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 9867f8f7a6cca1411711b3e7debb5b26d9dba16b Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu May 12 16:28:46 2016 +0200 Ne pas autoriser de réimporter les résultats sur les voyages déjà existants (See #2246) --- .../DuplicatedEchotypeAssociationException.java | 20 +++++++++++ ...plicatedResultsVoyageLengthAgeKeyException.java | 20 +++++++++++ ...catedResultsVoyageLengthWeightKeyException.java | 20 +++++++++++ .../importdata/MismatchVoyageException.java | 21 ++++++++++++ .../VoyageResultsVoyageEchotypeImportAction.java | 20 ++++++++--- ...oyageResultsVoyageLengthAgeKeyImportAction.java | 32 ++++++++++++++++++ ...geResultsVoyageLengthWeightKeyImportAction.java | 39 ++++++++++++++++++++-- .../i18n/echobase-services_en_GB.properties | 4 +++ .../i18n/echobase-services_fr_FR.properties | 4 +++ 9 files changed, 172 insertions(+), 8 deletions(-) diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedEchotypeAssociationException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedEchotypeAssociationException.java new file mode 100644 index 0000000..35e6054 --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedEchotypeAssociationException.java @@ -0,0 +1,20 @@ +package fr.ifremer.echobase.services.service.importdata; + +import org.nuiton.csv.ImportRuntimeException; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l; + +/** + * Created on 12/05/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class DuplicatedEchotypeAssociationException extends ImportRuntimeException { + + public DuplicatedEchotypeAssociationException(Locale locale, int rowNumber, String voyageName, String echotypeName, String baracoudaCode) { + super(l(locale, "echobase.importError.duplicate.echotypeSpeciesAssociation", rowNumber, echotypeName, voyageName, baracoudaCode)); + } +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedResultsVoyageLengthAgeKeyException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedResultsVoyageLengthAgeKeyException.java new file mode 100644 index 0000000..678153b --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedResultsVoyageLengthAgeKeyException.java @@ -0,0 +1,20 @@ +package fr.ifremer.echobase.services.service.importdata; + +import org.nuiton.csv.ImportRuntimeException; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l; + +/** + * Created on 12/05/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class DuplicatedResultsVoyageLengthAgeKeyException extends ImportRuntimeException { + + public DuplicatedResultsVoyageLengthAgeKeyException(Locale locale, int rowNumber, String voyageName, String baracoudaCode, float length, int age) { + super(l(locale, "echobase.importError.duplicate.voyageLengthAgeKey", rowNumber, baracoudaCode, length, age, voyageName)); + } +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedResultsVoyageLengthWeightKeyException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedResultsVoyageLengthWeightKeyException.java new file mode 100644 index 0000000..b101e6f --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedResultsVoyageLengthWeightKeyException.java @@ -0,0 +1,20 @@ +package fr.ifremer.echobase.services.service.importdata; + +import org.nuiton.csv.ImportRuntimeException; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l; + +/** + * Created on 12/05/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class DuplicatedResultsVoyageLengthWeightKeyException extends ImportRuntimeException { + + public DuplicatedResultsVoyageLengthWeightKeyException(Locale locale, int rowNumber, String voyageName, String baracoudaCode, String sizeCategoryName) { + super(l(locale, "echobase.importError.duplicate.voyageLengthWeightKey", rowNumber, baracoudaCode, sizeCategoryName, voyageName)); + } +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/MismatchVoyageException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/MismatchVoyageException.java new file mode 100644 index 0000000..a8f93a1 --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/MismatchVoyageException.java @@ -0,0 +1,21 @@ +package fr.ifremer.echobase.services.service.importdata; + +import org.nuiton.csv.ImportRuntimeException; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l; + +/** + * Created on 12/05/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class MismatchVoyageException extends ImportRuntimeException { + + public MismatchVoyageException(Locale locale, int rowNumber, String voyageName) { + super(l(locale, "echobase.importError.mismatch.voyage", rowNumber, voyageName)); + } + +} \ No newline at end of file diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageEchotypeImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageEchotypeImportAction.java index 707fa5c..9c8dfab 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageEchotypeImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageEchotypeImportAction.java @@ -9,7 +9,9 @@ import fr.ifremer.echobase.entities.data.Echotypes; import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.entities.references.Species; import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.DuplicatedEchotypeAssociationException; import fr.ifremer.echobase.services.service.importdata.ImportDataFileResult; +import fr.ifremer.echobase.services.service.importdata.MismatchVoyageException; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageResultsImportDataContext; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsVoyageEchotypeImportExportModel; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsVoyageEchotypeImportRow; @@ -54,6 +56,9 @@ public class VoyageResultsVoyageEchotypeImportAction extends VoyageResultsImport log.info("Starts import of echotype from file " + inputFile.getFileName()); } + String voyageId = importDataContext.getConfiguration().getVoyageId(); + Voyage expectedVoyage = persistenceService.getVoyage(voyageId); + try (Import<VoyageResultsVoyageEchotypeImportRow> importer = open()) { incrementsProgress(); @@ -65,6 +70,10 @@ public class VoyageResultsVoyageEchotypeImportAction extends VoyageResultsImport Voyage voyage = row.getVoyage(); + if (!expectedVoyage.equals(voyage)) { + throw new MismatchVoyageException(getLocale(), rowNumber, voyage.getName()); + } + Echotype rowEchotype = row.getEchotype(); String echotypeName = rowEchotype.getName(); @@ -99,14 +108,15 @@ public class VoyageResultsVoyageEchotypeImportAction extends VoyageResultsImport Species existingSpecies = echotype.getSpeciesByTopiaId(species.getTopiaId()); - if (existingSpecies == null) { + if (existingSpecies != null) { - // add this species - echotype.addSpecies(species); + throw new DuplicatedEchotypeAssociationException(getLocale(), rowNumber, voyage.getName(), echotypeName, species.getBaracoudaCode()); + } - speciesIdToEchotypeId.add(Pair.of(species.getTopiaId(), echotype.getTopiaId())); + // add this species + echotype.addSpecies(species); - } + speciesIdToEchotypeId.add(Pair.of(species.getTopiaId(), echotype.getTopiaId())); } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthAgeKeyImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthAgeKeyImportAction.java index 5afb54d..ae3101c 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthAgeKeyImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthAgeKeyImportAction.java @@ -4,7 +4,9 @@ import fr.ifremer.echobase.entities.EchoBaseUserEntityEnum; import fr.ifremer.echobase.entities.data.LengthAgeKey; import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.DuplicatedResultsVoyageLengthAgeKeyException; import fr.ifremer.echobase.services.service.importdata.ImportDataFileResult; +import fr.ifremer.echobase.services.service.importdata.MismatchVoyageException; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageResultsImportDataContext; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsVoyageLengthAgeKeyImportExportModel; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsVoyageLengthAgeKeyImportRow; @@ -12,6 +14,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Import; +import java.util.Set; +import java.util.TreeSet; + /** * Created on 25/03/16. * @@ -44,6 +49,15 @@ public class VoyageResultsVoyageLengthAgeKeyImportAction extends VoyageResultsIm log.info("Starts import of lenthAgeKey from file " + inputFile.getFileName()); } + String voyageId = importDataContext.getConfiguration().getVoyageId(); + Voyage expectedVoyage = persistenceService.getVoyage(voyageId); + + Set<String> cacheKeys = new TreeSet<>(); + + for (LengthAgeKey lengthAgeKey : expectedVoyage.getLengthAgeKey()) { + cacheKeys.add(cacheKey(lengthAgeKey)); + } + try (Import<VoyageResultsVoyageLengthAgeKeyImportRow> importer = open()) { incrementsProgress(); @@ -55,7 +69,21 @@ public class VoyageResultsVoyageLengthAgeKeyImportAction extends VoyageResultsIm Voyage voyage = row.getVoyage(); + if (!expectedVoyage.equals(voyage)) { + throw new MismatchVoyageException(getLocale(), rowNumber, voyage.getName()); + } + LengthAgeKey lengthAgeKeyToCreate = row.getLengthAgeKey(); + String cacheKey = cacheKey(lengthAgeKeyToCreate); + if (cacheKeys.contains(cacheKey)) { + throw new DuplicatedResultsVoyageLengthAgeKeyException(getLocale(), + rowNumber, + voyage.getName(), + lengthAgeKeyToCreate.getSpecies().getBaracoudaCode(), + lengthAgeKeyToCreate.getLength(), + lengthAgeKeyToCreate.getAge()); + } + LengthAgeKey lengthAgeKey = persistenceService.createLengthAgeKey(lengthAgeKeyToCreate); // attach it to voyage @@ -87,4 +115,8 @@ public class VoyageResultsVoyageLengthAgeKeyImportAction extends VoyageResultsIm } + private String cacheKey(LengthAgeKey lengthAgeKey) { + return lengthAgeKey.getSpecies().getTopiaId() + "~" + lengthAgeKey.getLength() + "~" + lengthAgeKey.getAge(); + } + } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthWeightKeyImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthWeightKeyImportAction.java index 560fe2d..bb07100 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthWeightKeyImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthWeightKeyImportAction.java @@ -5,7 +5,9 @@ import fr.ifremer.echobase.entities.data.LengthWeightKey; import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.entities.references.SpeciesCategory; import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.DuplicatedResultsVoyageLengthWeightKeyException; import fr.ifremer.echobase.services.service.importdata.ImportDataFileResult; +import fr.ifremer.echobase.services.service.importdata.MismatchVoyageException; import fr.ifremer.echobase.services.service.importdata.SpeciesCategoryCache; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageResultsImportDataContext; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsVoyageLengthWeightKeyImportExportModel; @@ -14,6 +16,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Import; +import java.util.Set; +import java.util.TreeSet; + /** * Created on 25/03/16. * @@ -48,6 +53,15 @@ public class VoyageResultsVoyageLengthWeightKeyImportAction extends VoyageResult SpeciesCategoryCache speciesCategoryCache = importDataContext.getSpeciesCategoryCache(); + String voyageId = importDataContext.getConfiguration().getVoyageId(); + Voyage expectedVoyage = persistenceService.getVoyage(voyageId); + + Set<String> cacheKeys = new TreeSet<>(); + + for (LengthWeightKey lengthWeightKey : expectedVoyage.getLengthWeightKey()) { + cacheKeys.add(cacheKey(lengthWeightKey)); + } + try (Import<VoyageResultsVoyageLengthWeightKeyImportRow> importer = open()) { incrementsProgress(); @@ -55,15 +69,29 @@ public class VoyageResultsVoyageLengthWeightKeyImportAction extends VoyageResult for (VoyageResultsVoyageLengthWeightKeyImportRow row : importer) { doFlushTransaction(++rowNumber); + Voyage voyage = row.getVoyage(); + if (!expectedVoyage.equals(voyage)) { + throw new MismatchVoyageException(getLocale(), rowNumber, voyage.getName()); + } + // find speciesCategory SpeciesCategory speciesCategory = speciesCategoryCache.getSpeciesCategory(row.getSpecies(), null, row.getSizeCategory(), null, null, result); - LengthWeightKey toCreate = row.getLengthWeightKey(); - toCreate.setSpeciesCategory(speciesCategory); + LengthWeightKey lengthWeightKeyToCreate = row.getLengthWeightKey(); + lengthWeightKeyToCreate.setSpeciesCategory(speciesCategory); + + String cacheKey = cacheKey(lengthWeightKeyToCreate); + if (cacheKeys.contains(cacheKey)) { + throw new DuplicatedResultsVoyageLengthWeightKeyException(getLocale(), + rowNumber, + voyage.getName(), + lengthWeightKeyToCreate.getSpeciesCategory().getSpecies().getBaracoudaCode(), + lengthWeightKeyToCreate.getSpeciesCategory().getSizeCategory().getName()); + } - LengthWeightKey lengthWeightKey = persistenceService.createLengthWeightKey(toCreate); + LengthWeightKey lengthWeightKey = persistenceService.createLengthWeightKey(lengthWeightKeyToCreate); //TODO should we import it ? //lengthWeightKey.setMetadata(row.getMetadata()); @@ -96,4 +124,9 @@ public class VoyageResultsVoyageLengthWeightKeyImportAction extends VoyageResult } + private String cacheKey(LengthWeightKey lengthWeightKey) { + SpeciesCategory speciesCategory = lengthWeightKey.getSpeciesCategory(); + return speciesCategory.getSpecies().getTopiaId() + "~" + speciesCategory.getSizeCategory().getTopiaId(); + } + } 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 22205ec..80a1504 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 @@ -42,6 +42,10 @@ echobase.importError.duplicate.subSamble=Line %s - Subs-sample (length class %s, echobase.importError.duplicate.transect=Line %s - A transect titled «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.transit=Line %s - A transit start «%s» - end «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.voyage=Line %s - A voyage named «%s» already exists in database. +echobase.importError.mismatch.voyage=Line %s - Used voyage «%s» does not match with the voyage configured. +echobase.importError.duplicate.echotypeSpeciesAssociation=Line %s - Echotype «%s» on voyage named «%s» already contains the species «%s». +echobase.importError.duplicate.voyageLengthAgeKey=Line %s - Result on species «%s» (length class «%s» - age «%s») on voyage named «%s» already exists in database. +echobase.importError.duplicate.voyageLengthWeightKey=Line %s - Result on species «%s» (size category «%s») on 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 fb1f6ba..af28dff 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 @@ -41,7 +41,11 @@ echobase.importError.duplicate.sample=L'opération %s ne peut pas contenir deux echobase.importError.duplicate.subSamble=Ligne %s - Le sous-échantillon (classe de taille %s, catégorie %s, opération %s) existe déjà dans la base. echobase.importError.duplicate.transect=Ligne %s - Le transect nommé «%s» sur la marée nommée «%s» existe déjà dans la base. echobase.importError.duplicate.transit=Ligne %s - Le transit début «%s» - fin «%s» sur la marée nommée «%s» existe déjà dans la base. +echobase.importError.duplicate.echotypeSpeciesAssociation=Ligne %s - L'échotype «%s» sur la marée nommée «%s» contient déjà l'espèce «%s». +echobase.importError.duplicate.voyageLengthAgeKey=Ligne %s - Le résultat sur l'espèce «%s» (classe de taille «%s» - age «%s») sur la marée nommée «%s» existe déjà dans la base. +echobase.importError.duplicate.voyageLengthWeightKey=Ligne %s - Le résultat sur l'espèce «%s» (catégorie de taille «%s») sur la marée nommée «%s» existe déjà dans la base. echobase.importError.duplicate.voyage=Ligne %s - La marée nommée «%s» existe déjà dans la base. +echobase.importError.mismatch.voyage=Ligne %s - La marée «%s» ne correspond pas à celle configurée. 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) echobase.importError.esduCell.withDepthEndFilled=La cellule de type ESDU (id\: %s - nom %s) contient la colonne MOVIES_EILayer\\cellset\\depthend renseignée, ce qui n'est pas autorisé. -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.