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 40916235a059a2e5dd144e583f79ec3b7026340f Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Feb 19 19:52:16 2015 +0100 introduce validation helper + continue importing operations --- .../genericformat/GenericFormatImportContext.java | 22 ++++++-- .../genericformat/GenericFormatImportService.java | 19 ++++--- .../GenericFormatImportValidationHelper.java | 62 ++++++++++++++++++++++ .../GenericformatImportPersitenceHelper.java | 13 +++-- .../consumer/CsvConsumerForOperation.java | 18 +++---- .../consumer/CsvConsumerForSurvey.java | 7 ++- .../FishingOperationNotValidException.java | 6 +-- .../resources/i18n/tutti-service_fr_FR.properties | 2 +- 8 files changed, 116 insertions(+), 33 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 9afba1a..999d63b 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 @@ -8,6 +8,7 @@ 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.PersistenceService; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.service.csv.CaracteristicValueParseException; import fr.ifremer.tutti.service.csv.CaracteristicValueParserFormatter; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForAccidentalCatch; @@ -53,12 +54,20 @@ public class GenericFormatImportContext implements Closeable { private final GenericformatImportPersitenceHelper persitenceHelper; - public GenericFormatImportContext(GenericFormatImportRequest importRequest, ProgressionModel progressionModel, PersistenceService persistenceService, Decorator<Cruise> cruiseDecorator, Decorator<FishingOperation> fishingOperationDecorator) { + private final GenericFormatImportValidationHelper validationHelper; + + public GenericFormatImportContext(GenericFormatImportRequest importRequest, + ProgressionModel progressionModel, + PersistenceService persistenceService, + Decorator<Cruise> cruiseDecorator, + Decorator<FishingOperation> fishingOperationDecorator) { this.importRequest = importRequest; this.progressionModel = progressionModel; 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()); + } public GenericFormatImportRequest getImportRequest() { @@ -72,6 +81,8 @@ public class GenericFormatImportContext implements Closeable { @Override public void close() throws IOException { + validationHelper.close(); + //TODO Close //getArchive().close(); @@ -111,7 +122,7 @@ public class GenericFormatImportContext implements Closeable { public boolean isCruiseAlreadyImported(Cruise cruise) { Cruise importedCruise = getImportedCruise(cruise); - return importedCruise !=null; + return importedCruise != null; } @@ -153,7 +164,7 @@ public class GenericFormatImportContext implements Closeable { public boolean isFishingOperationAlreadyImported(FishingOperation fishingOperation) { FishingOperation importedFishingOperation = getImportedFishingOperation(fishingOperation); - return importedFishingOperation!=null; + return importedFishingOperation != null; } @@ -248,4 +259,9 @@ public class GenericFormatImportContext implements Closeable { public GenericformatImportPersitenceHelper getPersitenceHelper() { return persitenceHelper; } + + public GenericFormatImportValidationHelper getValidationHelper() { + return validationHelper; + } + } 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 9c6625c..7d16638 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 @@ -2,6 +2,7 @@ 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; @@ -16,7 +17,6 @@ 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.WeightComputingService; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForAccidentalCatch; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForCatch; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForGearCaracteristic; @@ -79,9 +79,7 @@ public class GenericFormatImportService extends AbstractTuttiService { protected PersistenceService persistenceService; - protected ValidationService validationService; - - protected WeightComputingService weightComputingService; + protected ValidationService validationServic; protected ReferentialTemporaryGearService referentialTemporaryGearService; @@ -102,8 +100,6 @@ public class GenericFormatImportService extends AbstractTuttiService { super.setServiceContext(context); persistenceService = getService(PersistenceService.class); - validationService = getService(ValidationService.class); - weightComputingService = getService(WeightComputingService.class); referentialTemporaryGearService = getService(ReferentialTemporaryGearService.class); referentialTemporaryPersonService = getService(ReferentialTemporaryPersonService.class); referentialTemporarySpeciesService = getService(ReferentialTemporarySpeciesService.class); @@ -411,7 +407,7 @@ public class GenericFormatImportService extends AbstractTuttiService { try (CsvConsumerForSurvey consumer = importContext.loadSurveys()) { for (ImportRow<SurveyRow> row : consumer) { - consumer.validateRow(row, importContext, validationService); + consumer.validateRow(row, importContext); consumer.prepareRowForPersist(row); @@ -457,15 +453,18 @@ public class GenericFormatImportService extends AbstractTuttiService { try (CsvConsumerForOperation consumer = importContext.loadOperations()) { for (ImportRow<OperationRow> row : consumer) { - consumer.validateRow(row, importContext, validationService); + consumer.validateRow(row, importContext); consumer.prepareRowForPersist(row); OperationRow bean = row.getBean(); - importContext.getPersitenceHelper().persistFishingOperation(bean.getFishingOperation()); + FishingOperation savedFishingOperation = importContext.getPersitenceHelper().persistFishingOperation(bean.getFishingOperation()); + + CatchBatch catchBatch = bean.getCatchBatch(); + catchBatch.setFishingOperation(savedFishingOperation); - importContext.getPersitenceHelper().persistCatchBatch(bean.getCatchBatch()); + importContext.getPersitenceHelper().persistCatchBatch(catchBatch); } } catch (IOException e) { 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 new file mode 100644 index 0000000..90b65d0 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportValidationHelper.java @@ -0,0 +1,62 @@ +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.service.TuttiValidationDataContextSupport; +import fr.ifremer.tutti.service.ValidationService; +import org.apache.commons.io.IOUtils; +import org.nuiton.validator.NuitonValidatorResult; + +import java.io.Closeable; + +/** + * Created on 2/19/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14 + */ +public class GenericFormatImportValidationHelper implements Closeable { + + private final ValidationService validationService; + + private final TuttiValidationDataContextSupport originalValidationDataContextSupport; + + private final GenericFormatImportValidationDataContext validationDataContext; + + public GenericFormatImportValidationHelper(GenericFormatImportContext importContext, ValidationService validationService) { + this.validationService = validationService; + this.validationDataContext = new GenericFormatImportValidationDataContext(importContext); + this.originalValidationDataContextSupport = TuttiValidationDataContextSupport.setValidationContext(validationDataContext, true); + } + + @Override + public void close() { + + IOUtils.closeQuietly(validationService); + + TuttiValidationDataContextSupport.setValidationContext(originalValidationDataContextSupport, true); + + } + + public void useFishingOperationInValidation(FishingOperation fishingOperation) { + validationDataContext.setFishingOperation(fishingOperation); + } + + public NuitonValidatorResult validateCruise(Cruise cruise) { + return validationService.validateEditCruise(cruise); + } + + public NuitonValidatorResult validateFishingOperation(FishingOperation fishingOperation) { + + Cruise previousCruise = validationDataContext.getCruise(); + try { + Cruise cruise = fishingOperation.getCruise(); + validationDataContext.setCruise(cruise); + NuitonValidatorResult nuitonValidatorResult = validationService.validateEditFishingOperation(fishingOperation); + return nuitonValidatorResult; + } finally { + validationDataContext.setCruise(previousCruise); + } + } + +} 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 0ec9ba7..c5bd425 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 @@ -44,8 +44,8 @@ public class GenericformatImportPersitenceHelper { if (log.isInfoEnabled()) { log.info("Persist cruise: " + cruiseDecorator.toString(cruise)); } - Cruise persistedCruise = persistenceService.createCruise(cruise); - importContext.getImportResult().addImportedCruise(persistedCruise); + Cruise savedCruise = persistenceService.createCruise(cruise); + importContext.getImportResult().addImportedCruise(savedCruise); } @@ -72,12 +72,17 @@ public class GenericformatImportPersitenceHelper { } - public void persistFishingOperation(FishingOperation fishingOperation) { + public FishingOperation persistFishingOperation(FishingOperation fishingOperation) { if (log.isInfoEnabled()) { log.info("Persist fishing Operation: " + fishingOperationDecorator.toString(fishingOperation)); } + FishingOperation savedFishingOperation = persistenceService.createFishingOperation(fishingOperation); + importContext.getImportResult().addImportedFishingOperation(savedFishingOperation); + + return savedFishingOperation; + } public void persistCatchBatch(CatchBatch catchBatch) { @@ -86,6 +91,8 @@ public class GenericformatImportPersitenceHelper { log.info("Persist catchBatch of fishing Operation: " + fishingOperationDecorator.toString(catchBatch.getFishingOperation())); } + persistenceService.createCatchBatch(catchBatch); + } } 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 84b3859..a336602 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 @@ -3,7 +3,6 @@ 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.service.ValidationService; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportEntityParserFactory; @@ -26,7 +25,7 @@ public class CsvConsumerForOperation extends CsvComsumer<OperationRow, Operation super(file, OperationModel.forImport(separator, parserFactory)); } - public void validateRow(ImportRow<OperationRow> row, GenericFormatImportContext importContext, ValidationService validationService) { + public void validateRow(ImportRow<OperationRow> row, GenericFormatImportContext importContext) { if (row.isValid()) { @@ -34,8 +33,8 @@ public class CsvConsumerForOperation extends CsvComsumer<OperationRow, Operation FishingOperation fishingOperation = bean.getFishingOperation(); - Cruise importedCruise = importContext.getImportedCruise(bean.getCruise()); - if (importedCruise == null) { + Cruise cruise = importContext.getImportedCruise(bean.getCruise()); + if (cruise == null) { addCheckError(row, new CruiseNotFoundException(bean.getCruise())); @@ -45,17 +44,18 @@ public class CsvConsumerForOperation extends CsvComsumer<OperationRow, Operation } else { - bean.setCruise(importedCruise); + bean.setCruise(cruise); + fishingOperation.setCruise(cruise); - NuitonValidatorResult validatorResult = validationService.validateEditFishingOperation(fishingOperation); + NuitonValidatorResult validatorResult = importContext.getValidationHelper().validateFishingOperation(fishingOperation); - if (validatorResult.hasFatalMessages() || validatorResult.hasErrorMessagess()) { + if (validatorResult.hasFatalMessages()) { addCheckError(row, new FishingOperationNotValidException(fishingOperation, validatorResult)); } - //TODO other checkes ? + //TODO other checks ? } @@ -97,7 +97,7 @@ public class CsvConsumerForOperation extends CsvComsumer<OperationRow, Operation if (bean.isBenthosTotalLivingNotItemizedWeightComputed()) { catchBatch.setBenthosTotalLivingNotItemizedWeight(null); } - + if (bean.isMarineLitterTotalWeightComputed()) { catchBatch.setMarineLitterTotalWeight(null); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSurvey.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSurvey.java index 513225b..a96b13a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSurvey.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForSurvey.java @@ -3,7 +3,6 @@ package fr.ifremer.tutti.service.genericformat.consumer; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder; import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; -import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.service.csv.CsvComsumer; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportEntityParserFactory; @@ -27,7 +26,7 @@ public class CsvConsumerForSurvey extends CsvComsumer<SurveyRow, SurveyModel> { super(file, SurveyModel.forImport(separator, parserFactory)); } - public void validateRow(ImportRow<SurveyRow> row, GenericFormatImportContext importContext, ValidationService validationService) { + public void validateRow(ImportRow<SurveyRow> row, GenericFormatImportContext importContext) { if (row.isValid()) { @@ -45,8 +44,8 @@ public class CsvConsumerForSurvey extends CsvComsumer<SurveyRow, SurveyModel> { } else { - NuitonValidatorResult nuitonValidatorResult = validationService.validateEditCruise(cruise); - if (nuitonValidatorResult.hasFatalMessages() || nuitonValidatorResult.hasErrorMessagess()) { + NuitonValidatorResult nuitonValidatorResult = importContext.getValidationHelper().validateCruise(cruise); + if (nuitonValidatorResult.hasFatalMessages()) { addCheckError(row, new CruiseNotValidException(cruise, nuitonValidatorResult)); 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 f45ecb1..53ba30d 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 @@ -39,15 +39,15 @@ public class FishingOperationNotValidException extends Exception { if (validatorResult.hasFatalMessages()) { List<String> fatalMessage = validatorResult.getMessagesForScope(NuitonValidatorScope.FATAL); - builder.append(t("tutti.fatal.messages", Joiner.on("\n-").join(fatalMessage))); + builder.append("\n").append(t("tutti.fatal.messages", Joiner.on("\n-").join(fatalMessage))); } if (validatorResult.hasErrorMessagess()) { List<String> errorsMessage = validatorResult.getMessagesForScope(NuitonValidatorScope.ERROR); - builder.append(t("tutti.error.messages", Joiner.on("\n-").join(errorsMessage))); + builder.append("\n").append(t("tutti.error.messages", Joiner.on("\n-").join(errorsMessage))); } if (validatorResult.hasWarningMessages()) { List<String> warningMessage = validatorResult.getMessagesForScope(NuitonValidatorScope.WARNING); - builder.append(t("tutti.warning.messages", Joiner.on("\n-").join(warningMessage))); + builder.append("\n").append(t("tutti.warning.messages", Joiner.on("\n-").join(warningMessage))); } String message = t("tutti.genericFormat.import.error.fishingOperationNotValid", builder.toString()); 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 5bfa000..e767166 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 @@ -15,7 +15,7 @@ tutti.genericFormat.import.error.cruiseAlreadyImported=La campagne avec ce nom % 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.fishingOperationNotValid=La campagne n'est pas valide \:\n%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 (année\: %s, série\: %s, série partielle %s) tutti.genericFormat.import.gearCaracteristics=Import des caractéristiques d'engin tutti.genericFormat.import.individualObservations=Import des observations individuelles -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.