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 2f27401a4203e2afbc205900b838569de7ecb0bb Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Feb 20 17:27:44 2015 +0100 add usefull validation method for consumers + continue import for marine litter, accidental catches and individual observations --- .../genericformat/GenericFormatImportContext.java | 56 +++++++- .../genericformat/GenericFormatImportService.java | 30 ++++- .../GenericFormatImportValidationHelper.java | 52 ++++++++ .../GenericformatImportPersitenceHelper.java | 143 +++++++++++++++++++-- .../consumer/CsvConsumerForAccidentalCatch.java | 61 ++++++++- .../consumer/CsvConsumerForCatch.java | 12 +- .../consumer/CsvConsumerForGearCaracteristic.java | 16 +-- .../CsvConsumerForIndividualObservation.java | 62 ++++++++- .../consumer/CsvConsumerForMarineLitter.java | 16 ++- .../consumer/CsvConsumerForOperation.java | 34 ++--- .../consumer/CsvConsumerForParameter.java | 92 +++++-------- .../consumer/CsvConsumerForSampleCategory.java | 2 +- .../FishingOperationAlreadyImportedException.java | 2 +- 13 files changed, 457 insertions(+), 121 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java index 999d63b..df2831b 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,5 +1,9 @@ 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 fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Cruises; @@ -20,6 +24,7 @@ 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.referential.consumer.CsvConsumerForTemporaryGear; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryPerson; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporarySpecies; @@ -50,12 +55,17 @@ public class GenericFormatImportContext implements Closeable { private final ProgressionModel progressionModel; + private final Decorator<FishingOperation> fishingOperationDecorator; + private final GenericFormatImportEntityParserFactory importEntityParserFactory; private final GenericformatImportPersitenceHelper persitenceHelper; private final GenericFormatImportValidationHelper validationHelper; + private final Multimap<Cruise, GenericFormatImportOperationContext> fishingOperationsContexts; + + public GenericFormatImportContext(GenericFormatImportRequest importRequest, ProgressionModel progressionModel, PersistenceService persistenceService, @@ -63,11 +73,12 @@ public class GenericFormatImportContext implements Closeable { Decorator<FishingOperation> fishingOperationDecorator) { this.importRequest = importRequest; this.progressionModel = progressionModel; + this.fishingOperationDecorator = fishingOperationDecorator; this.importResult = new GenericFormatImportResult(importRequest); this.importEntityParserFactory = new GenericFormatImportEntityParserFactory(persistenceService, importRequest, importResult); this.persitenceHelper = new GenericformatImportPersitenceHelper(this, persistenceService, cruiseDecorator, fishingOperationDecorator); this.validationHelper = new GenericFormatImportValidationHelper(this, new ValidationService()); - + this.fishingOperationsContexts = ArrayListMultimap.create(); } public GenericFormatImportRequest getImportRequest() { @@ -143,16 +154,43 @@ public class GenericFormatImportContext implements Closeable { } - public FishingOperation getImportedFishingOperation(FishingOperation importRowFishingOperation) { + public void addImportedFishingOperation(FishingOperation fishingOperation) { + importResult.addImportedFishingOperation(fishingOperation); + String fishingOperationLabel = fishingOperationDecorator.toString(fishingOperation); + fishingOperationsContexts.put(fishingOperation.getCruise(), new GenericFormatImportOperationContext(fishingOperation, fishingOperationLabel)); + } + + public GenericFormatImportOperationContext getImportedFishingOperationContext(RowWithOperationContextSupport row) { + + Cruise cruise = row.getCruise(); + FishingOperation fishingOperation = row.getFishingOperation(); + + GenericFormatImportOperationContext result = null; + for (GenericFormatImportOperationContext importOperationContext : fishingOperationsContexts.get(cruise)) { + + FishingOperation importedFishingOperation = importOperationContext.getFishingOperation(); + boolean equals = FishingOperations.equals(importedFishingOperation, fishingOperation); + if (equals) { + result = importOperationContext; + break; + } + + } + return result; + + } + + public GenericFormatImportOperationContext getImportedFishingOperationContext(FishingOperation importRowFishingOperation) { Cruise cruise = importRowFishingOperation.getCruise(); - FishingOperation result = null; - for (FishingOperation importedFishingOperation : importResult.getImportedFishingOperations(cruise)) { + GenericFormatImportOperationContext result = null; + for (GenericFormatImportOperationContext importOperationContext : fishingOperationsContexts.get(cruise)) { - boolean equals = FishingOperations.equals(importRowFishingOperation, importedFishingOperation); + FishingOperation fishingOperation = importOperationContext.getFishingOperation(); + boolean equals = FishingOperations.equals(importRowFishingOperation, fishingOperation); if (equals) { - result = importedFishingOperation; + result = importOperationContext; break; } @@ -161,9 +199,13 @@ public class GenericFormatImportContext implements Closeable { } + public Iterable<GenericFormatImportOperationContext> getImportedFishingOperationContexts(Predicate<GenericFormatImportOperationContext> predicate) { + return Iterables.filter(fishingOperationsContexts.values(), predicate); + } + public boolean isFishingOperationAlreadyImported(FishingOperation fishingOperation) { - FishingOperation importedFishingOperation = getImportedFishingOperation(fishingOperation); + GenericFormatImportOperationContext importedFishingOperation = getImportedFishingOperationContext(fishingOperation); return importedFishingOperation != null; } 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 26bcb74..bd579e2 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 @@ -485,7 +485,9 @@ public class GenericFormatImportService extends AbstractTuttiService { consumer.validateRow(row, importContext); - consumer.prepareRowForPersist(row); + GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); + + consumer.prepareRowForPersist(fishingOperationContext,row); } } catch (IOException e) { @@ -508,13 +510,19 @@ public class GenericFormatImportService extends AbstractTuttiService { consumer.validateRow(row, importContext); - consumer.prepareRowForPersist(row); + GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); + + consumer.prepareRowForPersist(fishingOperationContext, row); } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close catch.csv file", e); } + //TODO +// importContext.getPersitenceHelper().persistSpeciesBatches(); +// importContext.getPersitenceHelper().persistBenthosBatches(); + } protected void importAccidentalCatches(GenericFormatImportContext importContext) { @@ -529,13 +537,17 @@ public class GenericFormatImportService extends AbstractTuttiService { consumer.validateRow(row, importContext); - consumer.prepareRowForPersist(row); + GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); + + consumer.prepareRowForPersist(fishingOperationContext, row); } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close accidentalCatch.csv file", e); } + importContext.getPersitenceHelper().persistAccidentalBatches(); + } protected void importIndividualObservations(GenericFormatImportContext importContext) { @@ -550,13 +562,17 @@ public class GenericFormatImportService extends AbstractTuttiService { consumer.validateRow(row, importContext); - consumer.prepareRowForPersist(row); + GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); + + consumer.prepareRowForPersist(fishingOperationContext, row); } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close individualObservation.csv file", e); } + importContext.getPersitenceHelper().persistIndividualObservationBatches(); + } protected void importMarineLitters(GenericFormatImportContext importContext) { @@ -571,13 +587,17 @@ public class GenericFormatImportService extends AbstractTuttiService { consumer.validateRow(row, importContext); - consumer.prepareRowForPersist(row); + GenericFormatImportOperationContext fishingOperationContext = importContext.getImportedFishingOperationContext(row.getBean()); + + consumer.prepareRowForPersist(fishingOperationContext, row); } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close marineLitter.csv file", e); } + importContext.getPersitenceHelper().persistMarineLitterBatches(); + } } 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 90b65d0..3d1d129 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 @@ -4,7 +4,13 @@ import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; 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.csv.RowWithCruiseContextSupport; +import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport; import org.apache.commons.io.IOUtils; +import org.nuiton.csv.ImportRow; import org.nuiton.validator.NuitonValidatorResult; import java.io.Closeable; @@ -59,4 +65,50 @@ public class GenericFormatImportValidationHelper implements Closeable { } } + public <R extends RowWithCruiseContextSupport> Cruise getCruise(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatImportContext importContext) { + + R bean = row.getBean(); + + Cruise cruise = importContext.getImportedCruise(bean.getCruise()); + if (cruise == null) { + + consumer.addCheckError(row, new CruiseNotFoundException(bean.getCruise())); + + } else { + + bean.setCruise(cruise); + + } + + return cruise; + + } + + public <R extends RowWithOperationContextSupport> GenericFormatImportOperationContext getFishingOperationContext(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatImportContext importContext) { + + GenericFormatImportOperationContext fishingOperationContext = null; + + Cruise cruise = getCruise(consumer, row, importContext); + + if (cruise != null) { + + R bean = row.getBean(); + + fishingOperationContext = importContext.getImportedFishingOperationContext(bean); + + if (fishingOperationContext == null) { + + consumer.addCheckError(row, new FishingOperationNotFoundInCruiseException(bean.getFishingOperation())); + + } else { + + bean.setFishingOperation(fishingOperationContext.getFishingOperation()); + + } + } + + return fishingOperationContext; + + } + } 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 7092531..78e7542 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,9 +1,15 @@ package fr.ifremer.tutti.service.genericformat; +import com.google.common.base.Predicate; 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.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; +import fr.ifremer.tutti.persistence.entities.data.MarineLitterBatch; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.service.PersistenceService; import org.apache.commons.collections4.MapUtils; @@ -80,7 +86,7 @@ public class GenericformatImportPersitenceHelper { } FishingOperation savedFishingOperation = persistenceService.createFishingOperation(fishingOperation); - importContext.getImportResult().addImportedFishingOperation(savedFishingOperation); + importContext.addImportedFishingOperation(savedFishingOperation); return savedFishingOperation; @@ -98,21 +104,142 @@ public class GenericformatImportPersitenceHelper { public void persistFishingOperationParameters() { - Collection<FishingOperation> fishingOperations = importContext.getImportResult().getImportedFishingOperations().values(); + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withParameters(); + } + }); - for (FishingOperation fishingOperation : fishingOperations) { + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { - if (MapUtils.isNotEmpty(fishingOperation.getGearUseFeatures()) || MapUtils.isNotEmpty(fishingOperation.getVesselUseFeatures())) { + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - if (log.isInfoEnabled()) { - log.info("Persist parameters of " + fishingOperationDecorator.toString(fishingOperation) + " of cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); - } - persistenceService.saveFishingOperation(fishingOperation); + if (log.isInfoEnabled()) { + log.info("Persist parameters of " + fishingOperationContext.getFishingOperationLabel() + " of cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + } + persistenceService.saveFishingOperation(fishingOperation); + + } + + } + public void persistMarineLitterBatches() { + + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(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() + " of cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); } + persistenceService.createMarineLitterBatches(fishingOperationId, marineLitterBatches); } } + public void persistAccidentalBatches() { + + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(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() + " of cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + } + persistenceService.createAccidentalBatches(fishingOperationId, accidentalBatches); + + } + + } + + public void persistIndividualObservationBatches() { + + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(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() + " of cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + } + + //TODO must reset caracteristics values for size, weight, ... using pmfmId + persistenceService.createIndividualObservationBatches(fishingOperationId, individualObservationBatches); + + } + + } + + public void persistSpeciesBatches() { + + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withSpeciesBatches(); + } + }); + + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + String fishingOperationId = fishingOperation.getId(); + Collection<SpeciesBatch> speciesBatches = fishingOperationContext.getSpeciesBatches(); + if (log.isInfoEnabled()) { + log.info("Persist " + speciesBatches.size() + " species batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " of cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + } + persistenceService.createSpeciesBatches(fishingOperationId, speciesBatches); + + } + + } + + public void persistBenthosBatches() { + + Iterable<GenericFormatImportOperationContext> fishingOperationContexts = importContext.getImportedFishingOperationContexts(new Predicate<GenericFormatImportOperationContext>() { + @Override + public boolean apply(GenericFormatImportOperationContext input) { + return input.withBenthosBatches(); + } + }); + + for (GenericFormatImportOperationContext fishingOperationContext : fishingOperationContexts) { + + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); + String fishingOperationId = fishingOperation.getId(); + Collection<BenthosBatch> benthosBatches = fishingOperationContext.getBenthosBatches(); + if (log.isInfoEnabled()) { + log.info("Persist " + benthosBatches.size() + " benthos batch(es) of " + fishingOperationContext.getFishingOperationLabel() + " of cruise: " + cruiseDecorator.toString(fishingOperation.getCruise())); + } + persistenceService.createBenthosBatches(fishingOperationId, benthosBatches); + + } + + } + + } 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 03ca96c..40cdf14 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 @@ -1,12 +1,21 @@ package fr.ifremer.tutti.service.genericformat.consumer; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; +import fr.ifremer.tutti.persistence.entities.data.AccidentalBatchs; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +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.GenericFormatImportEntityParserFactory; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportOperationContext; import fr.ifremer.tutti.service.genericformat.csv.AccidentalCatchModel; import fr.ifremer.tutti.service.genericformat.csv.AccidentalCatchRow; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.csv.ImportRow; +import java.io.Serializable; import java.nio.file.Path; /** @@ -17,6 +26,9 @@ import java.nio.file.Path; */ public class CsvConsumerForAccidentalCatch extends CsvComsumer<AccidentalCatchRow, AccidentalCatchModel> { + /** Logger. */ + private static final Log log = LogFactory.getLog(CsvConsumerForAccidentalCatch.class); + public CsvConsumerForAccidentalCatch(Path file, char separator, GenericFormatImportEntityParserFactory parserFactory) { super(file, AccidentalCatchModel.forImport(separator, parserFactory)); } @@ -25,9 +37,34 @@ public class CsvConsumerForAccidentalCatch extends CsvComsumer<AccidentalCatchRo if (row.isValid()) { - AccidentalCatchRow bean = row.getBean(); + GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); + + if (fishingOperationContext != null) { + + //TODO checks! + AccidentalCatchRow bean = row.getBean(); + + //TODO Use a validator ? + Caracteristic caracteristic = bean.getCaracteristic(); + if (caracteristic == null) { + //TODO Should done by parser ? + } + + //TODO Use a validator ? + if (bean.getCaracteristicValue() == null) { + + } - //TODO checks! + // parse caracteristic value + String value = (String) bean.getCaracteristicValue(); + try { + Serializable serializable = importContext.parseCaracteristicValue(caracteristic, value); + bean.setCaracteristicValue(serializable); + } catch (CaracteristicValueParseException e) { + addCheckError(row, e); + } + + } } @@ -35,9 +72,27 @@ public class CsvConsumerForAccidentalCatch extends CsvComsumer<AccidentalCatchRo } - public void prepareRowForPersist(ImportRow<AccidentalCatchRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext fishingOperationContext, ImportRow<AccidentalCatchRow> row) { AccidentalCatchRow bean = row.getBean(); + Integer batchId = bean.getBatchId(); + AccidentalBatch batch = fishingOperationContext.getAccidentalBatchById(batchId); + if (batch == null) { + + if (log.isInfoEnabled()) { + log.info("Detects accidentalBatch: " + batchId); + } + + batch = AccidentalBatchs.newAccidentalBatch(); + batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + batch.setCaracteristics(new CaracteristicMap()); + batch.setComment(bean.getComment()); + batch.setSpecies(bean.getSpecies()); + fishingOperationContext.addAccidentalBatch(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/CsvConsumerForCatch.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForCatch.java index 1b68a1b..909b6c9 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 @@ -4,6 +4,7 @@ import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportEntityParserFactory; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportOperationContext; import fr.ifremer.tutti.service.genericformat.csv.CatchModel; import fr.ifremer.tutti.service.genericformat.csv.CatchRow; import org.nuiton.csv.ImportRow; @@ -26,9 +27,14 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { if (row.isValid()) { - CatchRow bean = row.getBean(); + GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); - //TODO checks! + if (fishingOperationContext != null) { + + //TODO checks! + CatchRow bean = row.getBean(); + + } } @@ -36,7 +42,7 @@ public class CsvConsumerForCatch extends CsvComsumer<CatchRow, CatchModel> { } - public void prepareRowForPersist(ImportRow<CatchRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext fishingOperationContext, ImportRow<CatchRow> row) { CatchRow bean = row.getBean(); 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 57ad59b..5a815aa 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 @@ -8,6 +8,7 @@ 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.GenericFormatImportEntityParserFactory; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportValidationHelper; import fr.ifremer.tutti.service.genericformat.csv.GearCaracteristicModel; import fr.ifremer.tutti.service.genericformat.csv.GearCaracteristicRow; import org.nuiton.csv.ImportRow; @@ -31,23 +32,20 @@ public class CsvConsumerForGearCaracteristic extends CsvComsumer<GearCaracterist if (row.isValid()) { - GearCaracteristicRow bean = row.getBean(); + GenericFormatImportValidationHelper validationHelper = importContext.getValidationHelper(); - Cruise importedCruise = importContext.getImportedCruise(bean.getCruise()); - if (importedCruise == null) { + Cruise cruise = validationHelper.getCruise(this, row, importContext); - addCheckError(row, new CruiseNotFoundException(bean.getCruise())); + if (cruise != null) { - } else { - - bean.setCruise(importedCruise); + GearCaracteristicRow bean = row.getBean(); Gear gear = bean.getGear(); int rankOrder = bean.getRankOrder(); - Gear cruiseGear = importContext.getGear(importedCruise, gear, rankOrder); + Gear cruiseGear = importContext.getGear(cruise, gear, rankOrder); if (cruiseGear == null) { - addCheckError(row, new GearNotFoundInCruiseException(importedCruise, gear, rankOrder)); + addCheckError(row, new GearNotFoundInCruiseException(cruise, gear, rankOrder)); } bean.setGear(cruiseGear); 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 d4da32c..b6481bc 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 @@ -1,12 +1,21 @@ package fr.ifremer.tutti.service.genericformat.consumer; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatchs; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +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.GenericFormatImportEntityParserFactory; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportOperationContext; import fr.ifremer.tutti.service.genericformat.csv.IndividualObservationModel; import fr.ifremer.tutti.service.genericformat.csv.IndividualObservationRow; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.csv.ImportRow; +import java.io.Serializable; import java.nio.file.Path; /** @@ -17,6 +26,9 @@ import java.nio.file.Path; */ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualObservationRow, IndividualObservationModel> { + /** Logger. */ + private static final Log log = LogFactory.getLog(CsvConsumerForIndividualObservation.class); + public CsvConsumerForIndividualObservation(Path file, char separator, GenericFormatImportEntityParserFactory parserFactory) { super(file, IndividualObservationModel.forImport(separator, parserFactory)); } @@ -25,9 +37,34 @@ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualO if (row.isValid()) { - IndividualObservationRow bean = row.getBean(); + GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); + + if (fishingOperationContext != null) { + + //TODO checks! + IndividualObservationRow bean = row.getBean(); + + //TODO Use a validator ? + Caracteristic caracteristic = bean.getCaracteristic(); + if (caracteristic == null) { + //TODO Should done by parser ? + } + + //TODO Use a validator ? + if (bean.getCaracteristicValue() == null) { + + } + + // parse caracteristic value + String value = (String) bean.getCaracteristicValue(); + try { + Serializable serializable = importContext.parseCaracteristicValue(caracteristic, value); + bean.setCaracteristicValue(serializable); + } catch (CaracteristicValueParseException e) { + addCheckError(row, e); + } - //TODO checks! + } } @@ -35,9 +72,28 @@ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualO } - public void prepareRowForPersist(ImportRow<IndividualObservationRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext fishingOperationContext, ImportRow<IndividualObservationRow> row) { IndividualObservationRow bean = row.getBean(); + Integer batchId = bean.getBatchId(); + IndividualObservationBatch batch = fishingOperationContext.getIndividualObservationBatchesById(batchId); + if (batch == null) { + + if (log.isInfoEnabled()) { + log.info("Detects individualObservationBatch: " + batchId); + } + + batch = IndividualObservationBatchs.newIndividualObservationBatch(); + batch.setFishingOperation(fishingOperationContext.getFishingOperation()); + batch.setCaracteristics(new CaracteristicMap()); + batch.setComment(bean.getComment()); + batch.setSpecies(bean.getSpecies()); + fishingOperationContext.addIndividualObservationBatch(batchId, batch); + + } + + batch.getCaracteristics().put(bean.getCaracteristic(), bean.getCaracteristicValue()); + } 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 714c7be..08ea266 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 @@ -1,8 +1,10 @@ package fr.ifremer.tutti.service.genericformat.consumer; +import fr.ifremer.tutti.persistence.entities.data.MarineLitterBatch; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportEntityParserFactory; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportOperationContext; import fr.ifremer.tutti.service.genericformat.csv.MarineLitterModel; import fr.ifremer.tutti.service.genericformat.csv.MarineLitterRow; import org.nuiton.csv.ImportRow; @@ -25,9 +27,14 @@ public class CsvConsumerForMarineLitter extends CsvComsumer<MarineLitterRow, Mar if (row.isValid()) { - MarineLitterRow bean = row.getBean(); + GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); - //TODO checks! + if (fishingOperationContext != null) { + + //TODO checks! + MarineLitterRow bean = row.getBean(); + + } } @@ -35,9 +42,12 @@ public class CsvConsumerForMarineLitter extends CsvComsumer<MarineLitterRow, Mar } - public void prepareRowForPersist(ImportRow<MarineLitterRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext fishingOperationContext, ImportRow<MarineLitterRow> row) { MarineLitterRow bean = row.getBean(); + MarineLitterBatch marineLitterBatch = bean.getMarineLitterBatch(); + marineLitterBatch.setFishingOperation(fishingOperationContext.getFishingOperation()); + fishingOperationContext.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 a336602..28940e9 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 @@ -6,6 +6,7 @@ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportEntityParserFactory; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportValidationHelper; import fr.ifremer.tutti.service.genericformat.csv.OperationModel; import fr.ifremer.tutti.service.genericformat.csv.OperationRow; import org.nuiton.csv.ImportRow; @@ -29,36 +30,37 @@ public class CsvConsumerForOperation extends CsvComsumer<OperationRow, Operation if (row.isValid()) { - OperationRow bean = row.getBean(); + GenericFormatImportValidationHelper validationHelper = importContext.getValidationHelper(); - FishingOperation fishingOperation = bean.getFishingOperation(); + Cruise cruise = validationHelper.getCruise(this, row, importContext); - Cruise cruise = importContext.getImportedCruise(bean.getCruise()); - if (cruise == null) { + if (cruise != null) { - addCheckError(row, new CruiseNotFoundException(bean.getCruise())); + OperationRow bean = row.getBean(); - } else if (importContext.isFishingOperationAlreadyImported(fishingOperation)) { + FishingOperation fishingOperation = bean.getFishingOperation(); - addCheckError(row, new FishingOperationAlreadyImportedException(fishingOperation)); + if (importContext.isFishingOperationAlreadyImported(fishingOperation)) { - } else { + addCheckError(row, new FishingOperationAlreadyImportedException(fishingOperation)); - bean.setCruise(cruise); - fishingOperation.setCruise(cruise); + } else { - NuitonValidatorResult validatorResult = importContext.getValidationHelper().validateFishingOperation(fishingOperation); + fishingOperation.setCruise(cruise); - if (validatorResult.hasFatalMessages()) { + NuitonValidatorResult validatorResult = validationHelper.validateFishingOperation(fishingOperation); - addCheckError(row, new FishingOperationNotValidException(fishingOperation, validatorResult)); + if (validatorResult.hasFatalMessages()) { - } + addCheckError(row, new FishingOperationNotValidException(fishingOperation, validatorResult)); - //TODO other checks ? + } - } + //TODO other checks ? + } + + } } reportError(row); 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 f131086..8d793bb 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 @@ -1,13 +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.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; 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.GenericFormatImportEntityParserFactory; +import fr.ifremer.tutti.service.genericformat.GenericFormatImportOperationContext; import fr.ifremer.tutti.service.genericformat.csv.ParameterModel; import fr.ifremer.tutti.service.genericformat.csv.ParameterRow; import org.nuiton.csv.ImportRow; @@ -31,58 +29,41 @@ public class CsvConsumerForParameter extends CsvComsumer<ParameterRow, Parameter if (row.isValid()) { - ParameterRow bean = row.getBean(); + GenericFormatImportOperationContext fishingOperationContext = importContext.getValidationHelper().getFishingOperationContext(this, row, importContext); - FishingOperation fishingOperation = bean.getFishingOperation(); + if (fishingOperationContext != null) { - Cruise cruise = importContext.getImportedCruise(bean.getCruise()); - if (cruise == null) { + ParameterRow bean = row.getBean(); - addCheckError(row, new CruiseNotFoundException(bean.getCruise())); + bean.setFishingOperation(fishingOperationContext.getFishingOperation()); - } else { - - bean.setCruise(cruise); - fishingOperation.setCruise(cruise); - - FishingOperation importedFishingOperation = importContext.getImportedFishingOperation(fishingOperation); - - if (importedFishingOperation == null) { - - addCheckError(row, new FishingOperationNotFoundInCruiseException(fishingOperation)); - - } else { - - bean.setFishingOperation(importedFishingOperation); - - //TODO Use a validator ? - if (bean.getParameterType() == null) { - //TODO Should done by parser ? - } + //TODO Use a validator ? + if (bean.getParameterType() == null) { + //TODO Should done by parser ? + } - //TODO Use a validator ? - Caracteristic caracteristic = bean.getCaracteristic(); - if (caracteristic == null) { - //TODO Should done by parser ? - } + //TODO Use a validator ? + Caracteristic caracteristic = bean.getCaracteristic(); + if (caracteristic == null) { + //TODO Should done by parser ? + } - //TODO Use a validator ? - if (bean.getValue() == null) { + //TODO Use a validator ? + if (bean.getValue() == null) { - } + } - // parse caracteristic value - String value = (String) bean.getValue(); - try { - Serializable serializable = importContext.parseCaracteristicValue(caracteristic, value); - bean.setValue(serializable); - } catch (CaracteristicValueParseException e) { - addCheckError(row, e); - } + // parse caracteristic value + String value = (String) bean.getValue(); + try { + Serializable serializable = importContext.parseCaracteristicValue(caracteristic, value); + bean.setValue(serializable); + } catch (CaracteristicValueParseException e) { + addCheckError(row, e); + } - //TODO other checks ? + //TODO other checks ? - } } } @@ -91,39 +72,26 @@ public class CsvConsumerForParameter extends CsvComsumer<ParameterRow, Parameter } - public void prepareRowForPersist(ImportRow<ParameterRow> row) { + public void prepareRowForPersist(GenericFormatImportOperationContext importedFishingOperation, ImportRow<ParameterRow> row) { ParameterRow bean = row.getBean(); ParameterRow.ParameterType parameterType = bean.getParameterType(); - CaracteristicMap caracteristicMap; - switch (parameterType) { case GEAR: - caracteristicMap = bean.getFishingOperation().getGearUseFeatures(); - if (caracteristicMap == null) { - caracteristicMap = new CaracteristicMap(); - bean.getFishingOperation().setGearUseFeatures(caracteristicMap); - } + importedFishingOperation.addGearUseFeature(bean.getCaracteristic(), bean.getValue()); break; + case VESSEL: - caracteristicMap = bean.getFishingOperation().getVesselUseFeatures(); - if (caracteristicMap == null) { - caracteristicMap = new CaracteristicMap(); - bean.getFishingOperation().setVesselUseFeatures(caracteristicMap); - } + importedFishingOperation.addVesselUseFeature(bean.getCaracteristic(), bean.getValue()); break; - default: - throw new IllegalStateException("Can't happen!"); } - caracteristicMap.put(bean.getCaracteristic(), bean.getValue()); - } } \ No newline at end of file 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 55bde61..ad09359 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 @@ -31,7 +31,7 @@ public class CsvConsumerForSampleCategory extends CsvComsumer<SampleCategoryRow, if (row.isValid()) { - int categoryIndex = (int) row.getLineNumber() -1; + int categoryIndex = (int) row.getLineNumber() - 1; fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel sampleCategoryModel = importContext.getImportRequest().getSampleCategoryModel(); int nbSampling = sampleCategoryModel.getNbSampling(); 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 015ea11..66a850d 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.genericFormat.import.error.fishingOperationAlreadyImported", fishingOperation.getStationNumber(), fishingOperation.getFishingOperationNumber(), fishingOperation.getMultirigAggregation(), fishingOperation.getGearShootingStartDate(), fishingOperation.getCruise().getName()); } } \ No newline at end of file -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.