08/27: Ne pas autoriser de réimporter des opérations déjà existantes (See #2246)
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository echobase. See https://gitlab.nuiton.org/codelutin/echobase.git commit 32098723e5d9346217d1be59713a9630832fe5c3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon May 9 18:37:39 2016 +0200 Ne pas autoriser de réimporter des opérations déjà existantes (See #2246) --- .../services/service/UserDbPersistenceService.java | 22 +++++++++++ .../importdata/DuplicatedOperationException.java | 43 ++++++++++++++++++++++ .../VoyageOperationsOperationImportAction.java | 6 +++ .../strategy/OperationRemoveDataStrategy.java | 25 ++++++++++++- .../i18n/echobase-services_en_GB.properties | 7 ++-- .../i18n/echobase-services_fr_FR.properties | 5 ++- 6 files changed, 101 insertions(+), 7 deletions(-) diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java index a1f09a4..2bd2ca8 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java @@ -66,6 +66,7 @@ import fr.ifremer.echobase.entities.references.CellTypeImpl; import fr.ifremer.echobase.entities.references.CellTypes; import fr.ifremer.echobase.entities.references.DataMetadata; import fr.ifremer.echobase.entities.references.DataQuality; +import fr.ifremer.echobase.entities.references.DepthStratum; import fr.ifremer.echobase.entities.references.Mission; import fr.ifremer.echobase.entities.references.SampleDataType; import fr.ifremer.echobase.entities.references.SampleType; @@ -531,6 +532,10 @@ public class UserDbPersistenceService extends EchoBaseServiceSupport { return persistenceContext.getGearMetadataValueDao().create(gearMetadataValue); } + public GearMetadataValue getGearMetadataValue(String gearMetadataValueId) { + return persistenceContext.getGearMetadataValueDao().forTopiaIdEquals(gearMetadataValueId).findUnique(); + } + //------------------------------------------------------------------------// //--- ImportLog ----------------------------------------------------------// //------------------------------------------------------------------------// @@ -688,6 +693,15 @@ public class UserDbPersistenceService extends EchoBaseServiceSupport { //--- Operation ----------------------------------------------------------// //------------------------------------------------------------------------// + public boolean containsOperation(Voyage voyage, Vessel vessel, DepthStratum depthStratum, String operationId) { + return persistenceContext.getOperationDao() + .forIdEquals(operationId) + .addEquals(Operation.PROPERTY_DEPTH_STRATUM, depthStratum) + .addEquals(Operation.PROPERTY_TRANSECT + "." + Transect.PROPERTY_VESSEL, vessel) + .addEquals(Operation.PROPERTY_TRANSECT + "." + Transect.PROPERTY_TRANSIT + "." + Transit.PROPERTY_VOYAGE, voyage) + .exists(); + } + public Operation getOperation(String id) { return persistenceContext.getOperationDao().forTopiaIdEquals(id).findUnique(); } @@ -708,6 +722,14 @@ public class UserDbPersistenceService extends EchoBaseServiceSupport { //--- OperationMetadataValue ---------------------------------------------// //------------------------------------------------------------------------// + public OperationMetadataValue containsOperationOperationMetadataValue(OperationMetadataValue operationMetadataValue) { + return persistenceContext.getOperationMetadataValueDao().create(operationMetadataValue); + } + + public OperationMetadataValue getOperationMetadataValue(String id) { + return persistenceContext.getOperationMetadataValueDao().forTopiaIdEquals(id).findUnique(); + } + public OperationMetadataValue createOperationMetadataValue(OperationMetadataValue operationMetadataValue) { return persistenceContext.getOperationMetadataValueDao().create(operationMetadataValue); } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedOperationException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedOperationException.java new file mode 100644 index 0000000..abf984b --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedOperationException.java @@ -0,0 +1,43 @@ +package fr.ifremer.echobase.services.service.importdata; + +/* + * #%L + * EchoBase :: Services + * %% + * Copyright (C) 2011 - 2015 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import org.nuiton.csv.ImportRuntimeException; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l; + +/** + * Created on 5/09/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class DuplicatedOperationException extends ImportRuntimeException { + + private static final long serialVersionUID = 1L; + + public DuplicatedOperationException(Locale locale, String voyageName, String vesselName, String depthStratumName, String operationId) { + super(l(locale, "echobase.importError.duplicate.operation", operationId, depthStratumName, vesselName, voyageName)); + } +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsOperationImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsOperationImportAction.java index 0bb72a5..275697d 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsOperationImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsOperationImportAction.java @@ -7,6 +7,7 @@ import fr.ifremer.echobase.entities.data.Transit; import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.entities.references.Vessel; import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.DuplicatedOperationException; import fr.ifremer.echobase.services.service.importdata.ImportDataFileResult; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageOperationsImportDataContext; import fr.ifremer.echobase.services.service.importdata.csv.VoyageOperationsOperationImportExportModel; @@ -63,6 +64,11 @@ public class VoyageOperationsOperationImportAction extends VoyageOperationsImpor Operation operation = row.getOperation(); + boolean exists = persistenceService.containsOperation(voyage, vessel, operation.getDepthStratum(), operation.getId()); + if (exists) { + throw new DuplicatedOperationException(getLocale(), voyage.getName(), vessel.getName(), operation.getDepthStratum().getId(), operation.getId()); + } + Date startTime = operation.getGearShootingStartTime(); Date endTime = operation.getGearShootingEndTime(); diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/strategy/OperationRemoveDataStrategy.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/strategy/OperationRemoveDataStrategy.java index 0041644..6e8f0db 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/strategy/OperationRemoveDataStrategy.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/strategy/OperationRemoveDataStrategy.java @@ -24,7 +24,9 @@ package fr.ifremer.echobase.services.service.removedata.strategy; import com.google.common.collect.Sets; import fr.ifremer.echobase.entities.ImportLog; import fr.ifremer.echobase.entities.ImportType; +import fr.ifremer.echobase.entities.data.GearMetadataValue; import fr.ifremer.echobase.entities.data.Operation; +import fr.ifremer.echobase.entities.data.OperationMetadataValue; import fr.ifremer.echobase.entities.data.Transect; import fr.ifremer.echobase.entities.data.Voyage; import org.apache.commons.logging.Log; @@ -56,7 +58,26 @@ public class OperationRemoveDataStrategy extends AbstractRemoveDataStrategy { @Override protected void removeImportData(Voyage voyage, String id) throws TopiaException { - if (id.startsWith(Operation.class.getName())) { + if (id.startsWith(OperationMetadataValue.class.getName())) { + + OperationMetadataValue operationMetadataValue = persistenceService.getOperationMetadataValue(id); + operationMetadataValue.getOperation().removeOperationMetadataValue(operationMetadataValue); + + if (log.isDebugEnabled()) { + log.debug(operationMetadataValue + " was removed"); + } + + + } else if (id.startsWith(GearMetadataValue.class.getName())) { + + GearMetadataValue gearMetadataValue = persistenceService.getGearMetadataValue(id); + gearMetadataValue.getOperation().removeGearMetadataValue(gearMetadataValue); + + if (log.isDebugEnabled()) { + log.debug(gearMetadataValue + " was removed"); + } + + } else if (id.startsWith(Operation.class.getName())) { // get operation Operation operation = persistenceService.getOperation(id); @@ -68,7 +89,7 @@ public class OperationRemoveDataStrategy extends AbstractRemoveDataStrategy { // remove it persistenceService.deleteOperation(operation); if (log.isDebugEnabled()) { - log.debug(operation.getTopiaId() + " was removed"); + log.debug(operation + " was removed"); } } else { canNotDealWithId(id); diff --git a/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties b/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties index 6275397..63c6612 100644 --- a/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties +++ b/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties @@ -32,10 +32,11 @@ echobase.common.voyageFile=Voyage data file echobase.exportError.toFile=An error occured while exporting file %s \:%s echobase.importError.can.only.import.one.voyage.atime=Impossible to import more that one voyage at a time echobase.importError.dataMetadata.notFound=Metadata column %s missing (existing values \:%s) +echobase.importError.duplicate.operation=An operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.sample=Operation %s cannot comprise several samples of same type, species and size category -echobase.importError.duplicate.transect=A transect titled «%s» on voyage «%s» already exists un database. -echobase.importError.duplicate.transit=A transit start «%s» - end «%s» on voyage «%s» already exists un database. -echobase.importError.duplicate.voyage=A voyage named «%s» already exists un database. +echobase.importError.duplicate.transect=A transect titled «%s» on voyage «%s» already exists in database. +echobase.importError.duplicate.transit=A transit start «%s» - end «%s» on voyage «%s» already exists in database. +echobase.importError.duplicate.voyage=A voyage named «%s» already exists in database. echobase.importError.elementaryCell.withMissingDepthEnd=Elementary Cell (id\: %s - name %s) does not contains data in column MOVIES_EILayer\\cellset\\depthend, this is not allowed echobase.importError.esduCell.notfound=A new « dataAquisition» entry must be created for survey %s, vessel %s, instrument %s, whereas some elementary cells are not associated to an ESDU cell (line %s) echobase.importError.esduCell.withDepthEndFilled=ESDU Cell (id\: %s - name %s) contains data in column MOVIES_EILayer\\cellset\\depthend, this is not allowed. diff --git a/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties b/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties index 4b2fbdf..d898fff 100644 --- a/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties +++ b/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties @@ -32,9 +32,10 @@ echobase.common.voyageFile=Fichier des données de voyages echobase.exportError.toFile=Erreur lors de l'extraction du fichier %s \: %s echobase.importError.can.only.import.one.voyage.atime=Vous ne pouvez pas importer plus d'un voyage à la fois echobase.importError.dataMetadata.notFound=Colonne de métadonnées nommée %s non trouvée (valeurs existantes \: %s) +echobase.importError.duplicate.operation=L'opération d'identifiant «%s» sur la strate «%s» - navire «%s» et sur la marée nommée «%s» existe déjà dans la base. echobase.importError.duplicate.sample=L'opération %s ne peut pas contenir deux échantillons de même type %s, espèce %s et classe de taille %s -echobase.importError.duplicate.transect=Le transect de marée nommée «%s» - nom «%s» existe déjà dans la base. -echobase.importError.duplicate.transit=Le transit de marée nommée «%s», début «%s» - fin «%s» existe déjà dans la base. +echobase.importError.duplicate.transect=Le transect nommé «%s» sur la marée nommée «%s» existe déjà dans la base. +echobase.importError.duplicate.transit=Le transit début «%s» - fin «%s» sur la marée nommée «%s» existe déjà dans la base. echobase.importError.duplicate.voyage=La marée nommée «%s» existe déjà dans la base. echobase.importError.elementaryCell.withMissingDepthEnd=La cellule de type élémentaire (id\: %s - nom %s) ne contient pas la colonne MOVIES_EILayer\\cellset\\depthend renseignée, ce qui n'est pas autorisé. echobase.importError.esduCell.notfound=Un nouvelle entrée « dataAquisition »doit être créée pour la campagne %s, navire %s, instrument %s, mais il reste des cellules élémentaires non rattachées à une cellule ESDU (ligne %s) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm