This is an automated email from the git hooks/post-receive script. New commit to branch feature/2246 in repository echobase. See https://gitlab.nuiton.org/codelutin/echobase.git commit 9f72d77b3ef53ef5a390f1f9c790b541c3ae5e4b Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue May 10 09:46:46 2016 +0200 Ne pas autoriser de réimporter des meta sur les opérations et engins déjà existantes (See #2246) --- .../services/service/UserDbPersistenceService.java | 24 ++++++++++- .../DuplicatedGearMetadataValueException.java | 50 ++++++++++++++++++++++ .../DuplicatedOperationMetadataValueException.java | 44 +++++++++++++++++++ .../VoyageOperationsGearMetadataImportAction.java | 23 ++++++++++ ...ageOperationsOperationMetadataImportAction.java | 13 +++++- .../i18n/echobase-services_en_GB.properties | 2 + .../i18n/echobase-services_fr_FR.properties | 2 + 7 files changed, 155 insertions(+), 3 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 2bd2ca8..9d160ba 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 @@ -67,7 +67,10 @@ 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.Gear; +import fr.ifremer.echobase.entities.references.GearMetadata; import fr.ifremer.echobase.entities.references.Mission; +import fr.ifremer.echobase.entities.references.OperationMetadata; import fr.ifremer.echobase.entities.references.SampleDataType; import fr.ifremer.echobase.entities.references.SampleType; import fr.ifremer.echobase.entities.references.SexCategory; @@ -528,6 +531,17 @@ public class UserDbPersistenceService extends EchoBaseServiceSupport { //--- GearMetadataValue --------------------------------------------------// //------------------------------------------------------------------------// + public boolean containsGearMetadataValue(Voyage voyage, Vessel vessel, DepthStratum depthStratum, String operationId, Gear gear, GearMetadata gearMetadata) { + return persistenceContext.getGearMetadataValueDao() + .forGearMetadataEquals(gearMetadata) + .addEquals(GearMetadataValue.PROPERTY_GEAR, gear) + .addEquals(GearMetadataValue.PROPERTY_OPERATION + "." + Operation.PROPERTY_ID, operationId) + .addEquals(GearMetadataValue.PROPERTY_OPERATION + "." + Operation.PROPERTY_DEPTH_STRATUM, depthStratum) + .addEquals(GearMetadataValue.PROPERTY_OPERATION + "." + Operation.PROPERTY_TRANSECT + "." + Transect.PROPERTY_VESSEL, vessel) + .addEquals(GearMetadataValue.PROPERTY_OPERATION + "." + Operation.PROPERTY_TRANSECT + "." + Transect.PROPERTY_TRANSIT + "." + Transit.PROPERTY_VOYAGE, voyage) + .exists(); + } + public GearMetadataValue createGearMetadataValue(GearMetadataValue gearMetadataValue) { return persistenceContext.getGearMetadataValueDao().create(gearMetadataValue); } @@ -722,8 +736,14 @@ public class UserDbPersistenceService extends EchoBaseServiceSupport { //--- OperationMetadataValue ---------------------------------------------// //------------------------------------------------------------------------// - public OperationMetadataValue containsOperationOperationMetadataValue(OperationMetadataValue operationMetadataValue) { - return persistenceContext.getOperationMetadataValueDao().create(operationMetadataValue); + public boolean containsOperationMetadataValue(Voyage voyage, Vessel vessel, DepthStratum depthStratum, String operationId, OperationMetadata operationMetadata) { + return persistenceContext.getOperationMetadataValueDao() + .forOperationMetadataEquals(operationMetadata) + .addEquals(OperationMetadataValue.PROPERTY_OPERATION + "." + Operation.PROPERTY_ID, operationId) + .addEquals(OperationMetadataValue.PROPERTY_OPERATION + "." + Operation.PROPERTY_DEPTH_STRATUM, depthStratum) + .addEquals(OperationMetadataValue.PROPERTY_OPERATION + "." + Operation.PROPERTY_TRANSECT + "." + Transect.PROPERTY_VESSEL, vessel) + .addEquals(OperationMetadataValue.PROPERTY_OPERATION + "." + Operation.PROPERTY_TRANSECT + "." + Transect.PROPERTY_TRANSIT + "." + Transit.PROPERTY_VOYAGE, voyage) + .exists(); } public OperationMetadataValue getOperationMetadataValue(String id) { diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedGearMetadataValueException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedGearMetadataValueException.java new file mode 100644 index 0000000..094318f --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedGearMetadataValueException.java @@ -0,0 +1,50 @@ +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 DuplicatedGearMetadataValueException extends ImportRuntimeException { + + private static final long serialVersionUID = 1L; + + public DuplicatedGearMetadataValueException(Locale locale, + String voyageName, + String vesselName, + String depthStratumName, + String operationId, + String gearName, + String gearMetatadataName) { + super(l(locale, "echobase.importError.duplicate.gearMetataValue", gearMetatadataName, gearName, operationId, depthStratumName, vesselName, voyageName)); + } + +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedOperationMetadataValueException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedOperationMetadataValueException.java new file mode 100644 index 0000000..f3b3e8e --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedOperationMetadataValueException.java @@ -0,0 +1,44 @@ +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 DuplicatedOperationMetadataValueException extends ImportRuntimeException { + + private static final long serialVersionUID = 1L; + + public DuplicatedOperationMetadataValueException(Locale locale, String voyageName, String vesselName, String depthStratumName, String operationId, String operationMetatadataName) { + super(l(locale, "echobase.importError.duplicate.operationMetataValue", operationMetatadataName, operationId, depthStratumName, vesselName, voyageName)); + } + +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsGearMetadataImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsGearMetadataImportAction.java index c8f7447..f2d95d0 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsGearMetadataImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsGearMetadataImportAction.java @@ -3,7 +3,10 @@ package fr.ifremer.echobase.services.service.importdata.actions; import fr.ifremer.echobase.entities.EchoBaseUserEntityEnum; import fr.ifremer.echobase.entities.data.GearMetadataValue; import fr.ifremer.echobase.entities.data.Operation; +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.DuplicatedGearMetadataValueException; 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.VoyageOperationsGearMetadataValueImportExportModel; @@ -44,6 +47,8 @@ public class VoyageOperationsGearMetadataImportAction extends VoyageOperationsIm log.info("Starts import of gear metadata values from file " + inputFile.getFileName()); } + Voyage voyage = importDataContext.getVoyage(); + try (Import<VoyageOperationsGearMetadataValueImportRow> importer = open()) { int rowNumber = 0; @@ -53,7 +58,25 @@ public class VoyageOperationsGearMetadataImportAction extends VoyageOperationsIm doFlushTransaction(++rowNumber); Operation operation = row.getOperation(); + Vessel vessel = operation.getTransect().getVessel(); GearMetadataValue gearMetadataValuetoCreate = row.getGearMetadataValue(); + + boolean exists = persistenceService.containsGearMetadataValue(voyage, + vessel, + operation.getDepthStratum(), + operation.getId(), + operation.getGear(), + gearMetadataValuetoCreate.getGearMetadata()); + if (exists) { + throw new DuplicatedGearMetadataValueException(getLocale(), + voyage.getName(), + vessel.getName(), + operation.getDepthStratum().getId(), + operation.getId(), + operation.getGear().getCasinoGearName(), + gearMetadataValuetoCreate.getGearMetadata().getName()); + } + GearMetadataValue gearMetadataValue = persistenceService.createGearMetadataValue(gearMetadataValuetoCreate); operation.addGearMetadataValue(gearMetadataValue); diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsOperationMetadataImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsOperationMetadataImportAction.java index d65576c..ea057f1 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsOperationMetadataImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageOperationsOperationMetadataImportAction.java @@ -3,7 +3,10 @@ package fr.ifremer.echobase.services.service.importdata.actions; import fr.ifremer.echobase.entities.EchoBaseUserEntityEnum; import fr.ifremer.echobase.entities.data.Operation; import fr.ifremer.echobase.entities.data.OperationMetadataValue; +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.DuplicatedOperationMetadataValueException; 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.VoyageOperationsOperationMetadataValueImportExportModel; @@ -44,6 +47,8 @@ public class VoyageOperationsOperationMetadataImportAction extends VoyageOperati log.info("Starts import of operation metadata values from file " + inputFile.getFileName()); } + Voyage voyage = importDataContext.getVoyage(); + try (Import<VoyageOperationsOperationMetadataValueImportRow> importer = open()) { int rowNumber = 0; @@ -52,8 +57,14 @@ public class VoyageOperationsOperationMetadataImportAction extends VoyageOperati doFlushTransaction(++rowNumber); Operation operation = row.getOperation(); - + Vessel vessel = operation.getTransect().getVessel(); OperationMetadataValue operationMetadataValueToCreate = row.getOperationMetadataValue(); + + boolean exists = persistenceService.containsOperationMetadataValue(voyage, vessel, operation.getDepthStratum(), operation.getId(), operationMetadataValueToCreate.getOperationMetadata()); + if (exists) { + throw new DuplicatedOperationMetadataValueException(getLocale(), voyage.getName(), vessel.getName(), operation.getDepthStratum().getId(), operation.getId(), operationMetadataValueToCreate.getOperationMetadata().getName()); + } + OperationMetadataValue operationMetadataValue = persistenceService.createOperationMetadataValue(operationMetadataValueToCreate); operation.addOperationMetadataValue(operationMetadataValue); 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 63c6612..47c684c 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,7 +32,9 @@ 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.gearMetataValue=A gear meta data (type «%s») value on engin «%s» for operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.operation=An operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. +echobase.importError.duplicate.operationMetataValue=An operation meta data (type «%s») value for 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 in database. echobase.importError.duplicate.transit=A transit start «%s» - end «%s» on voyage «%s» already exists in database. 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 d898fff..9ab4be7 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,7 +32,9 @@ 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.gearMetataValue=La mise en œuvre (type %s) de l'engin «%s» (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.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.operationMetataValue=La donnée (type %s) (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 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. -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.