This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit cf014cddd57f570b0c06badc27c2f42f57ac74fe Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 1 19:49:22 2015 +0200 mise en place du rapport d'import + amélioration API d'import --- .../entities/data/FishingOperations.java | 2 +- .../genericformat/GenericFormatContextSupport.java | 8 +- .../GenericFormatImportCruiseContext.java | 18 +- .../GenericFormatImportCruiseResult.java | 63 +++--- .../GenericFormatImportOperationResult.java | 66 +++--- .../genericformat/GenericFormatImportResult.java | 69 +++--- .../GenericFormatValidateFileContext.java | 2 +- .../GenericformatImportPersistenceHelper.java | 15 +- .../importactions/DoCheckWeightAction.java | 2 +- .../importactions/DoCleanWeightAction.java | 2 +- .../importactions/ImportAccidentalCatchAction.java | 2 +- .../importactions/ImportCatchAction.java | 4 +- .../ImportIndividualObservationAction.java | 2 +- .../importactions/ImportMarineLitterAction.java | 2 +- .../importactions/ImportOperationAction.java | 24 +- .../importactions/ImportParameterAction.java | 2 +- .../resources/ftl/genericFormatImportReport_fr.ftl | 244 ++++++++++++--------- 17 files changed, 302 insertions(+), 225 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/data/FishingOperations.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/data/FishingOperations.java index 4f51874..c57c8f4 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/data/FishingOperations.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/data/FishingOperations.java @@ -66,7 +66,7 @@ public class FishingOperations extends AbstractFishingOperations { public static String getNaturalId(FishingOperation fishingOperation) { String cruiseId = Cruises.getNaturalId(fishingOperation.getCruise()); - String naturalId = cruiseId + fishingOperation.getStationNumber() + "--" + fishingOperation.getFishingOperationNumber() + "--" + fishingOperation.getMultirigAggregation(); + String naturalId = cruiseId + "--" + fishingOperation.getStationNumber() + "--" + fishingOperation.getFishingOperationNumber() + "--" + fishingOperation.getMultirigAggregation(); return naturalId; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatContextSupport.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatContextSupport.java index 12248f6..e3fc3f0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatContextSupport.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatContextSupport.java @@ -72,6 +72,7 @@ import java.io.Serializable; import java.nio.file.Path; import java.text.ParseException; import java.util.Collection; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; @@ -83,7 +84,7 @@ import java.util.Set; * @author Tony Chemit - chemit@codelutin.com * @since 3.13 */ -public abstract class GenericFormatContextSupport implements Closeable { +public abstract class GenericFormatContextSupport implements Closeable, Iterable<GenericFormatImportCruiseContext> { private final GenericFormatImportRequest importRequest; @@ -207,6 +208,11 @@ public abstract class GenericFormatContextSupport implements Closeable { } + @Override + public Iterator<GenericFormatImportCruiseContext> iterator() { + return ImmutableSet.copyOf(cruiseContexts.values()).iterator(); + } + public boolean isArchiveLayoutValid() { return CollectionUtils.isEmpty(archiveLayoutErrors); } 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 4a98128..ab06f31 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 @@ -39,8 +39,9 @@ import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport import java.io.Closeable; import java.io.Serializable; -import java.util.Collection; +import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; @@ -52,7 +53,7 @@ import java.util.TreeMap; * @author Tony Chemit - chemit@codelutin.com * @since 3.14 */ -public class GenericFormatImportCruiseContext implements Closeable { +public class GenericFormatImportCruiseContext implements Closeable, Iterable<GenericFormatImportOperationContext> { /** * The imported cruise. @@ -83,11 +84,11 @@ public class GenericFormatImportCruiseContext implements Closeable { this.cruise = cruise; this.selectiontCruiseData = selectiontCruiseData; this.existingCruiseData = existingCruiseData; - this.existingOperations = existingOperations; + this.existingOperations = existingOperations == null ? Collections.<FishingOperation>emptySet() : existingOperations; this.cruiseLabel = cruiseLabel; this.fishingOperationContexts = new TreeMap<>(); this.gearsWithcaracteristics = new HashSet<>(); - this.skippedFishingOperationsNaturalId = new LinkedHashSet<>(); + this.skippedFishingOperationsNaturalId = new LinkedHashSet<>(); } @Override @@ -100,6 +101,11 @@ public class GenericFormatImportCruiseContext implements Closeable { } + @Override + public Iterator<GenericFormatImportOperationContext> iterator() { + return ImmutableList.copyOf(fishingOperationContexts.values()).iterator(); + } + public Cruise getCruise() { return cruise; } @@ -213,10 +219,6 @@ public class GenericFormatImportCruiseContext implements Closeable { } - public Collection<GenericFormatImportOperationContext> getFishingOperationContexts() { - return ImmutableList.copyOf(fishingOperationContexts.values()); - } - public Iterable<FishingOperation> getFishingOperations() { return Iterables.transform(fishingOperationContexts.values(), GenericFormatImportOperationContext.TO_FISHING_OPERATION_FUNCTION); } 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 76d66b2..2e824fc 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 @@ -24,17 +24,12 @@ package fr.ifremer.tutti.service.genericformat; * #L% */ -import com.google.common.base.Function; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; import fr.ifremer.tutti.persistence.entities.data.Cruise; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import java.io.Serializable; -import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; -import java.util.Set; /** * Created on 2/22/15. @@ -42,56 +37,70 @@ import java.util.Set; * @author Tony Chemit - chemit@codelutin.com * @since 3.14 */ -public class GenericFormatImportCruiseResult implements Serializable { +public class GenericFormatImportCruiseResult implements Serializable, Iterable<GenericFormatImportOperationResult> { private static final long serialVersionUID = 1L; - public static final Function<GenericFormatImportCruiseResult, Cruise> TO_CRUISE_FUNCTION = new Function<GenericFormatImportCruiseResult, Cruise>() { - @Override - public Cruise apply(GenericFormatImportCruiseResult input) { - return input.getCruise(); - } - }; + private final Map<String, GenericFormatImportOperationResult> fishingOperationResults; private final Cruise cruise; private final boolean override; - private final Map<String, GenericFormatImportOperationResult> fishingOperationResults; + private final String label; - public GenericFormatImportCruiseResult(GenericFormatImportCruiseContext cruiseContext) { + private int nbOperationsCreated; + + private int nbOperationsUpdated; + public GenericFormatImportCruiseResult(GenericFormatImportCruiseContext cruiseContext) { + label = cruiseContext.getCruiseLabel(); this.cruise = cruiseContext.getCruise(); - this.override = cruiseContext.getExistingCruiseData()!=null; + this.override = cruiseContext.getExistingCruiseData() != null; this.fishingOperationResults = new HashMap<>(); - for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext operationContext : cruiseContext) { GenericFormatImportOperationResult operationResult = new GenericFormatImportOperationResult(operationContext); fishingOperationResults.put(operationContext.getFishingOperation().getId(), operationResult); + if (operationContext.isOverride()) { + nbOperationsUpdated++; + } else { + nbOperationsCreated++; + + } } } - public Cruise getCruise() { - return cruise; + public String getLabel() { + return label; } - public boolean isOverride() { - return override; + public String getId() { + return cruise.getId(); + } + + public int getNbOperationsCreated() { + return nbOperationsCreated; } - public GenericFormatImportOperationResult getFishingOperationResult(String fishingOperationId) { - return fishingOperationResults.get(fishingOperationId); + public int getNbOperationsUpdated() { + return nbOperationsUpdated; } - public Collection<String> getFishingOperationIds() { - return fishingOperationResults.keySet(); + public Cruise getCruise() { + return cruise; + } + + public boolean isOverride() { + return override; } - public Set<FishingOperation> getFishingOperations() { - return ImmutableSet.copyOf(Iterables.transform(fishingOperationResults.values(), GenericFormatImportOperationResult.TO_FISHING_OPERATION_FUNCTION)); + @Override + public Iterator<GenericFormatImportOperationResult> iterator() { + return fishingOperationResults.values().iterator(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationResult.java index 85c9f02..aec4abd 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationResult.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationResult.java @@ -24,13 +24,11 @@ package fr.ifremer.tutti.service.genericformat; * #L% */ -import com.google.common.base.Function; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import org.apache.commons.lang3.BooleanUtils; import java.io.Serializable; -import java.util.LinkedHashSet; -import java.util.Set; /** * Created on 2/22/15. @@ -40,24 +38,17 @@ import java.util.Set; */ public class GenericFormatImportOperationResult implements Serializable { - public static final Function<GenericFormatImportOperationResult, FishingOperation> TO_FISHING_OPERATION_FUNCTION = new Function<GenericFormatImportOperationResult, FishingOperation>() { - @Override - public FishingOperation apply(GenericFormatImportOperationResult input) { - return input.getFishingOperation(); - } - }; - private static final long serialVersionUID = 1L; - private final Set<String> checkErrors; - private final FishingOperation fishingOperation; private final CatchBatch catchBatch; - private int nbGearFeautres; + private final String label; + + private int nbGearFeatures; - private int nbVesselFeautres; + private int nbVesselFeatures; private int nbAccidentalCatches; @@ -77,9 +68,9 @@ public class GenericFormatImportOperationResult implements Serializable { public GenericFormatImportOperationResult(GenericFormatImportOperationContext operationContext) { this.fishingOperation = operationContext.getFishingOperation(); + this.label = operationContext.getFishingOperationLabel(); this.override = operationContext.isOverride(); this.catchBatch = operationContext.getCatchBatch(); - this.checkErrors = new LinkedHashSet<>(); flushContext(operationContext); } @@ -87,12 +78,36 @@ public class GenericFormatImportOperationResult implements Serializable { return override; } - public void addCheckError(String error) { - checkErrors.add(error); + public String getLabel() { + return label; + } + + public String getId() { + return fishingOperation.getId(); + } + + public boolean isValid() { + return BooleanUtils.isTrue(fishingOperation.getFishingOperationValid()); + } + + public Float getCatchTotalWeight() { + return catchBatch.getCatchTotalWeight(); + } + + public int getNbSpeciesTaxon() { + return nbSpeciesBatchesVrac + nbSpeciesBatchesHorsVrac; + } + + public int getNbBenthosTaxon() { + return nbBenthosBatchesVrac + nbBenthosBatchesHorsVrac; + } + + public boolean isWithAccidentalCatches() { + return nbAccidentalCatches > 0; } - public Set<String> getCheckErrors() { - return checkErrors; + public boolean isWithMarineLitter() { + return nbMarineLitters > 0; } public FishingOperation getFishingOperation() { @@ -103,12 +118,12 @@ public class GenericFormatImportOperationResult implements Serializable { return catchBatch; } - public int getNbGearFeautres() { - return nbGearFeautres; + public int getNbGearFeatures() { + return nbGearFeatures; } - public int getNbVesselFeautres() { - return nbVesselFeautres; + public int getNbVesselFeatures() { + return nbVesselFeatures; } public int getNbAccidentalCatches() { @@ -143,10 +158,10 @@ public class GenericFormatImportOperationResult implements Serializable { //TODO See what else to set here (catch stuff ?) if (operationContext.withGearFeatures()) { - nbGearFeautres = operationContext.getGearUseFeatures().size(); + nbGearFeatures = operationContext.getGearUseFeatures().size(); } if (operationContext.withVesselFeatures()) { - nbVesselFeautres = operationContext.getVesselUseFeatures().size(); + nbVesselFeatures = operationContext.getVesselUseFeatures().size(); } if (operationContext.withAccidentalBatches()) { nbAccidentalCatches = operationContext.getAccidentalBatches().size(); @@ -170,7 +185,6 @@ public class GenericFormatImportOperationResult implements Serializable { if (operationContext.withBenthosBatches(false)) { nbBenthosBatchesHorsVrac = operationContext.getBenthosBatches(false).size(); } - checkErrors.addAll(operationContext.getCheckErrors()); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportResult.java index e21aac1..6759e3f 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportResult.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportResult.java @@ -24,16 +24,11 @@ package fr.ifremer.tutti.service.genericformat; * #L% */ -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; import fr.ifremer.tutti.persistence.entities.data.Cruise; -import fr.ifremer.tutti.persistence.entities.data.Cruises; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; -import java.util.Set; /** * Created on 2/11/15. @@ -47,60 +42,54 @@ public class GenericFormatImportResult extends GenericFormatResultSupport { private final Map<String, GenericFormatImportCruiseResult> cruiseResults; + private int nbCruisesCreated; + + private int nbCruisesUpdated; + + private int nbOperationsCreated; + + private int nbOperationsUpdated; + public GenericFormatImportResult(GenericFormatImportContext importContext) { super(importContext); - this.cruiseResults = new LinkedHashMap<>(); - } - public Set<Cruise> getImportedCruises() { - return ImmutableSet.copyOf(Iterables.transform(cruiseResults.values(), GenericFormatImportCruiseResult.TO_CRUISE_FUNCTION)); - } + this.cruiseResults = new LinkedHashMap<>(); - public Cruise getCruise(Cruise importRowCruise) { + for (GenericFormatImportCruiseContext cruiseContext : importContext) { - Cruise result = null; - for (GenericFormatImportCruiseResult importCruiseResult : cruiseResults.values()) { + Cruise cruise = cruiseContext.getCruise(); + GenericFormatImportCruiseResult cruiseResult = new GenericFormatImportCruiseResult(cruiseContext); + cruiseResults.put(cruise.getId(), cruiseResult); - Cruise cruise = importCruiseResult.getCruise(); - boolean equals = Cruises.equals(importRowCruise, cruise); - if (equals) { - result = cruise; - break; + if (cruiseResult.isOverride()) { + nbCruisesUpdated++; + } else { + nbCruisesCreated++; } - + nbOperationsCreated += cruiseResult.getNbOperationsCreated(); + nbOperationsUpdated += cruiseResult.getNbOperationsUpdated(); } - return result; } - public GenericFormatImportCruiseResult getImportedCruiseResult(String cruiseId) { - return cruiseResults.get(cruiseId); + public Collection<GenericFormatImportCruiseResult> getCruiseResults() { + return cruiseResults.values(); } - public Set<FishingOperation> getImportedFishingOperations(Cruise cruise) { - GenericFormatImportCruiseResult importCruiseResult = getImportedCruiseResult(cruise.getId()); - return ImmutableSet.copyOf(importCruiseResult.getFishingOperations()); + public int getNbCruisesCreated() { + return nbCruisesCreated; } - public Collection<String> getImportedFishingOperationIds(Cruise cruise) { - GenericFormatImportCruiseResult importCruiseResult = getImportedCruiseResult(cruise.getId()); - return ImmutableSet.copyOf(importCruiseResult.getFishingOperationIds()); + public int getNbCruisesUpdated() { + return nbCruisesUpdated; } - public void addFishingOperationCheckError(Cruise cruise, String fishingOperationId, String checkError) { - - GenericFormatImportCruiseResult importedCruiseResult = getImportedCruiseResult(cruise.getId()); - GenericFormatImportOperationResult fishingOperationResult = importedCruiseResult.getFishingOperationResult(fishingOperationId); - fishingOperationResult.addCheckError(checkError); - + public int getNbOperationsCreated() { + return nbOperationsCreated; } - public void flushContext(GenericFormatImportCruiseContext cruiseContext) { - - Cruise cruise = cruiseContext.getCruise(); - GenericFormatImportCruiseResult cruiseResult = new GenericFormatImportCruiseResult(cruiseContext); - cruiseResults.put(cruise.getId(), cruiseResult); - + public int getNbOperationsUpdated() { + return nbOperationsUpdated; } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatValidateFileContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatValidateFileContext.java index ce8dd46..949f244 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatValidateFileContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatValidateFileContext.java @@ -82,7 +82,7 @@ public class GenericFormatValidateFileContext extends GenericFormatContextSuppor Set<OperationDataModel> operations = new LinkedHashSet<>(); - for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) { FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); // Add a natural Id as id (used in import to find which cruise to import) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersistenceHelper.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersistenceHelper.java index 3b1aac4..afe9ee4 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersistenceHelper.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersistenceHelper.java @@ -147,8 +147,19 @@ public class GenericformatImportPersistenceHelper { } public String getCatchBatchId(String operationId) { - CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(operationId); - return catchBatch.getId(); + boolean withCatchBatch = isWithCatchBatch(operationId); + String catchBatchId; + if (withCatchBatch) { + CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(operationId); + catchBatchId = catchBatch.getId(); + } else { + catchBatchId = null; + } + return catchBatchId; + } + + public boolean isWithCatchBatch(String operationId) { + return persistenceService.isFishingOperationWithCatchBatch(operationId); } public CatchBatch createCatchBatch(CatchBatch catchBatch) { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCheckWeightAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCheckWeightAction.java index b6b365f..d37fec9 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCheckWeightAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCheckWeightAction.java @@ -74,7 +74,7 @@ public class DoCheckWeightAction extends ImportActionSupport { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext operationContext : cruiseContext) { progressionModel.increments(t("tutti.service.genericFormat.checkWeights.fishingOperation", cruiseContext.getCruiseLabel(), operationContext.getFishingOperationLabel())); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCleanWeightAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCleanWeightAction.java index 899b21e..2cbc303 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCleanWeightAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCleanWeightAction.java @@ -73,7 +73,7 @@ public class DoCleanWeightAction extends ImportActionSupport { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext operationContext : cruiseContext) { progressionModel.increments(t("tutti.service.genericFormat.cleanWeights.fishingOperation", cruiseContext.getCruiseLabel(), operationContext.getFishingOperationLabel())); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportAccidentalCatchAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportAccidentalCatchAction.java index 10c1f38..33623c3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportAccidentalCatchAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportAccidentalCatchAction.java @@ -114,7 +114,7 @@ public class ImportAccidentalCatchAction extends ImportActionSupport { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) { boolean override = fishingOperationContext.isOverride(); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportCatchAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportCatchAction.java index 79c2c83..e99659d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportCatchAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportCatchAction.java @@ -121,7 +121,7 @@ public class ImportCatchAction extends ImportActionSupport { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) { boolean override = fishingOperationContext.isOverride(); @@ -214,7 +214,7 @@ public class ImportCatchAction extends ImportActionSupport { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) { boolean override = fishingOperationContext.isOverride(); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportIndividualObservationAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportIndividualObservationAction.java index 946731a..70c3a6d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportIndividualObservationAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportIndividualObservationAction.java @@ -114,7 +114,7 @@ public class ImportIndividualObservationAction extends ImportActionSupport { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) { boolean override = fishingOperationContext.isOverride(); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportMarineLitterAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportMarineLitterAction.java index d052502..887cb2b 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportMarineLitterAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportMarineLitterAction.java @@ -114,7 +114,7 @@ public class ImportMarineLitterAction extends ImportActionSupport { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) { boolean override = fishingOperationContext.isOverride(); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportOperationAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportOperationAction.java index a90370d..d6c38f4 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportOperationAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportOperationAction.java @@ -220,12 +220,28 @@ public class ImportOperationAction extends ImportActionSupport { } FishingOperation updatedFishingOperation = persistenceHelper.saveFishingOperation(fishingOperation); - - String existingCatchBatchId = persistenceHelper.getCatchBatchId(updatedFishingOperation.getId()); - catchBatch.setId(existingCatchBatchId); catchBatch.setFishingOperation(updatedFishingOperation); - CatchBatch updatedCatchBatch = persistenceHelper.saveCatchBatch(catchBatch); + CatchBatch updatedCatchBatch; + + if (persistenceHelper.isWithCatchBatch(updatedFishingOperation.getId())) { + + String existingCatchBatchId = persistenceHelper.getCatchBatchId(updatedFishingOperation.getId()); + catchBatch.setId(existingCatchBatchId); + + if (log.isInfoEnabled()) { + log.info("Update catch batch (" + operationStr + "): " + existingCatchBatchId); + } + updatedCatchBatch = persistenceHelper.saveCatchBatch(catchBatch); + + } else { + + if (log.isInfoEnabled()) { + log.info("Create new catchBatch (" + operationStr + ")"); + } + updatedCatchBatch = persistenceHelper.createCatchBatch(catchBatch); + + } boolean importAttachments = importContext.getImportRequest().isImportAttachments(); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportParameterAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportParameterAction.java index a7c7975..02e1d03 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportParameterAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportParameterAction.java @@ -112,7 +112,7 @@ public class ImportParameterAction extends ImportActionSupport { boolean updateOperations = importContext.getImportRequest().isUpdateOperations(); - for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) { String cruiseStr = cruiseContext.getCruiseLabel(); String operationStr = fishingOperationContext.getFishingOperationLabel(); diff --git a/tutti-service/src/main/resources/ftl/genericFormatImportReport_fr.ftl b/tutti-service/src/main/resources/ftl/genericFormatImportReport_fr.ftl index bfa7bb9..ed711d4 100644 --- a/tutti-service/src/main/resources/ftl/genericFormatImportReport_fr.ftl +++ b/tutti-service/src/main/resources/ftl/genericFormatImportReport_fr.ftl @@ -209,7 +209,7 @@ </table> </#macro> -<#macro renderImportFileResult fileResult anchorName> +<#macro renderImportFileResult fileResult anchorName showDetail> <tr> <td>${fileResult.filename}</td> <td>${fileResult.mandatory?string('Oui', 'Non')}</td> @@ -231,7 +231,10 @@ <td class="unkwon"></td> <td class="unkwon"></td> </#if> + <td>${fileResult.linesCount}</td> + <#if showDetail> <td><a href="#${anchorName}">Détails</a></td> + </#if> </tr> </#macro> @@ -328,8 +331,53 @@ <li>Fichier: ${importConfiguration.importFile.name}</li> <li>Date - heure : ${startingDate?date?string.full} ${startingDate?time?string.short}</li> <li>Série de campagne: ${program.name}</li> + <li>Nombre de campagnes créées: ${nbCruisesCreated}</li> + <li>Nombre de campagnes mises à jour: ${nbCruisesUpdated}</li> + <li>Nombre de traits créés: ${nbOperationsCreated}</li> + <li>Nombre de campagnes mises à jour: ${nbOperationsUpdated}</li> +</ul> + +<h2>Configuration de l'import</h2> + +<ul> +<#if importConfiguration.overrideData><li>Écraser des données existantes</li></#if> +<#if importConfiguration.overrideProtocol><li>Remplacer le protocole existant</li></#if> +<#if importConfiguration.updateCruises><li>Mettre à jour les caractéristiques des campagnes existantes</li></#if> +<#if importConfiguration.updateOperations><li>Mettre à jour les caractéristiques des traits existants</li></#if> +<#if importConfiguration.importSpecies><li>Importer les lôts espèces</li></#if> +<#if importConfiguration.importBenthos><li>Importer les lôts benthos</li></#if> +<#if importConfiguration.importMarineLitter><li>Importer les lôts macro-déchets</li></#if> +<#if importConfiguration.importAccidentalCatch><li>Importer les captures accidentelles</li></#if> +<#if importConfiguration.importIndividualObservation><li>Importer les observations individuelles</li></#if> +<#if importConfiguration.importAttachments><li>Importer les pièces-jointes</li></#if> </ul> +<h2 class="nextPage"></h2> +<h2>Données sélectionnées à importer</h2> + +<ul> +<#list cruiseResults as cruiseResult> +<li> +<p>Campagne ${cruiseResult.label}<#if cruiseResult.override> (*)</#if> (<a href="#cruise_${cruiseResult.id}">Détails</a>) </p> +<ul> + <#list cruiseResult.iterator() as operationResult> + <li>Trait ${operationResult.label}<#if operationResult.override> (*)</#if> (<a href="#operation_${cruiseResult.id}_${operationResult.id}">Détails</a>)</li> + </#list> +</ul> +</li> +</#list> +</ul> + +<p>(*) donnée déjà existante.</p> + +<#if protocolFileResult.imported && protocolFileResult.valid> +<p>Un protocol nommé <span class="bold">${protocol.name}</span> a été importé et sélectionné pour l'import.</p> +</#if> + +<h2 class="nextPage"></h2> +<h2>Fichiers importés</h2> + +<h3>Référentiels temporaires importés</h3> <table align="center"> <thead> <tr> @@ -338,31 +386,103 @@ <th>Présent</th> <th>Importé</th> <th>Valide</th> + <th>Nombre de lignes</th> <th>Détail</th> </tr> </thead> <tbody> - <@renderImportFileResult fileResult=sampleCategoryFileResult anchorName="sampleCategoryFileResult"/> - <@renderImportFileResult fileResult=referentialTemporaryGearFileResult anchorName="referentialTemporaryGearFileResult"/> - <@renderImportFileResult fileResult=referentialTemporaryPersonFileResult anchorName="referentialTemporaryPersonFileResult"/> - <@renderImportFileResult fileResult=referentialTemporarySpeciesFileResult anchorName="referentialTemporarySpeciesFileResult"/> - <@renderImportFileResult fileResult=referentialTemporaryVesselFileResult anchorName="referentialTemporaryVesselFileResult"/> - <@renderImportFileResult fileResult=protocolFileResult anchorName="protocolFileResult"/> - <@renderImportFileResult fileResult=surveyFileResult anchorName="surveyFileResult"/> - <@renderImportFileResult fileResult=gearCaracteristicFileResult anchorName="gearCaracteristicFileResult"/> - <@renderImportFileResult fileResult=operationFileResult anchorName="operationFileResult"/> - <@renderImportFileResult fileResult=parameterFileResult anchorName="parameterFileResult"/> - <@renderImportFileResult fileResult=catchFileResult anchorName="catchFileResult"/> - <@renderImportFileResult fileResult=marineLitterFileResult anchorName="marineLitterFileResult"/> - <@renderImportFileResult fileResult=accidentalCatchFileResult anchorName="accidentalCatchFileResult"/> - <@renderImportFileResult fileResult=individualObservationFileResult anchorName="individualObservationFileResult"/> + <@renderImportFileResult fileResult=referentialTemporaryGearFileResult anchorName="referentialTemporaryGearFileResult" showDetail=true/> + <@renderImportFileResult fileResult=referentialTemporaryPersonFileResult anchorName="referentialTemporaryPersonFileResult" showDetail=true/> + <@renderImportFileResult fileResult=referentialTemporarySpeciesFileResult anchorName="referentialTemporarySpeciesFileResult" showDetail=true/> + <@renderImportFileResult fileResult=referentialTemporaryVesselFileResult anchorName="referentialTemporaryVesselFileResult" showDetail=true/> + </tbody> +</table> + +<h3>Fichiers de données importés</h3> +<table align="center"> + <thead> + <tr> + <th>Fichier</th> + <th>Obligatoire</th> + <th>Présent</th> + <th>Importé</th> + <th>Valide</th> + <th>Nombre de lignes</th> + </tr> + </thead> + <tbody> + <@renderImportFileResult fileResult=surveyFileResult anchorName="surveyFileResult" showDetail=false/> + <@renderImportFileResult fileResult=gearCaracteristicFileResult anchorName="gearCaracteristicFileResult" showDetail=false/> + <@renderImportFileResult fileResult=operationFileResult anchorName="operationFileResult" showDetail=false/> + <@renderImportFileResult fileResult=parameterFileResult anchorName="parameterFileResult" showDetail=false/> + <@renderImportFileResult fileResult=catchFileResult anchorName="catchFileResult" showDetail=false/> + <@renderImportFileResult fileResult=marineLitterFileResult anchorName="marineLitterFileResult" showDetail=false/> + <@renderImportFileResult fileResult=accidentalCatchFileResult anchorName="accidentalCatchFileResult" showDetail=false/> + <@renderImportFileResult fileResult=individualObservationFileResult anchorName="individualObservationFileResult" showDetail=false/> </tbody> </table> <h2 class="nextPage"></h2> -<h2>Modèle de catégorisation <a name="sampleCategoryFileResult"></a></h2> -<@renderImportFile fileResult=sampleCategoryFileResult/> +<#macro renderCruiseResult cruiseResult> +<h2>Campagne ${cruiseResult.label} <a name="cruise_${cruiseResult.id}"></a></h2> + +<ul> + <#if cruiseResult.override> + <li>Campagne mise à jour</li> + <#else> + <li>Campagne créee</li> + </#if> + <li>Date de début : ${cruiseResult.cruise.beginDate?date?string.full}</li> + <li>Date de fin : ${cruiseResult.cruise.endDate?date?string.full}</li> + <li>Nombre de taits créés : ${cruiseResult.nbOperationsCreated}</li> + <li>Nombre de taits mis à jour : ${cruiseResult.nbOperationsUpdated}</li> + <li>Navire : ${cruiseResult.cruise.vessel.registrationCode} - ${cruiseResult.cruise.vessel.internationalRegistrationCode} </li> + <li>Engins : + <ul> + <#list cruiseResult.cruise.gear as gear> + <li>Engin importé : ${gear.label}</li> + </#list> + </ul> + </li> +</ul> + +<table align="center"> + <thead> + <tr> + <th>Trait</th> + <th>Valide</th> + <th>Poids total capture</th> + <th>Nb de taxons Espèce</th> + <th>Nb de taxons Benthos</th> + <th>Nb d'observations individuelles</th> + <th>Captures accidentelles</th> + <th>Macro-déchets</th> + </tr> + </thead> + <tbody> + <#list cruiseResult.iterator() as operationResult> + <tr> + <td>${operationResult.label} <a name="operation_${cruiseResult.id}_${operationResult.id}"></a></td> + <td>${operationResult.valid?string('Oui', 'Non')}</td> + <td>${operationResult.catchTotalWeight!'NA'}</td> + <td>${operationResult.nbSpeciesTaxon}</td> + <td>${operationResult.nbBenthosTaxon}</td> + <td>${operationResult.nbIndividualObservations}</td> + <td>${operationResult.withAccidentalCatches?string('Oui', 'Non')}</td> + <td>${operationResult.withMarineLitter?string('Oui', 'Non')}</td> + </tr> + </#list> + </tbody> +</table> + + <h2 class="nextPage"></h2> + +</#macro> + +<#list cruiseResults as cruiseResult> + <@renderCruiseResult cruiseResult=cruiseResult/> +</#list> <h2 class="nextPage"></h2> @@ -408,95 +528,5 @@ <@renderReferentialVesselList title="Navires associés" entries=fileResult.entitiesLinkedEntries/> </#if> -<h2 class="nextPage"></h2> - -<h2>Protocole <a name="protocolFileResult"></a></h2> -<#assign fileResult = protocolFileResult> -<@renderSimpleImportFile fileResult=fileResult/> - -<#if fileResult.imported && fileResult.valid> -<p>Un protocol nommé ${protocol.name} a été importé et sélectionné pour l'import.</p> -</#if> - -<h2 class="nextPage"></h2> - -<h2>Fichier des campagnes <a name="surveyFileResult"></a></h2> -<#assign fileResult = surveyFileResult> -<@renderImportFile fileResult=fileResult/> -<#if fileResult.valid> -<p>Des campagnes ont été importées.</p> -<strong>TODO</strong> -</#if> - -<h2 class="nextPage"></h2> - -<h2>Fichier des mises en oeuvre d'engin <a name="gearCaracteristicFileResult"></a></h2> -<#assign fileResult = gearCaracteristicFileResult> -<@renderImportFile fileResult=fileResult/> -<#if fileResult.valid> -<p>Des mises en oeuvre d'engin ont été importées.</p> -<strong>TODO</strong> -</#if> - -<h2 class="nextPage"></h2> - -<h2>Fichier des traits <a name="operationFileResult"></a></h2> -<#assign fileResult = operationFileResult> -<@renderImportFile fileResult=fileResult/> -<#if fileResult.valid> -<p>Des traits ont été importés.</p> -<strong>TODO</strong> -</#if> - -<h2 class="nextPage"></h2> - -<h2>Fichier des caractéristiques de trait <a name="parameterFileResult"></a></h2> -<#assign fileResult = parameterFileResult> -<@renderImportFile fileResult=fileResult/> -<#if fileResult.valid> -<p>Des caractéristiques de trait ont été importées.</p> -<strong>TODO</strong> -</#if> - -<h2 class="nextPage"></h2> - -<h2>Fichier des lôts capture <a name="catchFileResult"></a></h2> -<#assign fileResult = catchFileResult> -<@renderImportFile fileResult=fileResult/> -<#if fileResult.valid> -<p>Des lôts capture ont été importées.</p> -<strong>TODO</strong> -</#if> - -<h2 class="nextPage"></h2> - -<h2>Fichier des macro déchets <a name="marineLitterFileResult"></a></h2> -<#assign fileResult = marineLitterFileResult> -<@renderImportFile fileResult=fileResult/> -<#if fileResult.valid> -<p>Des macro déchets ont été importés.</p> -<strong>TODO</strong> -</#if> - -<h2 class="nextPage"></h2> - -<h2>Fichier des captures accidentelles <a name="accidentalCatchFileResult"></a></h2> -<#assign fileResult = accidentalCatchFileResult> -<@renderImportFile fileResult=fileResult/> -<#if fileResult.valid> -<p>Des captures accidentelles ont été importées.</p> -<strong>TODO</strong> -</#if> - -<h2 class="nextPage"></h2> - -<h2>Fichier des observations individuelles <a name="individualObservationFileResult"></a></h2> -<#assign fileResult = individualObservationFileResult> -<@renderImportFile fileResult=fileResult/> -<#if fileResult.valid> -<p>Des observations individuelles ont été importées.</p> -<strong>TODO</strong> -</#if> - </body> </html> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.