This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 919567bb552e259bc94180a16209b5d23a97b799 Author: Benjamin POUSSIN <poussin@codelutin.com> Date: Wed Jun 15 18:41:59 2016 +0200 fixes #8335 --- .../GenericFormatImportOperationContext.java | 21 ++++++++-- .../GenericFormatImportOperationResult.java | 12 ++++-- .../GenericformatImportPersistenceHelper.java | 3 +- .../ImportIndividualObservationAction.java | 45 ++++++++++++++-------- .../resources/ftl/genericFormatImportReport_fr.ftl | 7 +++- 5 files changed, 64 insertions(+), 24 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationContext.java index b262a20..0b23063 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationContext.java @@ -39,19 +39,19 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchs; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.model.OperationDataModel; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; - import java.io.Closeable; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; /** * Created on 2/20/15. @@ -75,8 +75,12 @@ public class GenericFormatImportOperationContext implements Closeable { private final Map<Integer, AccidentalBatch> accidentalBatchesById; + /** all observation available in imported file */ private final Map<Integer, IndividualObservationBatch> individualObservationBatchesById; + /** valid observation realy imported in database */ + private List<IndividualObservationBatch> individualObservationBatchImported; + private final Map<Integer, SpeciesBatch> vracSpeciesBatches; private final Map<Integer, SpeciesBatch> horsVracSpeciesBatches; @@ -119,6 +123,7 @@ public class GenericFormatImportOperationContext implements Closeable { this.marineLitterBatches = new ArrayList<>(); this.accidentalBatchesById = new TreeMap<>(); this.individualObservationBatchesById = new TreeMap<>(); + this.individualObservationBatchImported = Collections.emptyList(); this.vracSpeciesBatches = new TreeMap<>(); this.horsVracSpeciesBatches = new TreeMap<>(); this.speciesFrequencies = ArrayListMultimap.create(); @@ -249,6 +254,14 @@ public class GenericFormatImportOperationContext implements Closeable { return ImmutableList.copyOf(individualObservationBatchesById.values()); } + public List<IndividualObservationBatch> getIndividualObservationBatchImported() { + return individualObservationBatchImported; + } + + public void setIndividualObservationBatchImported(List<IndividualObservationBatch> imported) { + individualObservationBatchImported = imported; + } + public int getNbSpeciesTaxon() { Set<Species> speciesSet = new HashSet<>(); SpeciesBatchs.grabSpeciesChildBatchs(vracSpeciesBatches.values(), speciesSet); @@ -306,6 +319,7 @@ public class GenericFormatImportOperationContext implements Closeable { vesselUseFeatures.clear(); marineLitterBatches.clear(); individualObservationBatchesById.clear(); + individualObservationBatchImported.clear(); accidentalBatchesById.clear(); benthosFrequencies.clear(); vracBenthosBatches.clear(); @@ -344,5 +358,6 @@ public class GenericFormatImportOperationContext implements Closeable { public boolean isWeightsDeleted() { return weightsDeleted; } + } 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 034c8c6..c1ad783 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 @@ -26,11 +26,10 @@ package fr.ifremer.tutti.service.genericformat; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.BooleanUtils; - import java.io.Serializable; import java.util.Set; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; /** * Created on 2/22/15. @@ -62,6 +61,8 @@ public class GenericFormatImportOperationResult implements Serializable { private int nbIndividualObservations; + private int nbIndividualObservationsImported; + private int nbSpeciesTaxon; private int nbBenthosTaxon; @@ -157,6 +158,10 @@ public class GenericFormatImportOperationResult implements Serializable { return nbIndividualObservations; } + public int getNbIndividualObservationsImported() { + return nbIndividualObservationsImported; + } + public int getNbSpeciesTaxon() { return nbSpeciesTaxon; } @@ -182,6 +187,7 @@ public class GenericFormatImportOperationResult implements Serializable { } if (operationContext.withIndividualObservationBatches()) { nbIndividualObservations = operationContext.getIndividualObservationBatches().size(); + nbIndividualObservationsImported = operationContext.getIndividualObservationBatchImported().size(); } if (operationContext.withSpeciesBatches(true)) { 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 507ec87..44ecb2f 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 @@ -24,7 +24,6 @@ package fr.ifremer.tutti.service.genericformat; * #L% */ -import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; @@ -292,7 +291,7 @@ public class GenericformatImportPersistenceHelper { persistenceService.deleteAllIndividualObservationsForFishingOperation(fishingOperationId); } - public List<IndividualObservationBatch> createIndividualObservationBatch(FishingOperation fishingOperation, ImmutableList<IndividualObservationBatch> individualObservationBatch) { + public List<IndividualObservationBatch> createIndividualObservationBatch(FishingOperation fishingOperation, List<IndividualObservationBatch> individualObservationBatch) { return persistenceService.createIndividualObservationBatches(fishingOperation, individualObservationBatch); } 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 5d4a3ec..4d84aee 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 @@ -37,17 +37,16 @@ import fr.ifremer.tutti.service.genericformat.GenericformatImportPersistenceHelp import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForIndividualObservation; import fr.ifremer.tutti.service.genericformat.csv.AttachmentRow; import fr.ifremer.tutti.service.genericformat.csv.IndividualObservationRow; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.ImportRow; import org.nuiton.csv.ImportRuntimeException; import org.nuiton.jaxx.application.ApplicationTechnicalException; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Objects; - import static org.nuiton.i18n.I18n.t; /** @@ -153,8 +152,8 @@ public class ImportIndividualObservationAction extends ImportActionSupport { if (log.isInfoEnabled()) { log.info("Persist " + individualObservationBatches.size() + " individual observation(s) of " + operationStr + " for cruise: " + cruiseStr); } - persistIndividualObservationBatches(fishingOperationContext, individualObservationBatches); - + List<IndividualObservationBatch> imported = persistIndividualObservationBatches(fishingOperationContext, individualObservationBatches); + fishingOperationContext.setIndividualObservationBatchImported(imported); } } @@ -168,29 +167,45 @@ public class ImportIndividualObservationAction extends ImportActionSupport { } - private void persistIndividualObservationBatches(GenericFormatImportOperationContext fishingOperationContext, ImmutableList<IndividualObservationBatch> batches) { + private List<IndividualObservationBatch> persistIndividualObservationBatches(GenericFormatImportOperationContext fishingOperationContext, ImmutableList<IndividualObservationBatch> batches) { + + // https://forge.codelutin.com/issues/8335 + // Certain observation individuelle ne sont pas retrouvee dans + // le fichier "catch" importer, cela est du a un autre bug + // qui fait que certaine observation reste dans le system + // au lieu d'etre effacee (?) + // On ne peut donc pas les importer, on les ignores simplement + // (car pour pouvoir les importer il faut absolument un speciesBatchId + // valide) au lieu de lever une exception. + List<IndividualObservationBatch> goodBatches = new ArrayList<IndividualObservationBatch>(batches.size()); for (IndividualObservationBatch individualObservation : batches) { Integer batchId = individualObservation.getBatchId(); Integer speciesBatchId = fishingOperationContext.getSpeciesBatchId(batchId); - Objects.requireNonNull(speciesBatchId, "Persisted Species batch id not found for import species batch id: " + batchId); - individualObservation.setBatchId(speciesBatchId); - + if (speciesBatchId == null) { + if (log.isErrorEnabled()) { + log.error("Persisted Species batch id not found for import species batch id: " + batchId); + } + } else { + // Objects.requireNonNull(speciesBatchId, "Persisted Species batch id not found for import species batch id: " + batchId); + individualObservation.setBatchId(speciesBatchId); + goodBatches.add(individualObservation); + } } // On conserve l'ordre des ids d'imports qui vont servir ensuite pour persister les pièces jointes ImmutableList.Builder<Integer> idsBuilder = ImmutableList.builder(); - batches.forEach(batch -> idsBuilder.add(batch.getIdAsInt())); + goodBatches.forEach(batch -> idsBuilder.add(batch.getIdAsInt())); ImmutableList<Integer> importIds = idsBuilder.build(); // on enlève les ids pour la persistence - batches.forEach(batch -> batch.setId((String) null)); + goodBatches.forEach(batch -> batch.setId((String) null)); FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - List<IndividualObservationBatch> savedBatches = persistenceHelper.createIndividualObservationBatch(fishingOperation, batches); + List<IndividualObservationBatch> savedBatches = persistenceHelper.createIndividualObservationBatch(fishingOperation, goodBatches); // Persistence des pièces-jointes associées aux observations individuelles int index = 0; @@ -200,7 +215,7 @@ public class ImportIndividualObservationAction extends ImportActionSupport { Collection<AttachmentRow> attachmentRows = importContext.popAttachmentRows(ObjectTypeCode.SAMPLE, importId); persistenceHelper.persistAttachments(savedBatch.getIdAsInt(), attachmentRows); } - + return goodBatches; } }); diff --git a/tutti-service/src/main/resources/ftl/genericFormatImportReport_fr.ftl b/tutti-service/src/main/resources/ftl/genericFormatImportReport_fr.ftl index 9c3e628..224c503 100644 --- a/tutti-service/src/main/resources/ftl/genericFormatImportReport_fr.ftl +++ b/tutti-service/src/main/resources/ftl/genericFormatImportReport_fr.ftl @@ -532,7 +532,12 @@ <td class="small"><#if importBenthos> ${operationResult.benthosTotalSortedWeight!'NA'}<#else> - </#if></td> <td class="small"><#if importSpecies> ${operationResult.nbSpeciesTaxon}<#else> - </#if></td> <td class="small"><#if importBenthos> ${operationResult.nbBenthosTaxon}<#else> - </#if></td> - <td class="small"><#if importIndividualObservation> ${operationResult.nbIndividualObservations}<#else> - </#if></td> + <td class="small"> + <#if importIndividualObservation> + <#if operationResult.nbIndividualObservations == operationResult.nbIndividualObservationsImported> ${operationResult.nbIndividualObservations} + <#else> ${operationResult.nbIndividualObservationsImported}/${operationResult.nbIndividualObservations} </#if> + <#else> - </#if> + </td> <td class="small"><#if importAccidentalCatch> ${operationResult.withAccidentalCatches?string('Oui', 'Non')}<#else> - </#if></td> <td class="small"><#if importMarineLitter> ${operationResult.withMarineLitter?string('Oui', 'Non')}<#else> - </#if></td> </tr> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.