This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 7de70d388fa024f52b8cd269ef3a3928a21cbb0a Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Nov 21 16:19:00 2014 +0100 reecriture de l'import pupitri pour mieux le gerer --- .../tutti/service/pupitri/PupitriImportResult.java | 130 +++++----- .../service/pupitri/PupitriImportService.java | 270 ++++++++++++++------- .../resources/i18n/tutti-service_en_GB.properties | 1 - .../resources/i18n/tutti-service_fr_FR.properties | 1 - .../pupitri/PupitryImportServiceTestSupport.java | 18 ++ 5 files changed, 263 insertions(+), 157 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java index 04a2d4f..a88fe84 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java @@ -60,8 +60,6 @@ public class PupitriImportResult { int nbCarrousselImported; -// int nbCarrousselNotImported; - private Float sortedWeight; private Float rejectedWeight; @@ -153,16 +151,12 @@ public class PupitriImportResult { return melagSortedWeight == null ? null : melagSortedWeight.floatValue(); } - public Set<Species> getMelagSpecies() { - return melagSpecies; - } - public Set<String> getNotImportedSpeciesIds() { return ImmutableSet.copyOf(notImportedSpeciesIds); } /** - * @return {@code true} if there is a total melga weight defined (at least one species MELA-GNE found). + * @return {@code true} if there is a total melag weight defined (at least one species MELA-GNE found). * @since 3.4.2 */ public boolean isFoundTotalMelag() { @@ -185,18 +179,6 @@ public class PupitriImportResult { this.nbTrunkNotImported++; } - void incrementNbCarrousselImported() { - this.nbCarrousselImported++; - } - -// void incrementNbCarrousselNotImported() { -// this.nbCarrousselNotImported++; -// } - -// void setNbCarrousselNotImported(int nbCarrousselNotImported) { -// this.nbCarrousselNotImported = nbCarrousselNotImported; -// } - void setSortedWeight(Float sortedWeight) { this.sortedWeight = sortedWeight; } @@ -205,61 +187,17 @@ public class PupitriImportResult { this.rejectedWeight = rejectedWeight; } - void setCarrouselSortedWeight(Float carrouselSortedWeight) { - this.carrouselSortedWeight = carrouselSortedWeight; - } + void flushCarrouselResult(CarrouselImportRequestResult carrouselImportRequestResult) { - void setCatches(List<PupitriCatch> catches) { - for (PupitriCatch aCatch : catches) { - addCatch(aCatch); - } - } + // set carrousel sorted weight + this.carrouselSortedWeight = Weights.roundKiloGram(carrouselImportRequestResult.getCarrouselSortedWeight()); - void addNotImportedSpeciesId(String notImportedSpeciesId) { - notImportedSpeciesIds.add(notImportedSpeciesId); - } + // set nb carrousel imported batches + this.nbCarrousselImported = carrouselImportRequestResult.getNbCarrousselImported(); + this.notImportedSpeciesIds.addAll(carrouselImportRequestResult.getNotImportedSpeciesIds()); - void addCatch(PupitriCatch aCatch) { - - catches.add(aCatch); - - if (aCatch.isMelagMetaSpecies()) { - - if (log.isInfoEnabled()) { - log.info("Found a MELAG catch: " + aCatch); - } - // add weight to melag - addMelagTotalWeight(aCatch.getWeight(Signs.DEFAULT)); - - } - - if (aCatch.isForMelag()) { - - // add species as a melag one - melagSpecies.add(aCatch.getSpecies()); - - // add weight to sorted melag - addMelagSortedWeight(aCatch.getWeight(Signs.MELAG)); - - } - - } - - void addMelagTotalWeight(float weight) { - - if (melagTotalWeight == null) { - melagTotalWeight = new MutableFloat(); - } - melagTotalWeight.add(weight); - - } - - void addMelagSortedWeight(float weight) { - - if (melagSortedWeight == null) { - melagSortedWeight = new MutableFloat(); - } - melagSortedWeight.add(weight); + List<PupitriCatch> incomingCatches = carrouselImportRequestResult.getCatches(); + setCatches(incomingCatches); } @@ -310,4 +248,54 @@ public class PupitriImportResult { } } + + private void setCatches(List<PupitriCatch> catches) { + for (PupitriCatch aCatch : catches) { + addCatch(aCatch); + } + } + + private void addCatch(PupitriCatch aCatch) { + + catches.add(aCatch); + + if (aCatch.isMelagMetaSpecies()) { + + if (log.isInfoEnabled()) { + log.info("Found a MELAG catch: " + aCatch); + } + // add weight to melag + addMelagTotalWeight(aCatch.getWeight(Signs.DEFAULT)); + + } + + if (aCatch.isForMelag()) { + + // add species as a melag one + melagSpecies.add(aCatch.getSpecies()); + + // add weight to sorted melag + addMelagSortedWeight(aCatch.getWeight(Signs.MELAG)); + + } + + } + + private void addMelagTotalWeight(float weight) { + + if (melagTotalWeight == null) { + melagTotalWeight = new MutableFloat(); + } + melagTotalWeight.add(weight); + + } + + private void addMelagSortedWeight(float weight) { + + if (melagSortedWeight == null) { + melagSortedWeight = new MutableFloat(); + } + melagSortedWeight.add(weight); + + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java index 8d35c6d..117c4b2 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java @@ -24,7 +24,6 @@ package fr.ifremer.tutti.service.pupitri; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode; @@ -51,7 +50,6 @@ import fr.ifremer.tutti.service.TuttiServiceContext; import fr.ifremer.tutti.util.Weights; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableFloat; import org.apache.commons.logging.Log; @@ -173,8 +171,7 @@ public class PupitriImportService extends AbstractTuttiService { protected void importPupitriTrunk(PupitriImportResult result, File file, FishingOperation operation) { if (log.isInfoEnabled()) { - log.info("Will import pupitri operation [" + operation.toString() + - "] trunk from file: " + file); + log.info("Will import pupitri operation [" + operation.toString() + "] trunk from file: " + file); } // prepare import @@ -182,44 +179,36 @@ public class PupitriImportService extends AbstractTuttiService { float sortedWeight = 0f; float rejectedWeight = 0f; - Import<TrunkRow> importer = null; - TrunkRowModel csvModel = new TrunkRowModel(','); - File fileWithHeaders = createFileWithHeaders(csvModel, file); - Reader reader = ApplicationIOUtil.newReader( + try (Reader reader = ApplicationIOUtil.newReader( fileWithHeaders, - n("tutti.service.puttiri.carroussel.import.error")); - try { - importer = Import.newImport(csvModel, reader); - - for (TrunkRow bean : importer) { - if (bean.acceptOperation(operation)) { - switch (bean.getDirection()) { - case VAT: - sortedWeight += bean.getWeight(); - break; - - case VNT: - rejectedWeight += bean.getWeight(); + n("tutti.service.pupitri.import.trunk.error"))) { + try (Import<TrunkRow> importer = Import.newImport(csvModel, reader)) { + + for (TrunkRow bean : importer) { + if (bean.acceptOperation(operation)) { + switch (bean.getDirection()) { + case VAT: + sortedWeight += bean.getWeight(); + break; + + case VNT: + rejectedWeight += bean.getWeight(); + } + result.incrementNbTrunkImported(); + } else { + result.incrementNbTrunkNotImported(); } - result.incrementNbTrunkImported(); - } else { - result.incrementNbTrunkNotImported(); } } - importer.close(); - reader.close(); - } catch (Exception e) { throw new ApplicationTechnicalException( t("tutti.service.pupitri.import.trunk.error", operation.toString(), file), e); } finally { - IOUtils.closeQuietly(importer); - IOUtils.closeQuietly(reader); FileUtils.deleteQuietly(fileWithHeaders); } @@ -242,90 +231,204 @@ public class PupitriImportService extends AbstractTuttiService { "] carrousel from file: " + carrouselFile); } - // prepare import + // process import file + CarrouselImportRequestResult carrouselImportRequestResult = processCarrouselImportFile(carrouselFile, operation); + + // adjust result (deal with melag for example) + + // save it to global result + result.flushCarrouselResult(carrouselImportRequestResult); + + } + + protected CarrouselImportRequestResult processCarrouselImportFile(File carrouselFile, FishingOperation operation) { + + if (log.isInfoEnabled()) { + log.info("Will import pupitri operation [" + operation.toString() + "] carrousel from file: " + carrouselFile); + } // get the map of species by survey code or reftax code ListMultimap<String, Species> speciesBySurveyCode = ArrayListMultimap.create(); speciesBySurveyCode.putAll(Speciess.splitBySurveyCode(dataContext.getReferentSpeciesWithSurveyCode())); speciesBySurveyCode.putAll(Speciess.splitByRefTaxCode(dataContext.getReferentSpecies())); - // import the batches - - Float carrouselSortedWeight = 0f; - - List<PupitriCatch> catches = Lists.newArrayList(); -// Set<String> notFoundSpecies = Sets.newHashSet(); - - Import<CarrouselRow> importer = null; + CarrouselImportRequestResult result = new CarrouselImportRequestResult(speciesBySurveyCode); CarrouselRowModel carrouselCsvModel = new CarrouselRowModel(','); + File fileWithHeaders = createFileWithHeaders(carrouselCsvModel, carrouselFile); - File fileWithHeaders = createFileWithHeaders(carrouselCsvModel, - carrouselFile); - Reader reader = ApplicationIOUtil.newReader( + try (Reader reader = ApplicationIOUtil.newReader( fileWithHeaders, - n("tutti.service.puttiri.carroussel.import.error")); - try { - - importer = Import.newImport(carrouselCsvModel, reader); + n("tutti.service.pupitri.import.carrousel.error"))) { - for (CarrouselRow bean : importer) { - // is the bean from the current operation and rig ? - if (bean.acceptOperation(operation)) { + try (Import<CarrouselRow> importer = Import.newImport(carrouselCsvModel, reader)) { - result.incrementNbCarrousselImported(); + for (CarrouselRow bean : importer) { - String speciesId = bean.getSpeciesId(); + importCarrouselRow(result, operation, bean); - List<Species> speciesList = speciesBySurveyCode.get(speciesId); - Float beanWeight = bean.getWeight(); - if (beanWeight < 0f) { - beanWeight = 0f; - } - boolean sorted = bean.isSorted(); - if (sorted) { - carrouselSortedWeight += beanWeight; - } - - if (CollectionUtils.isNotEmpty(speciesList)) { - - Species species = speciesList.get(0); - PupitriCatch pupitriCatch = new PupitriCatch(species, sorted); - int catchIndex = catches.indexOf(pupitriCatch); - if (catchIndex >= 0) { - pupitriCatch = catches.get(catchIndex); - } else { - catches.add(pupitriCatch); - } - pupitriCatch.addToSign(bean.getSign(), beanWeight); - } else { - result.addNotImportedSpeciesId(speciesId); - } } } - importer.close(); - reader.close(); - } catch (Exception e) { DecoratorService service = getService(DecoratorService.class); throw new ApplicationTechnicalException( t("tutti.service.pupitri.import.carrousel.error", carrouselFile, service.getDecorator(operation).toString(operation)), e); } finally { - IOUtils.closeQuietly(importer); - IOUtils.closeQuietly(reader); + FileUtils.deleteQuietly(fileWithHeaders); } -// result.setNbCarrousselNotImported(notFoundSpecies.size()); - result.setCarrouselSortedWeight(Weights.roundKiloGram(carrouselSortedWeight)); - result.setCatches(catches); + return result; + + } + + protected void importCarrouselRow(CarrouselImportRequestResult result, FishingOperation operation, CarrouselRow bean) { + + if (!bean.acceptOperation(operation)) { + + // ce lot n'est pas sur la bonne operation + return; + + } + + // le lot est sur la bonne operation + result.incrementNbCarrousselImported(); + + // poids du lot + Float beanWeight = bean.getWeight(); + if (beanWeight < 0f) { + + //FIXME Savoir pourquoi cela doit arriver ? + beanWeight = 0f; + + } + + boolean sorted = bean.isSorted(); + if (sorted) { + + // ajout au total des poids trie du carrousel + // meme si ensuite l'espèce peut-être rejeté + result.addCarrouselSortedWeight(beanWeight); + + } + + String speciesId = bean.getSpeciesId(); + List<Species> speciesList = result.getSpecies(speciesId); + if (CollectionUtils.isEmpty(speciesList)) { + + // l'espece n'est pas reconnu + // pas de traitement sur ce lot + result.addNotImportedSpeciesId(speciesId); + + } else { + + // creation d'un nouveau lot (par rapport au tuple (espece, trie)) + // ou bien recuperation d'un lot deja existant + PupitriCatch pupitriCatch = result.getExistingCatchOrAdd(speciesList, sorted); + + // ajout du poids au signe donne dans le lot + pupitriCatch.addToSign(bean.getSign(), beanWeight); + + } + } +// protected void importPupitriCarrousel(PupitriImportResult result, +// File carrouselFile, +// FishingOperation operation) { +// +// if (log.isInfoEnabled()) { +// log.info("Will import pupitri operation [" + operation.toString() + +// "] carrousel from file: " + carrouselFile); +// } +// +// // prepare import +// +// // get the map of species by survey code or reftax code +// ListMultimap<String, Species> speciesBySurveyCode = ArrayListMultimap.create(); +// speciesBySurveyCode.putAll(Speciess.splitBySurveyCode(dataContext.getReferentSpeciesWithSurveyCode())); +// speciesBySurveyCode.putAll(Speciess.splitByRefTaxCode(dataContext.getReferentSpecies())); +// +// // import the batches +// +// Float carrouselSortedWeight = 0f; +// +// List<PupitriCatch> catches = Lists.newArrayList(); +//// Set<String> notFoundSpecies = Sets.newHashSet(); +// +// Import<CarrouselRow> importer = null; +// +// CarrouselRowModel carrouselCsvModel = new CarrouselRowModel(','); +// +// File fileWithHeaders = createFileWithHeaders(carrouselCsvModel, +// carrouselFile); +// Reader reader = ApplicationIOUtil.newReader( +// fileWithHeaders, +// n("tutti.service.pupitri.carroussel.import.error")); +// try { +// +// importer = Import.newImport(carrouselCsvModel, reader); +// +// for (CarrouselRow bean : importer) { +// // is the bean from the current operation and rig ? +// if (bean.acceptOperation(operation)) { +// +// result.incrementNbCarrousselImported(); +// +// String speciesId = bean.getSpeciesId(); +// +// List<Species> speciesList = speciesBySurveyCode.get(speciesId); +// Float beanWeight = bean.getWeight(); +// if (beanWeight < 0f) { +// beanWeight = 0f; +// } +// boolean sorted = bean.isSorted(); +// if (sorted) { +// carrouselSortedWeight += beanWeight; +// } +// +// if (CollectionUtils.isNotEmpty(speciesList)) { +// +// Species species = speciesList.get(0); +// PupitriCatch pupitriCatch = new PupitriCatch(species, sorted); +// int catchIndex = catches.indexOf(pupitriCatch); +// if (catchIndex >= 0) { +// pupitriCatch = catches.get(catchIndex); +// } else { +// catches.add(pupitriCatch); +// } +// pupitriCatch.addToSign(bean.getSign(), beanWeight); +// } else { +// result.addNotImportedSpeciesId(speciesId); +// } +// } +// } +// +// importer.close(); +// reader.close(); +// +// } catch (Exception e) { +// DecoratorService service = getService(DecoratorService.class); +// throw new ApplicationTechnicalException( +// t("tutti.service.pupitri.import.carrousel.error", carrouselFile, service.getDecorator(operation).toString(operation)), e); +// +// } finally { +// IOUtils.closeQuietly(importer); +// IOUtils.closeQuietly(reader); +// FileUtils.deleteQuietly(fileWithHeaders); +// } +// +//// result.setNbCarrousselNotImported(notFoundSpecies.size()); +// result.setCarrouselSortedWeight(Weights.roundKiloGram(carrouselSortedWeight)); +// result.setCatches(catches); +// } + protected void savePupitriImportResult(PupitriImportResult result, FishingOperation operation, CatchBatch catchBatch) { + addFileAsAttachment(result.getTrunkFile(), catchBatch); addFileAsAttachment(result.getCarrousselFile(), catchBatch); @@ -352,8 +455,7 @@ public class PupitriImportService extends AbstractTuttiService { boolean splitSpecies = isSplitSpecies(pupitriCatch); - Map<Signs, MutableFloat> weightBySign = - pupitriCatch.getWeightBySign(); + Map<Signs, MutableFloat> weightBySign = pupitriCatch.getWeightBySign(); if (splitSpecies) { diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index 2774bc4..d985a05 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -212,7 +212,6 @@ tutti.service.pupitri.export.species.error= tutti.service.pupitri.import.attachment.comment= tutti.service.pupitri.import.carrousel.error= tutti.service.pupitri.import.trunk.error= -tutti.service.puttiri.carroussel.import.error= tutti.service.referential.export.gear.error= tutti.service.referential.export.person.error= tutti.service.referential.export.species.error= diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index 4a69a80..4d638cd 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 @@ -192,7 +192,6 @@ tutti.service.pupitri.export.species.error=Erreur lors de l'export des espèces tutti.service.pupitri.import.attachment.comment=Import Pupitri du %s tutti.service.pupitri.import.carrousel.error=Erreur lors de l'import du fichier de carrousel %2s pour le trait %1s tutti.service.pupitri.import.trunk.error=Erreur lors de l'import du fichier de trémie %2s pour le trait %1s -tutti.service.puttiri.carroussel.import.error= tutti.service.referential.export.gear.error=Erreur lors de l'export des engins dans le fichier %s tutti.service.referential.export.person.error=Erreur lors de l'export des personnes dans le fichier %s tutti.service.referential.export.species.error=Erreur lors de l'export des espèces dans le fichier %s diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitryImportServiceTestSupport.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitryImportServiceTestSupport.java new file mode 100644 index 0000000..8c67f06 --- /dev/null +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitryImportServiceTestSupport.java @@ -0,0 +1,18 @@ +package fr.ifremer.tutti.service.pupitri; + +/** + * Created on 11/21/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class PupitryImportServiceTestSupport { + + public static final String PROGRAM_ID = "CAM-CGFS"; + + public static final String CRUISE_ID = "100000"; + + public static final String OPERATION_1_ID = "100000"; + + public static final String OPERATION_2_ID = "100001"; +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.