From 46bc3e1f53d677e1444d3f206e3b7a8b0f6bb501 Mon Sep 17 00:00:00 2001 From: enricoottonello Date: Tue, 19 Mar 2019 13:34:40 +0100 Subject: [PATCH] added view on mdstore and transaction tables --- .../manager/MDStoreManagerException.java | 30 +++++ .../manager/controller/MDStoreController.java | 60 ++++++--- .../data/mdstore/manager/model/MDStore.java | 16 +++ .../manager/model/MDStoreWithInfo.java | 124 ++++++++++++++++++ .../mdstore/manager/model/Transaction.java | 35 +++++ .../repository/MDStoreWithInfoRepository.java | 10 ++ .../repository/ReadOnlyRepository.java | 18 +++ .../repository/TransactionRepository.java | 3 + .../src/main/resources/schema.sql | 22 ++++ 9 files changed, 297 insertions(+), 21 deletions(-) create mode 100644 dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/MDStoreManagerException.java create mode 100644 dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/MDStoreWithInfo.java create mode 100644 dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/MDStoreWithInfoRepository.java create mode 100644 dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/ReadOnlyRepository.java diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/MDStoreManagerException.java b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/MDStoreManagerException.java new file mode 100644 index 000000000..6ccd5e5fc --- /dev/null +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/MDStoreManagerException.java @@ -0,0 +1,30 @@ +package eu.dnetlib.data.mdstore.manager; + +public class MDStoreManagerException extends Exception{ + + /** + * + */ + private static final long serialVersionUID = -7503316126409002675L; + + public MDStoreManagerException() { + super(); + } + + public MDStoreManagerException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public MDStoreManagerException(String message, Throwable cause) { + super(message, cause); + } + + public MDStoreManagerException(String message) { + super(message); + } + + public MDStoreManagerException(Throwable cause) { + super(cause); + } +} diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java index 8954843d0..a0563856e 100644 --- a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java @@ -5,56 +5,74 @@ import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import eu.dnetlib.data.mdstore.manager.MDStoreManagerException; import eu.dnetlib.data.mdstore.manager.model.MDStore; +import eu.dnetlib.data.mdstore.manager.model.MDStoreWithInfo; +import eu.dnetlib.data.mdstore.manager.model.Transaction; import eu.dnetlib.data.mdstore.manager.repository.MDStoreRepository; +import eu.dnetlib.data.mdstore.manager.repository.MDStoreWithInfoRepository; +import eu.dnetlib.data.mdstore.manager.repository.TransactionRepository; @RestController @RequestMapping("/api/mdstores") public class MDStoreController { @Autowired - private MDStoreRepository repo; + private MDStoreRepository mdstoreRepository; + @Autowired + private TransactionRepository transactionRepository; + @Autowired + private MDStoreWithInfoRepository mdstoreWithInfoRepository; @RequestMapping(value = "/", method = RequestMethod.GET) - public final List find() { - return repo.findAll(); + public final Iterable find() { + return mdstoreWithInfoRepository.findAll(); } @RequestMapping(value = "/identifiers", method = RequestMethod.GET) public final List findIdentifiers() { - return repo.findAll().stream().map(MDStore::getId).collect(Collectors.toList()); + return mdstoreRepository.findAll().stream().map(MDStore::getId).collect(Collectors.toList()); } - @RequestMapping(value = "/{id}", method = RequestMethod.GET) - public final MDStore get(@PathVariable final String id) { - return repo.findById(id).orElse(null); + @RequestMapping(value = "/byId/{id}", method = RequestMethod.GET) + public final MDStoreWithInfo get(@PathVariable final String id) { + return mdstoreWithInfoRepository.findById(id).orElse(null); } @RequestMapping(value = "/count", method = RequestMethod.GET) public final long count() { - return repo.count(); + return mdstoreRepository.count(); } - @RequestMapping(value = "/", method = RequestMethod.PUT) - public final void save(@RequestBody final MDStore entity) { - repo.save(entity); + @RequestMapping(value = "/new/{format}/{layout}/{interpretation}", method = RequestMethod.PUT) + public MDStoreWithInfo createMDStore( + @PathVariable String format, + @PathVariable String layout, + @PathVariable String interpretation, + @RequestParam(required=false) String dsId, + @RequestParam(required=false) String apiId) throws MDStoreManagerException { + final MDStore md = MDStore.newInstance(dsId, apiId, format, layout, interpretation); + mdstoreRepository.save(md); + + final Transaction t = Transaction.newInstance(md.getId()); + t.setCurrent(true); + transactionRepository.save(t); + + return mdstoreWithInfoRepository.findById(md.getId()).orElseThrow(() -> new MDStoreManagerException("MDStore not found")); } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) - public void delete(@PathVariable final String id) { - repo.deleteById(id); - } - - @RequestMapping(value = "/{id}", method = RequestMethod.POST) - public void update(@PathVariable final String id, @RequestBody final MDStore entity) { - if (repo.existsById(id)) { - entity.setId(id); - repo.save(entity); + public void delete(@PathVariable final String id) throws MDStoreManagerException { + if (transactionRepository.countByMdstoreAndActive(id, true) == 0) { + transactionRepository.deleteByMdstore(id); + mdstoreRepository.deleteById(id); + } else { + throw new MDStoreManagerException("Active transactions found on mdstore : " + id); } } diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/MDStore.java b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/MDStore.java index ff4508b40..797b0784b 100644 --- a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/MDStore.java +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/MDStore.java @@ -1,6 +1,7 @@ package eu.dnetlib.data.mdstore.manager.model; import java.io.Serializable; +import java.util.UUID; import javax.persistence.Column; import javax.persistence.Entity; @@ -85,6 +86,21 @@ public class MDStore implements Serializable { this.apiId = apiId; } + public static MDStore newInstance(final String format, final String layout, final String interpretation) { + return newInstance(null, null, format, layout, interpretation); + } + + public static MDStore newInstance(final String dsId, final String apiId, final String format, final String layout, final String interpretation) { + final MDStore md = new MDStore(); + md.setId("md-" + UUID.randomUUID()); + md.setDatasourceId(dsId); + md.setApiId(apiId); + md.setFormat(format); + md.setLayout(layout); + md.setInterpretation(interpretation); + return md; + } + diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/MDStoreWithInfo.java b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/MDStoreWithInfo.java new file mode 100644 index 000000000..3f5b59938 --- /dev/null +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/MDStoreWithInfo.java @@ -0,0 +1,124 @@ +package eu.dnetlib.data.mdstore.manager.model; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +@Entity +@Table(name = "mdstores_with_info") +public class MDStoreWithInfo implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -8445784770687571492L; + + @Id + @Column(name = "id") + private String id; + + @Column(name = "format") + private String format; + + @Column(name = "layout") + private String layout; + + @Column(name = "interpretation") + private String interpretation; + + @Column(name = "datasource_id") + private String datasourceId; + + @Column(name = "api_id") + private String apiId ; + + @Column(name = "current_version") + private String currentVersion; + + @Column(name = "lastupdate") + @Temporal(TemporalType.TIMESTAMP) + private Date lastUpdate; + + @Column(name = "size") + private int size; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getLayout() { + return layout; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + public String getInterpretation() { + return interpretation; + } + + public void setInterpretation(String interpretation) { + this.interpretation = interpretation; + } + + public String getDatasourceId() { + return datasourceId; + } + + public void setDatasourceId(String datasourceId) { + this.datasourceId = datasourceId; + } + + public String getApiId() { + return apiId; + } + + public void setApiId(String apiId) { + this.apiId = apiId; + } + + public String getCurrentVersion() { + return currentVersion; + } + + public void setCurrentVersion(String currentVersion) { + this.currentVersion = currentVersion; + } + + public Date getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Date lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + +} diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/Transaction.java b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/Transaction.java index c24a1e0f2..cc7100955 100644 --- a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/Transaction.java +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/model/Transaction.java @@ -25,9 +25,15 @@ public class Transaction implements Serializable{ @Column(name = "mdstore") private String mdstore; + @Column(name = "current") + private boolean current; + @Column(name = "active") private boolean active; + @Column(name = "readcount") + private int readCount; + @Column(name = "lastupdate") @Temporal(TemporalType.TIMESTAMP) private Date lastUpdate; @@ -51,6 +57,14 @@ public class Transaction implements Serializable{ this.mdstore = mdstore; } + public boolean isCurrent() { + return current; + } + + public void setCurrent(boolean current) { + this.current = current; + } + public boolean isActive() { return active; } @@ -59,6 +73,14 @@ public class Transaction implements Serializable{ this.active = active; } + public int getReadCount() { + return readCount; + } + + public void setReadCount(int readCount) { + this.readCount = readCount; + } + public Date getLastUpdate() { return lastUpdate; } @@ -75,5 +97,18 @@ public class Transaction implements Serializable{ this.size = size; } + public static Transaction newInstance(final String mdId) { + final Transaction t = new Transaction(); + t.setId(mdId + "-" + new Date().getTime()); + t.setMdstore(mdId); + t.setLastUpdate(null); + t.setActive(false); + t.setCurrent(false); + t.setReadCount(0); + t.setSize(0); + return t; + } + + } diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/MDStoreWithInfoRepository.java b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/MDStoreWithInfoRepository.java new file mode 100644 index 000000000..3a8608ba2 --- /dev/null +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/MDStoreWithInfoRepository.java @@ -0,0 +1,10 @@ +package eu.dnetlib.data.mdstore.manager.repository; + +import org.springframework.stereotype.Repository; + +import eu.dnetlib.data.mdstore.manager.model.MDStoreWithInfo; + +@Repository +public interface MDStoreWithInfoRepository extends ReadOnlyRepository { + +} diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/ReadOnlyRepository.java b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/ReadOnlyRepository.java new file mode 100644 index 000000000..02ba4346c --- /dev/null +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/ReadOnlyRepository.java @@ -0,0 +1,18 @@ +package eu.dnetlib.data.mdstore.manager.repository; + +import java.util.Optional; + +import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.Repository; + +@NoRepositoryBean +public interface ReadOnlyRepository extends Repository { + + Optional findById(ID id); + + boolean existsById(ID id); + + Iterable findAll(); + + long count(); +} \ No newline at end of file diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/TransactionRepository.java b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/TransactionRepository.java index 24fcc7005..e757955bc 100644 --- a/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/TransactionRepository.java +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/java/eu/dnetlib/data/mdstore/manager/repository/TransactionRepository.java @@ -8,4 +8,7 @@ import eu.dnetlib.data.mdstore.manager.model.Transaction; @Repository public interface TransactionRepository extends JpaRepository { + void deleteByMdstore(String id); + + int countByMdstoreAndActive(String id, boolean active); } diff --git a/dhp-applications/dhp-mdstore-manager-app/src/main/resources/schema.sql b/dhp-applications/dhp-mdstore-manager-app/src/main/resources/schema.sql index 865f8ad06..79abc2568 100644 --- a/dhp-applications/dhp-mdstore-manager-app/src/main/resources/schema.sql +++ b/dhp-applications/dhp-mdstore-manager-app/src/main/resources/schema.sql @@ -1,3 +1,7 @@ +DROP VIEW IF EXISTS mdstores_with_info; +DROP TABLE IF EXISTS transactions; +DROP TABLE IF EXISTS mdstores; + CREATE TABLE mdstores ( id text PRIMARY KEY, format text, @@ -10,7 +14,25 @@ CREATE TABLE mdstores ( CREATE TABLE transactions ( id text PRIMARY KEY, mdstore text REFERENCES mdstores(id), + current boolean, active boolean, + readcount int, lastupdate timestamp, size int ); + +CREATE VIEW mdstores_with_info AS SELECT + md.id AS id, + md.format AS format, + md.layout AS layout, + md.interpretation AS interpretation, + md.datasource_id AS datasource_id, + md.api_id AS api_id, + t.id AS current_version, + t.lastupdate AS lastupdate, + t.size AS size +FROM + mdstores md + LEFT OUTER JOIN transactions t ON (md.id = t.mdstore) +WHERE + t.current = TRUE;