Author: kmorin Date: 2013-06-10 16:45:01 +0200 (Mon, 10 Jun 2013) New Revision: 1092 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1092 Log: fixes #2615 [IMP/EXP] - Import/Export multi-postes : pas de contr?\195?\180le sur l'ID op?\195?\169ration Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AbstractFishingOperationRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AbstractFishingOperationRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/FishingOperationRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/FishingOperationRowModel.java Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AbstractFishingOperationRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AbstractFishingOperationRow.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AbstractFishingOperationRow.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -0,0 +1,58 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import java.util.Date; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.3.1 + */ +public abstract class AbstractFishingOperationRow { + + public static final String STATION_NUMBER = "stationNumber"; + + public static final String OPERATION_NUMBER = "operationNumber"; + + public static final String MULTIRIG_AGGREGATION = "multirigAggregation"; + + public static final String DATE = "date"; + + protected String stationNumber; + + protected Integer operationNumber; + + protected String multirigAggregation; + + protected Date date; + + public String getStationNumber() { + return stationNumber; + } + + public void setStationNumber(String stationNumber) { + this.stationNumber = stationNumber; + } + + public Integer getOperationNumber() { + return operationNumber; + } + + public void setOperationNumber(Integer operationNumber) { + this.operationNumber = operationNumber; + } + + public String getMultirigAggregation() { + return multirigAggregation; + } + + public void setMultirigAggregation(String multirigAggregation) { + this.multirigAggregation = multirigAggregation; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } +} Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AbstractFishingOperationRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AbstractFishingOperationRowModel.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AbstractFishingOperationRowModel.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -0,0 +1,20 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import fr.ifremer.tutti.service.TuttiCsvUtil; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.3.1 + */ +public abstract class AbstractFishingOperationRowModel<FO extends AbstractFishingOperationRow> + extends TuttiCsvUtil.AbstractTuttiImportExportModel<FO> { + + public AbstractFishingOperationRowModel(char separator) { + super(separator); + + newColumnForImportExport(FishingOperationRow.STATION_NUMBER); + newColumnForImportExport(FishingOperationRow.OPERATION_NUMBER, TuttiCsvUtil.INTEGER); + newColumnForImportExport(FishingOperationRow.MULTIRIG_AGGREGATION); + newColumnForImportExport(FishingOperationRow.DATE, TuttiCsvUtil.DAY_TIME); + } +} Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRow.java 2013-06-10 13:40:13 UTC (rev 1091) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRow.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -28,7 +28,7 @@ * @author kmorin <kmorin@codelutin.com> * @since 2.3 */ -public class CatchWeightsRow { +public class CatchWeightsRow extends AbstractFishingOperationRow { public static final String TOTAL_SORTED_WEIGHT = "totalSortedWeight"; Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRowModel.java 2013-06-10 13:40:13 UTC (rev 1091) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRowModel.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -30,7 +30,7 @@ * @author kmorin <kmorin@codelutin.com> * @since 2.3 */ -public class CatchWeightsRowModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<CatchWeightsRow> { +public class CatchWeightsRowModel extends AbstractFishingOperationRowModel<CatchWeightsRow> { public CatchWeightsRowModel(char separator) { super(separator); Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/FishingOperationRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/FishingOperationRow.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/FishingOperationRow.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -0,0 +1,10 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import java.util.Date; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.3.1 + */ +public class FishingOperationRow extends AbstractFishingOperationRow { +} Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/FishingOperationRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/FishingOperationRowModel.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/FishingOperationRowModel.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -0,0 +1,19 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import fr.ifremer.tutti.service.TuttiCsvUtil; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.3.1 + */ +public class FishingOperationRowModel extends AbstractFishingOperationRowModel<FishingOperationRow> { + + public FishingOperationRowModel(char separator) { + super(separator); + } + + @Override + public FishingOperationRow newEmptyInstance() { + return new FishingOperationRow(); + } +} Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRow.java 2013-06-10 13:40:13 UTC (rev 1091) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRow.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -28,7 +28,7 @@ * @author kmorin <kmorin@codelutin.com> * @since 2.3 */ -public class MarineLitterWeightRow { +public class MarineLitterWeightRow extends AbstractFishingOperationRow { public static final String TOTAL_WEIGHT = "totalWeight"; Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRowModel.java 2013-06-10 13:40:13 UTC (rev 1091) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRowModel.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -30,7 +30,7 @@ * @author kmorin <kmorin@codelutin.com> * @since 2.3 */ -public class MarineLitterWeightRowModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<MarineLitterWeightRow> { +public class MarineLitterWeightRowModel extends AbstractFishingOperationRowModel<MarineLitterWeightRow> { public MarineLitterWeightRowModel(char separator) { super(separator); Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java 2013-06-10 13:40:13 UTC (rev 1091) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java 2013-06-10 14:45:01 UTC (rev 1092) @@ -31,6 +31,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.io.Files; +import fr.ifremer.tutti.TuttiBusinessException; import fr.ifremer.tutti.TuttiIOUtil; import fr.ifremer.tutti.TuttiTechnicalException; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; @@ -46,6 +47,7 @@ import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.TuttiServiceContext; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -158,6 +160,7 @@ weights.setTotalSortedWeight(catchBatch.getSpeciesTotalSortedWeight()); weights.setInertWeight(catchBatch.getSpeciesTotalInertWeight()); weights.setLivingNotItemizedWeight(catchBatch.getSpeciesTotalLivingNotItemizedWeight()); + exportOperation(weights, operation); exportCatches(file, SPECIES_FILE, weights, rows, frequencyRows, attachmentRows); } @@ -191,6 +194,7 @@ weights.setTotalSortedWeight(catchBatch.getBenthosTotalSortedWeight()); weights.setInertWeight(catchBatch.getBenthosTotalInertWeight()); weights.setLivingNotItemizedWeight(catchBatch.getBenthosTotalLivingNotItemizedWeight()); + exportOperation(weights, operation); exportCatches(file, BENTHOS_FILE, weights, rows, frequencyRows, attachmentRows); } @@ -253,6 +257,7 @@ CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(operationId); MarineLitterWeightRow weight = new MarineLitterWeightRow(); weight.setTotalWeight(catchBatch.getMarineLitterTotalWeight()); + exportOperation(weight, operation); MarineLitterWeightRowModel weightModel = new MarineLitterWeightRowModel(csvSeparator); @@ -358,6 +363,25 @@ IOUtils.closeQuietly(writer); } + // export operation + FishingOperationRow foRow = new FishingOperationRow(); + exportOperation(foRow, operation); + + FishingOperationRowModel foRowModel = new FishingOperationRowModel(csvSeparator); + + File weightFile = new File(directory, WEIGHTS_FILE); + file2zip.add(weightFile); + try { + writer = Files.newWriter(weightFile, Charsets.UTF_8); + Export export = Export.newExport(foRowModel, Lists.newArrayList(foRow)); + export.write(writer); + writer.close(); + } catch (Exception e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.export.operation.error", weightFile), e); + } finally { + IOUtils.closeQuietly(writer); + } + exportAttachments(directory, file2zip, attachmentRows); try { @@ -446,6 +470,25 @@ IOUtils.closeQuietly(writer); } + // export operation + FishingOperationRow foRow = new FishingOperationRow(); + exportOperation(foRow, operation); + + FishingOperationRowModel foRowModel = new FishingOperationRowModel(csvSeparator); + + File weightFile = new File(directory, WEIGHTS_FILE); + file2zip.add(weightFile); + try { + writer = Files.newWriter(weightFile, Charsets.UTF_8); + Export export = Export.newExport(foRowModel, Lists.newArrayList(foRow)); + export.write(writer); + writer.close(); + } catch (Exception e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.export.operation.error", weightFile), e); + } finally { + IOUtils.closeQuietly(writer); + } + exportAttachments(directory, file2zip, attachmentRows); try { @@ -489,6 +532,10 @@ new AllFileSelector(), _("tutti.service.multipost.explodeArchive.error", file)); + //check operation + CatchWeightsRowModel weightsModel = new CatchWeightsRowModel(csvSeparator); + checkSameOperation(tempDir, weightsModel, operation); + // Import batches File speciesFile = new File(tempDir, SPECIES_FILE); @@ -578,7 +625,7 @@ } CatchFrequencyRowModel frequencyModel = new CatchFrequencyRowModel(csvSeparator, - dataContext.getLengthStepCaracteristics()); + dataContext.getCaracteristics()); Import<CatchFrequencyRow> frequencyImporter = Import.newImport(frequencyModel, reader); @@ -628,7 +675,6 @@ throw new TuttiTechnicalException(_("tutti.service.multipost.import.weights.error", weightsFile), e); } - CatchWeightsRowModel weightsModel = new CatchWeightsRowModel(csvSeparator); Import<CatchWeightsRow> weights = Import.newImport(weightsModel, reader); Iterator<CatchWeightsRow> iterator = weights.iterator(); @@ -695,6 +741,10 @@ new AllFileSelector(), _("tutti.service.multipost.explodeArchive.error", file)); + //check operation + CatchWeightsRowModel weightsModel = new CatchWeightsRowModel(csvSeparator); + checkSameOperation(tempDir, weightsModel, operation); + // Import batches File benthosFile = new File(tempDir, BENTHOS_FILE); @@ -784,7 +834,7 @@ } CatchFrequencyRowModel frequencyModel = new CatchFrequencyRowModel(csvSeparator, - dataContext.getLengthStepCaracteristics()); + dataContext.getCaracteristics()); Import<CatchFrequencyRow> frequencyImporter = Import.newImport(frequencyModel, reader); @@ -834,7 +884,6 @@ throw new TuttiTechnicalException(_("tutti.service.multipost.import.weights.error", weightsFile), e); } - CatchWeightsRowModel weightsModel = new CatchWeightsRowModel(csvSeparator); Import<CatchWeightsRow> weights = Import.newImport(weightsModel, reader); Iterator<CatchWeightsRow> iterator = weights.iterator(); @@ -901,6 +950,10 @@ new AllFileSelector(), _("tutti.service.multipost.explodeArchive.error", file)); + //check operation + MarineLitterWeightRowModel weightModel = new MarineLitterWeightRowModel(csvSeparator); + checkSameOperation(tempDir, weightModel, operation); + // Import batches File marineLitterFile = new File(tempDir, MARINE_LITTER_FILE); @@ -985,7 +1038,6 @@ throw new TuttiTechnicalException(_("tutti.service.multipost.import.weights.error", weightsFile), e); } - MarineLitterWeightRowModel weightModel = new MarineLitterWeightRowModel(csvSeparator); Import<MarineLitterWeightRow> weight = Import.newImport(weightModel, reader); Iterator<MarineLitterWeightRow> iterator = weight.iterator(); @@ -1028,6 +1080,10 @@ new AllFileSelector(), _("tutti.service.multipost.explodeArchive.error", file)); + //check operation + FishingOperationRowModel operationModel = new FishingOperationRowModel(csvSeparator); + checkSameOperation(tempDir, operationModel, operation); + // Import batches File observationFile = new File(tempDir, INDIVIDUAL_OBSERVATION_FILE); @@ -1140,6 +1196,10 @@ new AllFileSelector(), _("tutti.service.multipost.explodeArchive.error", file)); + //check operation + FishingOperationRowModel operationModel = new FishingOperationRowModel(csvSeparator); + checkSameOperation(tempDir, operationModel, operation); + // Import batches File accidentalFile = new File(tempDir, ACCIDENTAL_CATCHES_FILE); @@ -1397,6 +1457,13 @@ } } + protected void exportOperation(AbstractFishingOperationRow afoRow, FishingOperation operation) { + afoRow.setStationNumber(operation.getStationNumber()); + afoRow.setOperationNumber(operation.getFishingOperationNumber()); + afoRow.setMultirigAggregation(operation.getMultirigAggregation()); + afoRow.setDate(operation.getGearShootingStartDate()); + } + protected void exportAttachments(File directory, List<File> file2zip, List<AttachmentRow> attachmentRows) { AttachmentRowModel csvAttachmentModel = new AttachmentRowModel(csvSeparator); @@ -1536,4 +1603,34 @@ } } } + + protected void checkSameOperation(File directory, + AbstractFishingOperationRowModel fishingOperationRowModel, + FishingOperation operation) { + File operationFile = new File(directory, WEIGHTS_FILE); + Reader reader; + + try { + reader = Files.newReader(operationFile, Charsets.UTF_8); + + } catch (FileNotFoundException e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.import.operation.error", operationFile), e); + } + + Import<AbstractFishingOperationRow> fishingOperationImporter = Import.newImport(fishingOperationRowModel, reader); + + Iterator<AbstractFishingOperationRow> iterator = fishingOperationImporter.iterator(); + if (iterator.hasNext()) { + AbstractFishingOperationRow row = iterator.next(); + if (ObjectUtils.notEqual(row.getStationNumber(), operation.getStationNumber()) + || ObjectUtils.notEqual(row.getOperationNumber(), operation.getFishingOperationNumber()) + || ObjectUtils.notEqual(row.getMultirigAggregation(), operation.getMultirigAggregation()) + || ObjectUtils.notEqual(row.getDate(), operation.getGearShootingStartDate())) { + + throw new TuttiBusinessException(_("tutti.service.multipost.import.wrongOperation.error", + decoratorService.getDecoratorByType(FishingOperation.class) + .toString(operation))); + } + } + } } Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-06-10 13:40:13 UTC (rev 1091) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-06-10 14:45:01 UTC (rev 1092) @@ -93,6 +93,7 @@ tutti.service.multipost.export.deleteTempDirectory.error= tutti.service.multipost.export.error= tutti.service.multipost.export.frequencies.error= +tutti.service.multipost.export.operation.error= tutti.service.multipost.export.species.error= tutti.service.multipost.export.weight.error= tutti.service.multipost.export.weights.error= @@ -100,8 +101,10 @@ tutti.service.multipost.import.batches.error= tutti.service.multipost.import.caracteristics.error= tutti.service.multipost.import.frequencies.error= +tutti.service.multipost.import.operation.error= tutti.service.multipost.import.species.error= tutti.service.multipost.import.weights.error= +tutti.service.multipost.import.wrongOperation.error= tutti.service.multipost.resolveArchive.error= tutti.service.operations.accidental.error.species.required= tutti.service.operations.computeWeights.benthos.error.incoherentCategoryWeight= Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-06-10 13:40:13 UTC (rev 1091) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-06-10 14:45:01 UTC (rev 1092) @@ -90,13 +90,16 @@ tutti.service.multipost.export.deleteTempDirectory.error=Erreur lors de la suppression du dossier temporaire tutti.service.multipost.export.error=Erreur lors de la création du fichier d'export tutti.service.multipost.export.frequencies.error=Erreur lors de l'export des mensurations +tutti.service.multipost.export.operation.error=Erreur lors de l'export des données du trait tutti.service.multipost.export.weight.error=Erreur lors de l'export des poids tutti.service.multipost.export.weights.error=Erreur lors de l'export des poids tutti.service.multipost.import.attachments.error=Erreur lors de l'import des pièces-jointes tutti.service.multipost.import.batches.error=Erreur lors de l'import des lots tutti.service.multipost.import.caracteristics.error=Erreur lors de l'import des caractéristiques tutti.service.multipost.import.frequencies.error=Erreur lors de l'import des mensurations +tutti.service.multipost.import.operation.error=Erreur lors de l'import des données du trait tutti.service.multipost.import.weights.error=Erreur lors de l'import des poids +tutti.service.multipost.import.wrongOperation.error=Opération est impossible<hr/>Les lots que vous essayez d'importer proviennent d'un autre trait :<br/>%s tutti.service.multipost.resolveArchive.error=Erreur lors de l'ouverture de l'archive tutti.service.operations.computeWeights.error.benthos.incoherentCategoryWeight=Benthos - Le poids total des mensurations du lot de %s/%s - %s (%skg) est supérieur au poids de la catégorie (%skg) tutti.service.operations.computeWeights.error.benthos.incoherentParentCategoryWeight=Benthos - Le poids du lot de %s/%s - %s (%skg) est inférieur à la somme des poids de ses sous-catégories (%skg)