This is an automated email from the git hooks/post-receive script. New commit to branch feature/6688 in repository tutti. See http://git.codelutin.com/tutti.git commit bd6f2ef378cf73be37e3481e7a96fe351372d1a7 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Feb 23 20:37:03 2015 +0100 can override cruise + test for it --- .../genericformat/GenericFormatImportContext.java | 15 +-- .../GenericFormatImportCruiseContext.java | 9 +- .../GenericFormatImportCruiseResult.java | 7 ++ .../genericformat/GenericFormatImportService.java | 10 +- .../GenericformatImportPersitenceHelper.java | 43 +++++++- .../consumer/CsvConsumerForSurvey.java | 9 +- .../resources/i18n/tutti-service_fr_FR.properties | 1 + .../GenericFormatImportServiceTest.java | 110 +++++++++++++++++++++ .../onlyCruise/gearCaracteristics.csv | 3 + .../resources/genericFormat/onlyCruise/survey.csv | 2 + 10 files changed, 193 insertions(+), 16 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java index 0824f2c..cc6e382 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java @@ -148,11 +148,8 @@ public class GenericFormatImportContext implements Closeable { this.importedVessels = importedVessels; } - public boolean isCruiseAlreadyExists(Cruise cruise) { - - Cruise existingCruise = importRequest.getExistingCruise(cruise); - return existingCruise != null; - + public Cruise getExistingCruise(Cruise cruise) { + return importRequest.getExistingCruise(cruise); } public boolean isCruiseAlreadyImported(Cruise cruise) { @@ -162,10 +159,10 @@ public class GenericFormatImportContext implements Closeable { } - public void addImportedCruise(Cruise cruise) { + public void addImportedCruise(Cruise cruise, boolean override) { String cruiseId = cruise.getId(); - GenericFormatImportCruiseContext cruiseContext = new GenericFormatImportCruiseContext(cruise, cruiseDecorator.toString(cruise)); + GenericFormatImportCruiseContext cruiseContext = new GenericFormatImportCruiseContext(cruise, override,cruiseDecorator.toString(cruise)); cruiseContexts.put(cruiseId, cruiseContext); } @@ -307,6 +304,10 @@ public class GenericFormatImportContext implements Closeable { } } + public void addStepsInProgressionModel(int size) { + progressionModel.adaptTotal(progressionModel.getTotal() + size); + } + public static interface CruiseContextAction { void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseContext.java index f8d48af..5ef2b87 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseContext.java @@ -29,14 +29,17 @@ public class GenericFormatImportCruiseContext implements Closeable { private final Cruise cruise; + private final boolean override; + private final String cruiseLabel; private final Map<String, GenericFormatImportOperationContext> fishingOperationContexts; private final Set<Gear> gearsWithcaracteristics; - public GenericFormatImportCruiseContext(Cruise cruise, String cruiseLabel) { + public GenericFormatImportCruiseContext(Cruise cruise, boolean override, String cruiseLabel) { this.cruise = cruise; + this.override=override; this.cruiseLabel = cruiseLabel; this.fishingOperationContexts = new TreeMap<>(); this.gearsWithcaracteristics = new HashSet<>(); @@ -56,6 +59,10 @@ public class GenericFormatImportCruiseContext implements Closeable { return cruise; } + public boolean isOverride() { + return override; + } + public String getCruiseLabel() { return cruiseLabel; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseResult.java index 886ade5..197256e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseResult.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseResult.java @@ -28,11 +28,14 @@ public class GenericFormatImportCruiseResult { private final Cruise cruise; + private final boolean override; + private final Map<String, GenericFormatImportOperationResult> fishingOperationResults; public GenericFormatImportCruiseResult(GenericFormatImportCruiseContext cruiseContext) { this.cruise = cruiseContext.getCruise(); + this.override = cruiseContext.isOverride(); this.fishingOperationResults = new HashMap<>(); for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts()) { @@ -48,6 +51,10 @@ public class GenericFormatImportCruiseResult { return cruise; } + public boolean isOverride() { + return override; + } + public GenericFormatImportOperationResult getFishingOperationResult(String fishingOperationId) { return fishingOperationResults.get(fishingOperationId); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java index 16b049b..fdfead5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java @@ -52,6 +52,7 @@ import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.File; import java.io.IOException; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; @@ -150,7 +151,12 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { Preconditions.checkNotNull(importFile); Preconditions.checkState(importFile.exists()); - Set<Cruise> cruises = ImmutableSet.copyOf(persistenceService.getAllCruise(program.getId())); + // Full load cruise + Set<Cruise> cruises = new LinkedHashSet<>(); + for (String cruiseId : persistenceService.getAllCruiseId(program.getId())) { + cruises.add(persistenceService.getCruise(cruiseId)); + } + TuttiProtocol protocol = persistenceService.getProtocol(); GenericFormatArchive archive = GenericFormatArchive.forImport(importFile, context.getConfig().getTmpDirectory()); @@ -160,7 +166,7 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { ';', program, context.getSampleCategoryModel(), - cruises, + ImmutableSet.copyOf(cruises), protocol); return request; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersitenceHelper.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersitenceHelper.java index 34019fd..d41d77d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersitenceHelper.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersitenceHelper.java @@ -2,6 +2,7 @@ package fr.ifremer.tutti.service.genericformat; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; import fr.ifremer.tutti.persistence.entities.data.BenthosBatchFrequency; @@ -54,12 +55,44 @@ public class GenericformatImportPersitenceHelper { public void persistCruise(Cruise cruise) { String cruiseStr = cruiseDecorator.toString(cruise); - if (log.isInfoEnabled()) { - log.info("Persist cruise: " + cruiseStr); + + boolean createCruise = TuttiEntities.isNew(cruise); + + Cruise savedCruise; + + if (createCruise) { + + if (log.isInfoEnabled()) { + log.info("Create cruise: " + cruiseStr); + } + importContext.increments(t("tutti.service.genericFormat.persist.cruise", cruiseStr)); + + savedCruise = persistenceService.createCruise(cruise); + + } else { + + if (log.isInfoEnabled()) { + log.info("Save existing cruise: " + cruiseStr); + } + + importContext.increments(t("tutti.service.genericFormat.persist.cruise", cruiseStr)); + savedCruise = persistenceService.saveCruise(cruise, false, false); + + List<String> fishingOperationIds = persistenceService.getAllFishingOperationIds(savedCruise.getId()); + importContext.addStepsInProgressionModel(fishingOperationIds.size()); + + for (String fishingOperationId : fishingOperationIds) { + + FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); + importContext.increments(t("tutti.service.genericFormat.remove.existingCruise.fishingOperation", cruiseStr, fishingOperationDecorator.toString(fishingOperation))); + + persistenceService.deleteFishingOperation(fishingOperationId); + + } + } - importContext.increments(t("tutti.service.genericFormat.persist.cruise", cruiseStr)); - Cruise savedCruise = persistenceService.createCruise(cruise); - importContext.addImportedCruise(savedCruise); + + importContext.addImportedCruise(savedCruise, !createCruise); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSurvey.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSurvey.java index a96b13a..2470218 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSurvey.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSurvey.java @@ -34,7 +34,8 @@ public class CsvConsumerForSurvey extends CsvComsumer<SurveyRow, SurveyModel> { Cruise cruise = bean.getCruise(); - if (importContext.isCruiseAlreadyExists(cruise)) { + Cruise existingCruise = importContext.getExistingCruise(cruise); + if (!(existingCruise == null || importContext.getImportRequest().isOverrideData())) { addCheckError(row, new CruiseAlreadyExistException(cruise)); @@ -44,6 +45,12 @@ public class CsvConsumerForSurvey extends CsvComsumer<SurveyRow, SurveyModel> { } else { + if (existingCruise != null) { + + cruise.setId(existingCruise.getId()); + + } + NuitonValidatorResult nuitonValidatorResult = importContext.getValidationHelper().validateCruise(cruise); if (nuitonValidatorResult.hasFatalMessages()) { diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index 860aeb9..9e91655 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -166,6 +166,7 @@ tutti.service.genericFormat.invalid.cruise=Erreur d'élévation de poids sur les tutti.service.genericFormat.invalid.fishingOperation=<li>L'élévation des poids ne peut pas être réalisée sur le trait %s, pour la raison suivante \:<ul><li>%s</li></ul></li> tutti.service.genericFormat.load.protocol=Import du protocol tutti.service.genericFormat.persist.cruise=Sauvegarde de la campagne <strong>%s</strong> +tutti.service.genericFormat.remove.existingCruise.fishingOperation=Suppression du trait <strong>%s</strong> - <strong>%s</strong> tutti.service.genericFormat.persist.gearCaracteristics=Sauvegarde des caractéristiques des engins de la campagne <strong>%s</strong> tutti.service.genericFormat.persist.operation=Sauvegarde du trait <strong>%s</strong> - <strong>%s</strong> tutti.service.genericFormat.persist.operation.accidentalBatches=Sauvegarde des captures accidentelles du trait <strong>%s</strong> - <strong>%s</strong> diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportServiceTest.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportServiceTest.java index 7024e1d..66bef66 100644 --- a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportServiceTest.java +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportServiceTest.java @@ -1,6 +1,9 @@ package fr.ifremer.tutti.service.genericformat; import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder; import fr.ifremer.tutti.service.ServiceDbResource; import fr.ifremer.tutti.service.referential.ReferentialTemporaryGearService; import fr.ifremer.tutti.service.referential.ReferentialTemporaryPersonService; @@ -11,9 +14,11 @@ import org.apache.commons.logging.LogFactory; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.nuiton.jaxx.application.ApplicationBusinessException; import java.io.File; import java.io.IOException; +import java.util.List; /** * Created on 2/15/15. @@ -105,4 +110,109 @@ public class GenericFormatImportServiceTest extends GenericFormatImportServiceTe Assert.assertEquals(4, temporaryVesselService.getTemporaryVessels().size()); } + + @Test + public void testImportNoOverride() throws IOException { + + ServiceDbResource.DataContext dataContext = getServiceDbResource().loadContext(PROGRAM_ID); + + File archiveFile = createArchive("empty.zip", "technical", "protocol", "empty", "onlyCruise"); + + GenericFormatImportConfiguration importConfiguration = new GenericFormatImportConfiguration(); + importConfiguration.setImportFile(archiveFile); + importConfiguration.setProgramId(dataContext.program.getId()); + + + int nbSteps = service.getImportProgramNbSteps(importConfiguration); + + { + ProgressionModel progressionModel = new ProgressionModel(); + progressionModel.adaptTotal(nbSteps); + + if (log.isInfoEnabled()) { + log.info("Will do import in " + nbSteps + " steps"); + } + + { + List<String> cruiseId = persistenceService.getAllCruiseId(PROGRAM_ID); + Assert.assertEquals(0, cruiseId.size()); + } + + service.importProgram(importConfiguration, progressionModel); + + assertCruiseInserted(); + } + + { + ProgressionModel progressionModel = new ProgressionModel(); + progressionModel.adaptTotal(nbSteps); + + if (log.isInfoEnabled()) { + log.info("Will do import in " + nbSteps + " steps"); + } + try { + service.importProgram(importConfiguration, progressionModel); + Assert.fail("Can't override cruise if overrideData to false"); + } catch (ApplicationBusinessException e) { + Assert.assertTrue(true); + } + } + + { + ProgressionModel progressionModel = new ProgressionModel(); + progressionModel.adaptTotal(nbSteps); + + if (log.isInfoEnabled()) { + log.info("Will do import in " + nbSteps + " steps"); + } + + importConfiguration.setOverrideData(true); + service.importProgram(importConfiguration, progressionModel); + + assertCruiseInserted(); + + } + + } + + protected void assertCruiseInserted() { + List<String> cruiseIds = persistenceService.getAllCruiseId(PROGRAM_ID); + Assert.assertEquals(1, cruiseIds.size()); + + Cruise cruise = persistenceService.getCruise(cruiseIds.get(0)); + Assert.assertNotNull(cruise); + Assert.assertEquals(4, cruise.sizeGear()); + + { + GearWithOriginalRankOrder gear = cruise.getGear(0); + Assert.assertEquals(379, (int) gear.getIdAsInt()); + + CaracteristicMap gearCaracteristics = persistenceService.getGearCaracteristics(cruise.getId(), gear.getId(), gear.getRankOrder()); + Assert.assertEquals(0, gearCaracteristics.size()); + } + + { + GearWithOriginalRankOrder gear = cruise.getGear(1); + Assert.assertEquals(381, (int) gear.getIdAsInt()); + + CaracteristicMap gearCaracteristics = persistenceService.getGearCaracteristics(cruise.getId(), gear.getId(), gear.getRankOrder()); + Assert.assertEquals(0, gearCaracteristics.size()); + } + + { + GearWithOriginalRankOrder gear = cruise.getGear(2); + Assert.assertEquals(64, (int) gear.getIdAsInt()); + + CaracteristicMap gearCaracteristics = persistenceService.getGearCaracteristics(cruise.getId(), gear.getId(), gear.getRankOrder()); + Assert.assertEquals(2, gearCaracteristics.size()); + } + + { + GearWithOriginalRankOrder gear = cruise.getGear(3); + Assert.assertEquals(64, (int) gear.getIdAsInt()); + + CaracteristicMap gearCaracteristics = persistenceService.getGearCaracteristics(cruise.getId(), gear.getId(), gear.getRankOrder()); + Assert.assertEquals(0, gearCaracteristics.size()); + } + } } diff --git a/tutti-service/src/test/resources/genericFormat/onlyCruise/gearCaracteristics.csv b/tutti-service/src/test/resources/genericFormat/onlyCruise/gearCaracteristics.csv new file mode 100644 index 0000000..a150b41 --- /dev/null +++ b/tutti-service/src/test/resources/genericFormat/onlyCruise/gearCaracteristics.csv @@ -0,0 +1,3 @@ +Annee;Serie;Serie_Partielle;Engin;Rang_Engin;Code_PMFM;Libelle_PMFM;Valeur;Serie_Id;Engin_Id;Valeur_Id +2014;Campagne EVHOE;1;Dragues à main manoeuvrées à partir du bateau;3;1391;Accessibilité au poisson - enquête - totale - Observation par un observateur;Bonne;CAM-EVHOE;64;1752 +2014;Campagne EVHOE;1;Dragues à main manoeuvrées à partir du bateau;3;46;Algorithme de déterminaison - marée - totale - Estimation algorithme SACROIS;3a - N VMS - 1 LB (VMS validées);CAM-EVHOE;64;172 \ No newline at end of file diff --git a/tutti-service/src/test/resources/genericFormat/onlyCruise/survey.csv b/tutti-service/src/test/resources/genericFormat/onlyCruise/survey.csv new file mode 100644 index 0000000..8090b4c --- /dev/null +++ b/tutti-service/src/test/resources/genericFormat/onlyCruise/survey.csv @@ -0,0 +1,2 @@ +Annee;Serie;Serie_Partielle;Navire;Nombre_Poches;Pays;Zone_Etude;Campagne;Id_Sismer;Date_Deb_Campagne;Port_Deb_Campagne;Date_Fin_Campagne;Port_Fin_Campagne;Chef_Mission;Resp_Salle_Tri;Commentaire;Serie_Id;Navire_Id;Engin_Id;Port_Deb_Campagne_Id;Port_Fin_Campagne_Id;Chef_Mission_Id;Resp_Salle_Tri_Id +2014;Campagne EVHOE;1;868095;1;FRA;EVHOE - Golfe de Gascogne / Mer Celtique;Campagne EVHOE 2014;;17/10/2014 07:00:00;Brest;01/12/2014 07:00:00;Brest;Jean-Pierre LEAUTE|Michele SALAUN|Lionel PAWLOWSKI;Erwan DUHAMEL|Nicolas CAROFF;;CAM-EVHOE;868095;379|381|64|64;530;530;143|70|2332;128|59 -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.