Author: bleny Date: 2014-06-25 18:33:03 +0200 (Wed, 25 Jun 2014) New Revision: 2105 Url: http://forge.codelutin.com/projects/wao/repository/revisions/2105 Log: fixes #5320 add validation to sampling plan import Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SamplingPlanService.java trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SamplingPlanService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SamplingPlanService.java 2014-06-25 14:50:28 UTC (rev 2104) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SamplingPlanService.java 2014-06-25 16:33:03 UTC (rev 2105) @@ -54,9 +54,11 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Export; import org.nuiton.csv.ExportModel; -import org.nuiton.csv.Import; +import org.nuiton.csv.Import2; import org.nuiton.csv.ImportModel; +import org.nuiton.csv.ImportRow; import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.i18n.I18n; import org.nuiton.topia.persistence.TopiaEntities; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.util.DateUtil; @@ -258,6 +260,8 @@ Preconditions.checkState(authenticatedWaoUser.isAuthorizedToCreateSampleRow()); + ObsProgram obsProgram = authenticatedWaoUser.getObsProgram(); + UpdateSampleRowCommand updateSampleRowCommand = new UpdateSampleRowCommand(); if (optionalSampleRowId.isPresent()) { @@ -275,12 +279,6 @@ updateSampleRowCommand.setCreation(false); - SampleRowLogImpl newSampleRowLog = new SampleRowLogImpl(); - newSampleRowLog.setAuthor(authenticatedWaoUser.getWaoUser()); - newSampleRowLog.setFromAdmin(authenticatedWaoUser.isAdmin()); - updateSampleRowCommand.setSampleRowLog(newSampleRowLog); - sampleRow.addSampleRowLog(newSampleRowLog); - Set<Boat> elligibleBoats = new HashSet<>(); for (ElligibleBoat elligibleBoat : sampleRow.getElligibleBoat()) { boolean boatIsElligibleForUser = @@ -297,12 +295,10 @@ SampleRow newSampleRow = new SampleRowImpl(); - newSampleRow.setObsProgram(ObsProgram.OBSMER); + newSampleRow.setObsProgram(obsProgram); newSampleRow.setProfession(new ProfessionImpl()); newSampleRow.setFishingZone(new HashSet<FishingZone>()); newSampleRow.setSampleMonth(new HashSet<SampleMonth>()); - - ObsProgram obsProgram = authenticatedWaoUser.getObsProgram(); if (obsProgram.isObsMer()) { newSampleRow.setSamplingStrategy(SamplingStrategy.SIMULTANEOUS_ALL_SPECIES); } @@ -316,6 +312,12 @@ } + SampleRowLogImpl newSampleRowLog = new SampleRowLogImpl(); + newSampleRowLog.setAuthor(authenticatedWaoUser.getWaoUser()); + newSampleRowLog.setFromAdmin(authenticatedWaoUser.isAdmin()); + updateSampleRowCommand.setSampleRowLog(newSampleRowLog); + updateSampleRowCommand.getSampleRow().addSampleRowLog(newSampleRowLog); + ImmutableMap<String, FishingZone> allFishingZones = Maps.uniqueIndex( getReferentialService().getAllFishingZones(), @@ -430,6 +432,13 @@ public void save(UpdateSampleRowCommand updateSampleRowCommand) { + save0(updateSampleRowCommand); + + commit(); + + } + + public void save0(UpdateSampleRowCommand updateSampleRowCommand) { SampleRow sampleRow = updateSampleRowCommand.getSampleRow(); if (!updateSampleRowCommand.isCreation()) { @@ -463,8 +472,6 @@ } else { dao.create(sampleRow); } - commit(); - } public InputStream exportSamplingPlan(SampleRowsFilter filter) { @@ -504,30 +511,78 @@ public void importSamplingPlan(AuthenticatedWaoUser authenticatedWaoUser, InputStream csv) throws ImportErrorException { + ObsProgram obsProgram = authenticatedWaoUser.getObsProgram(); + ImportModel<SampleRow> samplingPlanImportModel = newSamplingPlanImportModel(authenticatedWaoUser); - Import<SampleRow> samplingPlanImport = - Import.newImport(samplingPlanImportModel, csv); + Import2<SampleRow> samplingPlanImport = + Import2.newImport(samplingPlanImportModel, csv); - SampleRowTopiaDao dao = getSampleRowDao(); - try { - for (SampleRow sampleRow : samplingPlanImport) { + for (ImportRow<SampleRow> importRow : samplingPlanImport) { - if (StringUtils.isBlank(sampleRow.getCode())) { + SampleRow sampleRow = importRow.getBean(); + long lineNumber = importRow.getLineNumber(); - String newSampleRowCode = getNewSampleRowCode(ObsProgram.OBSMER); + UpdateSampleRowCommand updateSampleRowCommand = + newUpdateSampleRowCommand(authenticatedWaoUser, Optional.<String>absent()); + String logText = I18n.l(getLocale(), "csv.import.logComment"); + updateSampleRowCommand.getSampleRowLog().setLogText(logText); + + if (StringUtils.isBlank(sampleRow.getCode())) { + String newSampleRowCode = getNewSampleRowCode(obsProgram); sampleRow.setCode(newSampleRowCode); + } + updateSampleRowCommand.setSampleRow(sampleRow); + + try { + validate(authenticatedWaoUser, updateSampleRowCommand); + } catch (MissingSampleRowLogCommentException e) { + // à l'import l'utilisateur ne précise pas le commentaire, c'est la couche service qui doit le faire en amont + if (log.isErrorEnabled()) { + log.error("should never occur", e); + } + throw new WaoTechnicalException("should never occur", e); + } catch (SampleRowCodeMustBeUniqueException e) { + String message = I18n.l(getLocale(), "wao.import.sampleRow.failure.codeMustBeUnique", lineNumber); + throw new ImportErrorException(message); + } catch (MissingPeriodEndException e) { + String message = I18n.l(getLocale(), "wao.import.sampleRow.failure.missingPeriodEnd", lineNumber); + throw new ImportErrorException(message); + } catch (MissingPeriodBeginException e) { + String message = I18n.l(getLocale(), "wao.import.sampleRow.failure.missingPeriodBegin", lineNumber); + throw new ImportErrorException(message); + } catch (MissingFishingZonesException e) { + String message = I18n.l(getLocale(), "wao.import.sampleRow.failure.missingFishingZones", lineNumber); + throw new ImportErrorException(message); + } catch (WrongSampleRowCodeFormatException e) { + String message = I18n.l(getLocale(), "wao.import.sampleRow.failure.wrongSampleRowCodeFormat", lineNumber); + throw new ImportErrorException(message); + } catch (MissingProfessionSpeciesException e) { + String message = I18n.l(getLocale(), "wao.import.sampleRow.failure.missingProfessionSpecies", lineNumber); + throw new ImportErrorException(message); + } catch (SampleMonthWithIllegalExpectedTidesValueException e) { + SampleMonth sampleMonth = e.getSampleMonth(); + String message = I18n.l( + getLocale(), + "wao.import.sampleRow.failure.sampleMonthWithIllegalExpectedTidesValue", + lineNumber, + WaoUtils.formatMonth(getLocale(), sampleMonth.getPeriodDate())); + throw new ImportErrorException(message); + } catch (MissingProgramNameException e) { + String message = I18n.l(getLocale(), "wao.import.sampleRow.failure.missingProgramName", lineNumber); + throw new ImportErrorException(message); + } catch (MissingDcf5CodesException e) { + String message = I18n.l(getLocale(), "wao.import.sampleRow.failure.missingDcf5Codes", lineNumber); + throw new ImportErrorException(message); } - getProfessionDao().create(sampleRow.getProfession()); + save0(updateSampleRowCommand); - dao.create(sampleRow); - } } catch (ImportRuntimeException e) { Modified: trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties =================================================================== --- trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties 2014-06-25 14:50:28 UTC (rev 2104) +++ trunk/wao-services/src/main/resources/i18n/wao-services_en_GB.properties 2014-06-25 16:33:03 UTC (rev 2105) @@ -7,7 +7,7 @@ csv.import.error.unableToReadLine=Unable to read line %s csv.import.error.unableToSetValue=Unable to set value '%s' (entity '%s', line %s, column '%s') csv.import.error.unrecognizedHeaders=Fields %s are not recognized. Accepted fields are %s. -csv.import.logComment=Edited through import +csv.import.logComment=Creation through import fr.ifremer.wao.services.service.mail.UserCredentialsEmail.subject=Your Wao credentials wao.action.delete.failure.attachedContacts=Object is attached to some contacts. wao.action.delete.failure.attachedNews=Object is attached to some news. @@ -83,8 +83,16 @@ wao.import.failure.wrongValue=Unable to parse value '%S'. Possible values are %s wao.import.invalid.latitude=a latitude must be contained in range %s. ('%s' argument given) wao.import.invalid.longitude=a longitude must be contained in range %s. ('%s' argument given) -wao.import.sampleRow.failure.fishingZoneMissing=You must precise at least one fishing zone -wao.import.sampleRow.failure.missingSampleRowCode=You must precise a code for the sample row +wao.import.sampleRow.failure.codeMustBeUnique=Line %s\: The sample row code must be unique +wao.import.sampleRow.failure.fishingZoneMissing=Line %s\: You must precise at least one fishing zone +wao.import.sampleRow.failure.missingDcf5Codes=Line %s\: You must precise at least one DCF5 code +wao.import.sampleRow.failure.missingFishingZones=Line %s\: You must precise at least one fishing zone +wao.import.sampleRow.failure.missingPeriodBegin=Line %s\: You must precise the period beginning +wao.import.sampleRow.failure.missingPeriodEnd=Line %s\: You must precise the period end +wao.import.sampleRow.failure.missingProfessionSpecies=Line %s\: For this sampling strategy, you must provide the species +wao.import.sampleRow.failure.missingProgramName=Line %s\: You must precise the program name +wao.import.sampleRow.failure.missingSampleRowCode=Line %s\: You must precise a code for the sample row +wao.import.sampleRow.failure.sampleMonthWithIllegalExpectedTidesValue=Line %s\: Effort must be positive for month %s wao.import.sampleRow.failure.unknownFishingGearDcfCode=Unknown fishing gear code\: %s wao.import.sampleRow.failure.unknownTargetSpeciesDcfCode=Unknown target species code\: %s wao.import.sampleRow.failure.wrongFishingZone=There is no fishing zone with the code '%s' Modified: trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties =================================================================== --- trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties 2014-06-25 14:50:28 UTC (rev 2104) +++ trunk/wao-services/src/main/resources/i18n/wao-services_fr_FR.properties 2014-06-25 16:33:03 UTC (rev 2105) @@ -7,7 +7,7 @@ csv.import.error.unableToReadLine=Impossible de lire la ligne %s csv.import.error.unableToSetValue=Impossible d'enregistrer la valeur '%s' (entité '%s', ligne %s, column '%s') csv.import.error.unrecognizedHeaders=Les champs %s ne sont pas reconnus. Les champs possibles sont %s. -csv.import.logComment=Modification depuis import +csv.import.logComment=Création par import fr.ifremer.wao.services.service.mail.UserCredentialsEmail.subject=Informations de connexion Wao wao.action.delete.failure.attachedContacts=L'objet est lié à des contacts. wao.action.delete.failure.attachedNews=L'objet est lié à des actualités. @@ -80,8 +80,16 @@ wao.import.failure.wrongValue=Valeur '%s' non reconnue. Valeurs possibles \: %s wao.import.invalid.latitude=La latitude doit être dans l'intervalle %s (valeur actuelle %s) wao.import.invalid.longitude=La longitude doit être dans l'intervalle %s (valeur actuelle %s) -wao.import.sampleRow.failure.fishingZoneMissing=Il faut préciser au moins une zone de pêche -wao.import.sampleRow.failure.missingSampleRowCode=Il faut préciser un code pour a ligne du plan +wao.import.sampleRow.failure.codeMustBeUnique=Ligne %s \: Le code ligne doit être unique +wao.import.sampleRow.failure.fishingZoneMissing=Ligne %s \: Il faut préciser au moins une zone de pêche +wao.import.sampleRow.failure.missingDcf5Codes=Ligne %s \: Il faut préciser au moins un code DCF5 +wao.import.sampleRow.failure.missingFishingZones=Ligne %s \: Il faut préciser au moins une zone de pêche +wao.import.sampleRow.failure.missingPeriodBegin=Ligne %s \: Il faut préciser le débat de la période +wao.import.sampleRow.failure.missingPeriodEnd=Ligne %s \: Il faut préciser la fin de la période +wao.import.sampleRow.failure.missingProfessionSpecies=Ligne %s \: Il faut préciser les espèces cibles pour cette stratégie d'échantillonage +wao.import.sampleRow.failure.missingProgramName=Ligne %s \: Il faut préciser le programme +wao.import.sampleRow.failure.missingSampleRowCode=Ligne %s \: Il faut préciser un code pour a ligne du plan +wao.import.sampleRow.failure.sampleMonthWithIllegalExpectedTidesValue=Ligne %s \: l'effort d'observation doit être positif pour le mois %s wao.import.sampleRow.failure.unknownFishingGearDcfCode=Le code engin %s est inconnu du référentiel wao.import.sampleRow.failure.unknownTargetSpeciesDcfCode=Le code espèce cible %s est inconnu du référentiel wao.import.sampleRow.failure.wrongFishingZone=Le code '%s' ne correspond à aucune zone de pêche connue du référentiel