From abc91beaf68e7beb09d9b76c5734f4a88173542a Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 25 Jan 2021 16:40:35 +0100 Subject: [PATCH] some refactoring --- .../manager/controller/MDStoreController.java | 233 ++++++------------ .../manager/controller/SizeResponse.java | 21 ++ .../manager/controller/StatusResponse.java | 23 ++ .../exceptions/NoContentException.java | 36 --- .../repository/MDStoreVersionRepository.java | 4 +- .../mdstore/manager/utils/DatabaseUtils.java | 154 ++++++++++++ 6 files changed, 275 insertions(+), 196 deletions(-) create mode 100644 apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/SizeResponse.java create mode 100644 apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/StatusResponse.java delete mode 100644 apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/exceptions/NoContentException.java create mode 100644 apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/utils/DatabaseUtils.java diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java index 931d2cf6..2fc36602 100644 --- a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java +++ b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java @@ -1,215 +1,132 @@ package eu.dnetlib.data.mdstore.manager.controller; -import java.util.Date; import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; 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 com.google.common.collect.Lists; - -import eu.dnetlib.data.mdstore.manager.common.model.MDStore; -import eu.dnetlib.data.mdstore.manager.common.model.MDStoreCurrentVersion; import eu.dnetlib.data.mdstore.manager.common.model.MDStoreVersion; import eu.dnetlib.data.mdstore.manager.common.model.MDStoreWithInfo; import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException; -import eu.dnetlib.data.mdstore.manager.exceptions.NoContentException; -import eu.dnetlib.data.mdstore.manager.repository.MDStoreCurrentVersionRepository; -import eu.dnetlib.data.mdstore.manager.repository.MDStoreRepository; -import eu.dnetlib.data.mdstore.manager.repository.MDStoreVersionRepository; -import eu.dnetlib.data.mdstore.manager.repository.MDStoreWithInfoRepository; +import eu.dnetlib.data.mdstore.manager.utils.DatabaseUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @RestController @RequestMapping("/mdstores") -@Api(tags = { "Metadata Stores" }) +@Api(tags = { + "Metadata Stores" +}) public class MDStoreController { @Autowired - private MDStoreRepository mdstoreRepository; - @Autowired - private MDStoreVersionRepository mdstoreVersionRepository; - @Autowired - private MDStoreCurrentVersionRepository mdstoreCurrentVersionRepository; - @Autowired - private MDStoreWithInfoRepository mdstoreWithInfoRepository; - @Autowired - private JdbcTemplate jdbcTemplate; + private DatabaseUtils databaseUtils; - @ApiOperation(value = "Return all the mdstores") - @RequestMapping(value = "/", method = RequestMethod.GET) - public List find() { - return Lists.newArrayList(mdstoreWithInfoRepository.findAll()); + @ApiOperation("Return all the mdstores") + @GetMapping("/") + public Iterable find() { + return databaseUtils.listMdStores(); } - @ApiOperation(value = "Return all the mdstore identifiers") - @RequestMapping(value = "/ids", method = RequestMethod.GET) + @ApiOperation("Return all the mdstore identifiers") + @GetMapping("/ids") public List findIdentifiers() { - return mdstoreRepository.findAll().stream().map(MDStore::getId).collect(Collectors.toList()); + return databaseUtils.listMdStoreIDs(); } - @ApiOperation(value = "Return a mdstores by id") - @RequestMapping(value = "/mdstore/{mdId}", method = RequestMethod.GET) - public MDStoreWithInfo get(@ApiParam("the mdstore identifier") @PathVariable final String mdId) throws NoContentException { - return mdstoreWithInfoRepository.findById(mdId).orElseThrow(() -> new NoContentException("Missing mdstore: " + mdId)); + @ApiOperation("Return a mdstores by id") + @GetMapping("/mdstore/{mdId}") + public MDStoreWithInfo get(@ApiParam("the mdstore identifier") @PathVariable final String mdId) throws MDStoreManagerException { + return databaseUtils.findMdStore(mdId); } - @Transactional - @ApiOperation(value = "Increase the read count of the current mdstore") - @RequestMapping(value = "/mdstore/{mdId}/startReading", method = RequestMethod.GET) - public MDStoreVersion startReading(@ApiParam("the mdstore identifier") @PathVariable final String mdId) throws NoContentException { - final MDStoreCurrentVersion cv = mdstoreCurrentVersionRepository.findById(mdId).orElseThrow(() -> new NoContentException("Missing mdstore: " + mdId)); - final MDStoreVersion v = mdstoreVersionRepository.findById(cv.getCurrentVersion()) - .orElseThrow(() -> new NoContentException("Missing version: " + cv.getCurrentVersion())); - v.setReadCount(v.getReadCount() + 1); - mdstoreVersionRepository.save(v); - return v; + @ApiOperation("Increase the read count of the current mdstore") + @GetMapping("/mdstore/{mdId}/startReading") + public MDStoreVersion startReading(@ApiParam("the mdstore identifier") @PathVariable final String mdId) throws MDStoreManagerException { + return databaseUtils.startReading(mdId); } - @ApiOperation(value = "Return the number of mdstores") - @RequestMapping(value = "/count", method = RequestMethod.GET) - public long count() { - return mdstoreRepository.count(); + @ApiOperation("Return the number of mdstores") + @GetMapping("/count") + public SizeResponse count() { + return new SizeResponse(databaseUtils.countMdStores()); } - @ApiOperation(value = "Create a new mdstore") - @RequestMapping(value = "/new/{format}/{layout}/{interpretation}", method = RequestMethod.GET) + @ApiOperation("Create a new mdstore") + @GetMapping("/new/{format}/{layout}/{interpretation}") public MDStoreWithInfo createMDStore( - @ApiParam("mdstore format") @PathVariable final String format, - @ApiParam("mdstore layout") @PathVariable final String layout, - @ApiParam("mdstore interpretation") @PathVariable final String interpretation, - @ApiParam("datasource name") @RequestParam(required = false) final String dsName, - @ApiParam("datasource id") @RequestParam(required = false) final String dsId, - @ApiParam("api id") @RequestParam(required = false) final String apiId) throws MDStoreManagerException { - final String id = _createMDStore(format, layout, interpretation, dsName, dsId, apiId); - return mdstoreWithInfoRepository.findById(id).orElseThrow(() -> new MDStoreManagerException("MDStore not found")); + @ApiParam("mdstore format") @PathVariable final String format, + @ApiParam("mdstore layout") @PathVariable final String layout, + @ApiParam("mdstore interpretation") @PathVariable final String interpretation, + @ApiParam("datasource name") @RequestParam(required = false) final String dsName, + @ApiParam("datasource id") @RequestParam(required = false) final String dsId, + @ApiParam("api id") @RequestParam(required = false) final String apiId) throws MDStoreManagerException { + final String id = databaseUtils.createMDStore(format, layout, interpretation, dsName, dsId, apiId); + return databaseUtils.findMdStore(id); } - @Transactional - private String _createMDStore(final String format, - final String layout, - final String interpretation, - final String dsName, - final String dsId, - final String apiId) { - final MDStore md = MDStore.newInstance(format, layout, interpretation, dsName, dsId, apiId); - mdstoreRepository.save(md); - - final MDStoreVersion v = MDStoreVersion.newInstance(md.getId(), false); - v.setLastUpdate(new Date()); - mdstoreVersionRepository.save(v); - mdstoreCurrentVersionRepository.save(MDStoreCurrentVersion.newInstance(v)); - - return md.getId(); + @ApiOperation("Delete a mdstore by id") + @DeleteMapping("/mdstore/{mdId}") + public StatusResponse delete(@ApiParam("the id of the mdstore that will be deleted") @PathVariable final String mdId) throws MDStoreManagerException { + databaseUtils.deleteMdStore(mdId); + return StatusResponse.DELETED; } - @Transactional - @ApiOperation(value = "Delete a mdstore by id") - @RequestMapping(value = "/mdstore/{mdId}", method = RequestMethod.DELETE) - public void delete(@ApiParam("the id of the mdstore that will be deleted") @PathVariable final String mdId) throws MDStoreManagerException { - if (!mdstoreRepository.existsById(mdId)) { throw new NoContentException("On delete MDStore not found " + "[" + mdId + "]"); } - - if (mdstoreVersionRepository.countByMdstoreAndReadCountGreaterThan(mdId, - 0) > 0) { throw new MDStoreManagerException("Read transactions found on mdstore : " + mdId); } - - if (mdstoreVersionRepository.countByMdstoreAndWriting(mdId, - true) > 0) { throw new MDStoreManagerException("Write transactions found on mdstore : " + mdId); } - - mdstoreCurrentVersionRepository.deleteById(mdId); - mdstoreVersionRepository.deleteByMdstore(mdId); - mdstoreRepository.deleteById(mdId); + @ApiOperation("Return all the versions of a mdstore") + @GetMapping("/mdstore/{mdId}/versions") + public Iterable listVersions(@PathVariable final String mdId) throws MDStoreManagerException { + return databaseUtils.listVersions(mdId); } - @Transactional - @ApiOperation(value = "Return all the versions of a mdstore") - @RequestMapping(value = "/mdstore/{mdId}/versions", method = RequestMethod.GET) - public List listVersions(@PathVariable final String mdId) throws MDStoreManagerException { - return Lists.newArrayList(mdstoreVersionRepository.findByMdstore(mdId)); - } - - @Transactional - @ApiOperation(value = "Create a new preliminary version of a mdstore") - @RequestMapping(value = "/mdstore/{mdId}/newVersion", method = RequestMethod.GET) + @ApiOperation("Create a new preliminary version of a mdstore") + @GetMapping("/mdstore/{mdId}/newVersion") public MDStoreVersion prepareNewVersion(@ApiParam("the id of the mdstore for which will be created a new version") @PathVariable final String mdId) { - final MDStoreVersion v = MDStoreVersion.newInstance(mdId, true); - mdstoreVersionRepository.save(v); - return v; + return databaseUtils.prepareMdStoreVersion(mdId); } - @Transactional - @ApiOperation(value = "Promote a preliminary version to current") - @RequestMapping(value = "/version/{versionId}/commit/{size}", method = RequestMethod.GET) - public void commitVersion(@ApiParam("the id of the version that will be promoted to the current version") @PathVariable final String versionId, - @ApiParam(value = "the size of the new current mdstore") @PathVariable final long size) throws NoContentException { - final MDStoreVersion v = mdstoreVersionRepository.findById(versionId).orElseThrow(() -> new NoContentException("Invalid version: " + versionId)); - mdstoreCurrentVersionRepository.save(MDStoreCurrentVersion.newInstance(v)); - v.setWriting(false); - v.setSize(size); - v.setLastUpdate(new Date()); - mdstoreVersionRepository.save(v); + @ApiOperation("Promote a preliminary version to current") + @GetMapping("/version/{versionId}/commit/{size}") + public MDStoreVersion commitVersion(@ApiParam("the id of the version that will be promoted to the current version") @PathVariable final String versionId, + @ApiParam("the size of the new current mdstore") @PathVariable final long size) throws MDStoreManagerException { + return databaseUtils.commitMdStoreVersion(versionId, size); } - @ApiOperation(value = "Return all the expired versions of all the mdstores") - @RequestMapping(value = "/versions/expired", method = RequestMethod.GET) + @ApiOperation("Return all the expired versions of all the mdstores") + @GetMapping("/versions/expired") public List listExpiredVersions() { - return jdbcTemplate.queryForList( - "select v.id from mdstore_versions v left outer join mdstore_current_versions cv on (v.id = cv.current_version) where v.writing = false and v.readcount = 0 and cv.mdstore is null;", - String.class); + return databaseUtils.listExpiredVersions(); } - @Transactional - @ApiOperation(value = "Delete a mdstore version") - @RequestMapping(value = "/version/{versionId}", method = RequestMethod.DELETE) - public void deleteVersion(@ApiParam("the id of the version that has to be deleted") @PathVariable final String versionId, - @ApiParam("if true, the controls on writing and readcount values will be skipped") @RequestParam(required = false, defaultValue = "false") final boolean force) - throws MDStoreManagerException { - _deleteVersion(versionId, force); + @ApiOperation("Delete a mdstore version") + @DeleteMapping("/version/{versionId}") + public StatusResponse deleteVersion(@ApiParam("the id of the version that has to be deleted") @PathVariable final String versionId, + @ApiParam("if true, the controls on writing and readcount values will be skipped") @RequestParam(required = false, defaultValue = "false") final boolean force) + throws MDStoreManagerException { + databaseUtils.deleteMdStoreVersions(force, versionId); + return StatusResponse.DELETED; } - @Transactional - @ApiOperation(value = "Decrease the read count of a mdstore version") - @RequestMapping(value = "/version/{versionId}/endReading", method = RequestMethod.GET) + @ApiOperation("Decrease the read count of a mdstore version") + @GetMapping("/version/{versionId}/endReading") public MDStoreVersion endReading(@ApiParam("the id of the version that has been completely read") @PathVariable final String versionId) - throws MDStoreManagerException { - final MDStoreVersion v = mdstoreVersionRepository.findById(versionId).orElseThrow(() -> new MDStoreManagerException("Version not found")); - v.setReadCount(v.getReadCount() - 1); - return v; + throws MDStoreManagerException { + return databaseUtils.endReading(versionId); } - @Transactional - @ApiOperation(value = "Delete multiple mdstore versions") - @RequestMapping(value = "/versions/deleteList", method = RequestMethod.POST) - public void deleteVersions(@ApiParam("the list of ids of the versions that have to be deleted") @RequestBody final List versions, - @ApiParam("if true, the controls on writing and readcount values will be skipped") @RequestParam(required = false, defaultValue = "false") final boolean force) - throws MDStoreManagerException { - for (final String v : versions) { - _deleteVersion(v, force); - } + @ApiOperation("Delete multiple mdstore versions") + @PostMapping("/versions/deleteList") + public StatusResponse deleteVersions(@ApiParam("the list of ids of the versions that have to be deleted") @RequestBody final String[] versions, + @ApiParam("if true, the controls on writing and readcount values will be skipped") @RequestParam(required = false, defaultValue = "false") final boolean force) + throws MDStoreManagerException { + databaseUtils.deleteMdStoreVersions(force, versions); + return StatusResponse.DELETED; } - - private void _deleteVersion(final String versionId, final boolean force) throws MDStoreManagerException { - final MDStoreVersion v = mdstoreVersionRepository.findById(versionId).orElseThrow(() -> new MDStoreManagerException("Version not found")); - - if (mdstoreCurrentVersionRepository - .countByCurrentVersion(versionId) > 0) { throw new MDStoreManagerException("I cannot delete this version because it is the current version"); } - - if (!force) { - if (v.isWriting()) { throw new MDStoreManagerException("I cannot delete this version because it is in write mode"); } - if (v.getReadCount() > 0) { throw new MDStoreManagerException("I cannot delete this version because it is in read mode"); } - } - - mdstoreVersionRepository.delete(v); - } - } diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/SizeResponse.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/SizeResponse.java new file mode 100644 index 00000000..19d28be9 --- /dev/null +++ b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/SizeResponse.java @@ -0,0 +1,21 @@ +package eu.dnetlib.data.mdstore.manager.controller; + +public class SizeResponse { + + private long size = 0; + + public SizeResponse() {} + + public SizeResponse(final long size) { + this.size = size; + } + + public long getSize() { + return size; + } + + public void setSize(final long size) { + this.size = size; + } + +} diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/StatusResponse.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/StatusResponse.java new file mode 100644 index 00000000..463212bc --- /dev/null +++ b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/StatusResponse.java @@ -0,0 +1,23 @@ +package eu.dnetlib.data.mdstore.manager.controller; + +public class StatusResponse { + + public static final StatusResponse DELETED = new StatusResponse("DELETED"); + + private String status; + + public StatusResponse() {} + + public StatusResponse(final String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + + public void setStatus(final String status) { + this.status = status; + } + +} diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/exceptions/NoContentException.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/exceptions/NoContentException.java deleted file mode 100644 index 156fe382..00000000 --- a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/exceptions/NoContentException.java +++ /dev/null @@ -1,36 +0,0 @@ -package eu.dnetlib.data.mdstore.manager.exceptions; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(HttpStatus.NO_CONTENT) -public class NoContentException extends MDStoreManagerException{ - - /** - * - */ - private static final long serialVersionUID = -278683963172303773L; - - public NoContentException() { - super(); - } - - public NoContentException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } - - public NoContentException(String message, Throwable cause) { - super(message, cause); - } - - public NoContentException(String message) { - super(message); - } - - public NoContentException(Throwable cause) { - super(cause); - } - - - -} diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/repository/MDStoreVersionRepository.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/repository/MDStoreVersionRepository.java index e5a10e12..bfd868cf 100644 --- a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/repository/MDStoreVersionRepository.java +++ b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/repository/MDStoreVersionRepository.java @@ -10,9 +10,9 @@ public interface MDStoreVersionRepository extends JpaRepository findByMdstore(String mdId); diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/utils/DatabaseUtils.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/utils/DatabaseUtils.java new file mode 100644 index 00000000..f85e04ea --- /dev/null +++ b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/utils/DatabaseUtils.java @@ -0,0 +1,154 @@ +package eu.dnetlib.data.mdstore.manager.utils; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import eu.dnetlib.data.mdstore.manager.common.model.MDStore; +import eu.dnetlib.data.mdstore.manager.common.model.MDStoreCurrentVersion; +import eu.dnetlib.data.mdstore.manager.common.model.MDStoreVersion; +import eu.dnetlib.data.mdstore.manager.common.model.MDStoreWithInfo; +import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException; +import eu.dnetlib.data.mdstore.manager.repository.MDStoreCurrentVersionRepository; +import eu.dnetlib.data.mdstore.manager.repository.MDStoreRepository; +import eu.dnetlib.data.mdstore.manager.repository.MDStoreVersionRepository; +import eu.dnetlib.data.mdstore.manager.repository.MDStoreWithInfoRepository; + +@Component +public class DatabaseUtils { + + @Autowired + private MDStoreRepository mdstoreRepository; + @Autowired + private MDStoreVersionRepository mdstoreVersionRepository; + @Autowired + private MDStoreCurrentVersionRepository mdstoreCurrentVersionRepository; + @Autowired + private MDStoreWithInfoRepository mdstoreWithInfoRepository; + @Autowired + private JdbcTemplate jdbcTemplate; + + public Iterable listMdStores() { + return mdstoreWithInfoRepository.findAll(); + } + + public List listMdStoreIDs() { + return mdstoreRepository.findAll().stream().map(MDStore::getId).collect(Collectors.toList()); + } + + public long countMdStores() { + return mdstoreRepository.count(); + } + + public Iterable listVersions(final String mdId) { + return mdstoreVersionRepository.findByMdstore(mdId); + } + + public List listExpiredVersions() { + return jdbcTemplate + .queryForList("select v.id from mdstore_versions v left outer join mdstore_current_versions cv on (v.id = cv.current_version) where v.writing = false and v.readcount = 0 and cv.mdstore is null;", String.class); + } + + public MDStoreWithInfo findMdStore(final String mdId) throws MDStoreManagerException { + return mdstoreWithInfoRepository.findById(mdId).orElseThrow(() -> new MDStoreManagerException("Missing mdstore: " + mdId)); + } + + @Transactional + public String createMDStore(final String format, + final String layout, + final String interpretation, + final String dsName, + final String dsId, + final String apiId) { + + final MDStore md = MDStore.newInstance(format, layout, interpretation, dsName, dsId, apiId); + mdstoreRepository.save(md); + + final MDStoreVersion v = MDStoreVersion.newInstance(md.getId(), false); + v.setLastUpdate(new Date()); + mdstoreVersionRepository.save(v); + mdstoreCurrentVersionRepository.save(MDStoreCurrentVersion.newInstance(v)); + + return md.getId(); + } + + @Transactional + public void deleteMdStore(final String mdId) throws MDStoreManagerException { + if (!mdstoreRepository.existsById(mdId)) { throw new MDStoreManagerException("On delete MDStore not found " + "[" + mdId + "]"); } + + if (mdstoreVersionRepository.countByMdstoreAndReadCountGreaterThan(mdId, 0) > 0) { + throw new MDStoreManagerException("Read transactions found on mdstore : " + mdId); + } + + if (mdstoreVersionRepository.countByMdstoreAndWriting(mdId, true) > 0) { + throw new MDStoreManagerException("Write transactions found on mdstore : " + mdId); + } + + mdstoreCurrentVersionRepository.deleteById(mdId); + mdstoreVersionRepository.deleteByMdstore(mdId); + mdstoreRepository.deleteById(mdId); + } + + @Transactional + public MDStoreVersion startReading(final String mdId) throws MDStoreManagerException { + final MDStoreCurrentVersion cv = + mdstoreCurrentVersionRepository.findById(mdId).orElseThrow(() -> new MDStoreManagerException("Missing mdstore: " + mdId)); + final MDStoreVersion v = mdstoreVersionRepository.findById(cv.getCurrentVersion()) + .orElseThrow(() -> new MDStoreManagerException("Missing version: " + cv.getCurrentVersion())); + v.setReadCount(v.getReadCount() + 1); + mdstoreVersionRepository.save(v); + return v; + } + + @Transactional + public MDStoreVersion endReading(final String versionId) throws MDStoreManagerException { + final MDStoreVersion v = mdstoreVersionRepository.findById(versionId).orElseThrow(() -> new MDStoreManagerException("Version not found")); + v.setReadCount(v.getReadCount() - 1); + return v; + } + + @Transactional + public MDStoreVersion prepareMdStoreVersion(final String mdId) { + final MDStoreVersion v = MDStoreVersion.newInstance(mdId, true); + mdstoreVersionRepository.save(v); + return v; + } + + @Transactional + public MDStoreVersion commitMdStoreVersion(final String versionId, final long size) throws MDStoreManagerException { + final MDStoreVersion v = mdstoreVersionRepository.findById(versionId).orElseThrow(() -> new MDStoreManagerException("Invalid version: " + versionId)); + mdstoreCurrentVersionRepository.save(MDStoreCurrentVersion.newInstance(v)); + v.setWriting(false); + v.setSize(size); + v.setLastUpdate(new Date()); + mdstoreVersionRepository.save(v); + return v; + } + + @Transactional + public void deleteMdStoreVersions(final boolean force, final String... versions) throws MDStoreManagerException { + + for (final String versionId : versions) { + final MDStoreVersion v = mdstoreVersionRepository.findById(versionId).orElseThrow(() -> new MDStoreManagerException("Version not found")); + + if (mdstoreCurrentVersionRepository + .countByCurrentVersion(versionId) > 0) { + throw new MDStoreManagerException("I cannot delete this version because it is the current version"); + } + + if (!force) { + if (v.isWriting()) { throw new MDStoreManagerException("I cannot delete this version because it is in write mode"); } + if (v.getReadCount() > 0) { throw new MDStoreManagerException("I cannot delete this version because it is in read mode"); } + } + + mdstoreVersionRepository.delete(v); + } + } + +}