branch feature/6688 updated (f9212e6 -> b040b43)
This is an automated email from the git hooks/post-receive script. New change to branch feature/6688 in repository tutti. See http://git.codelutin.com/tutti.git from f9212e6 import catches (stabilize csv model + do the process math) new fe12fd6 fix batch creation new 923d204 generic import is ok \o/ new 86c2f9e - normalize i18n keys - finalize import - improve import result API - imporve import context API - add clean weights + ccheck weights on imported operations new 0a5891a - amélioration du calcul du nombre d'étapes - mise en place de la progression - amélioration de l'API de requete et resultat new b040b43 prepare test mecanism The 5 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit b040b4302b7f7265f74d292b153de9aa53d0bc71 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Feb 23 09:32:20 2015 +0100 prepare test mecanism commit 0a5891a8342ca13bf8a4c2300d31df90166b1f2c Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Feb 23 09:01:05 2015 +0100 - amélioration du calcul du nombre d'étapes - mise en place de la progression - amélioration de l'API de requete et resultat commit 86c2f9e8c402ec888a6b3588e97866d88c2f9c9b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Feb 22 13:37:17 2015 +0100 - normalize i18n keys - finalize import - improve import result API - imporve import context API - add clean weights + ccheck weights on imported operations commit 923d204b4821174e288b257eb51a4874bd11e082 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Feb 22 08:37:31 2015 +0100 generic import is ok \o/ commit fe12fd6b45b35319b821d3495a5c3a604f635539 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Feb 21 20:16:47 2015 +0100 fix batch creation Summary of changes: .../tutti/persistence/entities/TuttiEntities.java | 5 +- .../entities/data/SpeciesAbleBatchs.java | 7 +- .../genericformat/GenericFormatArchive.java | 52 ++- .../genericformat/GenericFormatExportContext.java | 7 +- .../genericformat/GenericFormatExportService.java | 237 +++--------- .../genericformat/GenericFormatImportContext.java | 218 +++++------ .../GenericFormatImportCruiseContext.java | 146 ++++++++ .../GenericFormatImportCruiseResult.java | 63 ++++ .../GenericFormatImportEntityParserFactory.java | 24 +- .../GenericFormatImportOperationContext.java | 109 ++++-- .../GenericFormatImportOperationResult.java | 145 ++++++++ .../genericformat/GenericFormatImportRequest.java | 34 +- .../genericformat/GenericFormatImportResult.java | 112 +++--- .../genericformat/GenericFormatImportService.java | 357 ++++++++++-------- .../GenericFormatImportValidationDataContext.java | 7 +- .../GenericFormatImportValidationHelper.java | 41 ++- .../genericformat/GenericFormatServiceSupport.java | 139 +++++++ .../GenericformatImportPersitenceHelper.java | 406 +++++++++++++-------- .../consumer/CruiseAlreadyExistException.java | 2 +- .../consumer/CruiseAlreadyImportedException.java | 2 +- .../consumer/CruiseNotFoundException.java | 2 +- .../consumer/CruiseNotValidException.java | 2 +- .../consumer/CsvConsumerForAccidentalCatch.java | 18 +- .../consumer/CsvConsumerForCatch.java | 175 +++++---- .../consumer/CsvConsumerForGearCaracteristic.java | 29 +- .../CsvConsumerForIndividualObservation.java | 19 +- .../consumer/CsvConsumerForMarineLitter.java | 16 +- .../consumer/CsvConsumerForOperation.java | 25 +- .../consumer/CsvConsumerForParameter.java | 19 +- .../consumer/CsvConsumerForSampleCategory.java | 10 +- .../FishingOperationAlreadyImportedException.java | 2 +- .../FishingOperationNotFoundInCruiseException.java | 2 +- .../FishingOperationNotValidException.java | 2 +- .../consumer/GearNotFoundInCruiseException.java | 2 +- .../tutti/service/genericformat/csv/CatchRow.java | 3 +- .../genericformat/csv/ExportSampleCategory.java | 4 + .../resources/i18n/tutti-service_en_GB.properties | 172 +++++---- .../resources/i18n/tutti-service_fr_FR.properties | 149 ++++---- .../GenericFormatImportServiceTest.java | 68 +--- ... => GenericFormatImportServiceTestSupport.java} | 48 ++- .../{empty => default}/accidentalCatch.csv | 0 .../genericFormat/{empty => default}/catch.csv | 0 .../{empty => default}/gearCaracteristics.csv | 0 .../{empty => default}/individualObservation.csv | 0 .../{empty => default}/marineLitter.csv | 0 .../genericFormat/{empty => default}/operation.csv | 0 .../genericFormat/{empty => default}/parameter.csv | 0 .../{empty => default}/sampleCategory.csv | 0 .../genericFormat/{empty => default}/survey.csv | 0 49 files changed, 1797 insertions(+), 1083 deletions(-) create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseContext.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseResult.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationResult.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatServiceSupport.java copy tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/{GenericFormatImportServiceTest.java => GenericFormatImportServiceTestSupport.java} (55%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/accidentalCatch.csv (100%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/catch.csv (100%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/gearCaracteristics.csv (100%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/individualObservation.csv (100%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/marineLitter.csv (100%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/operation.csv (100%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/parameter.csv (100%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/sampleCategory.csv (100%) rename tutti-service/src/test/resources/genericFormat/{empty => default}/survey.csv (100%) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 fe12fd6b45b35319b821d3495a5c3a604f635539 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Feb 21 20:16:47 2015 +0100 fix batch creation --- .../entities/data/SpeciesAbleBatchs.java | 7 ++- .../consumer/CsvConsumerForCatch.java | 71 ++++++++++++++++------ .../tutti/service/genericformat/csv/CatchRow.java | 3 +- .../genericformat/csv/ExportSampleCategory.java | 4 ++ 4 files changed, 62 insertions(+), 23 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/data/SpeciesAbleBatchs.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/data/SpeciesAbleBatchs.java index f388142..7e9ac01 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/data/SpeciesAbleBatchs.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/data/SpeciesAbleBatchs.java @@ -70,6 +70,11 @@ public class SpeciesAbleBatchs { } + public static <B extends SpeciesAbleBatch> List<B> getChildBatchs(B batch) { + return (List<B>) batch.getChildBatchs(); + } + + public static <B extends SpeciesAbleBatch> void setParentBatch(B parent, B child) { if (parent instanceof SpeciesBatch) { @@ -80,7 +85,7 @@ public class SpeciesAbleBatchs { } - public static <B extends SpeciesAbleBatch> void addChildBatch(B child, B parent) { + public static <B extends SpeciesAbleBatch> void addChildBatch(B parent, B child) { if (child instanceof SpeciesBatch) { ((SpeciesBatch) parent).addChildBatchs((SpeciesBatch) child); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java index 6a6b513..34cfd0a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java @@ -13,6 +13,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequencys; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchs; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; @@ -22,6 +23,8 @@ import fr.ifremer.tutti.service.genericformat.csv.CatchModel; import fr.ifremer.tutti.service.genericformat.csv.CatchRow; import fr.ifremer.tutti.service.genericformat.csv.ExportSampleCategory; import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.csv.ImportRow; import java.nio.file.Path; @@ -34,6 +37,9 @@ import java.nio.file.Path; */ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { + /** Logger. */ + private static final Log log = LogFactory.getLog(CsvConsumerForCatch.class); + private final Predicate<CatchRow> catchRowVracPredicate; public CsvConsumerForCatch(Path file, char separator, SampleCategoryModel sampleCategoryModel, GenericFormatImportEntityParserFactory parserFactory) { @@ -43,7 +49,7 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { @Override public boolean apply(CatchRow input) { ExportSampleCategory exportSampleCategory = input.getSampleCategory().get(0); - return QualitativeValueId.SORTED_VRAC.getValue().equals(exportSampleCategory.getCategoryValue()); + return QualitativeValueId.SORTED_VRAC.getValue().equals(((CaracteristicQualitativeValue) exportSampleCategory.getCategoryValue()).getIdAsInt()); } }; @@ -60,6 +66,16 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { //TODO checks! CatchRow bean = row.getBean(); + for (ExportSampleCategory sampleCategory : bean.getSampleCategory()) { + + if (sampleCategory.isFilled()) { + + if (sampleCategory.getCategoryValue() == null) { + //TODO + } + } + } + } } @@ -96,6 +112,9 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { frequency.setLengthStep(bean.getFrequencyLengthStep()); frequency.setWeight(bean.getFrequencyWeight()); frequency.setNumber(bean.getBatchNumber()); + if (log.isInfoEnabled()) { + log.info("Create benthos frequency " + frequency.getNumber() + " for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); + } fishingOperationContext.addBenthosFrequency(batch, frequency); @@ -117,6 +136,10 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { frequency.setWeight(bean.getFrequencyWeight()); frequency.setNumber(bean.getBatchNumber()); + if (log.isInfoEnabled()) { + log.info("Create species frequency " + frequency.getNumber() + " for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); + } + fishingOperationContext.addSpeciesFrequency(batch, frequency); } else { @@ -143,17 +166,15 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { batch = BenthosBatchs.newBenthosBatch(); batch.setSpecies(species); batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + if (log.isInfoEnabled()) { + log.info("Create benthos root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + fishingOperationContext.getFishingOperationLabel()); + } fishingOperationContext.addBenthosBatch(vrac, batch); } - for (ExportSampleCategory exportSampleCategory : bean.getFilledSampleCategories()) { - - batch = (BenthosBatch) fillBatchCategories(batch, exportSampleCategory); - - } - + batch = fillBatchCategories(batch, bean); return batch; } @@ -172,32 +193,32 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { batch = SpeciesBatchs.newSpeciesBatch(); batch.setSpecies(species); batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + if (log.isInfoEnabled()) { + log.info("Create species root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + fishingOperationContext.getFishingOperationLabel()); + } fishingOperationContext.addSpeciesBatch(vrac, batch); } - for (ExportSampleCategory exportSampleCategory : bean.getFilledSampleCategories()) { - - batch = (SpeciesBatch) fillBatchCategories(batch, exportSampleCategory); - - } - + batch = fillBatchCategories(batch, bean); return batch; } - protected void fillBatchCategories(SpeciesAbleBatch batch, CatchRow bean) { + protected <A extends SpeciesAbleBatch> A fillBatchCategories(A batch, CatchRow bean) { for (ExportSampleCategory exportSampleCategory : bean.getFilledSampleCategories()) { batch = fillBatchCategories(batch, exportSampleCategory); } + return batch; + } - protected SpeciesAbleBatch fillBatchCategories(SpeciesAbleBatch batch, ExportSampleCategory sampleCategory) { + protected <A extends SpeciesAbleBatch> A fillBatchCategories(A batch, ExportSampleCategory sampleCategory) { - SpeciesAbleBatch result = null; + A result = null; if (batch.getSampleCategoryId() == null) { @@ -209,10 +230,15 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { } else { - if (!batch.isChildBatchsEmpty()) { + if (batch.getSampleCategoryId().equals(sampleCategory.getCategoryId()) && + batch.getSampleCategoryValue().equals(sampleCategory.getCategoryValue())) { + + result = batch; + + } else if (!batch.isChildBatchsEmpty()) { // got some childs, try to find a matching one - for (SpeciesAbleBatch childBatch : batch.getChildBatchs()) { + for (A childBatch : SpeciesAbleBatchs.getChildBatchs(batch)) { if (childBatch.getSampleCategoryId().equals(sampleCategory.getCategoryId()) && childBatch.getSampleCategoryValue().equals(sampleCategory.getCategoryValue())) { @@ -228,8 +254,13 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { if (result == null) { // add a child - SpeciesAbleBatch childBatch = SpeciesAbleBatchs.createNewChild(batch); - result = fillBatchCategories(childBatch, sampleCategory); + result = SpeciesAbleBatchs.createNewChild(batch); + result.setSampleCategoryId(sampleCategory.getCategoryId()); + result.setSampleCategoryValue(sampleCategory.getCategoryValue()); + result.setSampleCategoryWeight(sampleCategory.getCategoryWeight()); + if (log.isInfoEnabled()) { + log.info("Create child batch for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchRow.java index 01f1e48..79c79f6 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchRow.java @@ -297,9 +297,8 @@ public class CatchRow extends RowWithOperationContextSupport { List<ExportSampleCategory> result = new ArrayList<>(); for (ExportSampleCategory exportSampleCategory : sampleCategory) { - if (exportSampleCategory.getCategoryValue() != null) { + if (exportSampleCategory.isFilled()) { result.add(exportSampleCategory); - } } return result; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/ExportSampleCategory.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/ExportSampleCategory.java index 4612542..189e09f 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/ExportSampleCategory.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/ExportSampleCategory.java @@ -96,4 +96,8 @@ public class ExportSampleCategory<S extends Serializable> extends SampleCategory return categoryDef.getCaracteristic(); } + public boolean isFilled() { + return getCategoryValue() != null; + } + } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 923d204b4821174e288b257eb51a4874bd11e082 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Feb 22 08:37:31 2015 +0100 generic import is ok \o/ --- .../GenericFormatImportOperationContext.java | 30 ++---- .../genericformat/GenericFormatImportService.java | 5 +- .../GenericformatImportPersitenceHelper.java | 106 +++++++++++-------- .../consumer/CsvConsumerForCatch.java | 112 ++++++++++++--------- 4 files changed, 140 insertions(+), 113 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 5a1d60f..e614a49 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 @@ -2,7 +2,6 @@ package fr.ifremer.tutti.service.genericformat; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; @@ -19,6 +18,7 @@ import org.apache.commons.collections4.MapUtils; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -44,13 +44,13 @@ public class GenericFormatImportOperationContext { private final Map<Integer, SpeciesBatch> horsVracSpeciesBatches; - private final ArrayListMultimap<SpeciesBatch, SpeciesBatchFrequency> speciesFrequencies; + private final ArrayListMultimap<Integer, SpeciesBatchFrequency> speciesFrequencies; private final Map<Integer, BenthosBatch> vracBenthosBatches; private final Map<Integer, BenthosBatch> horsVracBenthosBatches; - private final ArrayListMultimap<BenthosBatch, BenthosBatchFrequency> benthosFrequencies; + private final ArrayListMultimap<Integer, BenthosBatchFrequency> benthosFrequencies; private final CaracteristicMap fishinOperationGearUseFeatures; @@ -110,14 +110,6 @@ public class GenericFormatImportOperationContext { return MapUtils.isNotEmpty(getBenthosBatchMap(vrac)); } - public boolean withSpeciesFrequencies() { - return !speciesFrequencies.isEmpty(); - } - - public boolean withBenthosFrequencies() { - return !benthosFrequencies.isEmpty(); - } - public AccidentalBatch getAccidentalBatchById(Integer accidentalBatchId) { return accidentalBatchesById.get(accidentalBatchId); } @@ -163,11 +155,11 @@ public class GenericFormatImportOperationContext { } public void addSpeciesFrequency(SpeciesBatch batch, SpeciesBatchFrequency frequency) { - speciesFrequencies.put(batch, frequency); + speciesFrequencies.put(batch.getIdAsInt(), frequency); } public void addBenthosFrequency(BenthosBatch batch, BenthosBatchFrequency frequency) { - benthosFrequencies.put(batch, frequency); + benthosFrequencies.put(batch.getIdAsInt(), frequency); } public Collection<MarineLitterBatch> getMarineLitterBatches() { @@ -183,19 +175,19 @@ public class GenericFormatImportOperationContext { } public Collection<SpeciesBatch> getSpeciesBatches(boolean vrac) { - return ImmutableSet.copyOf(getSpeciesBatchMap(vrac).values()); + return ImmutableList.copyOf(getSpeciesBatchMap(vrac).values()); } public Collection<BenthosBatch> getBenthosBatches(boolean vrac) { - return ImmutableSet.copyOf(getBenthosBatchMap(vrac).values()); + return ImmutableList.copyOf(getBenthosBatchMap(vrac).values()); } - public ArrayListMultimap<BenthosBatch, BenthosBatchFrequency> getBenthosFrequencies() { - return benthosFrequencies; + public List<BenthosBatchFrequency> getBenthosFrequencies(BenthosBatch benthosBatch) { + return benthosFrequencies.get(benthosBatch.getIdAsInt()); } - public ArrayListMultimap<SpeciesBatch, SpeciesBatchFrequency> getSpeciesFrequencies() { - return speciesFrequencies; + public List<SpeciesBatchFrequency> getSpeciesFrequencies(SpeciesBatch speciesBatch) { + return speciesFrequencies.get(speciesBatch.getIdAsInt()); } public CaracteristicMap getFishinOperationGearUseFeatures() { 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 bd579e2..eb1bbea 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 @@ -519,9 +519,8 @@ public class GenericFormatImportService extends AbstractTuttiService { throw new ApplicationTechnicalException("Could not close catch.csv file", e); } - //TODO -// importContext.getPersitenceHelper().persistSpeciesBatches(); -// importContext.getPersitenceHelper().persistBenthosBatches(); + importContext.getPersitenceHelper().persistSpeciesBatches(); + importContext.getPersitenceHelper().persistBenthosBatches(); } 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 409b147..92efdc0 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 @@ -1,7 +1,6 @@ package fr.ifremer.tutti.service.genericformat; import com.google.common.base.Predicate; -import com.google.common.collect.ArrayListMultimap; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; @@ -15,6 +14,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.service.PersistenceService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -230,42 +230,24 @@ public class GenericformatImportPersitenceHelper { for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - String fishingOperationId = fishingOperation.getId(); if (fishingOperationContext.withSpeciesBatches(true)) { - Collection<SpeciesBatch> speciesBatches = fishingOperationContext.getSpeciesBatches(true); + Collection<SpeciesBatch> batches = fishingOperationContext.getSpeciesBatches(true); if (log.isInfoEnabled()) { - log.info("Persist " + speciesBatches.size() + " VRAC species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + log.info("Persist " + batches.size() + " VRAC root species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } - persistenceService.createSpeciesBatches(fishingOperationId, speciesBatches); + persistSpeciesBatches(fishingOperationContext, batches, null); } if (fishingOperationContext.withSpeciesBatches(false)) { - Collection<SpeciesBatch> speciesBatches = fishingOperationContext.getSpeciesBatches(false); + Collection<SpeciesBatch> batches = fishingOperationContext.getSpeciesBatches(false); if (log.isInfoEnabled()) { - log.info("Persist " + speciesBatches.size() + " HORS VRAC species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } - persistenceService.createSpeciesBatches(fishingOperationId, speciesBatches); - - } - - if (fishingOperationContext.withSpeciesFrequencies()) { - - ArrayListMultimap<SpeciesBatch, SpeciesBatchFrequency> allFrequencies = fishingOperationContext.getSpeciesFrequencies(); - for (SpeciesBatch benthosBatch : allFrequencies.keySet()) { - - List<SpeciesBatchFrequency> frequencies = allFrequencies.get(benthosBatch); - - String batchId = benthosBatch.getId(); - if (log.isInfoEnabled()) { - log.info("Persist " + frequencies.size() + " frequency(ies) (species batch: " + batchId + ") of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } - persistenceService.saveSpeciesBatchFrequency(batchId, frequencies); - + log.info("Persist " + batches.size() + " HORS VRAC root species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } + persistSpeciesBatches(fishingOperationContext, batches, null); } @@ -285,45 +267,87 @@ public class GenericformatImportPersitenceHelper { for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - String fishingOperationId = fishingOperation.getId(); if (fishingOperationContext.withBenthosBatches(true)) { - Collection<BenthosBatch> benthosBatches = fishingOperationContext.getBenthosBatches(true); + Collection<BenthosBatch> batches = fishingOperationContext.getBenthosBatches(true); if (log.isInfoEnabled()) { - log.info("Persist " + benthosBatches.size() + " VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + log.info("Persist " + batches.size() + " VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } - persistenceService.createBenthosBatches(fishingOperationId, benthosBatches); + persistBenthosBatches(fishingOperationContext, batches, null); } if (fishingOperationContext.withBenthosBatches(false)) { - Collection<BenthosBatch> benthosBatches = fishingOperationContext.getBenthosBatches(false); + Collection<BenthosBatch> batches = fishingOperationContext.getBenthosBatches(false); if (log.isInfoEnabled()) { - log.info("Persist " + benthosBatches.size() + " HORS VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + log.info("Persist " + batches.size() + " HORS VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } - persistenceService.createBenthosBatches(fishingOperationId, benthosBatches); + persistBenthosBatches(fishingOperationContext, batches, null); } - if (fishingOperationContext.withBenthosFrequencies()) { + } - ArrayListMultimap<BenthosBatch, BenthosBatchFrequency> allFrequencies = fishingOperationContext.getBenthosFrequencies(); - for (BenthosBatch benthosBatch : allFrequencies.keySet()) { + } - List<BenthosBatchFrequency> frequencies = allFrequencies.get(benthosBatch); + protected void persistSpeciesBatches(GenericFormatImportOperationContext fishingOperationContext, Collection<SpeciesBatch> batches, String parentId) { - String batchId = benthosBatch.getId(); - if (log.isInfoEnabled()) { - log.info("Persist " + frequencies.size() + " frequency(ies) (benthos batch: " + batchId + ") of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } - persistenceService.saveBenthosBatchFrequency(batchId, frequencies); + for (SpeciesBatch batch : batches) { + + List<SpeciesBatchFrequency> frequencies = fishingOperationContext.getSpeciesFrequencies(batch); + + // reset temporary id to persist batch + batch.setId((Integer) null); + SpeciesBatch createdBatch = persistenceService.createSpeciesBatch(batch, parentId); + + if (CollectionUtils.isNotEmpty(frequencies)) { + + String batchId = batch.getId(); + if (log.isInfoEnabled()) { + log.info("Persist " + frequencies.size() + " frequency(ies) (species batch: " + batchId + ") of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperationContext.getFishingOperation().getCruise())); + } + persistenceService.saveSpeciesBatchFrequency(batchId, frequencies); + + } + + if (!batch.isChildBatchsEmpty()) { + + persistSpeciesBatches(fishingOperationContext, batch.getChildBatchs(), createdBatch.getId()); + + } + + } + + } + protected void persistBenthosBatches(GenericFormatImportOperationContext fishingOperationContext, Collection<BenthosBatch> batches, String parentId) { + + for (BenthosBatch batch : batches) { + + List<BenthosBatchFrequency> frequencies = fishingOperationContext.getBenthosFrequencies(batch); + + // reset temporary id to persist batch + batch.setId((Integer) null); + + BenthosBatch createdBatch = persistenceService.createBenthosBatch(batch, parentId); + + if (CollectionUtils.isNotEmpty(frequencies)) { + + String batchId = batch.getId(); + if (log.isInfoEnabled()) { + log.info("Persist " + frequencies.size() + " frequency(ies) (benthos batch: " + batchId + ") of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperationContext.getFishingOperation().getCruise())); } + persistenceService.saveBenthosBatchFrequency(batchId, frequencies); } + if (!batch.isChildBatchsEmpty()) { + + persistBenthosBatches(fishingOperationContext, batch.getChildBatchs(), createdBatch.getId()); + + } } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java index 34cfd0a..5efda23 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java @@ -43,6 +43,7 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { private final Predicate<CatchRow> catchRowVracPredicate; public CsvConsumerForCatch(Path file, char separator, SampleCategoryModel sampleCategoryModel, GenericFormatImportEntityParserFactory parserFactory) { + super(file, CatchModel.forImport(separator, sampleCategoryModel, parserFactory)); this.catchRowVracPredicate = new Predicate<CatchRow>() { @@ -103,56 +104,65 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { if (bean.isBenthos()) { - BenthosBatch batch = getOrCreateBenthosBatch(fishingOperationContext, bean); + prepareBenthosRowForPersist(fishingOperationContext, bean, withFrequency); - if (withFrequency) { + } else { - BenthosBatchFrequency frequency = BenthosBatchFrequencys.newBenthosBatchFrequency(); - frequency.setLengthStepCaracteristic(bean.getFrequencyLengthStepCaracteristic()); - frequency.setLengthStep(bean.getFrequencyLengthStep()); - frequency.setWeight(bean.getFrequencyWeight()); - frequency.setNumber(bean.getBatchNumber()); - if (log.isInfoEnabled()) { - log.info("Create benthos frequency " + frequency.getNumber() + " for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); - } + prepareSpeciesRowForPersist(fishingOperationContext, bean, withFrequency); - fishingOperationContext.addBenthosFrequency(batch, frequency); + } - } else { + } - batch.setNumber(bean.getBatchNumber()); + protected void prepareSpeciesRowForPersist(GenericFormatImportOperationContext fishingOperationContext, CatchRow bean, boolean withFrequency) { - } + Species species = bean.getSpecies(); + boolean vrac = bean.isVrac(); - } else { + SpeciesBatch batch = fishingOperationContext.getSpeciesBatch(vrac, species.getReferenceTaxonId()); - SpeciesBatch batch = getOrCreateSpeciesBatch(fishingOperationContext, bean); + if (batch == null) { - if (withFrequency) { + // create root batch - SpeciesBatchFrequency frequency = SpeciesBatchFrequencys.newSpeciesBatchFrequency(); - frequency.setLengthStepCaracteristic(bean.getFrequencyLengthStepCaracteristic()); - frequency.setLengthStep(bean.getFrequencyLengthStep()); - frequency.setWeight(bean.getFrequencyWeight()); - frequency.setNumber(bean.getBatchNumber()); + batch = SpeciesBatchs.newSpeciesBatch(); + batch.setId(getNextBatchId()); + batch.setSpecies(species); + batch.setFishingOperation(fishingOperationContext.getFishingOperation()); - if (log.isInfoEnabled()) { - log.info("Create species frequency " + frequency.getNumber() + " for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); - } + if (log.isInfoEnabled()) { + log.info("Create species root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + fishingOperationContext.getFishingOperationLabel()); + } + + fishingOperationContext.addSpeciesBatch(vrac, batch); + + } - fishingOperationContext.addSpeciesFrequency(batch, frequency); + batch = fillBatchCategories(batch, bean); - } else { + if (withFrequency) { - batch.setNumber(bean.getBatchNumber()); + SpeciesBatchFrequency frequency = SpeciesBatchFrequencys.newSpeciesBatchFrequency(); + frequency.setBatch(batch); + frequency.setLengthStepCaracteristic(bean.getFrequencyLengthStepCaracteristic()); + frequency.setLengthStep(bean.getFrequencyLengthStep()); + frequency.setWeight(bean.getFrequencyWeight()); + frequency.setNumber(bean.getBatchNumber()); + if (log.isInfoEnabled()) { + log.info("Create species frequency " + frequency.getNumber() + " for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); } - } + fishingOperationContext.addSpeciesFrequency(batch, frequency); + + } else { + + batch.setNumber(bean.getBatchNumber()); + } } - protected BenthosBatch getOrCreateBenthosBatch(GenericFormatImportOperationContext fishingOperationContext, CatchRow bean) { + protected void prepareBenthosRowForPersist(GenericFormatImportOperationContext fishingOperationContext, CatchRow bean, boolean withFrequency) { Species species = bean.getSpecies(); boolean vrac = bean.isVrac(); @@ -164,8 +174,10 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { // create root batch batch = BenthosBatchs.newBenthosBatch(); + batch.setId(getNextBatchId()); batch.setSpecies(species); batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + if (log.isInfoEnabled()) { log.info("Create benthos root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + fishingOperationContext.getFishingOperationLabel()); } @@ -175,34 +187,27 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { } batch = fillBatchCategories(batch, bean); - return batch; - - } - protected SpeciesBatch getOrCreateSpeciesBatch(GenericFormatImportOperationContext fishingOperationContext, CatchRow bean) { + if (withFrequency) { - Species species = bean.getSpecies(); - boolean vrac = bean.isVrac(); - - SpeciesBatch batch = fishingOperationContext.getSpeciesBatch(vrac, species.getReferenceTaxonId()); - - if (batch == null) { - - // create root batch + BenthosBatchFrequency frequency = BenthosBatchFrequencys.newBenthosBatchFrequency(); + frequency.setBatch(batch); + frequency.setLengthStepCaracteristic(bean.getFrequencyLengthStepCaracteristic()); + frequency.setLengthStep(bean.getFrequencyLengthStep()); + frequency.setWeight(bean.getFrequencyWeight()); + frequency.setNumber(bean.getBatchNumber()); - batch = SpeciesBatchs.newSpeciesBatch(); - batch.setSpecies(species); - batch.setFishingOperation(fishingOperationContext.getFishingOperation()); if (log.isInfoEnabled()) { - log.info("Create species root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + fishingOperationContext.getFishingOperationLabel()); + log.info("Create benthos frequency " + frequency.getNumber() + " for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); } - fishingOperationContext.addSpeciesBatch(vrac, batch); + fishingOperationContext.addBenthosFrequency(batch, frequency); - } + } else { - batch = fillBatchCategories(batch, bean); - return batch; + batch.setNumber(bean.getBatchNumber()); + + } } @@ -255,6 +260,7 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { // add a child result = SpeciesAbleBatchs.createNewChild(batch); + result.setId(getNextBatchId()); result.setSampleCategoryId(sampleCategory.getCategoryId()); result.setSampleCategoryValue(sampleCategory.getCategoryValue()); result.setSampleCategoryWeight(sampleCategory.getCategoryWeight()); @@ -270,4 +276,10 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { } + private int batchId; + + private int getNextBatchId() { + return batchId++; + } + } \ No newline at end of file -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 86c2f9e8c402ec888a6b3588e97866d88c2f9c9b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Feb 22 13:37:17 2015 +0100 - normalize i18n keys - finalize import - improve import result API - imporve import context API - add clean weights + ccheck weights on imported operations --- .../tutti/persistence/entities/TuttiEntities.java | 5 +- .../genericformat/GenericFormatArchive.java | 8 +- .../genericformat/GenericFormatExportContext.java | 7 +- .../genericformat/GenericFormatExportService.java | 237 ++++--------- .../genericformat/GenericFormatImportContext.java | 218 ++++++------ .../GenericFormatImportCruiseContext.java | 154 +++++++++ .../GenericFormatImportCruiseResult.java | 64 ++++ .../GenericFormatImportEntityParserFactory.java | 24 +- .../GenericFormatImportOperationContext.java | 79 ++++- .../GenericFormatImportOperationResult.java | 145 ++++++++ .../genericformat/GenericFormatImportRequest.java | 17 + .../genericformat/GenericFormatImportResult.java | 105 +++--- .../genericformat/GenericFormatImportService.java | 305 +++++++++-------- .../GenericFormatImportValidationDataContext.java | 7 +- .../GenericFormatImportValidationHelper.java | 41 ++- .../genericformat/GenericFormatServiceSupport.java | 139 ++++++++ .../GenericformatImportPersitenceHelper.java | 378 ++++++++++++--------- .../consumer/CruiseAlreadyExistException.java | 2 +- .../consumer/CruiseAlreadyImportedException.java | 2 +- .../consumer/CruiseNotFoundException.java | 2 +- .../consumer/CruiseNotValidException.java | 2 +- .../consumer/CsvConsumerForAccidentalCatch.java | 18 +- .../consumer/CsvConsumerForCatch.java | 40 ++- .../consumer/CsvConsumerForGearCaracteristic.java | 29 +- .../CsvConsumerForIndividualObservation.java | 19 +- .../consumer/CsvConsumerForMarineLitter.java | 16 +- .../consumer/CsvConsumerForOperation.java | 25 +- .../consumer/CsvConsumerForParameter.java | 19 +- .../consumer/CsvConsumerForSampleCategory.java | 10 +- .../FishingOperationAlreadyImportedException.java | 2 +- .../FishingOperationNotFoundInCruiseException.java | 2 +- .../FishingOperationNotValidException.java | 2 +- .../consumer/GearNotFoundInCruiseException.java | 2 +- .../resources/i18n/tutti-service_en_GB.properties | 160 ++++----- .../resources/i18n/tutti-service_fr_FR.properties | 137 ++++---- 35 files changed, 1505 insertions(+), 917 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java index 1e95bdb..d9a9337 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java @@ -28,6 +28,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -45,10 +46,10 @@ public class TuttiEntities { // helper class does not instanciate } - public static <B extends TuttiEntity> List<String> toIds(List<B> list) { + public static <B extends TuttiEntity> List<String> toIds(Collection<B> list) { List<String> result = list == null ? Collections.<String>emptyList() : - Lists.transform(list, GET_ID); + Lists.transform(list instanceof List? (List<B>)list: new ArrayList<>(list), GET_ID); return result; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatArchive.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatArchive.java index d9524b2..9498c46 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatArchive.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatArchive.java @@ -207,11 +207,11 @@ public class GenericFormatArchive { if (progressionModel != null) { - progressionModel.increments(t("tutti.service.genericExport.buildZip", archiveFile)); + progressionModel.increments(t("tutti.service.genericFormat.export.buildZip", archiveFile)); } - ApplicationIOUtil.zip(workingDirectory.toFile(), archiveFile, t("tutti.service.genericExport.zip.error", archiveFile)); + ApplicationIOUtil.zip(workingDirectory.toFile(), archiveFile, t("tutti.service.genericFormat.export.zip.error", archiveFile)); } @@ -338,7 +338,7 @@ public class GenericFormatArchive { if (log.isErrorEnabled()) { log.error("Mandatory entry " + zipEntryPath + " not found."); } - errors.add(t("tutti.genericformat.importError.missArchiveFile", archiveFilePath.getFilename())); + errors.add(t("tutti.service.genericFormat.importError.missArchiveFile", archiveFilePath.getFilename())); } else { @@ -357,7 +357,7 @@ public class GenericFormatArchive { if (!errors.isEmpty()) { - String message = t("tutti.genericFormat.importError.archiveNotSane", Joiner.on("\n").join(errors)); + String message = t("tutti.service.genericFormat.importError.archiveNotSane", Joiner.on("\n").join(errors)); throw new ApplicationBusinessException(message); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java index b8d8889..d947d00 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java @@ -1,5 +1,6 @@ package fr.ifremer.tutti.service.genericformat; +import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; @@ -115,6 +116,7 @@ public class GenericFormatExportContext implements Closeable { Decorator<FishingOperation> fishingOperationDecorator, SampleCategoryModel sampleCategoryModel) { + Preconditions.checkNotNull(progressionModel); this.progressionModel = progressionModel; this.archive = archive; @@ -286,9 +288,8 @@ public class GenericFormatExportContext implements Closeable { } public void increments(String message) { - if (progressionModel != null) { - progressionModel.increments(message); - } + progressionModel.increments(message); + if (log.isInfoEnabled()) { log.info(message); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java index 83b5bb7..5750514 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java @@ -33,7 +33,6 @@ import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.data.MarineLitterBatch; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; @@ -44,11 +43,6 @@ import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; -import fr.ifremer.tutti.service.AbstractTuttiService; -import fr.ifremer.tutti.service.DecoratorService; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.TuttiServiceContext; -import fr.ifremer.tutti.service.catches.WeightComputingService; import fr.ifremer.tutti.service.genericformat.csv.AccidentalCatchRow; import fr.ifremer.tutti.service.genericformat.csv.CatchRow; import fr.ifremer.tutti.service.genericformat.csv.GearCaracteristicRow; @@ -64,11 +58,6 @@ import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForGearCaracte import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForSampleCategory; import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForSpecies; import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForSurvey; -import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryGearService; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryPersonService; -import fr.ifremer.tutti.service.referential.ReferentialTemporarySpeciesService; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryVesselService; import fr.ifremer.tutti.service.referential.csv.GearRow; import fr.ifremer.tutti.service.referential.csv.PersonRow; import fr.ifremer.tutti.service.referential.csv.SpeciesRow; @@ -80,15 +69,16 @@ import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporaryVess import fr.ifremer.tutti.util.Numbers; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationBusinessException; import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.LinkedHashSet; +import java.util.Collection; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -101,46 +91,10 @@ import static org.nuiton.i18n.I18n.t; * @author tchemit <chemit@codelutin.com> * @since 1.3 */ -public class GenericFormatExportService extends AbstractTuttiService { +public class GenericFormatExportService extends GenericFormatServiceSupport { private static final Log log = LogFactory.getLog(GenericFormatExportService.class); - protected PersistenceService persistenceService; - - protected WeightComputingService weightComputingService; - - protected ReferentialTemporaryGearService referentialTemporaryGearService; - - protected ReferentialTemporaryPersonService referentialTemporaryPersonService; - - protected ReferentialTemporarySpeciesService referentialTemporarySpeciesService; - - protected ReferentialTemporaryVesselService referentialTemporaryVesselService; - - protected ProtocolImportExportService protocolImportExportService; - - protected Decorator<FishingOperation> fishingOperationDecorator; - - protected Decorator<Cruise> cruiseDecorator; - - @Override - public void setServiceContext(TuttiServiceContext context) { - - super.setServiceContext(context); - persistenceService = getService(PersistenceService.class); - weightComputingService = getService(WeightComputingService.class); - referentialTemporaryGearService = getService(ReferentialTemporaryGearService.class); - referentialTemporaryPersonService = getService(ReferentialTemporaryPersonService.class); - referentialTemporarySpeciesService = getService(ReferentialTemporarySpeciesService.class); - referentialTemporaryVesselService = getService(ReferentialTemporaryVesselService.class); - protocolImportExportService = getService(ProtocolImportExportService.class); - - DecoratorService decoratorService = getService(DecoratorService.class); - cruiseDecorator = decoratorService.getDecoratorByType(Cruise.class); - fishingOperationDecorator = decoratorService.getDecoratorByType(FishingOperation.class); - - } - public int getExportProgramNbSteps(String programId) { // nbCruise * (check cruise / export cruise / gear caracteristics / operation / parameter / catches / individual observation / accidental catches / marine litters) + @@ -233,7 +187,7 @@ public class GenericFormatExportService extends AbstractTuttiService { try { List<String> fishingOperationIds = persistenceService.getAllFishingOperationIds(cruise.getId()); - String error = getCruiseErrors(progressionModel, cruise, fishingOperationIds); + String error = getCruiseErrors(cruise, fishingOperationIds, progressionModel); if (error != null) { throw new ApplicationBusinessException(error); } @@ -277,6 +231,9 @@ public class GenericFormatExportService extends AbstractTuttiService { Preconditions.checkNotNull(cruiseId); + ProgressionModel progressionModel = new ProgressionModel(); + progressionModel.setTotal(1000); + Cruise cruise = persistenceService.getCruise(cruiseId); Preconditions.checkNotNull(cruise); @@ -288,7 +245,7 @@ public class GenericFormatExportService extends AbstractTuttiService { ApplicationBusinessException checkError = null; try { - String error = getCruiseErrors(null, cruise, Lists.newArrayList(fishingOperationId)); + String error = getCruiseErrors(cruise, Lists.newArrayList(fishingOperationId), progressionModel); if (error != null) { throw new ApplicationBusinessException(error); } @@ -303,7 +260,7 @@ public class GenericFormatExportService extends AbstractTuttiService { GenericFormatArchive genericFormatArchive = GenericFormatArchive.forExport(null, context.getConfig().getTmpDirectory()); - try (GenericFormatExportContext exportContext = createExportContext(null, genericFormatArchive)) { + try (GenericFormatExportContext exportContext = createExportContext(progressionModel, genericFormatArchive)) { FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); @@ -344,7 +301,7 @@ public class GenericFormatExportService extends AbstractTuttiService { cruise = persistenceService.getCruise(cruise.getId()); List<String> allFishingOperation = persistenceService.getAllFishingOperationIds(cruise.getId()); - String error = getCruiseErrors(progressionModel, cruise, allFishingOperation); + String error = getCruiseErrors(cruise, allFishingOperation, progressionModel); if (error != null) { @@ -364,15 +321,7 @@ public class GenericFormatExportService extends AbstractTuttiService { throw new ApplicationBusinessException(errorMessage); } - } - protected void increments(ProgressionModel progressionModel, String message) { - if (progressionModel != null) { - progressionModel.increments(message); - } - if (log.isInfoEnabled()) { - log.info(message); - } } protected void terminatesExport(GenericFormatExportContext exportContext) { @@ -400,7 +349,7 @@ public class GenericFormatExportService extends AbstractTuttiService { protected void exportTemporaryGears(GenericFormatExportContext exportContext, List<Gear> temporaryGears) { - exportContext.increments(t("tutti.service.genericExport.exportTemporaryGear", temporaryGears.size())); + exportContext.increments(t("tutti.service.genericFormat.export.exportTemporaryGear", temporaryGears.size())); try { @@ -417,7 +366,7 @@ public class GenericFormatExportService extends AbstractTuttiService { protected void exportTemporaryPersons(GenericFormatExportContext exportContext, List<Person> temporaryPersons) { - exportContext.increments(t("tutti.service.genericExport.exportTemporaryPerson", temporaryPersons.size())); + exportContext.increments(t("tutti.service.genericFormat.export.exportTemporaryPerson", temporaryPersons.size())); try { @@ -434,7 +383,7 @@ public class GenericFormatExportService extends AbstractTuttiService { protected void exportTemporarySpeciess(GenericFormatExportContext exportContext, List<Species> temporarySpeciess) { - exportContext.increments(t("tutti.service.genericExport.exportTemporarySpecies", temporarySpeciess.size())); + exportContext.increments(t("tutti.service.genericFormat.export.exportTemporarySpecies", temporarySpeciess.size())); try { @@ -451,7 +400,7 @@ public class GenericFormatExportService extends AbstractTuttiService { protected void exportTemporaryVessels(GenericFormatExportContext exportContext, List<Vessel> temporaryVessels) { - exportContext.increments(t("tutti.service.genericExport.exportTemporaryVessel", temporaryVessels.size())); + exportContext.increments(t("tutti.service.genericFormat.export.exportTemporaryVessel", temporaryVessels.size())); try { @@ -468,7 +417,7 @@ public class GenericFormatExportService extends AbstractTuttiService { protected void exportSampleCategoryModel(GenericFormatExportContext exportContext, SampleCategoryModel sampleCategoryModel) { - exportContext.increments(t("tutti.service.genericExport.exportSampleCategoyModel", sampleCategoryModel.getNbSampling())); + exportContext.increments(t("tutti.service.genericFormat.export.exportSampleCategoyModel", sampleCategoryModel.getNbSampling())); try { @@ -489,11 +438,11 @@ public class GenericFormatExportService extends AbstractTuttiService { if (protocolFilled) { TuttiProtocol protocol = persistenceService.getProtocol(); - exportContext.increments(t("tutti.service.genericExport.exportProtocol", protocol.getName())); + exportContext.increments(t("tutti.service.genericFormat.export.exportProtocol", protocol.getName())); protocolImportExportService.exportProtocol(protocol, exportContext.getProtocolFile()); } else { - exportContext.increments(t("tutti.service.genericExport.skipProtocolExport")); + exportContext.increments(t("tutti.service.genericFormat.export.skipProtocolExport")); } } @@ -523,7 +472,7 @@ public class GenericFormatExportService extends AbstractTuttiService { private void exportSurvey(GenericFormatExportContext exportContext, Cruise cruise) { - exportContext.increments(t("tutti.service.exportCruise.exportSurvey", cruise.getName())); + exportContext.increments(t("tutti.service.genericFormat.exportCruise.exportSurvey", cruise.getName())); List<TuttiLocation> allCountry = persistenceService.getAllCountry(); String countryId = context.getConfig().getExportCountryId(); @@ -537,13 +486,13 @@ public class GenericFormatExportService extends AbstractTuttiService { producerForSurvey.write(surveyRow); } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.export.survey.error"), e); + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.survey.error"), e); } } protected void exportGearCaracteristics(GenericFormatExportContext exportContext, Cruise cruise) { - exportContext.increments(t("tutti.service.exportCruise.exportGearCaracteristics", cruise.getName())); + exportContext.increments(t("tutti.service.genericFormat.exportCruise.exportGearCaracteristics", cruise.getName())); try { @@ -565,14 +514,14 @@ public class GenericFormatExportService extends AbstractTuttiService { producerForGearCaracteristics.write(rows); } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.export.gearCaracteristics.error"), e); + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.gearCaracteristics.error"), e); } } protected void exportOperation(GenericFormatExportContext exportContext, Cruise cruise, FishingOperation operation) { GenericFormatExportOperationContext operationContext = exportContext.newOperationContext(cruise, operation); - exportContext.increments(t("tutti.service.exportCruise.exportOperation", cruise.getName(), operationContext.getOperationLabel())); + exportContext.increments(t("tutti.service.genericFormat.exportCruise.exportOperation", cruise.getName(), operationContext.getOperationLabel())); CatchBatch catchBatch = operationContext.getCatchBatch(); @@ -614,7 +563,7 @@ public class GenericFormatExportService extends AbstractTuttiService { } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.export.operation.error", operationContext.getOperationLabel(), operationContext.getCruise().getName()), e); + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.operation.error", operationContext.getOperationLabel(), operationContext.getCruise().getName()), e); } @@ -685,7 +634,7 @@ public class GenericFormatExportService extends AbstractTuttiService { protected void exportSpecies(GenericFormatExportContext exportContext) { - exportContext.increments(t("tutti.service.genericExport.exportSpecies")); + exportContext.increments(t("tutti.service.genericFormat.export.exportSpecies")); try { @@ -694,44 +643,42 @@ public class GenericFormatExportService extends AbstractTuttiService { producerForSpecies.write(rows); } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.export.species.error"), e); + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.species.error"), e); } } - protected String getCruiseErrors(ProgressionModel progressionModel, Cruise cruise, List<String> allFishingOperation) { + protected int getCruiseNbStep(String cruiseId) { + Cruise cruise = persistenceService.getCruise(cruiseId); Preconditions.checkNotNull(cruise); + List<String> allFishingOperationIds = persistenceService.getAllFishingOperationIds(cruiseId); + int nbFishingOperations = allFishingOperationIds.size(); - increments(progressionModel, t("tutti.service.exportCruise.checkCruise", cruise.getName())); + int result = 1 + nbFishingOperations // check cruise + operations + + 1 // export cruise + + 1 // export gear caracteristics + + nbFishingOperations; // export operation - // check cruise fishing operations + return result; - StringBuilder errorMessageBuilder = new StringBuilder(); + } - boolean withErrors = false; + protected String getCruiseErrors(Cruise cruise, Collection<String> fishingOperationIds, ProgressionModel progressionModel) { - for (String fishingOperationId : allFishingOperation) { + Map<String, String> errors = getFishingOperationsErrors(cruise, fishingOperationIds, progressionModel); - FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); - increments(progressionModel, t("tutti.service.exportCruise.checkCruiseFishingOperation", cruise.getName(), fishingOperationDecorator.toString(fishingOperation))); + String result; - String error = checkCruiseFishingOperation(fishingOperationId); + if (errors.isEmpty()) { - if (error != null) { + StringBuilder errorMessageBuilder = new StringBuilder(); - withErrors = true; + for (String error : errors.values()) { errorMessageBuilder.append("<li>").append(error).append("</li>"); - } - } - - String result; - - if (withErrors) { - String cruiseStr = cruiseDecorator.toString(cruise); - result = t("tutti.service.export.invalid.cruise", cruiseStr, errorMessageBuilder.toString()); + result = t("tutti.service.genericFormat.invalid.cruise", cruiseStr, errorMessageBuilder.toString()); } else { @@ -743,102 +690,38 @@ public class GenericFormatExportService extends AbstractTuttiService { } - protected String checkCruiseFishingOperation(String fishingOperationId) { + protected Map<String, String> getFishingOperationsErrors(Cruise cruise, Collection<String> fishingOperationIds, ProgressionModel progressionModel) { - if (log.isDebugEnabled()) { - log.debug("Will check operation: " + fishingOperationId); - } - - Set<String> errors = new LinkedHashSet<>(); - - boolean withCatchBatch = persistenceService.isFishingOperationWithCatchBatch(fishingOperationId); - - if (!withCatchBatch) { - - if (log.isWarnEnabled()) { - log.warn("Skip fishing operation " + fishingOperationId + " since no catchBatch associated."); - } - - } else { + Preconditions.checkNotNull(cruise); + Preconditions.checkNotNull(progressionModel); - BatchContainer<SpeciesBatch> rootSpeciesBatch; - try { - rootSpeciesBatch = weightComputingService.getComputedSpeciesBatches(fishingOperationId); + progressionModel.increments(t("tutti.service.genericFormat.checkCruise", cruise.getName())); - } catch (ApplicationBusinessException e) { - errors.add(e.getMessage()); - rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId, false); - } + Map<String, String> errors = new LinkedHashMap<>(); - BatchContainer<BenthosBatch> rootBenthosBatch; - try { - rootBenthosBatch = weightComputingService.getComputedBenthosBatches(fishingOperationId); + for (String fishingOperationId : fishingOperationIds) { - } catch (ApplicationBusinessException e) { - errors.add(e.getMessage()); - rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId, false); - } + FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); + progressionModel.increments(t("tutti.service.genericFormat.checkCruiseFishingOperation", cruise.getName(), fishingOperationDecorator.toString(fishingOperation))); - CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(fishingOperationId); + Set<String> errorsForOperation = checkFishingOperation(fishingOperationId); + if (!errorsForOperation.isEmpty()) { - BatchContainer<MarineLitterBatch> rootMarineLitterBatch; - try { - Float weight = catchBatch == null ? null : catchBatch.getMarineLitterTotalWeight(); - rootMarineLitterBatch = weightComputingService.getComputedMarineLitterBatches(fishingOperationId, weight); - } catch (ApplicationBusinessException e) { - errors.add(e.getMessage()); - rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId); - } + String fishingOperationStr = fishingOperationDecorator.toString(fishingOperation); - try { - if (catchBatch != null) { - weightComputingService.computeCatchBatchWeights(catchBatch, - rootSpeciesBatch, - rootBenthosBatch, - rootMarineLitterBatch); + StringBuilder sb = new StringBuilder(); + for (String error : errorsForOperation) { + sb.append("<li>").append(error).append("</li>"); } - } catch (ApplicationBusinessException e) { - errors.add(e.getMessage()); - } - } - - String errorMessage; - - if (errors.isEmpty()) { - - errorMessage = null; + String errorMessage = t("tutti.service.genericFormat.invalid.fishingOperation", fishingOperationStr, sb.toString()); + errors.put(fishingOperationId, errorMessage); - } else { - - FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); - String fishingOperationStr = fishingOperationDecorator.toString(fishingOperation); - - StringBuilder sb = new StringBuilder(); - for (String error : errors) { - sb.append("<li>").append(error).append("</li>"); } - errorMessage = t("tutti.service.export.invalid.fishingOperation", fishingOperationStr, sb.toString()); } - return errorMessage; - - } - - protected int getCruiseNbStep(String cruiseId) { - - Cruise cruise = persistenceService.getCruise(cruiseId); - Preconditions.checkNotNull(cruise); - List<String> allFishingOperationIds = persistenceService.getAllFishingOperationIds(cruiseId); - int nbFishingOperations = allFishingOperationIds.size(); - - int result = 1 + nbFishingOperations // check cruise + operations - + 1 // export cruise - + 1 // export gear caracteristics - + nbFishingOperations; // export operation - - return result; + return errors; } 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 df2831b..0824f2c 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 @@ -1,16 +1,17 @@ package fr.ifremer.tutti.service.genericformat; -import com.google.common.base.Predicate; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Multimap; +import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; 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 fr.ifremer.tutti.persistence.entities.data.FishingOperations; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.service.csv.CaracteristicValueParseException; @@ -24,19 +25,18 @@ import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForOperation; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForParameter; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForSampleCategory; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForSurvey; -import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport; +import fr.ifremer.tutti.service.genericformat.csv.RowWithCruiseContextSupport; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryGear; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryPerson; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporarySpecies; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryVessel; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; import java.io.Closeable; -import java.io.IOException; import java.io.Serializable; import java.text.ParseException; +import java.util.LinkedHashMap; +import java.util.Map; /** * Created on 2/5/15. @@ -46,132 +46,148 @@ import java.text.ParseException; */ public class GenericFormatImportContext implements Closeable { - /** Logger. */ - private static final Log log = LogFactory.getLog(GenericFormatImportContext.class); - private final GenericFormatImportRequest importRequest; - private final GenericFormatImportResult importResult; - private final ProgressionModel progressionModel; + private final Decorator<Cruise> cruiseDecorator; + private final Decorator<FishingOperation> fishingOperationDecorator; private final GenericFormatImportEntityParserFactory importEntityParserFactory; - private final GenericformatImportPersitenceHelper persitenceHelper; - private final GenericFormatImportValidationHelper validationHelper; - private final Multimap<Cruise, GenericFormatImportOperationContext> fishingOperationsContexts; + private TuttiProtocol importedProtocol; + + private GenericFormatReferentialImportResult<Gear, Integer> importedGears; + private GenericFormatReferentialImportResult<Person, Integer> importedPersons; + + private GenericFormatReferentialImportResult<Species, Integer> importedSpecies; + + private GenericFormatReferentialImportResult<Vessel, String> importedVessels; + + private final Map<String, GenericFormatImportCruiseContext> cruiseContexts; public GenericFormatImportContext(GenericFormatImportRequest importRequest, ProgressionModel progressionModel, PersistenceService persistenceService, Decorator<Cruise> cruiseDecorator, Decorator<FishingOperation> fishingOperationDecorator) { + + Preconditions.checkNotNull(importRequest); + Preconditions.checkNotNull(progressionModel); + Preconditions.checkNotNull(persistenceService); + Preconditions.checkNotNull(cruiseDecorator); + Preconditions.checkNotNull(fishingOperationDecorator); + this.importRequest = importRequest; this.progressionModel = progressionModel; + this.cruiseDecorator = cruiseDecorator; this.fishingOperationDecorator = fishingOperationDecorator; - this.importResult = new GenericFormatImportResult(importRequest); - this.importEntityParserFactory = new GenericFormatImportEntityParserFactory(persistenceService, importRequest, importResult); - this.persitenceHelper = new GenericformatImportPersitenceHelper(this, persistenceService, cruiseDecorator, fishingOperationDecorator); + this.importEntityParserFactory = new GenericFormatImportEntityParserFactory(persistenceService, this); this.validationHelper = new GenericFormatImportValidationHelper(this, new ValidationService()); - this.fishingOperationsContexts = ArrayListMultimap.create(); + this.cruiseContexts = new LinkedHashMap<>(); + + } + + @Override + public void close() { + + validationHelper.close(); + + for (GenericFormatImportCruiseContext cruiseContext : cruiseContexts.values()) { + cruiseContext.close(); + } + cruiseContexts.clear(); + } public GenericFormatImportRequest getImportRequest() { return importRequest; } - public GenericFormatImportResult getImportResult() { - return importResult; + public TuttiProtocol getImportedProtocol() { + return importedProtocol; } - @Override - public void close() throws IOException { - - validationHelper.close(); - - //TODO Close - //getArchive().close(); + public void setImportedProtocol(TuttiProtocol importedProtocol) { + this.importedProtocol = importedProtocol; + } + public GenericFormatReferentialImportResult<Gear, Integer> getImportedGears() { + return importedGears; } - public boolean isCruiseAlreadyExists(Cruise cruise) { + public void setImportedGears(GenericFormatReferentialImportResult<Gear, Integer> importedGears) { + this.importedGears = importedGears; + } - boolean equals = false; - for (Cruise existingCruise : importRequest.getExistingCruises()) { + public GenericFormatReferentialImportResult<Person, Integer> getImportedPersons() { + return importedPersons; + } - equals = Cruises.equals(cruise, existingCruise); - if (equals) { - break; - } + public void setImportedPersons(GenericFormatReferentialImportResult<Person, Integer> importedPersons) { + this.importedPersons = importedPersons; + } - } - return equals; + public GenericFormatReferentialImportResult<Species, Integer> getImportedSpecies() { + return importedSpecies; + } + public void setImportedSpecies(GenericFormatReferentialImportResult<Species, Integer> importedSpecies) { + this.importedSpecies = importedSpecies; } - public Cruise getImportedCruise(Cruise importRowCruise) { + public GenericFormatReferentialImportResult<Vessel, String> getImportedVessels() { + return importedVessels; + } - Cruise result = null; - for (Cruise importedCruise : importResult.getImportedCruises()) { + public void setImportedVessels(GenericFormatReferentialImportResult<Vessel, String> importedVessels) { + this.importedVessels = importedVessels; + } - boolean equals = Cruises.equals(importRowCruise, importedCruise); - if (equals) { - result = importedCruise; - break; - } + public boolean isCruiseAlreadyExists(Cruise cruise) { - } - return result; + Cruise existingCruise = importRequest.getExistingCruise(cruise); + return existingCruise != null; } public boolean isCruiseAlreadyImported(Cruise cruise) { - Cruise importedCruise = getImportedCruise(cruise); - return importedCruise != null; + GenericFormatImportCruiseContext cruiseContext = getCruiseContext(cruise); + return cruiseContext != null; } - public Gear getGear(Cruise cruise, Gear gear, int rankOrder) { + public void addImportedCruise(Cruise cruise) { - Gear result = null; - - int index = rankOrder - 1; - boolean gearExists = cruise.sizeGear() > index; - if (gearExists) { - Gear cruiseGear = cruise.getGear(index); - gearExists = cruiseGear.getId().equals(gear.getId()); - if (gearExists) { - result = cruiseGear; - } - } - return result; + String cruiseId = cruise.getId(); + GenericFormatImportCruiseContext cruiseContext = new GenericFormatImportCruiseContext(cruise, cruiseDecorator.toString(cruise)); + cruiseContexts.put(cruiseId, cruiseContext); } - public void addImportedFishingOperation(FishingOperation fishingOperation) { - importResult.addImportedFishingOperation(fishingOperation); + public void addImportedFishingOperation(FishingOperation fishingOperation, CatchBatch catchBatch) { + + GenericFormatImportCruiseContext cruiseContext = getCruiseContext(fishingOperation.getCruise()); String fishingOperationLabel = fishingOperationDecorator.toString(fishingOperation); - fishingOperationsContexts.put(fishingOperation.getCruise(), new GenericFormatImportOperationContext(fishingOperation, fishingOperationLabel)); + cruiseContext.addFishingOperation(fishingOperation, catchBatch, fishingOperationLabel); + } - public GenericFormatImportOperationContext getImportedFishingOperationContext(RowWithOperationContextSupport row) { + public GenericFormatImportCruiseContext getCruiseContext(RowWithCruiseContextSupport row) { Cruise cruise = row.getCruise(); - FishingOperation fishingOperation = row.getFishingOperation(); - GenericFormatImportOperationContext result = null; - for (GenericFormatImportOperationContext importOperationContext : fishingOperationsContexts.get(cruise)) { + GenericFormatImportCruiseContext result = null; + for (GenericFormatImportCruiseContext cruiseContext : cruiseContexts.values()) { - FishingOperation importedFishingOperation = importOperationContext.getFishingOperation(); - boolean equals = FishingOperations.equals(importedFishingOperation, fishingOperation); + boolean equals = Cruises.equals(cruise, cruiseContext.getCruise()); if (equals) { - result = importOperationContext; + result = cruiseContext; break; } @@ -180,33 +196,18 @@ public class GenericFormatImportContext implements Closeable { } - public GenericFormatImportOperationContext getImportedFishingOperationContext(FishingOperation importRowFishingOperation) { - - Cruise cruise = importRowFishingOperation.getCruise(); + public GenericFormatImportCruiseContext getCruiseContext(Cruise cruise) { - GenericFormatImportOperationContext result = null; - for (GenericFormatImportOperationContext importOperationContext : fishingOperationsContexts.get(cruise)) { + GenericFormatImportCruiseContext cruiseContext = cruiseContexts.get(cruise.getId()); + return cruiseContext; - FishingOperation fishingOperation = importOperationContext.getFishingOperation(); - boolean equals = FishingOperations.equals(importRowFishingOperation, fishingOperation); - if (equals) { - result = importOperationContext; - break; - } - - } - return result; - - } - - public Iterable<GenericFormatImportOperationContext> getImportedFishingOperationContexts(Predicate<GenericFormatImportOperationContext> predicate) { - return Iterables.filter(fishingOperationsContexts.values(), predicate); } - public boolean isFishingOperationAlreadyImported(FishingOperation fishingOperation) { + public GenericFormatImportOperationContext getFishingOperationContext(FishingOperation fishingOperation) { - GenericFormatImportOperationContext importedFishingOperation = getImportedFishingOperationContext(fishingOperation); - return importedFishingOperation != null; + GenericFormatImportCruiseContext cruiseContext = getCruiseContext(fishingOperation.getCruise()); + GenericFormatImportOperationContext result = cruiseContext.getFishingOperationContext(fishingOperation); + return result; } @@ -290,20 +291,25 @@ public class GenericFormatImportContext implements Closeable { } public void increments(String message) { - if (progressionModel != null) { - progressionModel.increments(message); - } - if (log.isInfoEnabled()) { - log.info(message); - } - } - - public GenericformatImportPersitenceHelper getPersitenceHelper() { - return persitenceHelper; + progressionModel.increments(message); } public GenericFormatImportValidationHelper getValidationHelper() { return validationHelper; } + public void doActionOnCruiseContexts(CruiseContextAction action) { + + for (GenericFormatImportCruiseContext cruiseContext : cruiseContexts.values()) { + + action.onCruise(cruiseContext, progressionModel); + + } + } + + 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 new file mode 100644 index 0000000..5a1e971 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseContext.java @@ -0,0 +1,154 @@ +package fr.ifremer.tutti.service.genericformat; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.FishingOperations; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport; + +import java.io.Closeable; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +/** + * Created on 2/22/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14 + */ +public class GenericFormatImportCruiseContext implements Closeable { + + private final Cruise cruise; + + private final String cruiseLabel; + + private final Map<String, GenericFormatImportOperationContext> fishingOperationContexts; + + private final Set<Gear> gearsWithcaracteristics; + + public GenericFormatImportCruiseContext(Cruise cruise, String cruiseLabel) { + this.cruise = cruise; + this.cruiseLabel = cruiseLabel; + this.fishingOperationContexts = new TreeMap<>(); + this.gearsWithcaracteristics = new HashSet<>(); + } + + @Override + public void close() { + + for (GenericFormatImportOperationContext cruiseContext : fishingOperationContexts.values()) { + cruiseContext.close(); + } + fishingOperationContexts.clear(); + + } + + public Cruise getCruise() { + return cruise; + } + + public String getCruiseLabel() { + return cruiseLabel; + } + + public Gear getGear(Gear gear, int rankOrder) { + + Gear result = null; + + int index = rankOrder - 1; + boolean gearExists = cruise.sizeGear() > index; + if (gearExists) { + Gear cruiseGear = cruise.getGear(index); + gearExists = cruiseGear.getId().equals(gear.getId()); + if (gearExists) { + result = cruiseGear; + } + } + return result; + + } + + public void addFishingOperation(FishingOperation fishingOperation, CatchBatch catchBatch, String fishingOperationLabel) { + fishingOperationContexts.put(fishingOperation.getId(), new GenericFormatImportOperationContext(fishingOperation, catchBatch, fishingOperationLabel)); + } + + public GenericFormatImportOperationContext getFishingOperationContext(FishingOperation fishingOperation) { + + GenericFormatImportOperationContext result = fishingOperationContexts.get(fishingOperation.getId()); + return result; + + } + + public boolean isFishingOperationAlreadyImported(RowWithOperationContextSupport row) { + + GenericFormatImportOperationContext fishingOperationContext = getFishingOperationContext(row); + boolean found = fishingOperationContext != null; + return found; + + } + + public GenericFormatImportOperationContext getFishingOperationContext(RowWithOperationContextSupport row) { + + FishingOperation fishingOperation = row.getFishingOperation(); + GenericFormatImportOperationContext result = null; + for (GenericFormatImportOperationContext importOperationContext : fishingOperationContexts.values()) { + + FishingOperation importedFishingOperation = importOperationContext.getFishingOperation(); + boolean equals = FishingOperations.equals(importedFishingOperation, fishingOperation); + if (equals) { + result = importOperationContext; + break; + } + + } + + return result; + + } + + + public Iterable<GenericFormatImportOperationContext> getFishingOperationContexts(Predicate<GenericFormatImportOperationContext> predicate) { + + Iterable<GenericFormatImportOperationContext> result; + if (predicate == null) { + result = fishingOperationContexts.values(); + } else { + result = Iterables.filter(fishingOperationContexts.values(), predicate); + } + return result; + + } + + public Iterable<FishingOperation> getFishingOperations() { + return Iterables.transform(fishingOperationContexts.values(), GenericFormatImportOperationContext.TO_FISHING_OPERATION_FUNCTION); + } + + public boolean withGearCaracteristics() { + return !gearsWithcaracteristics.isEmpty(); + } + + public void addGearCaracteristic(Gear gear, Caracteristic caracteristic, Serializable caracteristicValue) { + + gearsWithcaracteristics.add(gear); + + CaracteristicMap caracteristics = gear.getCaracteristics(); + if (caracteristics == null) { + caracteristics = new CaracteristicMap(); + gear.setCaracteristics(caracteristics); + } + caracteristics.put(caracteristic, caracteristicValue); + + } + + public Set<Gear> getGearsWithcaracteristics() { + return gearsWithcaracteristics; + } +} 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 new file mode 100644 index 0000000..51c0d82 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportCruiseResult.java @@ -0,0 +1,64 @@ +package fr.ifremer.tutti.service.genericformat; + +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.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Created on 2/22/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14 + */ +public class GenericFormatImportCruiseResult { + + public static final Function<GenericFormatImportCruiseResult, Cruise> TO_CRUISE_FUNCTION = new Function<GenericFormatImportCruiseResult, Cruise>() { + @Override + public Cruise apply(GenericFormatImportCruiseResult input) { + return input.getCruise(); + } + }; + + private final Cruise cruise; + + private final Map<String, GenericFormatImportOperationResult> fishingOperationResults; + + public GenericFormatImportCruiseResult(GenericFormatImportCruiseContext cruiseContext) { + + this.cruise = cruiseContext.getCruise(); + this.fishingOperationResults = new HashMap<>(); + + Iterable<GenericFormatImportOperationContext> operationContexts = cruiseContext.getFishingOperationContexts(null); + for (GenericFormatImportOperationContext operationContext : operationContexts) { + + GenericFormatImportOperationResult operationResult = new GenericFormatImportOperationResult(operationContext); + fishingOperationResults.put(operationContext.getFishingOperation().getId(), operationResult); + + } + + } + + public Cruise getCruise() { + return cruise; + } + + public GenericFormatImportOperationResult getFishingOperationResult(String fishingOperationId) { + return fishingOperationResults.get(fishingOperationId); + } + + public Collection<String> getFishingOperationIds() { + return fishingOperationResults.keySet(); + } + + public Set<FishingOperation> getFishingOperations() { + return ImmutableSet.copyOf(Iterables.transform(fishingOperationResults.values(), GenericFormatImportOperationResult.TO_FISHING_OPERATION_FUNCTION)); + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportEntityParserFactory.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportEntityParserFactory.java index 7ae8fd3..17da0d6 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportEntityParserFactory.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportEntityParserFactory.java @@ -30,9 +30,7 @@ public class GenericFormatImportEntityParserFactory { private final PersistenceService persistenceService; - private final GenericFormatImportRequest importRequest; - - private final GenericFormatImportResult importResult; + private final GenericFormatImportContext importContext; private ProgramParserFormatter programParser; @@ -67,16 +65,14 @@ public class GenericFormatImportEntityParserFactory { private CaracteristicValueParserFormatter marineLitterSizeCategoryValueParser; public GenericFormatImportEntityParserFactory(PersistenceService persistenceService, - GenericFormatImportRequest importRequest, - GenericFormatImportResult importResult) { + GenericFormatImportContext importContext) { this.persistenceService = persistenceService; - this.importRequest = importRequest; - this.importResult = importResult; + this.importContext = importContext; } public VesselParserFormatter getVesselParser() { if (vesselParser == null) { - vesselParser = VesselParserFormatter.newParser(persistenceService, importResult.getImportedVessels().getIdTranslationMap()); + vesselParser = VesselParserFormatter.newParser(persistenceService, importContext.getImportedVessels().getIdTranslationMap()); } return vesselParser; } @@ -90,7 +86,7 @@ public class GenericFormatImportEntityParserFactory { public GearParserFormatter getGearParser() { if (gearParser == null) { - gearParser = GearParserFormatter.newParser(persistenceService, importResult.getImportedGears().getIdTranslationMap()); + gearParser = GearParserFormatter.newParser(persistenceService, importContext.getImportedGears().getIdTranslationMap()); } return gearParser; } @@ -105,7 +101,7 @@ public class GenericFormatImportEntityParserFactory { public PersonListParserFormatter getPersonListParser() { if (personListParser == null) { - PersonParserFormatter delegateParserFormatter = PersonParserFormatter.newParser(persistenceService, importResult.getImportedPersons().getIdTranslationMap()); + PersonParserFormatter delegateParserFormatter = PersonParserFormatter.newParser(persistenceService, importContext.getImportedPersons().getIdTranslationMap()); personListParser = PersonListParserFormatter.newParser(delegateParserFormatter); } return personListParser; @@ -145,7 +141,7 @@ public class GenericFormatImportEntityParserFactory { public FishingOperationStrataParserFormatter getFishingOperationStrataParser() { if (fishingOperationStrataParser == null) { - Program program = importRequest.getProgram(); + Program program = importContext.getImportRequest().getProgram(); fishingOperationStrataParser = FishingOperationStrataParserFormatter.newParser(persistenceService, program.getZone().getId()); } return fishingOperationStrataParser; @@ -153,7 +149,7 @@ public class GenericFormatImportEntityParserFactory { public FishingOperationSubStrataParserFormatter getFishingOperationSubStrataParser() { if (fishingOperationSubStrataParser == null) { - Program program = importRequest.getProgram(); + Program program = importContext.getImportRequest().getProgram(); fishingOperationSubStrataParser = FishingOperationSubStrataParserFormatter.newParser(persistenceService, program.getZone().getId()); } return fishingOperationSubStrataParser; @@ -161,7 +157,7 @@ public class GenericFormatImportEntityParserFactory { public FishingOperationLocationParserFormatter getFishingOperationLocationParser() { if (fishingOperationLocationParser == null) { - Program program = importRequest.getProgram(); + Program program = importContext.getImportRequest().getProgram(); fishingOperationLocationParser = FishingOperationLocationParserFormatter.newParser(persistenceService, program.getZone().getId()); } return fishingOperationLocationParser; @@ -176,7 +172,7 @@ public class GenericFormatImportEntityParserFactory { public SpeciesParserFormatter getSpeciesParser() { if (speciesParser == null) { - speciesParser = SpeciesParserFormatter.newParser(persistenceService, importResult.getImportedSpecies().getIdTranslationMap()); + speciesParser = SpeciesParserFormatter.newParser(persistenceService, importContext.getImportedSpecies().getIdTranslationMap()); } return speciesParser; } 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 e614a49..5c5d38f 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 @@ -1,11 +1,13 @@ package fr.ifremer.tutti.service.genericformat; +import com.google.common.base.Function; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableList; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; import fr.ifremer.tutti.persistence.entities.data.BenthosBatchFrequency; +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.data.MarineLitterBatch; @@ -15,11 +17,15 @@ import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; +import javax.annotation.Nullable; +import java.io.Closeable; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; /** @@ -28,10 +34,20 @@ import java.util.TreeMap; * @author Tony Chemit - chemit@codelutin.com * @since 3.14 */ -public class GenericFormatImportOperationContext { +public class GenericFormatImportOperationContext implements Closeable { + + public static final Function<GenericFormatImportOperationContext, FishingOperation> TO_FISHING_OPERATION_FUNCTION = new Function<GenericFormatImportOperationContext, FishingOperation>() { + @Nullable + @Override + public FishingOperation apply(GenericFormatImportOperationContext input) { + return input.getFishingOperation(); + } + }; private final FishingOperation fishingOperation; + private final CatchBatch catchBatch; + private final String fishingOperationLabel; private final Collection<MarineLitterBatch> marineLitterBatches; @@ -52,13 +68,18 @@ public class GenericFormatImportOperationContext { private final ArrayListMultimap<Integer, BenthosBatchFrequency> benthosFrequencies; - private final CaracteristicMap fishinOperationGearUseFeatures; + private final CaracteristicMap gearUseFeatures; - private final CaracteristicMap fishinOperationVesselUseFeatures; + private final CaracteristicMap vesselUseFeatures; - public GenericFormatImportOperationContext(FishingOperation fishingOperation, String fishingOperationLabel) { + private final Set<String> checkErrors; + + public GenericFormatImportOperationContext(FishingOperation fishingOperation, + CatchBatch catchBatch, + String fishingOperationLabel) { this.fishingOperation = fishingOperation; + this.catchBatch = catchBatch; this.fishingOperationLabel = fishingOperationLabel; this.marineLitterBatches = new ArrayList<>(); this.accidentalBatchesById = new TreeMap<>(); @@ -69,25 +90,29 @@ public class GenericFormatImportOperationContext { this.vracBenthosBatches = new TreeMap<>(); this.horsVracBenthosBatches = new TreeMap<>(); this.benthosFrequencies = ArrayListMultimap.create(); - this.fishinOperationGearUseFeatures = new CaracteristicMap(); - this.fishinOperationVesselUseFeatures = new CaracteristicMap(); - + this.gearUseFeatures = new CaracteristicMap(); + this.vesselUseFeatures = new CaracteristicMap(); + this.checkErrors = new LinkedHashSet<>(); } public FishingOperation getFishingOperation() { return fishingOperation; } + public CatchBatch getCatchBatch() { + return catchBatch; + } + public String getFishingOperationLabel() { return fishingOperationLabel; } public boolean withGearFeatures() { - return MapUtils.isNotEmpty(fishinOperationGearUseFeatures); + return MapUtils.isNotEmpty(gearUseFeatures); } public boolean withVesselFeatures() { - return MapUtils.isNotEmpty(fishinOperationVesselUseFeatures); + return MapUtils.isNotEmpty(vesselUseFeatures); } public boolean withMarineLitterBatches() { @@ -127,11 +152,11 @@ public class GenericFormatImportOperationContext { } public void addGearUseFeature(Caracteristic caracteristic, Serializable value) { - fishinOperationGearUseFeatures.put(caracteristic, value); + gearUseFeatures.put(caracteristic, value); } public void addVesselUseFeature(Caracteristic caracteristic, Serializable value) { - fishinOperationVesselUseFeatures.put(caracteristic, value); + vesselUseFeatures.put(caracteristic, value); } public void addMarineLitterBatch(MarineLitterBatch marineLitterBatch) { @@ -162,6 +187,10 @@ public class GenericFormatImportOperationContext { benthosFrequencies.put(batch.getIdAsInt(), frequency); } + public void addCheckErrors(Set<String> checkErrors) { + this.checkErrors.addAll(checkErrors); + } + public Collection<MarineLitterBatch> getMarineLitterBatches() { return ImmutableList.copyOf(marineLitterBatches); } @@ -190,12 +219,12 @@ public class GenericFormatImportOperationContext { return speciesFrequencies.get(speciesBatch.getIdAsInt()); } - public CaracteristicMap getFishinOperationGearUseFeatures() { - return fishinOperationGearUseFeatures; + public CaracteristicMap getGearUseFeatures() { + return gearUseFeatures; } - public CaracteristicMap getFishinOperationVesselUseFeatures() { - return fishinOperationVesselUseFeatures; + public CaracteristicMap getVesselUseFeatures() { + return vesselUseFeatures; } private Map<Integer, SpeciesBatch> getSpeciesBatchMap(boolean vrac) { @@ -206,5 +235,25 @@ public class GenericFormatImportOperationContext { return vrac ? vracBenthosBatches : horsVracBenthosBatches; } + public Set<String> getCheckErrors() { + return checkErrors; + } + + @Override + public void close() { + + gearUseFeatures.clear(); + vesselUseFeatures.clear(); + marineLitterBatches.clear(); + individualObservationBatchesById.clear(); + accidentalBatchesById.clear(); + benthosFrequencies.clear(); + vracBenthosBatches.clear(); + horsVracBenthosBatches.clear(); + speciesFrequencies.clear(); + vracSpeciesBatches.clear(); + horsVracSpeciesBatches.clear(); + + } } 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 new file mode 100644 index 0000000..159e75b --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationResult.java @@ -0,0 +1,145 @@ +package fr.ifremer.tutti.service.genericformat; + +import com.google.common.base.Function; +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; + +import javax.annotation.Nullable; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 2/22/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14 + */ +public class GenericFormatImportOperationResult { + + public static final Function<GenericFormatImportOperationResult, FishingOperation> TO_FISHING_OPERATION_FUNCTION = new Function<GenericFormatImportOperationResult, FishingOperation>() { + @Nullable + @Override + public FishingOperation apply(GenericFormatImportOperationResult input) { + return input.getFishingOperation(); + } + }; + + private final Set<String> checkErrors; + + private final FishingOperation fishingOperation; + + private final CatchBatch catchBatch; + + private int nbGearFeautres; + + private int nbVesselFeautres; + + private int nbAccidentalCatches; + + private int nbMarineLitters; + + private int nbIndividualObservations; + + private int nbSpeciesBatchesVrac; + + private int nbSpeciesBatchesHorsVrac; + + private int nbBenthosBatchesVrac; + + private int nbBenthosBatchesHorsVrac; + + public GenericFormatImportOperationResult(GenericFormatImportOperationContext operationContext) { + this.fishingOperation = operationContext.getFishingOperation(); + catchBatch = operationContext.getCatchBatch(); + this.checkErrors = new LinkedHashSet<>(); + flushContext(operationContext); + } + + public void addCheckError(String error) { + checkErrors.add(error); + } + + public Set<String> getCheckErrors() { + return checkErrors; + } + + public FishingOperation getFishingOperation() { + return fishingOperation; + } + + public CatchBatch getCatchBatch() { + return catchBatch; + } + + public int getNbGearFeautres() { + return nbGearFeautres; + } + + public int getNbVesselFeautres() { + return nbVesselFeautres; + } + + public int getNbAccidentalCatches() { + return nbAccidentalCatches; + } + + public int getNbMarineLitters() { + return nbMarineLitters; + } + + public int getNbIndividualObservations() { + return nbIndividualObservations; + } + + public int getNbSpeciesBatchesVrac() { + return nbSpeciesBatchesVrac; + } + + public int getNbSpeciesBatchesHorsVrac() { + return nbSpeciesBatchesHorsVrac; + } + + public int getNbBenthosBatchesVrac() { + return nbBenthosBatchesVrac; + } + + public int getNbBenthosBatchesHorsVrac() { + return nbBenthosBatchesHorsVrac; + } + + protected void flushContext(GenericFormatImportOperationContext operationContext) { + + //TODO See what else to set here (catch stuff ?) + if (operationContext.withGearFeatures()) { + nbGearFeautres = operationContext.getGearUseFeatures().size(); + } + if (operationContext.withVesselFeatures()) { + nbVesselFeautres = operationContext.getVesselUseFeatures().size(); + } + if (operationContext.withAccidentalBatches()) { + nbAccidentalCatches = operationContext.getAccidentalBatches().size(); + } + if (operationContext.withMarineLitterBatches()) { + nbMarineLitters = operationContext.getMarineLitterBatches().size(); + } + if (operationContext.withIndividualObservationBatches()) { + nbIndividualObservations = operationContext.getIndividualObservationBatches().size(); + } + + if (operationContext.withSpeciesBatches(true)) { + nbSpeciesBatchesVrac = operationContext.getSpeciesBatches(true).size(); + } + if (operationContext.withSpeciesBatches(false)) { + nbSpeciesBatchesHorsVrac = operationContext.getSpeciesBatches(false).size(); + } + if (operationContext.withBenthosBatches(true)) { + nbBenthosBatchesVrac = operationContext.getBenthosBatches(true).size(); + } + 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/GenericFormatImportRequest.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java index 052113b..13af96d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java @@ -2,6 +2,7 @@ package fr.ifremer.tutti.service.genericformat; import com.google.common.collect.ImmutableSet; import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.Cruises; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; @@ -70,4 +71,20 @@ public class GenericFormatImportRequest { return program; } + public Cruise getExistingCruise(Cruise importRowCruise) { + + Cruise result = null; + for (Cruise cruise : existingCruises) { + + boolean equals = Cruises.equals(importRowCruise, cruise); + if (equals) { + result = cruise; + break; + } + + } + return result; + + } + } 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 24471a5..251d58d 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 @@ -1,10 +1,9 @@ package fr.ifremer.tutti.service.genericformat; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSetMultimap; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; +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 fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -12,7 +11,10 @@ import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import java.util.Collection; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.Map; import java.util.Set; /** @@ -23,29 +25,32 @@ import java.util.Set; */ public class GenericFormatImportResult { - private final Set<Cruise> importedCruises; - - private final Multimap<Cruise, FishingOperation> importedFishingOperations; + private final Map<String, GenericFormatImportCruiseResult> cruiseResults; private final Set<String> errors; - private TuttiProtocol protocol; + private final TuttiProtocol protocol; - private GenericFormatReferentialImportResult<Gear, Integer> importedGears; + private final GenericFormatReferentialImportResult<Gear, Integer> importedGears; - private GenericFormatReferentialImportResult<Person, Integer> importedPersons; + private final GenericFormatReferentialImportResult<Person, Integer> importedPersons; - private GenericFormatReferentialImportResult<Species, Integer> importedSpecies; + private final GenericFormatReferentialImportResult<Species, Integer> importedSpecies; - private GenericFormatReferentialImportResult<Vessel, String> importedVessels; + private final GenericFormatReferentialImportResult<Vessel, String> importedVessels; private final GenericFormatImportRequest importRequest; - public GenericFormatImportResult(GenericFormatImportRequest importRequest) { - this.importRequest = importRequest; - this.importedCruises = new LinkedHashSet<>(); + public GenericFormatImportResult(GenericFormatImportContext importContext) { + this.importRequest = importContext.getImportRequest(); + this.cruiseResults = new LinkedHashMap<>(); this.errors = new LinkedHashSet<>(); - this.importedFishingOperations = LinkedHashMultimap.create(); + this.protocol = importContext.getImportedProtocol(); + this.importedGears = importContext.getImportedGears(); + this.importedPersons = importContext.getImportedPersons(); + this.importedSpecies = importContext.getImportedSpecies(); + this.importedVessels = importContext.getImportedVessels(); + } public GenericFormatImportRequest getImportRequest() { @@ -53,71 +58,81 @@ public class GenericFormatImportResult { } public Set<Cruise> getImportedCruises() { - return ImmutableSet.copyOf(importedCruises); + return ImmutableSet.copyOf(Iterables.transform(cruiseResults.values(), GenericFormatImportCruiseResult.TO_CRUISE_FUNCTION)); } - public Multimap<Cruise, FishingOperation> getImportedFishingOperations() { - return ImmutableSetMultimap.copyOf(importedFishingOperations); - } + public Cruise getCruise(Cruise importRowCruise) { + + Cruise result = null; + for (GenericFormatImportCruiseResult importCruiseResult : cruiseResults.values()) { + + Cruise cruise = importCruiseResult.getCruise(); + boolean equals = Cruises.equals(importRowCruise, cruise); + if (equals) { + result = cruise; + break; + } + + } + return result; - public Set<FishingOperation> getImportedFishingOperations(Cruise cruise) { - return ImmutableSet.copyOf(importedFishingOperations.get(cruise)); } - public TuttiProtocol getProtocol() { - return protocol; + public GenericFormatImportCruiseResult getImportedCruiseResult(String cruiseId) { + return cruiseResults.get(cruiseId); } - public Set<String> getErrors() { - return ImmutableSet.copyOf(errors); + public Set<FishingOperation> getImportedFishingOperations(Cruise cruise) { + GenericFormatImportCruiseResult importCruiseResult = getImportedCruiseResult(cruise.getId()); + return ImmutableSet.copyOf(importCruiseResult.getFishingOperations()); } - public void addImportedCruise(Cruise cruise) { - importedCruises.add(cruise); + public Collection<String> getImportedFishingOperationIds(Cruise cruise) { + GenericFormatImportCruiseResult importCruiseResult = getImportedCruiseResult(cruise.getId()); + return ImmutableSet.copyOf(importCruiseResult.getFishingOperationIds()); } - public void addImportedFishingOperation(FishingOperation fishingOperation) { - importedFishingOperations.put(fishingOperation.getCruise(), fishingOperation); + public Set<String> getErrors() { + return ImmutableSet.copyOf(errors); } public void addError(String error) { errors.add(error); } - public void setProtocol(TuttiProtocol protocol) { - this.protocol = protocol; + public TuttiProtocol getProtocol() { + return protocol; } public GenericFormatReferentialImportResult<Gear, Integer> getImportedGears() { return importedGears; } - public void setImportedGears(GenericFormatReferentialImportResult<Gear, Integer> importedGears) { - this.importedGears = importedGears; - } - public GenericFormatReferentialImportResult<Person, Integer> getImportedPersons() { return importedPersons; } - public void setImportedPersons(GenericFormatReferentialImportResult<Person, Integer> importedPersons) { - this.importedPersons = importedPersons; - } - public GenericFormatReferentialImportResult<Species, Integer> getImportedSpecies() { return importedSpecies; } - public void setImportedSpecies(GenericFormatReferentialImportResult<Species, Integer> importedSpecies) { - this.importedSpecies = importedSpecies; - } - public GenericFormatReferentialImportResult<Vessel, String> getImportedVessels() { return importedVessels; } - public void setImportedVessels(GenericFormatReferentialImportResult<Vessel, String> importedVessels) { - this.importedVessels = importedVessels; + public void addFishingOperationCheckError(Cruise cruise, String fishingOperationId, String checkError) { + + GenericFormatImportCruiseResult importedCruiseResult = getImportedCruiseResult(cruise.getId()); + GenericFormatImportOperationResult fishingOperationResult = importedCruiseResult.getFishingOperationResult(fishingOperationId); + fishingOperationResult.addCheckError(checkError); + } + public void flushContext(GenericFormatImportCruiseContext cruiseContext) { + + Cruise cruise = cruiseContext.getCruise(); + GenericFormatImportCruiseResult cruiseResult = new GenericFormatImportCruiseResult(cruiseContext); + cruiseResults.put(cruise.getId(), cruiseResult); + + } } 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 eb1bbea..ba129f5 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 @@ -3,7 +3,6 @@ package fr.ifremer.tutti.service.genericformat; import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; -import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; @@ -12,11 +11,9 @@ import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Vessel; -import fr.ifremer.tutti.service.AbstractTuttiService; -import fr.ifremer.tutti.service.DecoratorService; -import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiServiceContext; import fr.ifremer.tutti.service.ValidationService; +import fr.ifremer.tutti.service.catches.WeightCleaningService; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForAccidentalCatch; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForCatch; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForGearCaracteristic; @@ -35,13 +32,8 @@ import fr.ifremer.tutti.service.genericformat.csv.OperationRow; import fr.ifremer.tutti.service.genericformat.csv.ParameterRow; import fr.ifremer.tutti.service.genericformat.csv.SampleCategoryRow; import fr.ifremer.tutti.service.genericformat.csv.SurveyRow; -import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; import fr.ifremer.tutti.service.referential.ReferentialImportRequest; import fr.ifremer.tutti.service.referential.ReferentialImportResult; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryGearService; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryPersonService; -import fr.ifremer.tutti.service.referential.ReferentialTemporarySpeciesService; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryVesselService; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryGear; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryPerson; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporarySpecies; @@ -54,7 +46,6 @@ 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.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.File; @@ -64,6 +55,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Map; +import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -73,42 +65,19 @@ import static org.nuiton.i18n.I18n.t; * @author Tony Chemit - chemit@codelutin.com * @since 3.14 */ -public class GenericFormatImportService extends AbstractTuttiService { +public class GenericFormatImportService extends GenericFormatServiceSupport { private static final Log log = LogFactory.getLog(GenericFormatImportService.class); - protected PersistenceService persistenceService; + protected WeightCleaningService weightCleaningService; protected ValidationService validationServic; - protected ReferentialTemporaryGearService referentialTemporaryGearService; - - protected ReferentialTemporaryPersonService referentialTemporaryPersonService; - - protected ReferentialTemporarySpeciesService referentialTemporarySpeciesService; - - protected ReferentialTemporaryVesselService referentialTemporaryVesselService; - - protected ProtocolImportExportService protocolImportExportService; - - protected Decorator<FishingOperation> fishingOperationDecorator; - - protected Decorator<Cruise> cruiseDecorator; - @Override public void setServiceContext(TuttiServiceContext context) { super.setServiceContext(context); - persistenceService = getService(PersistenceService.class); - referentialTemporaryGearService = getService(ReferentialTemporaryGearService.class); - referentialTemporaryPersonService = getService(ReferentialTemporaryPersonService.class); - referentialTemporarySpeciesService = getService(ReferentialTemporarySpeciesService.class); - referentialTemporaryVesselService = getService(ReferentialTemporaryVesselService.class); - protocolImportExportService = getService(ProtocolImportExportService.class); - - DecoratorService decoratorService = getService(DecoratorService.class); - cruiseDecorator = decoratorService.getDecoratorByType(Cruise.class); - fishingOperationDecorator = decoratorService.getDecoratorByType(FishingOperation.class); + weightCleaningService = getService(WeightCleaningService.class); } @@ -145,6 +114,16 @@ public class GenericFormatImportService extends AbstractTuttiService { GenericFormatArchive archive = GenericFormatArchive.forImport(importFile, context.getConfig().getTmpDirectory()); + GenericFormatImportResult result = doImport(archive, program, progressionModel); + + computeReport(result); + + return result; + + } + + protected GenericFormatImportResult doImport(GenericFormatArchive archive, Program program, ProgressionModel progressionModel) { + GenericFormatImportRequest request = new GenericFormatImportRequest(persistenceService, archive, ';', @@ -153,7 +132,7 @@ public class GenericFormatImportService extends AbstractTuttiService { try (GenericFormatImportContext importContext = new GenericFormatImportContext(request, progressionModel, persistenceService, cruiseDecorator, fishingOperationDecorator)) { - GenericFormatImportResult result = new GenericFormatImportResult(request); + GenericformatImportPersitenceHelper persitenceHelper = new GenericformatImportPersitenceHelper(importContext, persistenceService, cruiseDecorator, fishingOperationDecorator); checkSampleCategoryModel(importContext); importTemporaryGears(importContext); @@ -162,30 +141,38 @@ public class GenericFormatImportService extends AbstractTuttiService { importTemporaryVessels(importContext); importProtocol(importContext); - importCruises(importContext); - importGearCaracteristics(importContext); - importOperations(importContext); - importParameters(importContext); - importCatches(importContext); - importMarineLitters(importContext); - importIndividualObservations(importContext); - importAccidentalCatches(importContext); + importCruises(importContext, persitenceHelper); + importGearCaracteristics(importContext, persitenceHelper); + importOperations(importContext, persitenceHelper); + importParameters(importContext, persitenceHelper); + importCatches(importContext, persitenceHelper); + importMarineLitters(importContext, persitenceHelper); + importIndividualObservations(importContext, persitenceHelper); + importAccidentalCatches(importContext, persitenceHelper); + + doCleanWeights(importContext); + doCheckCruises(importContext); + GenericFormatImportResult result = new GenericFormatImportResult(importContext); return result; - } catch (IOException e) { - throw new ApplicationTechnicalException("Could not create close import context", e); } } + protected void computeReport(GenericFormatImportResult result) { + + //TODO Compute report + + } + protected void checkSampleCategoryModel(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import sample category model."); } - importContext.increments(t("tutti.genericFormat.import.sampleCategoryModel")); + importContext.increments(t("tutti.service.genericFormat.import.sampleCategoryModel")); try (CsvConsumerForSampleCategory consumer = importContext.loadSampleCategories()) { int nbCategories = 0; @@ -196,7 +183,7 @@ public class GenericFormatImportService extends AbstractTuttiService { if (nbCategories != importContext.getImportRequest().getSampleCategoryModel().getNbSampling()) { - throw new ImportRuntimeException(t("tutti.genericFormat.import.sampleCategoryModel.error.missingCategories")); + throw new ImportRuntimeException(t("tutti.service.genericFormat.import.sampleCategoryModel.error.missingCategories")); } @@ -208,8 +195,11 @@ public class GenericFormatImportService extends AbstractTuttiService { protected void importTemporaryGears(GenericFormatImportContext importContext) { - importContext.increments(t("tutti.genericFormat.import.temporaryGears")); + importContext.increments(t("tutti.service.genericFormat.import.temporaryGears")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); + + GenericFormatReferentialImportResult<Gear, Integer> importResult; + if (archive.isTemporaryReferentialGearsPathExists()) { if (log.isInfoEnabled()) { @@ -228,10 +218,9 @@ public class GenericFormatImportService extends AbstractTuttiService { ReferentialImportResult<Gear> referentialImportResult = referentialTemporaryGearService.executeImportRequest(referentialImportRequest); - GenericFormatReferentialImportResult<Gear, Integer> genericFormatReferentialImportResult = new GenericFormatReferentialImportResult<>(referentialImportRequest, referentialImportResult); - importContext.getImportResult().setImportedGears(genericFormatReferentialImportResult); + importResult = new GenericFormatReferentialImportResult<>(referentialImportRequest, referentialImportResult); if (log.isInfoEnabled()) { - log.info("Temporary gears import result: " + genericFormatReferentialImportResult.getReport()); + log.info("Temporary gears import result: " + importResult.getReport()); } } else { @@ -239,16 +228,21 @@ public class GenericFormatImportService extends AbstractTuttiService { if (log.isInfoEnabled()) { log.info("Skip import temporary gears (no file found)."); } - importContext.getImportResult().setImportedGears(new GenericFormatReferentialImportResult<Gear, Integer>()); + importResult = new GenericFormatReferentialImportResult<>(); } + importContext.setImportedGears(importResult); + } protected void importTemporaryPersons(GenericFormatImportContext importContext) { - importContext.increments(t("tutti.genericFormat.import.temporaryPersons")); + importContext.increments(t("tutti.service.genericFormat.import.temporaryPersons")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); + + GenericFormatReferentialImportResult<Person, Integer> importResult; + if (archive.isTemporaryReferentialPersonsPathExists()) { if (log.isInfoEnabled()) { @@ -267,10 +261,9 @@ public class GenericFormatImportService extends AbstractTuttiService { ReferentialImportResult<Person> referentialImportResult = referentialTemporaryPersonService.executeImportRequest(referentialImportRequest); - GenericFormatReferentialImportResult<Person, Integer> genericFormatReferentialImportResult = new GenericFormatReferentialImportResult<>(referentialImportRequest, referentialImportResult); - importContext.getImportResult().setImportedPersons(genericFormatReferentialImportResult); + importResult = new GenericFormatReferentialImportResult<>(referentialImportRequest, referentialImportResult); if (log.isInfoEnabled()) { - log.info("Temporary persons import result: " + genericFormatReferentialImportResult.getReport()); + log.info("Temporary persons import result: " + importResult.getReport()); } } else { @@ -278,15 +271,20 @@ public class GenericFormatImportService extends AbstractTuttiService { if (log.isInfoEnabled()) { log.info("Skip import temporary persons (no file found)."); } - importContext.getImportResult().setImportedPersons(new GenericFormatReferentialImportResult<Person, Integer>()); + importResult = new GenericFormatReferentialImportResult<>(); } + importContext.setImportedPersons(importResult); + } protected void importTemporarySpecies(GenericFormatImportContext importContext) { - importContext.increments(t("tutti.genericFormat.import.temporarySpecies")); + importContext.increments(t("tutti.service.genericFormat.import.temporarySpecies")); + + GenericFormatReferentialImportResult<Species, Integer> importResult; + GenericFormatArchive archive = importContext.getImportRequest().getArchive(); if (archive.isTemporaryReferentialSpeciesPathExists()) { @@ -306,27 +304,31 @@ public class GenericFormatImportService extends AbstractTuttiService { ReferentialImportResult<Species> referentialImportResult = referentialTemporarySpeciesService.executeImportRequest(referentialImportRequest); - GenericFormatReferentialImportResult<Species, Integer> genericFormatReferentialImportResult = new GenericFormatReferentialImportResult<>(referentialImportRequest, referentialImportResult); - importContext.getImportResult().setImportedSpecies(genericFormatReferentialImportResult); + importResult = new GenericFormatReferentialImportResult<>(referentialImportRequest, referentialImportResult); if (log.isInfoEnabled()) { - log.info("Temporary species import result: " + genericFormatReferentialImportResult.getReport()); + log.info("Temporary species import result: " + importResult.getReport()); } } else { if (log.isInfoEnabled()) { log.info("Skip import temporary species (no file found)."); } - importContext.getImportResult().setImportedSpecies(new GenericFormatReferentialImportResult<Species, Integer>()); + importResult = new GenericFormatReferentialImportResult<>(); } + importContext.setImportedSpecies(importResult); + } protected void importTemporaryVessels(GenericFormatImportContext importContext) { - importContext.increments(t("tutti.genericFormat.import.temporaryVessels")); + importContext.increments(t("tutti.service.genericFormat.import.temporaryVessels")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); + + GenericFormatReferentialImportResult<Vessel, String> importResult; + if (archive.isTemporaryReferentialVesselsPathExists()) { if (log.isInfoEnabled()) { @@ -345,11 +347,10 @@ public class GenericFormatImportService extends AbstractTuttiService { ReferentialImportResult<Vessel> referentialImportResult = referentialTemporaryVesselService.executeImportRequest(referentialImportRequest); - GenericFormatReferentialImportResult<Vessel, String> genericFormatReferentialImportResult = new GenericFormatReferentialImportResult<>(referentialImportRequest, referentialImportResult); - importContext.getImportResult().setImportedVessels(genericFormatReferentialImportResult); + importResult = new GenericFormatReferentialImportResult<>(referentialImportRequest, referentialImportResult); if (log.isInfoEnabled()) { - log.info("Temporary vessels import result: " + genericFormatReferentialImportResult.getReport()); + log.info("Temporary vessels import result: " + importResult.getReport()); } } else { @@ -357,15 +358,17 @@ public class GenericFormatImportService extends AbstractTuttiService { if (log.isInfoEnabled()) { log.info("Skip import temporary vessels (no file found)."); } - importContext.getImportResult().setImportedVessels(new GenericFormatReferentialImportResult<Vessel, String>()); + importResult = new GenericFormatReferentialImportResult<>(); } + importContext.setImportedVessels(importResult); + } protected void importProtocol(GenericFormatImportContext importContext) { - importContext.increments(t("tutti.genericFormat.load.protocol")); + importContext.increments(t("tutti.service.genericFormat.load.protocol")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); if (archive.isProtocolExists()) { @@ -375,18 +378,18 @@ public class GenericFormatImportService extends AbstractTuttiService { TuttiProtocol tuttiProtocol = protocolImportExportService.importProtocol(archive.getProtocolPath().toFile()); - Map<String, String> idTranslationMap = importContext.getImportResult().getImportedSpecies().getIdTranslationMap(); + Map<String, String> idTranslationMap = importContext.getImportedSpecies().getIdTranslationMap(); TuttiProtocols.translateReferenceTaxonIds(tuttiProtocol, idTranslationMap); String newName = persistenceService.getFirstAvailableName(tuttiProtocol.getName()); tuttiProtocol.setName(newName); - importContext.increments(t("tutti.genericFormat.import.protocol", tuttiProtocol.getName())); + importContext.increments(t("tutti.service.genericFormat.import.protocol", tuttiProtocol.getName())); tuttiProtocol = persistenceService.createProtocol(tuttiProtocol); persistenceService.setProtocol(tuttiProtocol); - importContext.getImportResult().setProtocol(tuttiProtocol); + importContext.setImportedProtocol(tuttiProtocol); } else { @@ -397,21 +400,20 @@ public class GenericFormatImportService extends AbstractTuttiService { } } - protected void importCruises(GenericFormatImportContext importContext) { + protected void importCruises(GenericFormatImportContext importContext, GenericformatImportPersitenceHelper persitenceHelper) { if (log.isInfoEnabled()) { log.info("Import survey.csv file."); } - importContext.increments(t("tutti.genericFormat.import.cruises")); + importContext.increments(t("tutti.service.genericFormat.import.cruises")); try (CsvConsumerForSurvey consumer = importContext.loadSurveys()) { for (ImportRow<SurveyRow> row : consumer) { consumer.validateRow(row, importContext); - consumer.prepareRowForPersist(row); - importContext.getPersitenceHelper().persistCruise(row.getBean().getCruise()); + persitenceHelper.persistCruise(row.getBean().getCruise()); } } catch (IOException e) { @@ -420,51 +422,47 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importGearCaracteristics(GenericFormatImportContext importContext) { + protected void importGearCaracteristics(GenericFormatImportContext importContext, GenericformatImportPersitenceHelper persitenceHelper) { if (log.isInfoEnabled()) { log.info("Import gearCaracteristics.csv file."); } - importContext.increments(t("tutti.genericFormat.import.gearCaracteristics")); + importContext.increments(t("tutti.service.genericFormat.import.gearCaracteristics")); try (CsvConsumerForGearCaracteristic consumer = importContext.loadGearCaracteristics()) { for (ImportRow<GearCaracteristicRow> row : consumer) { - consumer.validateRow(row, importContext); - - consumer.prepareRowForPersist(row); + GenericFormatImportCruiseContext cruiseContext = consumer.validateRow(row, importContext); + consumer.prepareRowForPersist(cruiseContext, row); } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close gearCaracteristic.csv file", e); } - importContext.getPersitenceHelper().persistGearCaracteristics(); + persitenceHelper.persistGearCaracteristics(); } - protected void importOperations(GenericFormatImportContext importContext) { + protected void importOperations(GenericFormatImportContext importContext, GenericformatImportPersitenceHelper persitenceHelper) { if (log.isInfoEnabled()) { log.info("Import operation.csv file."); } - importContext.increments(t("tutti.genericFormat.import.operations")); + importContext.increments(t("tutti.service.genericFormat.import.operations")); try (CsvConsumerForOperation consumer = importContext.loadOperations()) { for (ImportRow<OperationRow> row : consumer) { - consumer.validateRow(row, importContext); - - consumer.prepareRowForPersist(row); + GenericFormatImportCruiseContext cruiseContext = consumer.validateRow(row, importContext); + consumer.prepareRowForPersist(cruiseContext, row); OperationRow bean = row.getBean(); - FishingOperation savedFishingOperation = importContext.getPersitenceHelper().persistFishingOperation(bean.getFishingOperation()); - + FishingOperation fishingOperation = bean.getFishingOperation(); CatchBatch catchBatch = bean.getCatchBatch(); - catchBatch.setFishingOperation(savedFishingOperation); - importContext.getPersitenceHelper().persistCatchBatch(catchBatch); + persitenceHelper.persistFishingOperation(fishingOperation, catchBatch); } } catch (IOException e) { @@ -473,129 +471,156 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importParameters(GenericFormatImportContext importContext) { + protected void importParameters(GenericFormatImportContext importContext, GenericformatImportPersitenceHelper persitenceHelper) { if (log.isInfoEnabled()) { log.info("Import parameter.csv file."); } - importContext.increments(t("tutti.genericFormat.import.parameters")); + importContext.increments(t("tutti.service.genericFormat.import.parameters")); try (CsvConsumerForParameter consumer = importContext.loadParameters()) { for (ImportRow<ParameterRow> row : consumer) { - consumer.validateRow(row, importContext); - - GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); - - consumer.prepareRowForPersist(fishingOperationContext,row); + GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext); + consumer.prepareRowForPersist(operationContext, row); } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close parameter.csv file", e); } - importContext.getPersitenceHelper().persistFishingOperationParameters(); + persitenceHelper.persistFishingOperationParameters(); } - protected void importCatches(GenericFormatImportContext importContext) { + protected void importCatches(GenericFormatImportContext importContext, GenericformatImportPersitenceHelper persitenceHelper) { if (log.isInfoEnabled()) { log.info("Import catch.csv file."); } - importContext.increments(t("tutti.genericFormat.import.catches")); + importContext.increments(t("tutti.service.genericFormat.import.catches")); try (CsvConsumerForCatch consumer = importContext.loadCatches()) { for (ImportRow<CatchRow> row : consumer) { - consumer.validateRow(row, importContext); - - GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); - - consumer.prepareRowForPersist(fishingOperationContext, row); + GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext); + consumer.prepareRowForPersist(operationContext, row); } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close catch.csv file", e); } - importContext.getPersitenceHelper().persistSpeciesBatches(); - importContext.getPersitenceHelper().persistBenthosBatches(); + persitenceHelper.persistSpeciesBatches(); + persitenceHelper.persistBenthosBatches(); } - protected void importAccidentalCatches(GenericFormatImportContext importContext) { + protected void importMarineLitters(GenericFormatImportContext importContext, GenericformatImportPersitenceHelper persitenceHelper) { if (log.isInfoEnabled()) { - log.info("Import accidentalCatch.csv file."); + log.info("Import marineLitter.csv file."); } - importContext.increments(t("tutti.genericFormat.import.accidentalCatches")); - - try (CsvConsumerForAccidentalCatch consumer = importContext.loadAccidentalCatches()) { - for (ImportRow<AccidentalCatchRow> row : consumer) { + importContext.increments(t("tutti.service.genericFormat.import.marineLitters")); - consumer.validateRow(row, importContext); + try (CsvConsumerForMarineLitter consumer = importContext.loadMarineLitters()) { + for (ImportRow<MarineLitterRow> row : consumer) { - GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); + GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext); - consumer.prepareRowForPersist(fishingOperationContext, row); + consumer.prepareRowForPersist(operationContext, row); } } catch (IOException e) { - throw new ApplicationTechnicalException("Could not close accidentalCatch.csv file", e); + throw new ApplicationTechnicalException("Could not close marineLitter.csv file", e); } - importContext.getPersitenceHelper().persistAccidentalBatches(); + persitenceHelper.persistMarineLitterBatches(); } - protected void importIndividualObservations(GenericFormatImportContext importContext) { + protected void importIndividualObservations(GenericFormatImportContext importContext, GenericformatImportPersitenceHelper persitenceHelper) { if (log.isInfoEnabled()) { log.info("Import individualObservation.csv file."); } - importContext.increments(t("tutti.genericFormat.import.individualObservations")); + importContext.increments(t("tutti.service.genericFormat.import.individualObservations")); try (CsvConsumerForIndividualObservation consumer = importContext.loadIndividualObservations()) { for (ImportRow<IndividualObservationRow> row : consumer) { - consumer.validateRow(row, importContext); - - GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); - - consumer.prepareRowForPersist(fishingOperationContext, row); + GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext); + consumer.prepareRowForPersist(operationContext, row); } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close individualObservation.csv file", e); } - importContext.getPersitenceHelper().persistIndividualObservationBatches(); + persitenceHelper.persistIndividualObservationBatches(); } - protected void importMarineLitters(GenericFormatImportContext importContext) { + protected void importAccidentalCatches(GenericFormatImportContext importContext, GenericformatImportPersitenceHelper persitenceHelper) { if (log.isInfoEnabled()) { - log.info("Import marineLitter.csv file."); + log.info("Import accidentalCatch.csv file."); } - importContext.increments(t("tutti.genericFormat.import.marineLitters")); - - try (CsvConsumerForMarineLitter consumer = importContext.loadMarineLitters()) { - for (ImportRow<MarineLitterRow> row : consumer) { - - consumer.validateRow(row, importContext); + importContext.increments(t("tutti.service.genericFormat.import.accidentalCatches")); - GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); + try (CsvConsumerForAccidentalCatch consumer = importContext.loadAccidentalCatches()) { + for (ImportRow<AccidentalCatchRow> row : consumer) { - consumer.prepareRowForPersist(fishingOperationContext, row); + GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext); + consumer.prepareRowForPersist(operationContext, row); } } catch (IOException e) { - throw new ApplicationTechnicalException("Could not close marineLitter.csv file", e); + throw new ApplicationTechnicalException("Could not close accidentalCatch.csv file", e); } - importContext.getPersitenceHelper().persistMarineLitterBatches(); + persitenceHelper.persistAccidentalBatches(); + + } + + protected void doCleanWeights(GenericFormatImportContext importContext) { + + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + + @Override + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { + + for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts(null)) { + + progressionModel.increments(t("tutti.service.genericFormat.cleanWeights.fishingOperation", operationContext.getFishingOperationLabel())); + + weightCleaningService.cleanFishingOperation(operationContext.getFishingOperation().getId()); + + } + + } + }); + + } + + protected void doCheckCruises(GenericFormatImportContext importContext) { + + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + + @Override + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { + + for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts(null)) { + + progressionModel.increments(t("tutti.service.genericFormat.checkWeights.fishingOperation", operationContext.getFishingOperationLabel())); + + Set<String> errors = checkFishingOperation(operationContext.getFishingOperation().getId()); + operationContext.addCheckErrors(errors); + + } + + } + }); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationDataContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationDataContext.java index 3066873..a4f9aa8 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationDataContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationDataContext.java @@ -1,5 +1,6 @@ package fr.ifremer.tutti.service.genericformat; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; @@ -9,7 +10,6 @@ import fr.ifremer.tutti.service.TuttiValidationDataContextSupport; import java.util.ArrayList; import java.util.List; -import java.util.Set; /** * Created on 2/19/15. @@ -50,8 +50,9 @@ public class GenericFormatImportValidationDataContext extends TuttiValidationDat if (cruise != null) { - Set<FishingOperation> importedFishingOperations = importContext.getImportResult().getImportedFishingOperations(cruise); - result.addAll(importedFishingOperations); + GenericFormatImportCruiseContext cruiseContext = importContext.getCruiseContext(cruise); + Iterable<FishingOperation> importedFishingOperations = cruiseContext.getFishingOperations(); + Iterables.addAll(result, importedFishingOperations); if (fishingOperation != null) { result.remove(fishingOperation); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationHelper.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationHelper.java index 3d1d129..28a313e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationHelper.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationHelper.java @@ -2,11 +2,13 @@ package fr.ifremer.tutti.service.genericformat; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.service.TuttiValidationDataContextSupport; import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.consumer.CruiseNotFoundException; import fr.ifremer.tutti.service.genericformat.consumer.FishingOperationNotFoundInCruiseException; +import fr.ifremer.tutti.service.genericformat.consumer.GearNotFoundInCruiseException; import fr.ifremer.tutti.service.genericformat.csv.RowWithCruiseContextSupport; import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport; import org.apache.commons.io.IOUtils; @@ -58,6 +60,7 @@ public class GenericFormatImportValidationHelper implements Closeable { try { Cruise cruise = fishingOperation.getCruise(); validationDataContext.setCruise(cruise); + validationDataContext.setFishingOperation(fishingOperation); NuitonValidatorResult nuitonValidatorResult = validationService.validateEditFishingOperation(fishingOperation); return nuitonValidatorResult; } finally { @@ -65,36 +68,58 @@ public class GenericFormatImportValidationHelper implements Closeable { } } - public <R extends RowWithCruiseContextSupport> Cruise getCruise(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatImportContext importContext) { + public <R extends RowWithCruiseContextSupport> GenericFormatImportCruiseContext getCruise(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatImportContext importContext) { R bean = row.getBean(); - Cruise cruise = importContext.getImportedCruise(bean.getCruise()); - if (cruise == null) { + GenericFormatImportCruiseContext cruiseContext = importContext.getCruiseContext(bean); + + if (cruiseContext == null) { consumer.addCheckError(row, new CruiseNotFoundException(bean.getCruise())); } else { + Cruise cruise = cruiseContext.getCruise(); bean.setCruise(cruise); + if (bean instanceof RowWithOperationContextSupport) { + ((RowWithOperationContextSupport) bean).getFishingOperation().setCruise(cruise); + + } } - return cruise; + return cruiseContext; + + } + + + + public <R extends RowWithCruiseContextSupport> Gear getGear(CsvComsumer<R, ?> consumer, GenericFormatImportContext importContext, ImportRow<R> row, Gear gear, int rankOrder) { + + Cruise cruise = row.getBean().getCruise(); + GenericFormatImportCruiseContext cruiseContext = importContext.getCruiseContext(cruise); + + Gear cruiseGear = cruiseContext.getGear(gear, rankOrder); + if (cruiseGear == null) { + consumer.addCheckError(row, new GearNotFoundInCruiseException(cruise, gear, rankOrder)); + } + + return cruiseGear; } public <R extends RowWithOperationContextSupport> GenericFormatImportOperationContext getFishingOperationContext(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatImportContext importContext) { - + GenericFormatImportOperationContext fishingOperationContext = null; - Cruise cruise = getCruise(consumer, row, importContext); + GenericFormatImportCruiseContext cruiseContext = getCruise(consumer, row, importContext); - if (cruise != null) { + if (cruiseContext != null) { R bean = row.getBean(); - fishingOperationContext = importContext.getImportedFishingOperationContext(bean); + fishingOperationContext = cruiseContext.getFishingOperationContext(bean); if (fishingOperationContext == null) { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatServiceSupport.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatServiceSupport.java new file mode 100644 index 0000000..e11c28e --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatServiceSupport.java @@ -0,0 +1,139 @@ +package fr.ifremer.tutti.service.genericformat; + +import fr.ifremer.tutti.persistence.entities.data.BatchContainer; +import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.MarineLitterBatch; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; +import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.catches.WeightComputingService; +import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; +import fr.ifremer.tutti.service.referential.ReferentialTemporaryGearService; +import fr.ifremer.tutti.service.referential.ReferentialTemporaryPersonService; +import fr.ifremer.tutti.service.referential.ReferentialTemporarySpeciesService; +import fr.ifremer.tutti.service.referential.ReferentialTemporaryVesselService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.decorator.Decorator; +import org.nuiton.jaxx.application.ApplicationBusinessException; + +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 2/22/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14 + */ +public class GenericFormatServiceSupport extends AbstractTuttiService { + + /** Logger. */ + private static final Log log = LogFactory.getLog(GenericFormatServiceSupport.class); + + protected PersistenceService persistenceService; + + protected WeightComputingService weightComputingService; + + protected ReferentialTemporaryGearService referentialTemporaryGearService; + + protected ReferentialTemporaryPersonService referentialTemporaryPersonService; + + protected ReferentialTemporarySpeciesService referentialTemporarySpeciesService; + + protected ReferentialTemporaryVesselService referentialTemporaryVesselService; + + protected ProtocolImportExportService protocolImportExportService; + + protected Decorator<FishingOperation> fishingOperationDecorator; + + protected Decorator<Cruise> cruiseDecorator; + + @Override + public void setServiceContext(TuttiServiceContext context) { + + super.setServiceContext(context); + persistenceService = getService(PersistenceService.class); + weightComputingService = getService(WeightComputingService.class); + referentialTemporaryGearService = getService(ReferentialTemporaryGearService.class); + referentialTemporaryPersonService = getService(ReferentialTemporaryPersonService.class); + referentialTemporarySpeciesService = getService(ReferentialTemporarySpeciesService.class); + referentialTemporaryVesselService = getService(ReferentialTemporaryVesselService.class); + protocolImportExportService = getService(ProtocolImportExportService.class); + + DecoratorService decoratorService = getService(DecoratorService.class); + cruiseDecorator = decoratorService.getDecoratorByType(Cruise.class); + fishingOperationDecorator = decoratorService.getDecoratorByType(FishingOperation.class); + + } + + protected Set<String> checkFishingOperation(String fishingOperationId) { + + if (log.isDebugEnabled()) { + log.debug("Will check operation: " + fishingOperationId); + } + + Set<String> errors = new LinkedHashSet<>(); + + boolean withCatchBatch = persistenceService.isFishingOperationWithCatchBatch(fishingOperationId); + + if (!withCatchBatch) { + + if (log.isWarnEnabled()) { + log.warn("Skip fishing operation " + fishingOperationId + " since no catchBatch associated."); + } + + } else { + + BatchContainer<SpeciesBatch> rootSpeciesBatch; + try { + rootSpeciesBatch = weightComputingService.getComputedSpeciesBatches(fishingOperationId); + + } catch (ApplicationBusinessException e) { + errors.add(e.getMessage()); + rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId, false); + } + + BatchContainer<BenthosBatch> rootBenthosBatch; + try { + rootBenthosBatch = weightComputingService.getComputedBenthosBatches(fishingOperationId); + + } catch (ApplicationBusinessException e) { + errors.add(e.getMessage()); + rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId, false); + } + + CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(fishingOperationId); + + BatchContainer<MarineLitterBatch> rootMarineLitterBatch; + try { + Float weight = catchBatch == null ? null : catchBatch.getMarineLitterTotalWeight(); + rootMarineLitterBatch = weightComputingService.getComputedMarineLitterBatches(fishingOperationId, weight); + + } catch (ApplicationBusinessException e) { + errors.add(e.getMessage()); + rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId); + } + + try { + if (catchBatch != null) { + weightComputingService.computeCatchBatchWeights(catchBatch, + rootSpeciesBatch, + rootBenthosBatch, + rootMarineLitterBatch); + } + } catch (ApplicationBusinessException e) { + errors.add(e.getMessage()); + } + } + + return errors; + + } + +} 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 92efdc0..fd96423 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 @@ -1,6 +1,7 @@ package fr.ifremer.tutti.service.genericformat; import com.google.common.base.Predicate; +import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; @@ -15,7 +16,6 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.service.PersistenceService; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; @@ -56,299 +56,343 @@ public class GenericformatImportPersitenceHelper { log.info("Persist cruise: " + cruiseDecorator.toString(cruise)); } Cruise savedCruise = persistenceService.createCruise(cruise); - importContext.getImportResult().addImportedCruise(savedCruise); + importContext.addImportedCruise(savedCruise); } public void persistGearCaracteristics() { - Set<Cruise> cruises = importContext.getImportResult().getImportedCruises(); + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { - for (Cruise cruise : cruises) { + @Override + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (Gear gear : cruise.getGear()) { + if (cruiseContext.withGearCaracteristics()) { - CaracteristicMap caracteristics = gear.getCaracteristics(); - if (MapUtils.isNotEmpty(caracteristics)) { + Set<Gear> gears = cruiseContext.getGearsWithcaracteristics(); + + Cruise cruise = cruiseContext.getCruise(); + + for (Gear gear : gears) { + + if (log.isInfoEnabled()) { + log.info("Persist " + gear.getCaracteristics().size() + " gear caracteristics for gear: " + gear.getName() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + persistenceService.saveGearCaracteristics(gear, cruise); - if (log.isInfoEnabled()) { - log.info("Persist " + caracteristics.size() + " gear caracteristics for gear: " + gear.getName() + " for cruise: " + cruiseDecorator.toString(cruise)); } - persistenceService.saveGearCaracteristics(gear, cruise); } } - } + }); } - public FishingOperation persistFishingOperation(FishingOperation fishingOperation) { + public void persistFishingOperation(FishingOperation fishingOperation, CatchBatch catchBatch) { if (log.isInfoEnabled()) { log.info("Persist fishing Operation: " + fishingOperationDecorator.toString(fishingOperation) + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } - FishingOperation savedFishingOperation = persistenceService.createFishingOperation(fishingOperation); - importContext.addImportedFishingOperation(savedFishingOperation); + FishingOperation createdFishingOperation = persistenceService.createFishingOperation(fishingOperation); + catchBatch.setFishingOperation(createdFishingOperation); - return savedFishingOperation; + CatchBatch createdCatchBatch = persistenceService.createCatchBatch(catchBatch); - } - - public void persistCatchBatch(CatchBatch catchBatch) { - - if (log.isInfoEnabled()) { - log.info("Persist catchBatch of fishing Operation: " + fishingOperationDecorator.toString(catchBatch.getFishingOperation()) + " for cruise: " + cruiseDecorator.toString(catchBatch.getFishingOperation().getCruise())); - } - - persistenceService.createCatchBatch(catchBatch); + importContext.addImportedFishingOperation(createdFishingOperation, createdCatchBatch); } public void persistFishingOperationParameters() { - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withGearFeatures() || input.withVesselFeatures(); - } - }); + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withGearFeatures() || input.withVesselFeatures(); + } + }); - FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - if (fishingOperationContext.withGearFeatures()) { + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - CaracteristicMap gearUseFeatures = fishingOperationContext.getFishinOperationGearUseFeatures(); - fishingOperation.setGearUseFeatures(gearUseFeatures); - if (log.isInfoEnabled()) { - log.info("Persist " + gearUseFeatures.size() + " gear use features of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } + if (fishingOperationContext.withGearFeatures()) { - } + CaracteristicMap gearUseFeatures = fishingOperationContext.getGearUseFeatures(); + fishingOperation.setGearUseFeatures(gearUseFeatures); + if (log.isInfoEnabled()) { + log.info("Persist " + gearUseFeatures.size() + " gear use features of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } - if (fishingOperationContext.withVesselFeatures()) { + } - CaracteristicMap vesselUseFeatures = fishingOperationContext.getFishinOperationVesselUseFeatures(); - fishingOperation.setVesselUseFeatures(vesselUseFeatures); - if (log.isInfoEnabled()) { - log.info("Persist " + vesselUseFeatures.size() + " vessel use features of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } + if (fishingOperationContext.withVesselFeatures()) { - } + CaracteristicMap vesselUseFeatures = fishingOperationContext.getVesselUseFeatures(); + fishingOperation.setVesselUseFeatures(vesselUseFeatures); + if (log.isInfoEnabled()) { + log.info("Persist " + vesselUseFeatures.size() + " vessel use features of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + + } - persistenceService.saveFishingOperation(fishingOperation); + persistenceService.saveFishingOperation(fishingOperation); - } + } + } + }); } public void persistMarineLitterBatches() { - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withMarineLitterBatches(); - } - }); + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withMarineLitterBatches(); + } + }); - FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + +// FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); // String fishingOperationId = fishingOperation.getId(); - Collection<MarineLitterBatch> marineLitterBatches = fishingOperationContext.getMarineLitterBatches(); - if (log.isInfoEnabled()) { - log.info("Persist " + marineLitterBatches.size() + " marine litter(s) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } - //FIXME Does not work (all batches are persisted, but the last one only displayed later in application) + Collection<MarineLitterBatch> marineLitterBatches = fishingOperationContext.getMarineLitterBatches(); + if (log.isInfoEnabled()) { + log.info("Persist " + marineLitterBatches.size() + " marine litter(s) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + //FIXME Does not work (all batches are persisted, but the last one only displayed later in application) // persistenceService.createMarineLitterBatches(fishingOperationId, marineLitterBatches); - for (MarineLitterBatch marineLitterBatch : marineLitterBatches) { - persistenceService.createMarineLitterBatch(marineLitterBatch); - } + for (MarineLitterBatch marineLitterBatch : marineLitterBatches) { + persistenceService.createMarineLitterBatch(marineLitterBatch); + } - } + } + + } + }); } public void persistAccidentalBatches() { - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withAccidentalBatches(); - } - }); + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { + + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withAccidentalBatches(); + } + }); + + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + String fishingOperationId = fishingOperation.getId(); + Collection<AccidentalBatch> accidentalBatches = fishingOperationContext.getAccidentalBatches(); + if (log.isInfoEnabled()) { + log.info("Persist " + accidentalBatches.size() + " accidental batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + persistenceService.createAccidentalBatches(fishingOperationId, accidentalBatches); + + } - FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - String fishingOperationId = fishingOperation.getId(); - Collection<AccidentalBatch> accidentalBatches = fishingOperationContext.getAccidentalBatches(); - if (log.isInfoEnabled()) { - log.info("Persist " + accidentalBatches.size() + " accidental batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } - persistenceService.createAccidentalBatches(fishingOperationId, accidentalBatches); + }); - } } public void persistIndividualObservationBatches() { - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withIndividualObservationBatches(); - } - }); + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withIndividualObservationBatches(); + } + }); - FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - String fishingOperationId = fishingOperation.getId(); - Collection<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches(); - if (log.isInfoEnabled()) { - log.info("Persist " + individualObservationBatches.size() + " individual observation(s) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } - persistenceService.createIndividualObservationBatches(fishingOperationId, individualObservationBatches); + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - } + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + String fishingOperationId = fishingOperation.getId(); + Collection<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches(); + if (log.isInfoEnabled()) { + log.info("Persist " + individualObservationBatches.size() + " individual observation(s) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + persistenceService.createIndividualObservationBatches(fishingOperationId, individualObservationBatches); + + } + + } + }); } public void persistSpeciesBatches() { - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withSpeciesBatches(true) || input.withSpeciesBatches(false); - } - }); + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withSpeciesBatches(true) || input.withSpeciesBatches(false); + } + }); - FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - if (fishingOperationContext.withSpeciesBatches(true)) { + if (fishingOperationContext.withSpeciesBatches(true)) { - Collection<SpeciesBatch> batches = fishingOperationContext.getSpeciesBatches(true); - if (log.isInfoEnabled()) { - log.info("Persist " + batches.size() + " VRAC root species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } - persistSpeciesBatches(fishingOperationContext, batches, null); + Collection<SpeciesBatch> batches = fishingOperationContext.getSpeciesBatches(true); + if (log.isInfoEnabled()) { + log.info("Persist " + batches.size() + " VRAC root species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + persistSpeciesBatches(fishingOperationContext, batches, null); - } + } + + if (fishingOperationContext.withSpeciesBatches(false)) { + + Collection<SpeciesBatch> batches = fishingOperationContext.getSpeciesBatches(false); + if (log.isInfoEnabled()) { + log.info("Persist " + batches.size() + " HORS VRAC root species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + persistSpeciesBatches(fishingOperationContext, batches, null); - if (fishingOperationContext.withSpeciesBatches(false)) { + } - Collection<SpeciesBatch> batches = fishingOperationContext.getSpeciesBatches(false); - if (log.isInfoEnabled()) { - log.info("Persist " + batches.size() + " HORS VRAC root species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } - persistSpeciesBatches(fishingOperationContext, batches, null); } - } + protected void persistSpeciesBatches(GenericFormatImportOperationContext fishingOperationContext, Collection<SpeciesBatch> batches, String parentId) { - } + for (SpeciesBatch batch : batches) { - public void persistBenthosBatches() { + List<SpeciesBatchFrequency> frequencies = fishingOperationContext.getSpeciesFrequencies(batch); - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { - @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withBenthosBatches(true) || input.withBenthosBatches(false); - } - }); + // reset temporary id to persist batch + batch.setId((Integer) null); + SpeciesBatch createdBatch = persistenceService.createSpeciesBatch(batch, parentId); - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + if (CollectionUtils.isNotEmpty(frequencies)) { - FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + String batchId = batch.getId(); + if (log.isInfoEnabled()) { + log.info("Persist " + frequencies.size() + " frequency(ies) (species batch: " + batchId + ") of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperationContext.getFishingOperation().getCruise())); + } + persistenceService.saveSpeciesBatchFrequency(batchId, frequencies); - if (fishingOperationContext.withBenthosBatches(true)) { + } - Collection<BenthosBatch> batches = fishingOperationContext.getBenthosBatches(true); - if (log.isInfoEnabled()) { - log.info("Persist " + batches.size() + " VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } - persistBenthosBatches(fishingOperationContext, batches, null); + if (!batch.isChildBatchsEmpty()) { - } + persistSpeciesBatches(fishingOperationContext, batch.getChildBatchs(), createdBatch.getId()); - if (fishingOperationContext.withBenthosBatches(false)) { + } - Collection<BenthosBatch> batches = fishingOperationContext.getBenthosBatches(false); - if (log.isInfoEnabled()) { - log.info("Persist " + batches.size() + " HORS VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } - persistBenthosBatches(fishingOperationContext, batches, null); } - } + }); + } - protected void persistSpeciesBatches(GenericFormatImportOperationContext fishingOperationContext, Collection<SpeciesBatch> batches, String parentId) { + public void persistBenthosBatches() { - for (SpeciesBatch batch : batches) { + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { - List<SpeciesBatchFrequency> frequencies = fishingOperationContext.getSpeciesFrequencies(batch); + @Override + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - // reset temporary id to persist batch - batch.setId((Integer) null); - SpeciesBatch createdBatch = persistenceService.createSpeciesBatch(batch, parentId); + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withBenthosBatches(true) || input.withBenthosBatches(false); + } + }); - if (CollectionUtils.isNotEmpty(frequencies)) { + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - String batchId = batch.getId(); - if (log.isInfoEnabled()) { - log.info("Persist " + frequencies.size() + " frequency(ies) (species batch: " + batchId + ") of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperationContext.getFishingOperation().getCruise())); - } - persistenceService.saveSpeciesBatchFrequency(batchId, frequencies); + if (fishingOperationContext.withBenthosBatches(true)) { - } + Collection<BenthosBatch> batches = fishingOperationContext.getBenthosBatches(true); + if (log.isInfoEnabled()) { + log.info("Persist " + batches.size() + " VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + persistBenthosBatches(fishingOperationContext, batches, null); - if (!batch.isChildBatchsEmpty()) { + } - persistSpeciesBatches(fishingOperationContext, batch.getChildBatchs(), createdBatch.getId()); + if (fishingOperationContext.withBenthosBatches(false)) { - } + Collection<BenthosBatch> batches = fishingOperationContext.getBenthosBatches(false); + if (log.isInfoEnabled()) { + log.info("Persist " + batches.size() + " HORS VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + } + persistBenthosBatches(fishingOperationContext, batches, null); - } + } - } + } + } - protected void persistBenthosBatches(GenericFormatImportOperationContext fishingOperationContext, Collection<BenthosBatch> batches, String parentId) { + protected void persistBenthosBatches(GenericFormatImportOperationContext fishingOperationContext, Collection<BenthosBatch> batches, String parentId) { - for (BenthosBatch batch : batches) { + for (BenthosBatch batch : batches) { - List<BenthosBatchFrequency> frequencies = fishingOperationContext.getBenthosFrequencies(batch); + List<BenthosBatchFrequency> frequencies = fishingOperationContext.getBenthosFrequencies(batch); - // reset temporary id to persist batch - batch.setId((Integer) null); + // reset temporary id to persist batch + batch.setId((Integer) null); - BenthosBatch createdBatch = persistenceService.createBenthosBatch(batch, parentId); + BenthosBatch createdBatch = persistenceService.createBenthosBatch(batch, parentId); - if (CollectionUtils.isNotEmpty(frequencies)) { + if (CollectionUtils.isNotEmpty(frequencies)) { - String batchId = batch.getId(); - if (log.isInfoEnabled()) { - log.info("Persist " + frequencies.size() + " frequency(ies) (benthos batch: " + batchId + ") of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperationContext.getFishingOperation().getCruise())); - } - persistenceService.saveBenthosBatchFrequency(batchId, frequencies); + String batchId = batch.getId(); + if (log.isInfoEnabled()) { + log.info("Persist " + frequencies.size() + " frequency(ies) (benthos batch: " + batchId + ") of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseDecorator.toString(fishingOperationContext.getFishingOperation().getCruise())); + } + persistenceService.saveBenthosBatchFrequency(batchId, frequencies); - } + } + + if (!batch.isChildBatchsEmpty()) { - if (!batch.isChildBatchsEmpty()) { + persistBenthosBatches(fishingOperationContext, batch.getChildBatchs(), createdBatch.getId()); - persistBenthosBatches(fishingOperationContext, batch.getChildBatchs(), createdBatch.getId()); + } + } } - } + + }); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseAlreadyExistException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseAlreadyExistException.java index a2b6096..96fee25 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseAlreadyExistException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseAlreadyExistException.java @@ -26,7 +26,7 @@ public class CruiseAlreadyExistException extends Exception { @Override public String getMessage() { - return t("tutti.genericFormat.import.error.cruiseAlreadyExist", cruise.getName()); + return t("tutti.service.genericFormat.import.error.cruiseAlreadyExist", cruise.getName()); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseAlreadyImportedException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseAlreadyImportedException.java index 13ca6d8..19e822a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseAlreadyImportedException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseAlreadyImportedException.java @@ -26,7 +26,7 @@ public class CruiseAlreadyImportedException extends Exception { @Override public String getMessage() { - return t("tutti.genericFormat.import.error.cruiseAlreadyImported", cruise.getName()); + return t("tutti.service.genericFormat.import.error.cruiseAlreadyImported", cruise.getName()); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseNotFoundException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseNotFoundException.java index 2426dff..fc994b5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseNotFoundException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseNotFoundException.java @@ -26,6 +26,6 @@ public class CruiseNotFoundException extends Exception { @Override public String getMessage() { - return t("tutti.genericFormat.import.error.cruiseNotFound", cruise.getBeginDate(), cruise.getProgram().getName(), cruise.getSurveyPart()); + return t("tutti.service.genericFormat.import.error.cruiseNotFound", cruise.getBeginDate(), cruise.getProgram().getName(), cruise.getSurveyPart()); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseNotValidException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseNotValidException.java index 2dee85d..15f93ff 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseNotValidException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CruiseNotValidException.java @@ -50,7 +50,7 @@ public class CruiseNotValidException extends Exception { builder.append(t("tutti.warning.messages", Joiner.on("\n-").join(warningMessage))); } - String message = t("tutti.genericFormat.import.error.cruiseNotValid", builder.toString()); + String message = t("tutti.service.genericFormat.import.error.cruiseNotValid", builder.toString()); return message; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForAccidentalCatch.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForAccidentalCatch.java index 40cdf14..9d2ac1f 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForAccidentalCatch.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForAccidentalCatch.java @@ -33,13 +33,15 @@ public class CsvConsumerForAccidentalCatch extends CsvComsumer<AccidentalCatchRo super(file, AccidentalCatchModel.forImport(separator, parserFactory)); } - public void validateRow(ImportRow<AccidentalCatchRow> row, GenericFormatImportContext importContext) { + public GenericFormatImportOperationContext validateRow(ImportRow<AccidentalCatchRow> row, GenericFormatImportContext importContext) { + + GenericFormatImportOperationContext operationContext = null; if (row.isValid()) { - GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); + operationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); - if (fishingOperationContext != null) { + if (operationContext != null) { //TODO checks! AccidentalCatchRow bean = row.getBean(); @@ -70,13 +72,15 @@ public class CsvConsumerForAccidentalCatch extends CsvComsumer<AccidentalCatchRo reportError(row); + return operationContext; + } - public void prepareRowForPersist(GenericFormatImportOperationContext fishingOperationContext, ImportRow<AccidentalCatchRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext operationContext, ImportRow<AccidentalCatchRow> row) { AccidentalCatchRow bean = row.getBean(); Integer batchId = bean.getBatchId(); - AccidentalBatch batch = fishingOperationContext.getAccidentalBatchById(batchId); + AccidentalBatch batch = operationContext.getAccidentalBatchById(batchId); if (batch == null) { if (log.isInfoEnabled()) { @@ -84,11 +88,11 @@ public class CsvConsumerForAccidentalCatch extends CsvComsumer<AccidentalCatchRo } batch = AccidentalBatchs.newAccidentalBatch(); - batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + batch.setFishingOperation(operationContext.getFishingOperation()); batch.setCaracteristics(new CaracteristicMap()); batch.setComment(bean.getComment()); batch.setSpecies(bean.getSpecies()); - fishingOperationContext.addAccidentalBatch(batchId, batch); + operationContext.addAccidentalBatch(batchId, batch); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java index 5efda23..eaa02e3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java @@ -56,13 +56,15 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { } - public void validateRow(ImportRow<CatchRow> row, GenericFormatImportContext importContext) { + public GenericFormatImportOperationContext validateRow(ImportRow<CatchRow> row, GenericFormatImportContext importContext) { + + GenericFormatImportOperationContext operationContext = null; if (row.isValid()) { - GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); + operationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); - if (fishingOperationContext != null) { + if (operationContext != null) { //TODO checks! CatchRow bean = row.getBean(); @@ -83,9 +85,11 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { reportError(row); + return operationContext; + } - public void prepareRowForPersist(GenericFormatImportOperationContext fishingOperationContext, ImportRow<CatchRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext operationContext, ImportRow<CatchRow> row) { CatchRow bean = row.getBean(); @@ -104,22 +108,22 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { if (bean.isBenthos()) { - prepareBenthosRowForPersist(fishingOperationContext, bean, withFrequency); + prepareBenthosRowForPersist(operationContext, bean, withFrequency); } else { - prepareSpeciesRowForPersist(fishingOperationContext, bean, withFrequency); + prepareSpeciesRowForPersist(operationContext, bean, withFrequency); } } - protected void prepareSpeciesRowForPersist(GenericFormatImportOperationContext fishingOperationContext, CatchRow bean, boolean withFrequency) { + protected void prepareSpeciesRowForPersist(GenericFormatImportOperationContext operationContext, CatchRow bean, boolean withFrequency) { Species species = bean.getSpecies(); boolean vrac = bean.isVrac(); - SpeciesBatch batch = fishingOperationContext.getSpeciesBatch(vrac, species.getReferenceTaxonId()); + SpeciesBatch batch = operationContext.getSpeciesBatch(vrac, species.getReferenceTaxonId()); if (batch == null) { @@ -128,13 +132,13 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { batch = SpeciesBatchs.newSpeciesBatch(); batch.setId(getNextBatchId()); batch.setSpecies(species); - batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + batch.setFishingOperation(operationContext.getFishingOperation()); if (log.isInfoEnabled()) { - log.info("Create species root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + fishingOperationContext.getFishingOperationLabel()); + log.info("Create species root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + operationContext.getFishingOperationLabel()); } - fishingOperationContext.addSpeciesBatch(vrac, batch); + operationContext.addSpeciesBatch(vrac, batch); } @@ -153,7 +157,7 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { log.info("Create species frequency " + frequency.getNumber() + " for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); } - fishingOperationContext.addSpeciesFrequency(batch, frequency); + operationContext.addSpeciesFrequency(batch, frequency); } else { @@ -162,12 +166,12 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { } } - protected void prepareBenthosRowForPersist(GenericFormatImportOperationContext fishingOperationContext, CatchRow bean, boolean withFrequency) { + protected void prepareBenthosRowForPersist(GenericFormatImportOperationContext operationContext, CatchRow bean, boolean withFrequency) { Species species = bean.getSpecies(); boolean vrac = bean.isVrac(); - BenthosBatch batch = fishingOperationContext.getBenthosBatch(vrac, species.getReferenceTaxonId()); + BenthosBatch batch = operationContext.getBenthosBatch(vrac, species.getReferenceTaxonId()); if (batch == null) { @@ -176,13 +180,13 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { batch = BenthosBatchs.newBenthosBatch(); batch.setId(getNextBatchId()); batch.setSpecies(species); - batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + batch.setFishingOperation(operationContext.getFishingOperation()); if (log.isInfoEnabled()) { - log.info("Create benthos root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + fishingOperationContext.getFishingOperationLabel()); + log.info("Create benthos root batch (" + (vrac ? "VRAC" : "HORS VRAC") + ") batch species: " + species.getName() + " for " + operationContext.getFishingOperationLabel()); } - fishingOperationContext.addBenthosBatch(vrac, batch); + operationContext.addBenthosBatch(vrac, batch); } @@ -201,7 +205,7 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { log.info("Create benthos frequency " + frequency.getNumber() + " for batch: " + batch.getSpecies().getName() + " - " + batch.getSampleCategoryId() + " - " + batch.getSampleCategoryValue()); } - fishingOperationContext.addBenthosFrequency(batch, frequency); + operationContext.addBenthosFrequency(batch, frequency); } else { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForGearCaracteristic.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForGearCaracteristic.java index 5a815aa..c051f76 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForGearCaracteristic.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForGearCaracteristic.java @@ -1,12 +1,11 @@ package fr.ifremer.tutti.service.genericformat.consumer; -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; -import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.service.csv.CaracteristicValueParseException; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportCruiseContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportEntityParserFactory; import fr.ifremer.tutti.service.genericformat.GenericFormatImportValidationHelper; import fr.ifremer.tutti.service.genericformat.csv.GearCaracteristicModel; @@ -28,26 +27,27 @@ public class CsvConsumerForGearCaracteristic extends CsvComsumer<GearCaracterist super(file, GearCaracteristicModel.forImport(separator, parserFactory)); } - public void validateRow(ImportRow<GearCaracteristicRow> row, GenericFormatImportContext importContext) { + public GenericFormatImportCruiseContext validateRow(ImportRow<GearCaracteristicRow> row, GenericFormatImportContext importContext) { + + GenericFormatImportCruiseContext cruiseContext = null; if (row.isValid()) { GenericFormatImportValidationHelper validationHelper = importContext.getValidationHelper(); - Cruise cruise = validationHelper.getCruise(this, row, importContext); + cruiseContext = validationHelper.getCruise(this, row, importContext); - if (cruise != null) { + if (cruiseContext != null) { GearCaracteristicRow bean = row.getBean(); Gear gear = bean.getGear(); int rankOrder = bean.getRankOrder(); - Gear cruiseGear = importContext.getGear(cruise, gear, rankOrder); - if (cruiseGear == null) { - addCheckError(row, new GearNotFoundInCruiseException(cruise, gear, rankOrder)); + Gear cruiseGear = validationHelper.getGear(this, importContext, row, gear, rankOrder); + if (cruiseGear != null) { + bean.setGear(cruiseGear); } - bean.setGear(cruiseGear); //TODO Use a validator ? Caracteristic caracteristic = bean.getCaracteristic(); @@ -75,18 +75,15 @@ public class CsvConsumerForGearCaracteristic extends CsvComsumer<GearCaracterist reportError(row); + return cruiseContext; + } - public void prepareRowForPersist(ImportRow<GearCaracteristicRow> row) { + public void prepareRowForPersist(GenericFormatImportCruiseContext cruiseContext, ImportRow<GearCaracteristicRow> row) { GearCaracteristicRow bean = row.getBean(); - CaracteristicMap caracteristics = bean.getGear().getCaracteristics(); - if (caracteristics == null) { - caracteristics = new CaracteristicMap(); - bean.getGear().setCaracteristics(caracteristics); - } - caracteristics.put(bean.getCaracteristic(), bean.getValue()); + cruiseContext.addGearCaracteristic(bean.getGear(), bean.getCaracteristic(), bean.getValue()); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForIndividualObservation.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForIndividualObservation.java index b6481bc..8b59fd5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForIndividualObservation.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForIndividualObservation.java @@ -33,13 +33,15 @@ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualO super(file, IndividualObservationModel.forImport(separator, parserFactory)); } - public void validateRow(ImportRow<IndividualObservationRow> row, GenericFormatImportContext importContext) { + public GenericFormatImportOperationContext validateRow(ImportRow<IndividualObservationRow> row, GenericFormatImportContext importContext) { + + GenericFormatImportOperationContext operationContext = null; if (row.isValid()) { - GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); + operationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); - if (fishingOperationContext != null) { + if (operationContext != null) { //TODO checks! IndividualObservationRow bean = row.getBean(); @@ -70,13 +72,15 @@ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualO reportError(row); + return operationContext; + } - public void prepareRowForPersist(GenericFormatImportOperationContext fishingOperationContext, ImportRow<IndividualObservationRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext operationContext, ImportRow<IndividualObservationRow> row) { IndividualObservationRow bean = row.getBean(); Integer batchId = bean.getBatchId(); - IndividualObservationBatch batch = fishingOperationContext.getIndividualObservationBatchesById(batchId); + IndividualObservationBatch batch = operationContext.getIndividualObservationBatchesById(batchId); if (batch == null) { if (log.isInfoEnabled()) { @@ -84,17 +88,16 @@ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualO } batch = IndividualObservationBatchs.newIndividualObservationBatch(); - batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + batch.setFishingOperation(operationContext.getFishingOperation()); batch.setCaracteristics(new CaracteristicMap()); batch.setComment(bean.getComment()); batch.setSpecies(bean.getSpecies()); - fishingOperationContext.addIndividualObservationBatch(batchId, batch); + operationContext.addIndividualObservationBatch(batchId, batch); } batch.getCaracteristics().put(bean.getCaracteristic(), bean.getCaracteristicValue()); - } } \ No newline at end of file diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForMarineLitter.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForMarineLitter.java index 08ea266..d7eac16 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForMarineLitter.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForMarineLitter.java @@ -23,13 +23,15 @@ public class CsvConsumerForMarineLitter extends CsvComsumer<MarineLitterRow, Mar super(file, MarineLitterModel.forImport(separator, parserFactory)); } - public void validateRow(ImportRow<MarineLitterRow> row, GenericFormatImportContext importContext) { + public GenericFormatImportOperationContext validateRow(ImportRow<MarineLitterRow> row, GenericFormatImportContext importContext) { + + GenericFormatImportOperationContext operationContext = null; if (row.isValid()) { - GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); + operationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); - if (fishingOperationContext != null) { + if (operationContext != null) { //TODO checks! MarineLitterRow bean = row.getBean(); @@ -40,14 +42,16 @@ public class CsvConsumerForMarineLitter extends CsvComsumer<MarineLitterRow, Mar reportError(row); + return operationContext; + } - public void prepareRowForPersist(GenericFormatImportOperationContext fishingOperationContext, ImportRow<MarineLitterRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext operationContext, ImportRow<MarineLitterRow> row) { MarineLitterRow bean = row.getBean(); MarineLitterBatch marineLitterBatch = bean.getMarineLitterBatch(); - marineLitterBatch.setFishingOperation(fishingOperationContext.getFishingOperation()); - fishingOperationContext.addMarineLitterBatch(marineLitterBatch); + marineLitterBatch.setFishingOperation(operationContext.getFishingOperation()); + operationContext.addMarineLitterBatch(marineLitterBatch); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForOperation.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForOperation.java index 0cbef2f..3a4619e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForOperation.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForOperation.java @@ -1,11 +1,11 @@ package fr.ifremer.tutti.service.genericformat.consumer; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; -import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportCruiseContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportEntityParserFactory; import fr.ifremer.tutti.service.genericformat.GenericFormatImportValidationHelper; import fr.ifremer.tutti.service.genericformat.csv.OperationModel; @@ -28,36 +28,35 @@ public class CsvConsumerForOperation extends CsvComsumer<OperationRow, Operation super(file, OperationModel.forImport(separator, parserFactory)); } - public void validateRow(ImportRow<OperationRow> row, GenericFormatImportContext importContext) { + public GenericFormatImportCruiseContext validateRow(ImportRow<OperationRow> row, GenericFormatImportContext importContext) { + + GenericFormatImportCruiseContext cruiseContext = null; if (row.isValid()) { GenericFormatImportValidationHelper validationHelper = importContext.getValidationHelper(); - Cruise cruise = validationHelper.getCruise(this, row, importContext); + cruiseContext = validationHelper.getCruise(this, row, importContext); - if (cruise != null) { + if (cruiseContext != null) { OperationRow bean = row.getBean(); FishingOperation fishingOperation = bean.getFishingOperation(); - if (importContext.isFishingOperationAlreadyImported(fishingOperation)) { + if (cruiseContext.isFishingOperationAlreadyImported(bean)) { addCheckError(row, new FishingOperationAlreadyImportedException(fishingOperation)); } else { - fishingOperation.setCruise(cruise); - Gear gear = bean.getGear(); int rankOrder = bean.getGearRankOrder(); - Gear cruiseGear = importContext.getGear(cruise, gear, rankOrder); - if (cruiseGear == null) { - addCheckError(row, new GearNotFoundInCruiseException(cruise, gear, rankOrder)); + Gear cruiseGear = validationHelper.getGear(this, importContext, row, gear, rankOrder); + if (cruiseGear != null) { + bean.setGear(cruiseGear); } - bean.setGear(cruiseGear); NuitonValidatorResult validatorResult = validationHelper.validateFishingOperation(fishingOperation); @@ -76,9 +75,11 @@ public class CsvConsumerForOperation extends CsvComsumer<OperationRow, Operation reportError(row); + return cruiseContext; + } - public void prepareRowForPersist(ImportRow<OperationRow> row) { + public void prepareRowForPersist(GenericFormatImportCruiseContext cruiseContext, ImportRow<OperationRow> row) { OperationRow bean = row.getBean(); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForParameter.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForParameter.java index 8d793bb..93fefe3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForParameter.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForParameter.java @@ -25,17 +25,20 @@ public class CsvConsumerForParameter extends CsvComsumer<ParameterRow, Parameter super(file, ParameterModel.forImport(separator, parserFactory)); } - public void validateRow(ImportRow<ParameterRow> row, GenericFormatImportContext importContext) { + public GenericFormatImportOperationContext validateRow(ImportRow<ParameterRow> row, GenericFormatImportContext importContext) { + + GenericFormatImportOperationContext operationContext = null; if (row.isValid()) { - GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); - if (fishingOperationContext != null) { + operationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); + + if (operationContext != null) { ParameterRow bean = row.getBean(); - bean.setFishingOperation(fishingOperationContext.getFishingOperation()); + bean.setFishingOperation(operationContext.getFishingOperation()); //TODO Use a validator ? if (bean.getParameterType() == null) { @@ -70,9 +73,11 @@ public class CsvConsumerForParameter extends CsvComsumer<ParameterRow, Parameter reportError(row); + return operationContext; + } - public void prepareRowForPersist(GenericFormatImportOperationContext importedFishingOperation, ImportRow<ParameterRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext operationContext, ImportRow<ParameterRow> row) { ParameterRow bean = row.getBean(); @@ -82,12 +87,12 @@ public class CsvConsumerForParameter extends CsvComsumer<ParameterRow, Parameter case GEAR: - importedFishingOperation.addGearUseFeature(bean.getCaracteristic(), bean.getValue()); + operationContext.addGearUseFeature(bean.getCaracteristic(), bean.getValue()); break; case VESSEL: - importedFishingOperation.addVesselUseFeature(bean.getCaracteristic(), bean.getValue()); + operationContext.addVesselUseFeature(bean.getCaracteristic(), bean.getValue()); break; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSampleCategory.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSampleCategory.java index ad09359..272d6f8 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSampleCategory.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSampleCategory.java @@ -38,7 +38,7 @@ public class CsvConsumerForSampleCategory extends CsvComsumer<SampleCategoryRow, if (nbSampling < categoryIndex) { // too much categories - addCheckError(row, new IllegalStateException(t("tutti.genericFormat.import.sampleCategoryModel.error.tooMuchCategories"))); + addCheckError(row, new IllegalStateException(t("tutti.service.genericFormat.import.sampleCategoryModel.error.tooMuchCategories"))); } else { @@ -49,22 +49,22 @@ public class CsvConsumerForSampleCategory extends CsvComsumer<SampleCategoryRow, if (StringUtils.isBlank(code)) { - addCheckError(row, new IllegalStateException(t("tutti.genericFormat.import.sampleCategoryModel.error.noCode"))); + addCheckError(row, new IllegalStateException(t("tutti.service.genericFormat.import.sampleCategoryModel.error.noCode"))); } else { Caracteristic caracteristic = bean.getCaracteristic(); if (caracteristic == null) { - addCheckError(row, new IllegalStateException(t("tutti.genericFormat.import.sampleCategoryModel.error.noCaracteristic"))); + addCheckError(row, new IllegalStateException(t("tutti.service.genericFormat.import.sampleCategoryModel.error.noCaracteristic"))); } else if (!Objects.equals(categoryEntry.getCategoryId(), caracteristic.getIdAsInt())) { - addCheckError(row, new IllegalStateException(t("tutti.genericFormat.import.sampleCategoryModel.error.caracteristicNotMatching", categoryEntry.getCategoryId(), caracteristic.getIdAsInt()))); + addCheckError(row, new IllegalStateException(t("tutti.service.genericFormat.import.sampleCategoryModel.error.caracteristicNotMatching", categoryEntry.getCategoryId(), caracteristic.getIdAsInt()))); } else if (!Objects.equals(categoryEntry.getCode(), code)) { - addCheckError(row, new IllegalStateException(t("tutti.genericFormat.import.sampleCategoryModel.error.codeNotMatching", categoryEntry.getCode(), code))); + addCheckError(row, new IllegalStateException(t("tutti.service.genericFormat.import.sampleCategoryModel.error.codeNotMatching", categoryEntry.getCode(), code))); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationAlreadyImportedException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationAlreadyImportedException.java index 66a850d..69d9176 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationAlreadyImportedException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationAlreadyImportedException.java @@ -26,7 +26,7 @@ public class FishingOperationAlreadyImportedException extends Exception { @Override public String getMessage() { - return t("tutti.genericFormat.import.error.fishingOperationAlreadyImported", fishingOperation.getStationNumber(), fishingOperation.getFishingOperationNumber(), fishingOperation.getMultirigAggregation(), fishingOperation.getGearShootingStartDate(), fishingOperation.getCruise().getName()); + return t("tutti.service.genericFormat.import.error.fishingOperationAlreadyImported", fishingOperation.getStationNumber(), fishingOperation.getFishingOperationNumber(), fishingOperation.getMultirigAggregation(), fishingOperation.getGearShootingStartDate(), fishingOperation.getCruise().getName()); } } \ No newline at end of file diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationNotFoundInCruiseException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationNotFoundInCruiseException.java index 01679c4..d657fce 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationNotFoundInCruiseException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationNotFoundInCruiseException.java @@ -26,7 +26,7 @@ public class FishingOperationNotFoundInCruiseException extends Exception { @Override public String getMessage() { - return t("tutti.genericFormat.import.error.fishingOperationNotFoundInCruise", fishingOperation.getStationNumber(), fishingOperation.getFishingOperationNumber(), fishingOperation.getMultirigAggregation(), fishingOperation.getGearShootingStartDate(), fishingOperation.getCruise().getName()); + return t("tutti.service.genericFormat.import.error.fishingOperationNotFoundInCruise", fishingOperation.getStationNumber(), fishingOperation.getFishingOperationNumber(), fishingOperation.getMultirigAggregation(), fishingOperation.getGearShootingStartDate(), fishingOperation.getCruise().getName()); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationNotValidException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationNotValidException.java index 53ba30d..f159f1e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationNotValidException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/FishingOperationNotValidException.java @@ -50,7 +50,7 @@ public class FishingOperationNotValidException extends Exception { builder.append("\n").append(t("tutti.warning.messages", Joiner.on("\n-").join(warningMessage))); } - String message = t("tutti.genericFormat.import.error.fishingOperationNotValid", builder.toString()); + String message = t("tutti.service.genericFormat.import.error.fishingOperationNotValid", builder.toString()); return message; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/GearNotFoundInCruiseException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/GearNotFoundInCruiseException.java index 0565519..5dd59e5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/GearNotFoundInCruiseException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/GearNotFoundInCruiseException.java @@ -41,7 +41,7 @@ public class GearNotFoundInCruiseException extends Exception { @Override public String getMessage() { - return t("tutti.genericFormat.import.error.gearNotFoundInCruise", gear.getName(), rankOrder, cruise.getName()); + return t("tutti.service.genericFormat.import.error.gearNotFoundInCruise", gear.getName(), rankOrder, cruise.getName()); } } diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index 56d904d..7e0d908 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -12,38 +12,6 @@ tutti.error.benthos.not.in.protocol= tutti.error.messages= tutti.error.species.not.in.protocol= tutti.fatal.messages= -tutti.genericFormat.import.accidentalCatches= -tutti.genericFormat.import.catches= -tutti.genericFormat.import.cruises= -tutti.genericFormat.import.error.cruiseAlreadyExist= -tutti.genericFormat.import.error.cruiseAlreadyImported= -tutti.genericFormat.import.error.cruiseNotFound= -tutti.genericFormat.import.error.cruiseNotValid= -tutti.genericFormat.import.error.fishingOperationAlreadyImported= -tutti.genericFormat.import.error.fishingOperationNotFoundInCruise= -tutti.genericFormat.import.error.fishingOperationNotValid= -tutti.genericFormat.import.error.gearNotFoundInCruise= -tutti.genericFormat.import.gearCaracteristics= -tutti.genericFormat.import.individualObservations= -tutti.genericFormat.import.marineLitters= -tutti.genericFormat.import.operations= -tutti.genericFormat.import.parameters= -tutti.genericFormat.import.protocol= -tutti.genericFormat.import.sampleCategoryModel= -tutti.genericFormat.import.sampleCategoryModel.error.caracteristicNotMatching= -tutti.genericFormat.import.sampleCategoryModel.error.codeNotMatching= -tutti.genericFormat.import.sampleCategoryModel.error.missingCategories= -tutti.genericFormat.import.sampleCategoryModel.error.noCaracteristic= -tutti.genericFormat.import.sampleCategoryModel.error.noCode= -tutti.genericFormat.import.sampleCategoryModel.error.tooMuchCategories= -tutti.genericFormat.import.temporaryGears= -tutti.genericFormat.import.temporaryPersons= -tutti.genericFormat.import.temporarySpecies= -tutti.genericFormat.import.temporaryVessels= -tutti.genericFormat.importError.archiveNotSane= -tutti.genericFormat.load.protocol= -tutti.genericFormat.reuse.protocol= -tutti.genericformat.importError.missArchiveFile= tutti.io.mkDir.error= tutti.pdf.export.missing.species.code= tutti.property.attachment= @@ -116,38 +84,6 @@ tutti.service.csv.parse.qualitativeValueError= tutti.service.cvs.format.error= tutti.service.cvs.mandatory.value= tutti.service.error.species.null= -tutti.service.export.accidentalCatch.error= -tutti.service.export.catches.error= -tutti.service.export.closeContext.error= -tutti.service.export.context.error= -tutti.service.export.gearCaracteristics.error= -tutti.service.export.individualObservations.error= -tutti.service.export.invalid.cruise= -tutti.service.export.invalid.fishingOperation= -tutti.service.export.marineLitters.error= -tutti.service.export.operation.error= -tutti.service.export.operations.error= -tutti.service.export.parameters.error= -tutti.service.export.species.error= -tutti.service.export.survey.error= -tutti.service.export.zip.error= -tutti.service.exportCruise.buildZip= -tutti.service.exportCruise.checkCruise= -tutti.service.exportCruise.checkCruiseFishingOperation= -tutti.service.exportCruise.exportAccidentalCatches= -tutti.service.exportCruise.exportCatch= -tutti.service.exportCruise.exportCatches= -tutti.service.exportCruise.exportGearCaracteristics= -tutti.service.exportCruise.exportIndividualObservation= -tutti.service.exportCruise.exportIndividualObservations= -tutti.service.exportCruise.exportMarineLitter= -tutti.service.exportCruise.exportMarineLitters= -tutti.service.exportCruise.exportOperation= -tutti.service.exportCruise.exportOperations= -tutti.service.exportCruise.exportParameter= -tutti.service.exportCruise.exportParameters= -tutti.service.exportCruise.exportSpecies= -tutti.service.exportCruise.exportSurvey= tutti.service.exportPdf.error= tutti.service.exportProgram.exportSpecies= tutti.service.exportSumatra.error.species.null= @@ -183,20 +119,88 @@ tutti.service.exportSumatraV2.header.species=Species tutti.service.exportSumatraV2.header.station=Station number tutti.service.exportSumatraV2.header.totalWeight=TotalWeight tutti.service.exportSumatraV2.header.year=Year -tutti.service.genericExport.buildZip= -tutti.service.genericExport.exportProtocol= -tutti.service.genericExport.exportSampleCategoyModel= -tutti.service.genericExport.exportSpecies= -tutti.service.genericExport.exportTemporaryGear= -tutti.service.genericExport.exportTemporaryPerson= -tutti.service.genericExport.exportTemporarySpecies= -tutti.service.genericExport.exportTemporaryVessel= -tutti.service.genericExport.skipProtocolExport= -tutti.service.genericExport.skipTemporaryGearExport= -tutti.service.genericExport.skipTemporaryPersonExport= -tutti.service.genericExport.skipTemporarySpeciesExport= -tutti.service.genericExport.skipTemporaryVesselExport= -tutti.service.genericExport.zip.error= +tutti.service.genericFormat.checkCruise= +tutti.service.genericFormat.checkCruiseFishingOperation= +tutti.service.genericFormat.cleanWeights.fishingOperation= +tutti.service.genericFormat.export.accidentalCatch.error= +tutti.service.genericFormat.export.buildZip= +tutti.service.genericFormat.export.catches.error= +tutti.service.genericFormat.export.closeContext.error= +tutti.service.genericFormat.export.context.error= +tutti.service.genericFormat.export.exportProtocol= +tutti.service.genericFormat.export.exportSampleCategoyModel= +tutti.service.genericFormat.export.exportSpecies= +tutti.service.genericFormat.export.exportTemporaryGear= +tutti.service.genericFormat.export.exportTemporaryPerson= +tutti.service.genericFormat.export.exportTemporarySpecies= +tutti.service.genericFormat.export.exportTemporaryVessel= +tutti.service.genericFormat.export.gearCaracteristics.error= +tutti.service.genericFormat.export.individualObservations.error= +tutti.service.genericFormat.export.invalid.cruise= +tutti.service.genericFormat.export.invalid.fishingOperation= +tutti.service.genericFormat.export.marineLitters.error= +tutti.service.genericFormat.export.operation.error= +tutti.service.genericFormat.export.operations.error= +tutti.service.genericFormat.export.parameters.error= +tutti.service.genericFormat.export.skipProtocolExport= +tutti.service.genericFormat.export.skipTemporaryGearExport= +tutti.service.genericFormat.export.skipTemporaryPersonExport= +tutti.service.genericFormat.export.skipTemporarySpeciesExport= +tutti.service.genericFormat.export.skipTemporaryVesselExport= +tutti.service.genericFormat.export.species.error= +tutti.service.genericFormat.export.survey.error= +tutti.service.genericFormat.export.zip.error= +tutti.service.genericFormat.exportCruise.buildZip= +tutti.service.genericFormat.exportCruise.checkCruise= +tutti.service.genericFormat.exportCruise.checkCruiseFishingOperation= +tutti.service.genericFormat.exportCruise.exportAccidentalCatches= +tutti.service.genericFormat.exportCruise.exportCatch= +tutti.service.genericFormat.exportCruise.exportCatches= +tutti.service.genericFormat.exportCruise.exportGearCaracteristics= +tutti.service.genericFormat.exportCruise.exportIndividualObservation= +tutti.service.genericFormat.exportCruise.exportIndividualObservations= +tutti.service.genericFormat.exportCruise.exportMarineLitter= +tutti.service.genericFormat.exportCruise.exportMarineLitters= +tutti.service.genericFormat.exportCruise.exportOperation= +tutti.service.genericFormat.exportCruise.exportOperations= +tutti.service.genericFormat.exportCruise.exportParameter= +tutti.service.genericFormat.exportCruise.exportParameters= +tutti.service.genericFormat.exportCruise.exportSpecies= +tutti.service.genericFormat.exportCruise.exportSurvey= +tutti.service.genericFormat.import.accidentalCatches= +tutti.service.genericFormat.import.catches= +tutti.service.genericFormat.import.cruises= +tutti.service.genericFormat.import.error.cruiseAlreadyExist= +tutti.service.genericFormat.import.error.cruiseAlreadyImported= +tutti.service.genericFormat.import.error.cruiseNotFound= +tutti.service.genericFormat.import.error.cruiseNotValid= +tutti.service.genericFormat.import.error.fishingOperationAlreadyImported= +tutti.service.genericFormat.import.error.fishingOperationNotFoundInCruise= +tutti.service.genericFormat.import.error.fishingOperationNotValid= +tutti.service.genericFormat.import.error.gearNotFoundInCruise= +tutti.service.genericFormat.import.gearCaracteristics= +tutti.service.genericFormat.import.individualObservations= +tutti.service.genericFormat.import.marineLitters= +tutti.service.genericFormat.import.operations= +tutti.service.genericFormat.import.parameters= +tutti.service.genericFormat.import.protocol= +tutti.service.genericFormat.import.sampleCategoryModel= +tutti.service.genericFormat.import.sampleCategoryModel.error.caracteristicNotMatching= +tutti.service.genericFormat.import.sampleCategoryModel.error.codeNotMatching= +tutti.service.genericFormat.import.sampleCategoryModel.error.missingCategories= +tutti.service.genericFormat.import.sampleCategoryModel.error.noCaracteristic= +tutti.service.genericFormat.import.sampleCategoryModel.error.noCode= +tutti.service.genericFormat.import.sampleCategoryModel.error.tooMuchCategories= +tutti.service.genericFormat.import.temporaryGears= +tutti.service.genericFormat.import.temporaryPersons= +tutti.service.genericFormat.import.temporarySpecies= +tutti.service.genericFormat.import.temporaryVessels= +tutti.service.genericFormat.importError.archiveNotSane= +tutti.service.genericFormat.importError.missArchiveFile= +tutti.service.genericFormat.invalid.cruise= +tutti.service.genericFormat.invalid.fishingOperation= +tutti.service.genericFormat.load.protocol= +tutti.service.genericFormat.reuse.protocol= tutti.service.multipost.attachment.copy.error= tutti.service.multipost.attachment.mkdir.error= tutti.service.multipost.export.attachments.error= 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 5fddd50..110431d 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 @@ -7,38 +7,6 @@ tutti.csv.import.error.on.field=Colonne %s \: %s tutti.csv.import.error.on.row=Des erreurs ont été détectées à la ligne %s \:\n %s tutti.error.messages=Erreurs \:\n %s tutti.fatal.messages=Erreurs critiques \:\n %s -tutti.genericFormat.import.accidentalCatches=Import des captures accidentelles -tutti.genericFormat.import.catches=Import des captures -tutti.genericFormat.import.cruises=Import des campagnes -tutti.genericFormat.import.error.cruiseAlreadyExist=Il existe déjà une campagne avec ce nom %s -tutti.genericFormat.import.error.cruiseAlreadyImported=La campagne avec ce nom %s a déjà été importée -tutti.genericFormat.import.error.cruiseNotFound=La campagne (année\: %s, série\: %s, série partielle %s) n'existe pas -tutti.genericFormat.import.error.cruiseNotValid= -tutti.genericFormat.import.error.fishingOperationAlreadyImported=Un trait %s - %s - %s -%s a déjà été importé dans la campagne %s -tutti.genericFormat.import.error.fishingOperationNotFoundInCruise=Le trait %s - %s - %s -%s n'existe pas dans la campagne %s -tutti.genericFormat.import.error.fishingOperationNotValid=Le trait n'est pas valide \:\n%s -tutti.genericFormat.import.error.gearNotFoundInCruise=L'engin %s (position %s) non trouvé dans la campagne %s -tutti.genericFormat.import.gearCaracteristics=Import des caractéristiques d'engin -tutti.genericFormat.import.individualObservations=Import des observations individuelles -tutti.genericFormat.import.marineLitters=Import des macro-déchets -tutti.genericFormat.import.operations=Import des traits -tutti.genericFormat.import.parameters=Import des paramètres de trait -tutti.genericFormat.import.protocol=Import d'un nouveau protocol %s -tutti.genericFormat.import.sampleCategoryModel=Import du modèle de catégorisation -tutti.genericFormat.import.sampleCategoryModel.error.caracteristicNotMatching=L'identifiant de la caractéristique devrait être %s, mais vaut %s -tutti.genericFormat.import.sampleCategoryModel.error.codeNotMatching=Le code devrait être %s, mais vaut %s -tutti.genericFormat.import.sampleCategoryModel.error.missingCategories=Il manque des catégories -tutti.genericFormat.import.sampleCategoryModel.error.noCaracteristic=La catactéristique est obligatoire -tutti.genericFormat.import.sampleCategoryModel.error.noCode=Le code est obligatoire -tutti.genericFormat.import.sampleCategoryModel.error.tooMuchCategories=Trop de catégorisation -tutti.genericFormat.import.temporaryGears=Import des références temporaires d'engins -tutti.genericFormat.import.temporaryPersons=Import des références temporaires de personnes -tutti.genericFormat.import.temporarySpecies=Import des références temporaires de Taxons -tutti.genericFormat.import.temporaryVessels=Import des références temporaires de navires -tutti.genericFormat.importError.archiveNotSane=L'archive ne respecte pas le format de l'import générique \:\n%s -tutti.genericFormat.load.protocol=Import du protocol -tutti.genericFormat.reuse.protocol=Réutilisation du protocol existant %s -tutti.genericformat.importError.missArchiveFile=Il manque le fichier %s dans l'archive tutti.io.mkDir.error=Erreur à la création du dossier %s tutti.pdf.export.missing.species.code=Une espèce (referenceId %s, nom scientifique %s) n'a ni code campagne, ni code refTax. tutti.property.attachment=Pièce jointe @@ -105,28 +73,6 @@ tutti.service.csv.parse.qualitativeValueError=La valeur %s de la caractéristiqu tutti.service.cvs.format.error=Erreur lors du formatage de la valeur %s tutti.service.cvs.mandatory.value=Valeur obligatoire tutti.service.error.species.null=Taxon non trouvé -tutti.service.export.accidentalCatch.error=Erreur lors de l'export des captures accidentelles -tutti.service.export.catches.error=Erreur lors de l'export des captures -tutti.service.export.closeContext.error=Erreur lors de la fermeture du contexte d'export -tutti.service.export.context.error=Erreur lors de la création des fichiers pour l'export -tutti.service.export.error.invalid.cruise=Erreur d'élévation de poids sur les traits de la campagne %s \:<ul>%s</ul> -tutti.service.export.error.invalid.fishingOperation=L'élévation des poids ne peut pas être réalisée sur le trait %s, pour les raisons suivantes \:<ul>%s</ul> -tutti.service.export.gearCaracteristics.error=Erreur lors de l'export des caractéristiques des engins -tutti.service.export.individualObservations.error=Erreur lors de l'export des observations individuelles -tutti.service.export.invalid.cruise=Erreur d'élévation de poids sur les traits de la campagne %s \:<ul>%s</ul> -tutti.service.export.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.export.marineLitters.error=Erreur lors de l'export des macro-déchets -tutti.service.export.operation.error=Impossible d'export le trait %s pour la campagne %s -tutti.service.export.operations.error=Erreur lors de l'export des traits -tutti.service.export.parameters.error=Erreur lors de l'export des paramètres -tutti.service.export.species.error=Erreur lors de l'export des espèces -tutti.service.export.survey.error=Erreur lors de l'export de la campagne -tutti.service.exportCruise.checkCruise=Vérification de la campagne %s -tutti.service.exportCruise.checkCruiseFishingOperation=Vérification de la campagne <strong>%s</strong> ( trait <strong>%s</strong> ) -tutti.service.exportCruise.exportGearCaracteristics=<html>Export de la campagne <strong>%s</strong> ( caractéristiques des engins)</html> -tutti.service.exportCruise.exportOperation=<html>Export de la campagne <strong>%s</strong> (trait <strong>%s</strong> )</html> -tutti.service.exportCruise.exportSpecies=<html>Export de la campagne <strong>%s</strong> ( espèces )</html> -tutti.service.exportCruise.exportSurvey=<html>Export de la campagne <strong>%s</strong></html> tutti.service.exportPdf.error=Erreur lors de la génération du pdf %s tutti.service.exportSumatra.error.species.null=L'espèce est nulle tutti.service.exportSumatra.error.station.null=Le trait est nul @@ -149,20 +95,75 @@ tutti.service.exportSumatra.header.surveySpecies=espececampagne tutti.service.exportSumatra.header.totalWeight=total tutti.service.exportSumatra.header.weight=total tutti.service.exportSumatra.header.year=annee -tutti.service.genericExport.buildZip=Création de l'archive de l'export (fichier %s) -tutti.service.genericExport.exportProtocol=Export du protocol %s -tutti.service.genericExport.exportSampleCategoyModel=Export des %s catégories -tutti.service.genericExport.exportSpecies=<html>Export du fichier <strong>species.csv</strong></html> -tutti.service.genericExport.exportTemporaryGear=Export de %s engins temporaires -tutti.service.genericExport.exportTemporaryPerson=Export de %s personnes temporaires -tutti.service.genericExport.exportTemporarySpecies=Export de %s espèces temporaires -tutti.service.genericExport.exportTemporaryVessel=Export de %s navires temporaires -tutti.service.genericExport.skipProtocolExport=Pas de protocol à exporter -tutti.service.genericExport.skipTemporaryGearExport=Pas d'engin temporaire à exporter -tutti.service.genericExport.skipTemporaryPersonExport=Pas de personne temporaire à exporter -tutti.service.genericExport.skipTemporarySpeciesExport=Pas d'espèce temporaire à exporter -tutti.service.genericExport.skipTemporaryVesselExport=Pas de navire temporaire à exporter -tutti.service.genericExport.zip.error=Erreur lors de la création du zip d'export %s +tutti.service.genericFormat.checkCruise=Vérification de la campagne %s +tutti.service.genericFormat.checkCruiseFishingOperation=Vérification de la campagne <strong>%s</strong> ( trait <strong>%s</strong> ) +tutti.service.genericFormat.cleanWeights.fishingOperation=Suppression des poids en double pour l'opération %s +tutti.service.genericFormat.export.accidentalCatch.error=Erreur lors de l'export des captures accidentelles +tutti.service.genericFormat.export.buildZip=Création de l'archive de l'export (fichier %s) +tutti.service.genericFormat.export.catches.error=Erreur lors de l'export des captures +tutti.service.genericFormat.export.closeContext.error=Erreur lors de la fermeture du contexte d'export +tutti.service.genericFormat.export.context.error=Erreur lors de la création des fichiers pour l'export +tutti.service.genericFormat.export.error.invalid.cruise=Erreur d'élévation de poids sur les traits de la campagne %s \:<ul>%s</ul> +tutti.service.genericFormat.export.error.invalid.fishingOperation=L'élévation des poids ne peut pas être réalisée sur le trait %s, pour les raisons suivantes \:<ul>%s</ul> +tutti.service.genericFormat.export.exportProtocol=Export du protocol %s +tutti.service.genericFormat.export.exportSampleCategoyModel=Export des %s catégories +tutti.service.genericFormat.export.exportSpecies=<html>Export du fichier <strong>species.csv</strong></html> +tutti.service.genericFormat.export.exportTemporaryGear=Export de %s engins temporaires +tutti.service.genericFormat.export.exportTemporaryPerson=Export de %s personnes temporaires +tutti.service.genericFormat.export.exportTemporarySpecies=Export de %s espèces temporaires +tutti.service.genericFormat.export.exportTemporaryVessel=Export de %s navires temporaires +tutti.service.genericFormat.export.gearCaracteristics.error=Erreur lors de l'export des caractéristiques des engins +tutti.service.genericFormat.export.individualObservations.error=Erreur lors de l'export des observations individuelles +tutti.service.genericFormat.export.marineLitters.error=Erreur lors de l'export des macro-déchets +tutti.service.genericFormat.export.operation.error=Impossible d'export le trait %s pour la campagne %s +tutti.service.genericFormat.export.operations.error=Erreur lors de l'export des traits +tutti.service.genericFormat.export.parameters.error=Erreur lors de l'export des paramètres +tutti.service.genericFormat.export.skipProtocolExport=Pas de protocol à exporter +tutti.service.genericFormat.export.skipTemporaryGearExport=Pas d'engin temporaire à exporter +tutti.service.genericFormat.export.skipTemporaryPersonExport=Pas de personne temporaire à exporter +tutti.service.genericFormat.export.skipTemporarySpeciesExport=Pas d'espèce temporaire à exporter +tutti.service.genericFormat.export.skipTemporaryVesselExport=Pas de navire temporaire à exporter +tutti.service.genericFormat.export.species.error=Erreur lors de l'export des espèces +tutti.service.genericFormat.export.survey.error=Erreur lors de l'export de la campagne +tutti.service.genericFormat.export.zip.error=Erreur lors de la création du zip d'export %s +tutti.service.genericFormat.exportCruise.exportGearCaracteristics=<html>Export de la campagne <strong>%s</strong> ( caractéristiques des engins)</html> +tutti.service.genericFormat.exportCruise.exportOperation=<html>Export de la campagne <strong>%s</strong> (trait <strong>%s</strong> )</html> +tutti.service.genericFormat.exportCruise.exportSpecies=<html>Export de la campagne <strong>%s</strong> ( espèces )</html> +tutti.service.genericFormat.exportCruise.exportSurvey=<html>Export de la campagne <strong>%s</strong></html> +tutti.service.genericFormat.import.accidentalCatches=Import des captures accidentelles +tutti.service.genericFormat.import.catches=Import des captures +tutti.service.genericFormat.import.cruises=Import des campagnes +tutti.service.genericFormat.import.error.cruiseAlreadyExist=Il existe déjà une campagne avec ce nom %s +tutti.service.genericFormat.import.error.cruiseAlreadyImported=La campagne avec ce nom %s a déjà été importée +tutti.service.genericFormat.import.error.cruiseNotFound=La campagne (année\: %s, série\: %s, série partielle %s) n'existe pas +tutti.service.genericFormat.import.error.cruiseNotValid= +tutti.service.genericFormat.import.error.fishingOperationAlreadyImported=Un trait %s - %s - %s -%s a déjà été importé dans la campagne %s +tutti.service.genericFormat.import.error.fishingOperationNotFoundInCruise=Le trait %s - %s - %s -%s n'existe pas dans la campagne %s +tutti.service.genericFormat.import.error.fishingOperationNotValid=Le trait n'est pas valide \:\n%s +tutti.service.genericFormat.import.error.gearNotFoundInCruise=L'engin %s (position %s) non trouvé dans la campagne %s +tutti.service.genericFormat.import.gearCaracteristics=Import des caractéristiques d'engin +tutti.service.genericFormat.import.individualObservations=Import des observations individuelles +tutti.service.genericFormat.import.marineLitters=Import des macro-déchets +tutti.service.genericFormat.import.operations=Import des traits +tutti.service.genericFormat.import.parameters=Import des paramètres de trait +tutti.service.genericFormat.import.protocol=Import d'un nouveau protocol %s +tutti.service.genericFormat.import.sampleCategoryModel=Import du modèle de catégorisation +tutti.service.genericFormat.import.sampleCategoryModel.error.caracteristicNotMatching=L'identifiant de la caractéristique devrait être %s, mais vaut %s +tutti.service.genericFormat.import.sampleCategoryModel.error.codeNotMatching=Le code devrait être %s, mais vaut %s +tutti.service.genericFormat.import.sampleCategoryModel.error.missingCategories=Il manque des catégories +tutti.service.genericFormat.import.sampleCategoryModel.error.noCaracteristic=La catactéristique est obligatoire +tutti.service.genericFormat.import.sampleCategoryModel.error.noCode=Le code est obligatoire +tutti.service.genericFormat.import.sampleCategoryModel.error.tooMuchCategories=Trop de catégorisation +tutti.service.genericFormat.import.temporaryGears=Import des références temporaires d'engins +tutti.service.genericFormat.import.temporaryPersons=Import des références temporaires de personnes +tutti.service.genericFormat.import.temporarySpecies=Import des références temporaires de Taxons +tutti.service.genericFormat.import.temporaryVessels=Import des références temporaires de navires +tutti.service.genericFormat.importError.archiveNotSane=L'archive ne respecte pas le format de l'import générique \:\n%s +tutti.service.genericFormat.importError.missArchiveFile=Il manque le fichier %s dans l'archive +tutti.service.genericFormat.invalid.cruise=Erreur d'élévation de poids sur les traits de la campagne %s \:<ul>%s</ul> +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.reuse.protocol=Réutilisation du protocol existant %s tutti.service.multipost.attachment.copy.error=Erreur lors de l'export de la pièce-jointe %s tutti.service.multipost.attachment.mkdir.error=Impossible de créer le répertoire %s tutti.service.multipost.export.attachments.error=Erreur lors de l'export des pièces-jointes -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 0a5891a8342ca13bf8a4c2300d31df90166b1f2c Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Feb 23 09:01:05 2015 +0100 - amélioration du calcul du nombre d'étapes - mise en place de la progression - amélioration de l'API de requete et resultat --- .../genericformat/GenericFormatArchive.java | 44 ++++ .../GenericFormatImportCruiseContext.java | 16 +- .../GenericFormatImportCruiseResult.java | 3 +- .../genericformat/GenericFormatImportRequest.java | 17 +- .../genericformat/GenericFormatImportResult.java | 9 +- .../genericformat/GenericFormatImportService.java | 71 +++--- .../GenericformatImportPersitenceHelper.java | 270 +++++++++++---------- .../resources/i18n/tutti-service_en_GB.properties | 12 + .../resources/i18n/tutti-service_fr_FR.properties | 16 +- 9 files changed, 272 insertions(+), 186 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatArchive.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatArchive.java index 9498c46..30c465a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatArchive.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatArchive.java @@ -10,9 +10,12 @@ import org.nuiton.jaxx.application.ApplicationBusinessException; import org.nuiton.jaxx.application.ApplicationIOUtil; import org.nuiton.jaxx.application.ApplicationTechnicalException; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.LineNumberReader; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -203,6 +206,47 @@ public class GenericFormatArchive { return getPath(ArchiveFilePath.DATA_MARINE_LITTER); } + public int getNbCruisesFromFile() { + + Path path = getSurveyPath(); + try (BufferedReader bufferedReader = Files.newBufferedReader(path, Charset.forName("UTF-8"))) { + + try (LineNumberReader lineNumberReader = new LineNumberReader(bufferedReader)) { + lineNumberReader.skip(Long.MAX_VALUE); + int result = lineNumberReader.getLineNumber() - 1; + if (result == -1) { + result = 0; + } + return result; + } + + } catch (IOException e) { + throw new ApplicationTechnicalException("Could not read survey.csv file from archive " + archiveFile, e); + } + + } + + public int getNbOperationsFromFile() { + + Path path = getOperationPath(); + + try (BufferedReader bufferedReader = Files.newBufferedReader(path, Charset.forName("UTF-8"))) { + + try (LineNumberReader lineNumberReader = new LineNumberReader(bufferedReader)) { + lineNumberReader.skip(Long.MAX_VALUE); + int result = lineNumberReader.getLineNumber() - 1; + if (result == -1) { + result = 0; + } + return result; + } + + } catch (IOException e) { + throw new ApplicationTechnicalException("Could not read operation.csv file from archive " + archiveFile, e); + } + + } + public void createZip(ProgressionModel progressionModel) { if (progressionModel != null) { 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 5a1e971..f8d48af 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 @@ -1,6 +1,6 @@ package fr.ifremer.tutti.service.genericformat; -import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; @@ -13,6 +13,7 @@ import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport import java.io.Closeable; import java.io.Serializable; +import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -114,17 +115,8 @@ public class GenericFormatImportCruiseContext implements Closeable { } - - public Iterable<GenericFormatImportOperationContext> getFishingOperationContexts(Predicate<GenericFormatImportOperationContext> predicate) { - - Iterable<GenericFormatImportOperationContext> result; - if (predicate == null) { - result = fishingOperationContexts.values(); - } else { - result = Iterables.filter(fishingOperationContexts.values(), predicate); - } - return result; - + public Collection<GenericFormatImportOperationContext> getFishingOperationContexts() { + return ImmutableList.copyOf(fishingOperationContexts.values()); } public Iterable<FishingOperation> getFishingOperations() { 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 51c0d82..886ade5 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 @@ -35,8 +35,7 @@ public class GenericFormatImportCruiseResult { this.cruise = cruiseContext.getCruise(); this.fishingOperationResults = new HashMap<>(); - Iterable<GenericFormatImportOperationContext> operationContexts = cruiseContext.getFishingOperationContexts(null); - for (GenericFormatImportOperationContext operationContext : operationContexts) { + for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts()) { GenericFormatImportOperationResult operationResult = new GenericFormatImportOperationResult(operationContext); fishingOperationResults.put(operationContext.getFishingOperation().getId(), operationResult); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java index 13af96d..92f06f5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java @@ -1,14 +1,11 @@ package fr.ifremer.tutti.service.genericformat; -import com.google.common.collect.ImmutableSet; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Cruises; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.service.PersistenceService; -import java.util.List; import java.util.Set; /** @@ -31,19 +28,19 @@ public class GenericFormatImportRequest { private final Program program; - public GenericFormatImportRequest(PersistenceService persistenceService, - GenericFormatArchive archive, + public GenericFormatImportRequest(GenericFormatArchive archive, char csvSeparator, Program program, - SampleCategoryModel sampleCategoryModel) { + SampleCategoryModel sampleCategoryModel, + Set<Cruise> cruises, + TuttiProtocol oldProtocol + ) { this.archive = archive; this.csvSeparator = csvSeparator; this.sampleCategoryModel = sampleCategoryModel; this.program = program; - - List<Cruise> allCruise = persistenceService.getAllCruise(program.getId()); - this.existingCruises = ImmutableSet.copyOf(allCruise); - this.oldProtocol = persistenceService.getProtocol(); + this.existingCruises = cruises; + this.oldProtocol = oldProtocol; } 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 251d58d..2a87b5e 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 @@ -39,10 +39,11 @@ public class GenericFormatImportResult { private final GenericFormatReferentialImportResult<Vessel, String> importedVessels; - private final GenericFormatImportRequest importRequest; + private final GenericFormatArchive archive; public GenericFormatImportResult(GenericFormatImportContext importContext) { - this.importRequest = importContext.getImportRequest(); + + this.archive = importContext.getImportRequest().getArchive(); this.cruiseResults = new LinkedHashMap<>(); this.errors = new LinkedHashSet<>(); this.protocol = importContext.getImportedProtocol(); @@ -53,8 +54,8 @@ public class GenericFormatImportResult { } - public GenericFormatImportRequest getImportRequest() { - return importRequest; + public GenericFormatArchive getArchive() { + return archive; } public Set<Cruise> getImportedCruises() { 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 ba129f5..51fd6c8 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 @@ -1,8 +1,10 @@ package fr.ifremer.tutti.service.genericformat; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; @@ -50,10 +52,6 @@ import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.File; import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; import java.util.Map; import java.util.Set; @@ -83,27 +81,38 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { public int getImportProgramNbSteps(File importFile) { - // nbCruise * (check cruise / export cruise / gear caracteristics / operation / parameter / catches / individual observation / accidental catches / marine litters) + - // (species + sampleCategoryModel + protocol + temporary gear + temporary person + temporar species + temporary vessel + zip) - GenericFormatArchive archive = GenericFormatArchive.forImport(importFile, context.getConfig().getTmpDirectory()); - Path surveyPath = archive.getSurveyPath(); - try { + int nbCruises = archive.getNbCruisesFromFile(); + if (log.isInfoEnabled()) { + log.info("Count " + nbCruises + " cruises to import."); + } + int nbOperations = archive.getNbOperationsFromFile(); + if (log.isInfoEnabled()) { + log.info("Count " + nbOperations + " operations to import."); + } + int result = 6 // check sampleCategoryModel + import ( gear + person + species + vessel + protocol ) + + 1 + nbCruises // load cruises + nbCruise * persist cruise + + 1 + nbCruises // load gear caracteristics + nbCruise * persist gear caracteristics + + 1 + nbOperations // load operations + nbOperations * persist operation + + 1 + nbOperations // load parameters + nbOperations * persist parameters + + 1 + nbOperations * 2 // load catches + nbOperations * persist (species batches + benthos batches) + + 1 + nbOperations // load marine litters + nbOperations * persist marine litters + + 1 + nbOperations // load individualObservations + nbOperations * persist individualObservations + + 1 + nbOperations // load accidental catches + nbOperations * persist accidental catches + + nbOperations // nbOperations * cleanWeights + + nbOperations // nbOperations * checkWeights + + 1; // compute report - List<String> allCruise = Files.readAllLines(surveyPath, Charset.forName("UTF-8")); - int result = 9 * allCruise.size() - 1 + 8; - return result; + return result; - } catch (IOException e) { - throw new ApplicationTechnicalException("Could not read survey.csv file from archive " + importFile, e); - } } public GenericFormatImportResult importProgram(String programId, File importFile, ProgressionModel progressionModel) { Preconditions.checkNotNull(programId); Preconditions.checkNotNull(importFile); + Preconditions.checkNotNull(progressionModel); Program program = persistenceService.getProgram(programId); Preconditions.checkNotNull(program); @@ -116,7 +125,7 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { GenericFormatImportResult result = doImport(archive, program, progressionModel); - computeReport(result); + computeReport(result, progressionModel); return result; @@ -124,11 +133,14 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { protected GenericFormatImportResult doImport(GenericFormatArchive archive, Program program, ProgressionModel progressionModel) { - GenericFormatImportRequest request = new GenericFormatImportRequest(persistenceService, - archive, + Set<Cruise> cruises = ImmutableSet.copyOf(persistenceService.getAllCruise(program.getId())); + TuttiProtocol protocol = persistenceService.getProtocol(); + GenericFormatImportRequest request = new GenericFormatImportRequest(archive, ';', program, - context.getSampleCategoryModel()); + context.getSampleCategoryModel(), + cruises, + protocol); try (GenericFormatImportContext importContext = new GenericFormatImportContext(request, progressionModel, persistenceService, cruiseDecorator, fishingOperationDecorator)) { @@ -151,7 +163,7 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { importAccidentalCatches(importContext, persitenceHelper); doCleanWeights(importContext); - doCheckCruises(importContext); + doCheckWeights(importContext); GenericFormatImportResult result = new GenericFormatImportResult(importContext); return result; @@ -160,9 +172,10 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { } - protected void computeReport(GenericFormatImportResult result) { + protected void computeReport(GenericFormatImportResult result, ProgressionModel progressionModel) { //TODO Compute report + progressionModel.increments(t("tutti.service.genericFormat.import.computeReport")); } @@ -368,7 +381,6 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { protected void importProtocol(GenericFormatImportContext importContext) { - importContext.increments(t("tutti.service.genericFormat.load.protocol")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); if (archive.isProtocolExists()) { @@ -397,6 +409,8 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { log.info("Skip import protocol (no file found)."); } + importContext.increments(t("tutti.service.genericFormat.skip.import.protocol")); + } } @@ -462,7 +476,7 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { FishingOperation fishingOperation = bean.getFishingOperation(); CatchBatch catchBatch = bean.getCatchBatch(); - persitenceHelper.persistFishingOperation(fishingOperation, catchBatch); + persitenceHelper.persistFishingOperation(cruiseContext, fishingOperation, catchBatch); } } catch (IOException e) { @@ -527,7 +541,6 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { for (ImportRow<MarineLitterRow> row : consumer) { GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext); - consumer.prepareRowForPersist(operationContext, row); } @@ -590,9 +603,9 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts(null)) { + for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts()) { - progressionModel.increments(t("tutti.service.genericFormat.cleanWeights.fishingOperation", operationContext.getFishingOperationLabel())); + progressionModel.increments(t("tutti.service.genericFormat.cleanWeights.fishingOperation", cruiseContext.getCruiseLabel(), operationContext.getFishingOperationLabel())); weightCleaningService.cleanFishingOperation(operationContext.getFishingOperation().getId()); @@ -603,16 +616,16 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { } - protected void doCheckCruises(GenericFormatImportContext importContext) { + protected void doCheckWeights(GenericFormatImportContext importContext) { importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts(null)) { + for (GenericFormatImportOperationContext operationContext : cruiseContext.getFishingOperationContexts()) { - progressionModel.increments(t("tutti.service.genericFormat.checkWeights.fishingOperation", operationContext.getFishingOperationLabel())); + progressionModel.increments(t("tutti.service.genericFormat.checkWeights.fishingOperation", cruiseContext.getCruiseLabel(), operationContext.getFishingOperationLabel())); Set<String> errors = checkFishingOperation(operationContext.getFishingOperation().getId()); operationContext.addCheckErrors(errors); 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 fd96423..34019fd 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 @@ -1,6 +1,5 @@ package fr.ifremer.tutti.service.genericformat; -import com.google.common.base.Predicate; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; @@ -24,6 +23,8 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import static org.nuiton.i18n.I18n.t; + /** * Created on 2/19/15. * @@ -52,9 +53,11 @@ public class GenericformatImportPersitenceHelper { public void persistCruise(Cruise cruise) { + String cruiseStr = cruiseDecorator.toString(cruise); if (log.isInfoEnabled()) { - log.info("Persist cruise: " + cruiseDecorator.toString(cruise)); + log.info("Persist cruise: " + cruiseStr); } + importContext.increments(t("tutti.service.genericFormat.persist.cruise", cruiseStr)); Cruise savedCruise = persistenceService.createCruise(cruise); importContext.addImportedCruise(savedCruise); @@ -67,6 +70,8 @@ public class GenericformatImportPersitenceHelper { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { + importContext.increments(t("tutti.service.genericFormat.persist.gearCaracteristics", cruiseContext.getCruiseLabel())); + if (cruiseContext.withGearCaracteristics()) { Set<Gear> gears = cruiseContext.getGearsWithcaracteristics(); @@ -89,12 +94,14 @@ public class GenericformatImportPersitenceHelper { } - public void persistFishingOperation(FishingOperation fishingOperation, CatchBatch catchBatch) { + public void persistFishingOperation(GenericFormatImportCruiseContext cruiseContext, FishingOperation fishingOperation, CatchBatch catchBatch) { + String operationStr = fishingOperationDecorator.toString(fishingOperation); + String cruiseStr = cruiseContext.getCruiseLabel(); if (log.isInfoEnabled()) { - log.info("Persist fishing Operation: " + fishingOperationDecorator.toString(fishingOperation) + " for cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + log.info("Persist fishing Operation: " + operationStr + " for cruise: " + cruiseStr); } - + importContext.increments(t("tutti.service.genericFormat.persist.operation", cruiseStr, operationStr)); FishingOperation createdFishingOperation = persistenceService.createFishingOperation(fishingOperation); catchBatch.setFishingOperation(createdFishingOperation); @@ -111,14 +118,14 @@ public class GenericformatImportPersitenceHelper { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { - @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withGearFeatures() || input.withVesselFeatures(); - } - }); + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + + String cruiseStr = cruiseContext.getCruiseLabel(); + String operationStr = fishingOperationContext.getFishingOperationLabel(); - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + importContext.increments(t("tutti.service.genericFormat.persist.operation.parameters", cruiseStr, operationStr)); + + boolean persist = false; FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); @@ -127,9 +134,11 @@ public class GenericformatImportPersitenceHelper { CaracteristicMap gearUseFeatures = fishingOperationContext.getGearUseFeatures(); fishingOperation.setGearUseFeatures(gearUseFeatures); if (log.isInfoEnabled()) { - log.info("Persist " + gearUseFeatures.size() + " gear use features of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + log.info("Persist " + gearUseFeatures.size() + " gear use features of " + operationStr + " for cruise: " + cruiseStr); } + persist = true; + } if (fishingOperationContext.withVesselFeatures()) { @@ -137,112 +146,20 @@ public class GenericformatImportPersitenceHelper { CaracteristicMap vesselUseFeatures = fishingOperationContext.getVesselUseFeatures(); fishingOperation.setVesselUseFeatures(vesselUseFeatures); if (log.isInfoEnabled()) { - log.info("Persist " + vesselUseFeatures.size() + " vessel use features of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + log.info("Persist " + vesselUseFeatures.size() + " vessel use features of " + operationStr + " for cruise: " + cruiseStr); } - } - - persistenceService.saveFishingOperation(fishingOperation); - - } - } - }); - - } - - public void persistMarineLitterBatches() { - - importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + persist = true; - @Override - public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { - @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withMarineLitterBatches(); - } - }); - - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - -// FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); -// String fishingOperationId = fishingOperation.getId(); - Collection<MarineLitterBatch> marineLitterBatches = fishingOperationContext.getMarineLitterBatches(); - if (log.isInfoEnabled()) { - log.info("Persist " + marineLitterBatches.size() + " marine litter(s) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); - } - //FIXME Does not work (all batches are persisted, but the last one only displayed later in application) -// persistenceService.createMarineLitterBatches(fishingOperationId, marineLitterBatches); - for (MarineLitterBatch marineLitterBatch : marineLitterBatches) { - persistenceService.createMarineLitterBatch(marineLitterBatch); } - } + if (persist) { - } - }); + persistenceService.saveFishingOperation(fishingOperation); - } - - public void persistAccidentalBatches() { - - importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { - - @Override - public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { - @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withAccidentalBatches(); } - }); - - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - - FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - String fishingOperationId = fishingOperation.getId(); - Collection<AccidentalBatch> accidentalBatches = fishingOperationContext.getAccidentalBatches(); - if (log.isInfoEnabled()) { - log.info("Persist " + accidentalBatches.size() + " accidental batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); - } - persistenceService.createAccidentalBatches(fishingOperationId, accidentalBatches); } - - } - }); - - - } - - public void persistIndividualObservationBatches() { - - importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { - - @Override - public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { - @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withIndividualObservationBatches(); - } - }); - - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - - FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - String fishingOperationId = fishingOperation.getId(); - Collection<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches(); - if (log.isInfoEnabled()) { - log.info("Persist " + individualObservationBatches.size() + " individual observation(s) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); - } - persistenceService.createIndividualObservationBatches(fishingOperationId, individualObservationBatches); - - } - } }); @@ -255,20 +172,18 @@ public class GenericformatImportPersitenceHelper { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { - @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withSpeciesBatches(true) || input.withSpeciesBatches(false); - } - }); + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + String cruiseStr = cruiseContext.getCruiseLabel(); + String operationStr = fishingOperationContext.getFishingOperationLabel(); + + importContext.increments(t("tutti.service.genericFormat.persist.operation.speciesBatches", cruiseStr, operationStr)); if (fishingOperationContext.withSpeciesBatches(true)) { Collection<SpeciesBatch> batches = fishingOperationContext.getSpeciesBatches(true); if (log.isInfoEnabled()) { - log.info("Persist " + batches.size() + " VRAC root species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + log.info("Persist " + batches.size() + " VRAC root species batch(es) of " + operationStr + " for cruise: " + cruiseStr); } persistSpeciesBatches(fishingOperationContext, batches, null); @@ -278,7 +193,7 @@ public class GenericformatImportPersitenceHelper { Collection<SpeciesBatch> batches = fishingOperationContext.getSpeciesBatches(false); if (log.isInfoEnabled()) { - log.info("Persist " + batches.size() + " HORS VRAC root species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + log.info("Persist " + batches.size() + " HORS VRAC root species batch(es) of " + operationStr + " for cruise: " + cruiseStr); } persistSpeciesBatches(fishingOperationContext, batches, null); @@ -330,20 +245,18 @@ public class GenericformatImportPersitenceHelper { @Override public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { - Iterable<GenericFormatImportOperationContext> fishingOperationContexts = cruiseContext.getFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { - @Override - public boolean apply(GenericFormatImportOperationContext input) { - return input.withBenthosBatches(true) || input.withBenthosBatches(false); - } - }); + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { - for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + String cruiseStr = cruiseContext.getCruiseLabel(); + String operationStr = fishingOperationContext.getFishingOperationLabel(); + + importContext.increments(t("tutti.service.genericFormat.persist.operation.benthosBatches", cruiseStr, operationStr)); if (fishingOperationContext.withBenthosBatches(true)) { Collection<BenthosBatch> batches = fishingOperationContext.getBenthosBatches(true); if (log.isInfoEnabled()) { - log.info("Persist " + batches.size() + " VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + log.info("Persist " + batches.size() + " VRAC benthos batch(es) of " + operationStr + " for cruise: " + cruiseStr); } persistBenthosBatches(fishingOperationContext, batches, null); @@ -353,7 +266,7 @@ public class GenericformatImportPersitenceHelper { Collection<BenthosBatch> batches = fishingOperationContext.getBenthosBatches(false); if (log.isInfoEnabled()) { - log.info("Persist " + batches.size() + " HORS VRAC benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " for cruise: " + cruiseContext.getCruiseLabel()); + log.info("Persist " + batches.size() + " HORS VRAC benthos batch(es) of " + operationStr + " for cruise: " + cruiseContext.getCruiseLabel()); } persistBenthosBatches(fishingOperationContext, batches, null); @@ -396,4 +309,107 @@ public class GenericformatImportPersitenceHelper { } + public void persistMarineLitterBatches() { + + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + + @Override + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { + + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + + String cruiseStr = cruiseContext.getCruiseLabel(); + String operationStr = fishingOperationContext.getFishingOperationLabel(); + + importContext.increments(t("tutti.service.genericFormat.persist.operation.marineLitters", cruiseStr, operationStr)); + + if (fishingOperationContext.withMarineLitterBatches()) { + +// FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); +// String fishingOperationId = fishingOperation.getId(); + Collection<MarineLitterBatch> marineLitterBatches = fishingOperationContext.getMarineLitterBatches(); + if (log.isInfoEnabled()) { + log.info("Persist " + marineLitterBatches.size() + " marine litter(s) of " + operationStr + " for cruise: " + cruiseStr); + } + //FIXME Does not work (all batches are persisted, but the last one only displayed later in application) +// persistenceService.createMarineLitterBatches(fishingOperationId, marineLitterBatches); + for (MarineLitterBatch marineLitterBatch : marineLitterBatches) { + persistenceService.createMarineLitterBatch(marineLitterBatch); + } + + } + + } + + } + }); + + } + + public void persistIndividualObservationBatches() { + + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + + @Override + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { + + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + + String cruiseStr = cruiseContext.getCruiseLabel(); + String operationStr = fishingOperationContext.getFishingOperationLabel(); + + importContext.increments(t("tutti.service.genericFormat.persist.operation.individualObservations", cruiseStr, operationStr)); + + if (fishingOperationContext.withIndividualObservationBatches()) { + + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + String fishingOperationId = fishingOperation.getId(); + Collection<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches(); + if (log.isInfoEnabled()) { + log.info("Persist " + individualObservationBatches.size() + " individual observation(s) of " + operationStr + " for cruise: " + cruiseStr); + } + persistenceService.createIndividualObservationBatches(fishingOperationId, individualObservationBatches); + + } + + } + + } + }); + + } + + public void persistAccidentalBatches() { + + importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { + + @Override + public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) { + + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext.getFishingOperationContexts()) { + + String cruiseStr = cruiseContext.getCruiseLabel(); + String operationStr = fishingOperationContext.getFishingOperationLabel(); + + importContext.increments(t("tutti.service.genericFormat.persist.operation.accidentalBatches", cruiseStr, operationStr)); + + if (fishingOperationContext.withAccidentalBatches()) { + + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + String fishingOperationId = fishingOperation.getId(); + Collection<AccidentalBatch> accidentalBatches = fishingOperationContext.getAccidentalBatches(); + if (log.isInfoEnabled()) { + log.info("Persist " + accidentalBatches.size() + " accidental batch(es) of " + operationStr + " for cruise: " + cruiseStr); + } + persistenceService.createAccidentalBatches(fishingOperationId, accidentalBatches); + + } + + } + + } + }); + + } + } diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index 7e0d908..58da369 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -121,6 +121,7 @@ tutti.service.exportSumatraV2.header.totalWeight=TotalWeight tutti.service.exportSumatraV2.header.year=Year tutti.service.genericFormat.checkCruise= tutti.service.genericFormat.checkCruiseFishingOperation= +tutti.service.genericFormat.checkWeights.fishingOperation= tutti.service.genericFormat.cleanWeights.fishingOperation= tutti.service.genericFormat.export.accidentalCatch.error= tutti.service.genericFormat.export.buildZip= @@ -169,6 +170,7 @@ tutti.service.genericFormat.exportCruise.exportSpecies= tutti.service.genericFormat.exportCruise.exportSurvey= tutti.service.genericFormat.import.accidentalCatches= tutti.service.genericFormat.import.catches= +tutti.service.genericFormat.import.computeReport= tutti.service.genericFormat.import.cruises= tutti.service.genericFormat.import.error.cruiseAlreadyExist= tutti.service.genericFormat.import.error.cruiseAlreadyImported= @@ -200,7 +202,17 @@ tutti.service.genericFormat.importError.missArchiveFile= tutti.service.genericFormat.invalid.cruise= tutti.service.genericFormat.invalid.fishingOperation= tutti.service.genericFormat.load.protocol= +tutti.service.genericFormat.persist.cruise= +tutti.service.genericFormat.persist.gearCaracteristics= +tutti.service.genericFormat.persist.operation= +tutti.service.genericFormat.persist.operation.accidentalBatches= +tutti.service.genericFormat.persist.operation.benthosBatches= +tutti.service.genericFormat.persist.operation.individualObservations= +tutti.service.genericFormat.persist.operation.marineLitters= +tutti.service.genericFormat.persist.operation.parameters= +tutti.service.genericFormat.persist.operation.speciesBatches= tutti.service.genericFormat.reuse.protocol= +tutti.service.genericFormat.skip.import.protocol= tutti.service.multipost.attachment.copy.error= tutti.service.multipost.attachment.mkdir.error= tutti.service.multipost.export.attachments.error= 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 110431d..860aeb9 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 @@ -97,7 +97,8 @@ tutti.service.exportSumatra.header.weight=total tutti.service.exportSumatra.header.year=annee tutti.service.genericFormat.checkCruise=Vérification de la campagne %s tutti.service.genericFormat.checkCruiseFishingOperation=Vérification de la campagne <strong>%s</strong> ( trait <strong>%s</strong> ) -tutti.service.genericFormat.cleanWeights.fishingOperation=Suppression des poids en double pour l'opération %s +tutti.service.genericFormat.checkWeights.fishingOperation=Vérification des poids du trait <strong>%s</strong> - <strong>%s</strong> +tutti.service.genericFormat.cleanWeights.fishingOperation=Suppression des poids en double du trait <strong>%s</strong> - <strong>%s</strong> tutti.service.genericFormat.export.accidentalCatch.error=Erreur lors de l'export des captures accidentelles tutti.service.genericFormat.export.buildZip=Création de l'archive de l'export (fichier %s) tutti.service.genericFormat.export.catches.error=Erreur lors de l'export des captures @@ -132,11 +133,12 @@ tutti.service.genericFormat.exportCruise.exportSpecies=<html>Export de la campag tutti.service.genericFormat.exportCruise.exportSurvey=<html>Export de la campagne <strong>%s</strong></html> tutti.service.genericFormat.import.accidentalCatches=Import des captures accidentelles tutti.service.genericFormat.import.catches=Import des captures +tutti.service.genericFormat.import.computeReport=Génération du rapport d'import tutti.service.genericFormat.import.cruises=Import des campagnes tutti.service.genericFormat.import.error.cruiseAlreadyExist=Il existe déjà une campagne avec ce nom %s tutti.service.genericFormat.import.error.cruiseAlreadyImported=La campagne avec ce nom %s a déjà été importée tutti.service.genericFormat.import.error.cruiseNotFound=La campagne (année\: %s, série\: %s, série partielle %s) n'existe pas -tutti.service.genericFormat.import.error.cruiseNotValid= +tutti.service.genericFormat.import.error.cruiseNotValid=La campagne n'est pas valide \: %s tutti.service.genericFormat.import.error.fishingOperationAlreadyImported=Un trait %s - %s - %s -%s a déjà été importé dans la campagne %s tutti.service.genericFormat.import.error.fishingOperationNotFoundInCruise=Le trait %s - %s - %s -%s n'existe pas dans la campagne %s tutti.service.genericFormat.import.error.fishingOperationNotValid=Le trait n'est pas valide \:\n%s @@ -163,7 +165,17 @@ tutti.service.genericFormat.importError.missArchiveFile=Il manque le fichier %s tutti.service.genericFormat.invalid.cruise=Erreur d'élévation de poids sur les traits de la campagne %s \:<ul>%s</ul> 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.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> +tutti.service.genericFormat.persist.operation.benthosBatches=Sauvegarde des lots benthos du trait <strong>%s</strong> - <strong>%s</strong> +tutti.service.genericFormat.persist.operation.individualObservations=Sauvegarde des observations individuelles du trait <strong>%s</strong> - <strong>%s</strong> +tutti.service.genericFormat.persist.operation.marineLitters=Sauvegarde des macro-déchets du trait <strong>%s</strong> - <strong>%s</strong> +tutti.service.genericFormat.persist.operation.parameters=Sauvegarde des caractéristiques du trait <strong>%s</strong> - <strong>%s</strong> +tutti.service.genericFormat.persist.operation.speciesBatches=Sauvegarde des lots espèces du trait <strong>%s</strong> - <strong>%s</strong> tutti.service.genericFormat.reuse.protocol=Réutilisation du protocol existant %s +tutti.service.genericFormat.skip.import.protocol=Pas de protocole à importer tutti.service.multipost.attachment.copy.error=Erreur lors de l'export de la pièce-jointe %s tutti.service.multipost.attachment.mkdir.error=Impossible de créer le répertoire %s tutti.service.multipost.export.attachments.error=Erreur lors de l'export des pièces-jointes -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 b040b4302b7f7265f74d292b153de9aa53d0bc71 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Feb 23 09:32:20 2015 +0100 prepare test mecanism --- .../GenericFormatImportServiceTest.java | 68 ++++------------------ ... => GenericFormatImportServiceTestSupport.java} | 48 ++++++++++----- .../{empty => default}/accidentalCatch.csv | 0 .../genericFormat/{empty => default}/catch.csv | 0 .../{empty => default}/gearCaracteristics.csv | 0 .../{empty => default}/individualObservation.csv | 0 .../{empty => default}/marineLitter.csv | 0 .../genericFormat/{empty => default}/operation.csv | 0 .../genericFormat/{empty => default}/parameter.csv | 0 .../{empty => default}/sampleCategory.csv | 0 .../genericFormat/{empty => default}/survey.csv | 0 11 files changed, 45 insertions(+), 71 deletions(-) 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 c499247..7261a4e 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,15 +1,10 @@ package fr.ifremer.tutti.service.genericformat; -import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.ServiceDbResource; -import fr.ifremer.tutti.service.TuttiServiceContext; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; -import org.nuiton.util.FileUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import java.io.File; +import java.io.IOException; /** * Created on 2/15/15. @@ -17,64 +12,23 @@ import java.io.File; * @author Tony Chemit - chemit@codelutin.com * @since 3.14 */ -public class GenericFormatImportServiceTest { +public class GenericFormatImportServiceTest extends GenericFormatImportServiceTestSupport { - @ClassRule - public static final ServiceDbResource dbResource = ServiceDbResource.writeDb("dbGenericFormatImport"); + /** Logger. */ + private static final Log log = LogFactory.getLog(GenericFormatImportServiceTest.class); - public static final String PROGRAM_ID = "CAM-EVHOE"; - - protected GenericFormatImportService service; - - protected PersistenceService persistenceService; - - protected ServiceDbResource.DataContext dataContext; - - protected ProgressionModel progressionModel; - - @Before - public void setUp() throws Exception { - - TuttiServiceContext serviceContext = dbResource.getServiceContext(); - - persistenceService = serviceContext.getService(PersistenceService.class); - - dbResource.setCountryInConfig("12"); - dbResource.openDataContext(); - - service = serviceContext.getService(GenericFormatImportService.class); - - dataContext = dbResource.loadContext(PROGRAM_ID); - - progressionModel = new ProgressionModel(); - - } - - protected File createArchive(String directoryName, String archiveFileName) { - - File explodedDirectory = FileUtil.getFileFromPaths(new File("src"), "test", "resources", "genericFormat", directoryName); - - File dataDirectory = dbResource.getConfig().getDataDirectory(); - File archiveFile = new File(dataDirectory, archiveFileName); - - GenericFormatArchive archiveToExport = GenericFormatArchive.forExportFromWorkingDirectory(archiveFile, explodedDirectory); - - archiveToExport.createZip(null); - - return archiveFile; - - } - - @Test - public void loadEmptyImport() { + @Override + public void testImport() throws IOException { File archiveFile = createArchive("empty", "empty.zip"); int nbSteps = service.getImportProgramNbSteps(archiveFile); progressionModel.adaptTotal(nbSteps); + if (log.isInfoEnabled()) { + log.info("Will do import in " + nbSteps + " steps"); + } service.importProgram(dataContext.program.getId(), archiveFile, progressionModel); - } } 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/GenericFormatImportServiceTestSupport.java similarity index 55% copy from tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportServiceTest.java copy to tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportServiceTestSupport.java index c499247..5c5b29f 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/GenericFormatImportServiceTestSupport.java @@ -4,20 +4,27 @@ import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.ServiceDbResource; import fr.ifremer.tutti.service.TuttiServiceContext; +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.nuiton.util.FileUtil; import java.io.File; +import java.io.IOException; /** - * Created on 2/15/15. + * Created on 2/23/15. * * @author Tony Chemit - chemit@codelutin.com * @since 3.14 */ -public class GenericFormatImportServiceTest { +public abstract class GenericFormatImportServiceTestSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(GenericFormatImportServiceTestSupport.class); @ClassRule public static final ServiceDbResource dbResource = ServiceDbResource.writeDb("dbGenericFormatImport"); @@ -50,12 +57,34 @@ public class GenericFormatImportServiceTest { } - protected File createArchive(String directoryName, String archiveFileName) { + protected File createArchive(String directoryName, String archiveFileName) throws IOException { + + File tmpDirectory = dbResource.getConfig().getTmpDirectory(); + + File explodedDirectory = new File(tmpDirectory, directoryName); + if (log.isInfoEnabled()) { + log.info("Exploded directory of archive: " + explodedDirectory); + } - File explodedDirectory = FileUtil.getFileFromPaths(new File("src"), "test", "resources", "genericFormat", directoryName); + File defaultDirectory = FileUtil.getFileFromPaths(new File("src"), "test", "resources", "genericFormat", "default"); + if (log.isInfoEnabled()) { + log.info("Copy default archive files from " + defaultDirectory); + } + FileUtils.copyDirectory(defaultDirectory, explodedDirectory); + + File overrideDirectory = FileUtil.getFileFromPaths(new File("src"), "test", "resources", "genericFormat", directoryName); + if (overrideDirectory.exists()) { + if (log.isInfoEnabled()) { + log.info("Copy overriden archive files from " + overrideDirectory); + } + FileUtils.copyDirectory(overrideDirectory, explodedDirectory); + } File dataDirectory = dbResource.getConfig().getDataDirectory(); File archiveFile = new File(dataDirectory, archiveFileName); + if (log.isInfoEnabled()) { + log.info("Build import archive: " + archiveFile); + } GenericFormatArchive archiveToExport = GenericFormatArchive.forExportFromWorkingDirectory(archiveFile, explodedDirectory); @@ -66,15 +95,6 @@ public class GenericFormatImportServiceTest { } @Test - public void loadEmptyImport() { - - File archiveFile = createArchive("empty", "empty.zip"); + public abstract void testImport() throws IOException; - int nbSteps = service.getImportProgramNbSteps(archiveFile); - progressionModel.adaptTotal(nbSteps); - - service.importProgram(dataContext.program.getId(), archiveFile, progressionModel); - - - } } diff --git a/tutti-service/src/test/resources/genericFormat/empty/accidentalCatch.csv b/tutti-service/src/test/resources/genericFormat/default/accidentalCatch.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/accidentalCatch.csv rename to tutti-service/src/test/resources/genericFormat/default/accidentalCatch.csv diff --git a/tutti-service/src/test/resources/genericFormat/empty/catch.csv b/tutti-service/src/test/resources/genericFormat/default/catch.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/catch.csv rename to tutti-service/src/test/resources/genericFormat/default/catch.csv diff --git a/tutti-service/src/test/resources/genericFormat/empty/gearCaracteristics.csv b/tutti-service/src/test/resources/genericFormat/default/gearCaracteristics.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/gearCaracteristics.csv rename to tutti-service/src/test/resources/genericFormat/default/gearCaracteristics.csv diff --git a/tutti-service/src/test/resources/genericFormat/empty/individualObservation.csv b/tutti-service/src/test/resources/genericFormat/default/individualObservation.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/individualObservation.csv rename to tutti-service/src/test/resources/genericFormat/default/individualObservation.csv diff --git a/tutti-service/src/test/resources/genericFormat/empty/marineLitter.csv b/tutti-service/src/test/resources/genericFormat/default/marineLitter.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/marineLitter.csv rename to tutti-service/src/test/resources/genericFormat/default/marineLitter.csv diff --git a/tutti-service/src/test/resources/genericFormat/empty/operation.csv b/tutti-service/src/test/resources/genericFormat/default/operation.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/operation.csv rename to tutti-service/src/test/resources/genericFormat/default/operation.csv diff --git a/tutti-service/src/test/resources/genericFormat/empty/parameter.csv b/tutti-service/src/test/resources/genericFormat/default/parameter.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/parameter.csv rename to tutti-service/src/test/resources/genericFormat/default/parameter.csv diff --git a/tutti-service/src/test/resources/genericFormat/empty/sampleCategory.csv b/tutti-service/src/test/resources/genericFormat/default/sampleCategory.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/sampleCategory.csv rename to tutti-service/src/test/resources/genericFormat/default/sampleCategory.csv diff --git a/tutti-service/src/test/resources/genericFormat/empty/survey.csv b/tutti-service/src/test/resources/genericFormat/default/survey.csv similarity index 100% rename from tutti-service/src/test/resources/genericFormat/empty/survey.csv rename to tutti-service/src/test/resources/genericFormat/default/survey.csv -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm