branch feature/8157 updated (6afd5b0 -> d31ed9a)
This is an automated email from the git hooks/post-receive script. New change to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git omits 6afd5b0 i18n (fixes #8157) omits 20ebc02 ajout de l'action de rapport de prélèvement pour la campagne (refs #8157) omits 9b441cb service d'export du rapport de prélèvements (refs #8157) omits 946cdbe récup du nombre de prélèvement par classe de taille pour une espece/maturité/sexe (refs #8157) omits 2dbbf8d i18n adds 59dac8e on ne set le rtp a null que quand on edite un nouveau batch (fixes #8213) adds 002a348 Merge branch 'feature/8213' into 'develop' adds 26aef4b index selectionné >= 0 (pourquoi à 1 ????) (fixes #8218) adds 94616c1 Merge branch 'feature/8218' into 'develop' adds a32347d Utilisation de la bonne liste de taxons (See #8200) adds efd0d34 Merge branch 'feature/8200' into 'develop' adds f56397f lecture de la mesure venant de l'ichtyometre, qu'importe le mode de copie (fixes #8206) adds 4365ccc livrable #8206 Merge branch 'feature/8206' into develop adds ff7f247 l'ui qui permet d'avoir la popup plus large doit etre mise sur la combo à la création, sinon ça a l'air de virer des listeners (fixes #8209) adds 827b53a livrable #8209 Merge branch 'feature/8209' into develop adds 9d0beb9 on pousse la caracteristique de maturité dans les caracteristiques par defaut pour que la maturité ne soit pas éditable sur un lot maturé (fixes #8219) adds 1a76326 livrable #8219 Merge branch 'feature/8219' into develop adds 23db1ec Amélioration du cache des codes de prélèvements (ne pas utiliser des Integer en valeurs d'une map) adds 27b822c Ajout d'une méthode sur la persistence pour tester qu'on peut utiliser un code de prélèvement (See #8204) adds 16b60e9 Ajout d'un cache de code de prélèvement viables ou non + blocage si code de prélèvement pas possible (See #8204) adds f5aaca3 Add more logs + display error if code is not available (Fixes #8204) adds e8523b6 On decremente uniquement si le code matché est le plus haut + amélioration code adds b83f3ca we show the popup until the user enters a valid sample code (refs #8204) adds cd3f1b6 add or remove the sampling code even if the row should not be sampled according to the protocol (fixes #8204) adds 4fe32d1 Merge branch 'feature/8204' into 'develop' adds bac8951 on pousse les caractéristiques non éditables dans le modèle (par exemple le sexe dans le cas d'un lot sexé) pour ne pas considéré cette données comme saisie et permettre l'enregistrement même si des lignes ont des valeurs seulement pour ces caractéristiques (fixes #8210) adds 4cdee6d testable-client #8210 Merge branch 'feature/8210' into develop adds a69ce47 je sais pas pourquoi ca sélectionnait la celulle alors qu'on lui demandait que non, du coup on selectionne la cellule, et ça remplace la sélection précédente (fixes #8211) adds 6e5e643 livrable #8211 Merge branch 'feature/8211' into develop adds dd370be on met d'abord le poids à jour, puis la taille (la modif de la taille peut supprimer la ligne de mensuration si le nombre est à 0) (fixes #8212) adds 049bea4 Livrable #8212 Merge branch 'feature/8212' into develop new 2255550 i18n new c4a9ecb récup du nombre de prélèvement par classe de taille pour une espece/maturité/sexe (refs #8157) new 73828f3 service d'export du rapport de prélèvements (refs #8157) new ee33996 ajout de l'action de rapport de prélèvement pour la campagne (refs #8157) new a4eecf3 i18n (fixes #8157) new 4cb6f60 on demande au cache de créer les lignes pour l'export (refs #8157) new d31ed9a On prend en compte les prélèvements qui ne rentrent pas dans le protocole (fixes #8157) This update added new revisions after undoing existing revisions. That is to say, some revisions that were in the old version of the branch are not in the new version. This situation occurs when a user --force pushes a change and generates a repository containing something like this: * -- * -- B -- O -- O -- O (6afd5b0) \ N -- N -- N refs/heads/feature/8157 (d31ed9a) You should already have received notification emails for all of the O revisions, and so the following emails describe only the N revisions from the common base, B. Any revisions marked "omits" are not gone; other references still refer to them. Any revisions marked "discards" are gone forever. The 7 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit d31ed9aa0d320f92e2dd54d6ae7532b0cf2bc5f2 Author: Kevin Morin <morin@codelutin.com> Date: Tue Apr 5 16:58:47 2016 +0200 On prend en compte les prélèvements qui ne rentrent pas dans le protocole (fixes #8157) commit 4cb6f60369a083fec68bea923745dc67475dc574 Author: Kevin Morin <morin@codelutin.com> Date: Tue Apr 5 16:06:49 2016 +0200 on demande au cache de créer les lignes pour l'export (refs #8157) commit a4eecf336a0ddb10695345eaa1a203e996b71af1 Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 23:34:13 2016 +0200 i18n (fixes #8157) commit ee339960af5c552da0d011b58580d6368d503bf9 Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 15:45:49 2016 +0200 ajout de l'action de rapport de prélèvement pour la campagne (refs #8157) commit 73828f37f2c1c90c17cf8e1b4939b2750a0c05f4 Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 15:45:21 2016 +0200 service d'export du rapport de prélèvements (refs #8157) commit c4a9ecb6a9c0f4cdcf8aad1de425ee994519e4a8 Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 15:43:17 2016 +0200 récup du nombre de prélèvement par classe de taille pour une espece/maturité/sexe (refs #8157) commit 2255550a210abbab9e042f4ce4921ea8a33ab13e Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 15:41:55 2016 +0200 i18n Summary of changes: .../tutti/persistence/TuttiPersistenceImpl.java | 5 + .../persistence/TuttiPersistenceNoDbImpl.java | 5 + ...dividualObservationBatchPersistenceService.java | 10 ++ ...dualObservationBatchPersistenceServiceImpl.java | 49 +++++++ .../service/util/SamplePersistenceHelper.java | 82 ++++++++--- .../src/main/resources/queries-failsafe.hbm.xml | 36 +++++ .../ifremer/tutti/service/PersistenceService.java | 5 + .../cps/CalcifiedPiecesSamplingExportService.java | 89 ++---------- ...ngRowModel.java => SamplingNumberRowModel.java} | 23 +-- .../CacheExtractedKey.java} | 11 +- .../service/sampling/CruiseSamplingCache.java | 156 ++++++++++++--------- .../sampling/CruiseSamplingCacheLoader.java | 2 +- .../sampling/CruiseSamplingInternalCache.java | 67 ++++++--- .../tutti/service/sampling/SamplingCodePrefix.java | 4 + .../tutti/service/sampling/SamplingEvent.java | 6 +- .../resources/i18n/tutti-service_en_GB.properties | 1 + .../resources/i18n/tutti-service_fr_FR.properties | 4 +- .../filtered-resources/tutti-help-fr.properties | 2 +- .../IndividualObservationBatchTableModel.java | 10 +- .../SamplingCodeCellEditor.java | 2 +- .../create/CreateSpeciesBatchUIHandler.java | 3 +- .../frequency/IndividualObservationUICache.java | 113 +++++++++++---- .../species/frequency/SpeciesFrequencyUI.jaxx | 13 +- .../frequency/SpeciesFrequencyUIHandler.java | 13 +- .../species/frequency/SpeciesFrequencyUIModel.java | 26 +++- .../actions/ApplySpeciesFrequencyRafaleAction.java | 17 +-- .../frequency/actions/EditSampleCodeAction.java | 102 +++++++++++++- .../frequency/actions/RemoveObservationAction.java | 7 +- .../swing/util/WideDataBeanFilterableComboBox.java | 26 ++++ .../tutti/ui/swing/util/WideDataComboBoxUI.java | 48 +++++-- .../resources/i18n/tutti-ui-swing_en_GB.properties | 1 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 1 + 32 files changed, 653 insertions(+), 286 deletions(-) rename tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/{CalcifiedPiecesSamplingRowModel.java => SamplingNumberRowModel.java} (62%) rename tutti-service/src/main/java/fr/ifremer/tutti/service/{export/cps/CalcifiedPiecesSamplingRow.java => sampling/CacheExtractedKey.java} (88%) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/WideDataBeanFilterableComboBox.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 2255550a210abbab9e042f4ce4921ea8a33ab13e Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 15:41:55 2016 +0200 i18n --- .../fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java index c2bec12..6406a1a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java @@ -40,6 +40,8 @@ import java.util.Collection; import java.util.List; import java.util.Optional; +import static org.nuiton.i18n.I18n.t; + /** * Pour charger le cache. * @@ -86,7 +88,7 @@ public class CruiseSamplingCacheLoader { FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); - progressionModel.increments("Chargement du cache d'échantillons pour le trait : " + fishingOperationDecorator.toString(fishingOperation)); + progressionModel.increments(t("tutti.cruise.cacheLoader.loading.fishingOperation", fishingOperationDecorator.toString(fishingOperation))); List<IndividualObservationBatch> allIndividualObservationBatchsForFishingOperation = persistenceService.getAllIndividualObservationBatchsForFishingOperation(fishingOperationId); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit c4a9ecb6a9c0f4cdcf8aad1de425ee994519e4a8 Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 15:43:17 2016 +0200 récup du nombre de prélèvement par classe de taille pour une espece/maturité/sexe (refs #8157) --- .../service/sampling/CruiseSamplingCache.java | 5 +++ .../sampling/CruiseSamplingInternalCache.java | 41 +++++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index dd03eb7..d917ea2 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -51,6 +51,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.TreeMap; /** * @author Kevin Morin (Code Lutin) @@ -782,4 +783,8 @@ public class CruiseSamplingCache implements Closeable { // (key, highestSamplingCode) -> code.equals(highestSamplingCode) ? code - 1 : highestSamplingCode); } + public TreeMap<Integer, Integer> getSamplingNbByLengthStepForCruise(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity, int minSize, Integer maxSize) { + return totalCruiseCache.getSamplingNbByLengthStep(speciesId, gender, maturity, minSize, maxSize); + } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java index bb4ff26..2c11465 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java @@ -54,10 +54,11 @@ class CruiseSamplingInternalCache implements Closeable { public static String createSamplingKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, int lengthStep) { Objects.requireNonNull(species); - return species.getReferenceTaxonId() - + KEY_SEPARATOR + (gender == null ? null : gender.getId()) - + KEY_SEPARATOR + maturity - + KEY_SEPARATOR + lengthStep; + return createSamplingKey(species.getReferenceTaxonId(), gender, maturity) + lengthStep; + } + + public static String createSamplingKey(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity) { + return speciesId + KEY_SEPARATOR + (gender == null ? null : gender.getId()) + KEY_SEPARATOR + maturity + KEY_SEPARATOR; } public static String addPrefixKey(Serializable prefix, String key) { @@ -173,6 +174,37 @@ class CruiseSamplingInternalCache implements Closeable { return result; } + /** + * Get the number of samplings by lengthstep for a species, maturity and gender, for the lengthsteps between min size and max size + * @param speciesId + * @param gender + * @param maturity + * @param minSize + * @param maxSize + * @return a map of the number of samplings for each lengthstep in millimeters + */ + public TreeMap<Integer, Integer> getSamplingNbByLengthStep(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity, int minSize, Integer maxSize) { + String keyPrefix = createSamplingKey(speciesId, gender, maturity); + + TreeMap<Integer, Integer> result = new TreeMap<>(); + + Iterator<Map.Entry<String, SamplingData>> iterator = data.entrySet().iterator(); + + int keyPrefixLength = keyPrefix.length(); + while (iterator.hasNext()) { + Map.Entry<String, SamplingData> entry = iterator.next(); + String key = entry.getKey(); + + if (key.startsWith(keyPrefix)) { + int lengthStep = Integer.parseInt(key.substring(keyPrefixLength)); + if (lengthStep >= minSize && (maxSize == null || lengthStep <= maxSize)) { + result.put(lengthStep, entry.getValue().getSamplingNb()); + } + } + } + return result; + } + private class SamplingData { private MutableInt observationNb = new MutableInt(0); @@ -208,4 +240,5 @@ class CruiseSamplingInternalCache implements Closeable { } + } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 73828f37f2c1c90c17cf8e1b4939b2750a0c05f4 Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 15:45:21 2016 +0200 service d'export du rapport de prélèvements (refs #8157) --- .../cps/CalcifiedPiecesSamplingExportService.java | 156 +++++++++++++++++++++ .../export/cps/CalcifiedPiecesSamplingRow.java | 76 ++++++++++ .../cps/CalcifiedPiecesSamplingRowModel.java | 63 +++++++++ .../resources/i18n/tutti-service_en_GB.properties | 10 ++ .../resources/i18n/tutti-service_fr_FR.properties | 10 ++ 5 files changed, 315 insertions(+) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java new file mode 100644 index 0000000..7e103a6 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java @@ -0,0 +1,156 @@ +package fr.ifremer.tutti.service.export.cps; + +import com.google.common.base.Charsets; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.io.Files; +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.persistence.entities.referential.Speciess; +import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiDataContext; +import fr.ifremer.tutti.service.TuttiServiceContext; +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.Export; +import org.nuiton.decorator.Decorator; +import org.nuiton.jaxx.application.ApplicationTechnicalException; + +import java.io.BufferedWriter; +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.stream.Collectors; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public class CalcifiedPiecesSamplingExportService extends AbstractTuttiService { + + private static final Log log = LogFactory.getLog(CalcifiedPiecesSamplingExportService.class); + + protected PersistenceService persistenceService; + protected DecoratorService decoratorService; + + @Override + public void setServiceContext(TuttiServiceContext context) { + super.setServiceContext(context); + persistenceService = getService(PersistenceService.class); + decoratorService = getService(DecoratorService.class); + } + + /** + * Export selected cruise with the csv sumatra format. + * + * @param file where to generate report + * @since 2.0 + */ + public void exportCruiseCalcifiedPiecesSamplingsReport(File file, + ProgressionModel progressionModel) { + + Preconditions.checkNotNull(file, "Cannot export to a null file"); + + TuttiDataContext dataContext = context.getDataContext(); + Preconditions.checkState(dataContext.isCruiseSamplingCacheLoaded()); + + List<CalcifiedPiecesSamplingRow> rows = Lists.newArrayList(); + + CalcifiedPiecesSamplingRowModel csvModel = new CalcifiedPiecesSamplingRowModel(context.getConfig().getCsvSeparator()); + + TuttiProtocol protocol = dataContext.getProtocol(); + + Map<Integer, Species> referenceSpeciesByReferenceTaxonId = Maps.uniqueIndex(dataContext.getReferentSpecies(), Speciess.GET_REFERECE_TAXON_ID_AS_INT); + + List<SpeciesProtocol> speciesInAlogirthm = + protocol.getSpecies().stream().filter(speciesProtocol -> !speciesProtocol.isCalcifiedPiecesSamplingDefinitionEmpty()).collect(Collectors.toList()); + + progressionModel.adaptTotal(progressionModel.getTotal() + speciesInAlogirthm.size()); + + Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class, DecoratorService.WITH_SURVEY_CODE); + + speciesInAlogirthm.forEach(speciesProtocol -> { + + Species species = referenceSpeciesByReferenceTaxonId.get(speciesProtocol.getSpeciesReferenceTaxonId()); + if (log.isDebugEnabled()) { + log.debug("export species " + species.getReferenceTaxonId() + " " + speciesDecorator.toString(species)); + } + progressionModel.increments(t("tutti.service.cpsExport.step.export.species", speciesDecorator.toString(species))); + + Collection<CalcifiedPiecesSamplingDefinition> cpsDefs = speciesProtocol.getCalcifiedPiecesSamplingDefinition(); + + cpsDefs.forEach(cpsDef -> { + if (cpsDef.isSex()) { + dataContext.getGenderValues().forEach(gender -> rows.addAll(getRows(species, cpsDef, gender))); + + } else { + rows.addAll(getRows(species, cpsDef, null)); + } + }); + }); + + BufferedWriter writer = null; + try { + writer = Files.newWriter(file, Charsets.UTF_8); + Export export = Export.newExport(csvModel, rows); + export.write(writer); + writer.close(); + + } catch (Exception e) { + throw new ApplicationTechnicalException(t("tutti.service.cpsExport.error", file), e); + } finally { + IOUtils.closeQuietly(writer); + } + } + + protected List<CalcifiedPiecesSamplingRow> getRows(Species species, CalcifiedPiecesSamplingDefinition cpsDef, CaracteristicQualitativeValue gender) { + Preconditions.checkState(context.getDataContext().isCruiseSamplingCacheLoaded()); + + Integer speciesId = species.getReferenceTaxonId(); + Boolean maturity = cpsDef.getMaturity(); + Integer maxByLenghtStep = cpsDef.getMaxByLenghtStep(); + int minSize = cpsDef.getMinSize(); + Integer maxSize = cpsDef.getMaxSize(); + + if (log.isDebugEnabled()) { + log.debug("create rows for " + speciesId + " (mat: " + maturity + ", sex: " + gender.getName() + ", max/lengthstep : " + maxByLenghtStep + ", min: " + minSize + ", max: " + maxSize + ")"); + } + + TreeMap<Integer, Integer> samplingNbByLengthStep = + context.getDataContext().getOptionalCruiseSamplingCache().get() + .getSamplingNbByLengthStepForCruise(speciesId, gender, maturity, minSize, maxSize); + + List<CalcifiedPiecesSamplingRow> rows = new ArrayList<>(); + samplingNbByLengthStep.keySet().forEach(lengthStep -> { + CalcifiedPiecesSamplingRow row = new CalcifiedPiecesSamplingRow(); + row.setSpecies(species); + row.setMaturity(maturity); + row.setSex(gender == null ? null : QualitativeValueId.fromValue(gender.getIdAsInt())); + row.setMaxByLengthStep(maxByLenghtStep); + row.setLengthStep(lengthStep); + row.setSamplingNb(samplingNbByLengthStep.getOrDefault(lengthStep, 0)); + rows.add(row); + }); + + if (log.isDebugEnabled()) { + log.debug("==> " + rows.size() + " found"); + } + + return rows; + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java new file mode 100644 index 0000000..c719b51 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java @@ -0,0 +1,76 @@ +package fr.ifremer.tutti.service.export.cps; + +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.tutti.persistence.entities.referential.Species; + +import java.io.Serializable; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public class CalcifiedPiecesSamplingRow implements Serializable { + + + public static final String PROPERTY_SPECIES = "species"; + public static final String PROPERTY_LENGTH_STEP = "lengthStep"; + public static final String PROPERTY_MATURITY = "maturity"; + public static final String PROPERTY_SEX = "sex"; + public static final String PROPERTY_SAMPLING_NB = "samplingNb"; + public static final String PROPERTY_MAX_BY_LENGTH_STEP = "maxByLengthStep"; + + protected Species species; + protected int lengthStep; + protected Boolean maturity; + protected QualitativeValueId sex; + protected int samplingNb; + protected Integer maxByLengthStep; + + public int getLengthStep() { + return lengthStep; + } + + public void setLengthStep(int lengthStep) { + this.lengthStep = lengthStep; + } + + public Boolean getMaturity() { + return maturity; + } + + public void setMaturity(Boolean maturity) { + this.maturity = maturity; + } + + public Integer getMaxByLengthStep() { + return maxByLengthStep; + } + + public void setMaxByLengthStep(Integer maxByLengthStep) { + this.maxByLengthStep = maxByLengthStep; + } + + public int getSamplingNb() { + return samplingNb; + } + + public void setSamplingNb(int samplingNb) { + this.samplingNb = samplingNb; + } + + public QualitativeValueId getSex() { + return sex; + } + + public void setSex(QualitativeValueId sex) { + this.sex = sex; + } + + public Species getSpecies() { + return species; + } + + public void setSpecies(Species species) { + this.species = species; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java new file mode 100644 index 0000000..81cb5af --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java @@ -0,0 +1,63 @@ +package fr.ifremer.tutti.service.export.cps; + +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.csv.AbstractTuttiImportExportModel; +import fr.ifremer.tutti.service.csv.TuttiCsvUtil; +import org.nuiton.csv.ValueFormatter; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public class CalcifiedPiecesSamplingRowModel extends AbstractTuttiImportExportModel<CalcifiedPiecesSamplingRow> { + + public CalcifiedPiecesSamplingRowModel(char separator) { + super(separator); + + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.surveyCode"), CalcifiedPiecesSamplingRow.PROPERTY_SPECIES, new ValueFormatter<Species>() { + + @Override + public String format(Species species) { + return String.valueOf(species.getSurveyCode()); + } + }); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.geniusName"), CalcifiedPiecesSamplingRow.PROPERTY_SPECIES, new ValueFormatter<Species>() { + + @Override + public String format(Species species) { + return String.valueOf(species.getName()); + } + }); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CalcifiedPiecesSamplingRow.PROPERTY_LENGTH_STEP, TuttiCsvUtil.PRIMITIVE_INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maturity"), CalcifiedPiecesSamplingRow.PROPERTY_MATURITY, new ValueFormatter<Boolean>() { + + @Override + public String format(Boolean maturity) { + if (maturity == null) { + return ""; + } + return maturity ? t("tutti.maturity.mature") : t("tutti.maturity.immature"); + } + }); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.gender"), CalcifiedPiecesSamplingRow.PROPERTY_SEX, new ValueFormatter<QualitativeValueId>() { + + @Override + public String format(QualitativeValueId sex) { + if (sex == null) { + return ""; + } + return t(sex.getDescription()); + } + }); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.samplingNb"), CalcifiedPiecesSamplingRow.PROPERTY_SAMPLING_NB, TuttiCsvUtil.PRIMITIVE_INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maxByLengthStep"), CalcifiedPiecesSamplingRow.PROPERTY_MAX_BY_LENGTH_STEP, TuttiCsvUtil.INTEGER); + } + + @Override + public CalcifiedPiecesSamplingRow newEmptyInstance() { + return new CalcifiedPiecesSamplingRow(); + } +} 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 5d79d71..1514c68 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 @@ -6,6 +6,7 @@ tutti.caracteristicType.gearUseFeature= tutti.caracteristicType.individualObservation= tutti.caracteristicType.lengthStep= tutti.caracteristicType.vesselUseFeature= +tutti.cruise.cacheLoader.loading.fishingOperation= tutti.csv.import.error.on.field= tutti.csv.import.error.on.row= tutti.decorator.null.infinite= @@ -80,8 +81,17 @@ tutti.service.bigfinImport.warning.species.notInProtocol= tutti.service.bigfinImport.warning.species.tooCategorized= tutti.service.bigfinImport.warning.speciesBatch.tooCategorized= tutti.service.bigfinimport.error.no.protocol= +tutti.service.calcifiedPiecesSamplingReport.header.gender= +tutti.service.calcifiedPiecesSamplingReport.header.geniusName= +tutti.service.calcifiedPiecesSamplingReport.header.lengthStep= +tutti.service.calcifiedPiecesSamplingReport.header.maturity= +tutti.service.calcifiedPiecesSamplingReport.header.maxByLengthStep= +tutti.service.calcifiedPiecesSamplingReport.header.samplingNb= +tutti.service.calcifiedPiecesSamplingReport.header.surveyCode= tutti.service.compressZipFile.error= tutti.service.context.serviceInstanciation.error= +tutti.service.cpsExport.error= +tutti.service.cpsExport.step.export.species= tutti.service.csv.caracteristic.qualitativeValue.notFound= tutti.service.csv.parse.entityNotFound= tutti.service.csv.parse.foreignEntityNotFound= 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 c064cbe..cd062bf 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 @@ -3,6 +3,7 @@ tutti.caracteristicType.INDIVIDUAL_OBSERVATION=Observations individuelles tutti.caracteristicType.LENGTH_STEP=Classes de tailles tutti.caracteristicType.VESSEL_USE_FEATURE=Autres caractéristiques tutti.caracteristicType.lengthStep= +tutti.cruise.cacheLoader.loading.fishingOperation=Chargement du cache d'échantillons pour le trait \: %s tutti.csv.import.error.on.field=Colonne %s \: %s tutti.csv.import.error.on.row=Des erreurs ont été détectées à la ligne %s \:\n %s tutti.decorator.null.infinite=∞ @@ -69,8 +70,17 @@ tutti.service.bigfinImport.warning.species.notInProtocol=[Enregistrement %s] L'e tutti.service.bigfinImport.warning.species.tooCategorized=L'espèce '<strong>%1s</strong>' est trop catégorisée (pas limitée à '<strong>%2s</strong>' et '<strong>%3s</strong>') tutti.service.bigfinImport.warning.speciesBatch.tooCategorized=[Enregistrement %s] Le lot '<strong>%1s</strong>' contient des sous catégories, on ne peut pas y ajouter des mensurations. tutti.service.bigfinimport.error.no.protocol=Impossible de faire un import Bigfin sans protocol. +tutti.service.calcifiedPiecesSamplingReport.header.gender=Sexe +tutti.service.calcifiedPiecesSamplingReport.header.geniusName=Nom scientifique +tutti.service.calcifiedPiecesSamplingReport.header.lengthStep=Classe de taille (mm) +tutti.service.calcifiedPiecesSamplingReport.header.maturity=Maturité +tutti.service.calcifiedPiecesSamplingReport.header.maxByLengthStep=Max/classe de taille +tutti.service.calcifiedPiecesSamplingReport.header.samplingNb=Nombre de prélèvements +tutti.service.calcifiedPiecesSamplingReport.header.surveyCode=Code campagne tutti.service.compressZipFile.error=Erreur lors de la compression du dossier %1s dans le fichier %2s tutti.service.context.serviceInstanciation.error=Erreur lors de l'instanciation du service %s +tutti.service.cpsExport.error=Erreur à l'export du rapport des prélèvements +tutti.service.cpsExport.step.export.species=Export des prélèvements pour l'espèce %s tutti.service.csv.caracteristic.qualitativeValue.notFound=La caractéristique qualitative %s n'a pas de value d'id %s tutti.service.csv.parse.entityNotFound=L'entité de type %1s avec la propriété %2s de valeur %3s n'a pas été trouvée tutti.service.csv.parse.foreignEntityNotFound=L'entité de type %1s avec l'identifiant %3s n'a pas été trouvée -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit ee339960af5c552da0d011b58580d6368d503bf9 Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 15:45:49 2016 +0200 ajout de l'action de rapport de prélèvement pour la campagne (refs #8157) --- .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 5 + .../ui/swing/content/home/SelectCruiseUI.jaxx | 1 + .../ui/swing/content/home/SelectCruiseUI.jcss | 10 +- .../CalcifiedPiecesSamplingReportAction.java | 117 +++++++++++++++++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 10 ++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 10 ++ 6 files changed, 152 insertions(+), 1 deletion(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java index 58bbab6..ea9de60 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java @@ -39,6 +39,7 @@ import fr.ifremer.tutti.service.catches.WeightCleaningService; import fr.ifremer.tutti.service.catches.WeightComputingService; import fr.ifremer.tutti.service.catches.multipost.MultiPostExportService; import fr.ifremer.tutti.service.catches.multipost.MultiPostImportService; +import fr.ifremer.tutti.service.export.cps.CalcifiedPiecesSamplingExportService; import fr.ifremer.tutti.service.export.pdf.CatchesPdfExportService; import fr.ifremer.tutti.service.export.sumatra.CatchesSumatraExportService; import fr.ifremer.tutti.service.export.toconfirmreport.ToConfirmReportService; @@ -750,6 +751,10 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage return serviceContext.getService(CatchesSumatraExportService.class); } + public CalcifiedPiecesSamplingExportService getCalcifiedPiecesSamplingExportService() { + return serviceContext.getService(CalcifiedPiecesSamplingExportService.class); + } + public MultiPostImportService getMultiPostImportService() { return serviceContext.getService(MultiPostImportService.class); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx index 0e049d5..c14782f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx @@ -65,6 +65,7 @@ <JButton id='editCruiseButton'/> <JButton id='sendCruiseReportButton'/> <JButton id='exportCruiseForSumatraButton'/> + <JButton id='calcifiedPiecesSamplingReportButton'/> <JButton id='speciesToConfirmReportForCruiseButton'/> <JButton id='newProtocolButton'/> <JButton id='importProtocolButton'/> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jcss b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jcss index 1582844..e77fc74 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jcss +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jcss @@ -90,7 +90,7 @@ BeanFilterableComboBox { #editCruiseComboBox { enabled: {model.isProgramFound() && model.isCruiseFound()}; - _comboboxActions: {Arrays.asList(editCruiseButton, sendCruiseReportButton, exportCruiseForSumatraButton, speciesToConfirmReportForCruiseButton)}; + _comboboxActions: {Arrays.asList(editCruiseButton, sendCruiseReportButton, exportCruiseForSumatraButton, calcifiedPiecesSamplingReportButton, speciesToConfirmReportForCruiseButton)}; } #editCruiseButton { @@ -118,6 +118,14 @@ BeanFilterableComboBox { _help: {"tutti.selectCruise.action.exportCruiseForSumatra.help"}; } +#calcifiedPiecesSamplingReportButton { + actionIcon: report; + text: "tutti.selectCruise.action.calcifiedPiecesSamplingReport"; + toolTipText: "tutti.selectCruise.action.calcifiedPiecesSamplingReport.tip"; + _applicationAction: {fr.ifremer.tutti.ui.swing.content.home.actions.CalcifiedPiecesSamplingReportAction.class}; + _help: {"tutti.selectCruise.action.calcifiedPiecesSamplingReport.help"}; +} + #speciesToConfirmReportForCruiseButton { actionIcon: report; text: "tutti.selectCruise.action.speciesToConfirmReportForCruise"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/CalcifiedPiecesSamplingReportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/CalcifiedPiecesSamplingReportAction.java new file mode 100644 index 0000000..d898c18 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/CalcifiedPiecesSamplingReportAction.java @@ -0,0 +1,117 @@ +package fr.ifremer.tutti.ui.swing.content.home.actions; + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.service.export.cps.CalcifiedPiecesSamplingExportService; +import fr.ifremer.tutti.service.sampling.CruiseSamplingCacheLoader; +import fr.ifremer.tutti.ui.swing.content.MainUIHandler; +import fr.ifremer.tutti.ui.swing.content.actions.AbstractMainUITuttiAction; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.DateUtil; + +import java.io.File; +import java.util.Date; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public class CalcifiedPiecesSamplingReportAction extends AbstractMainUITuttiAction { + + /** Logger. */ + private static final Log log = + LogFactory.getLog(CalcifiedPiecesSamplingReportAction.class); + + protected File file; + +// protected SumatraExportResult sumatraExportResult; + + public CalcifiedPiecesSamplingReportAction(MainUIHandler handler) { + super(handler, false); + } + + @Override + public boolean prepareAction() throws Exception { + + boolean doAction = super.prepareAction(); + + if (doAction && !getDataContext().isProtocolFilled()) { + displayErrorMessage( + t("tutti.exportCpsCsv.title.missing.protocol"), + t("tutti.exportCpsCsv.message.missing.protocol") + ); + doAction = false; + } + + if (doAction && !getDataContext().getProtocol().isUseCalcifiedPieceSampling()) { + displayErrorMessage( + t("tutti.exportCpsCsv.title.sampling.notActivated"), + t("tutti.exportCpsCsv.message.sampling.notActivated") + ); + doAction = false; + } + + if (doAction) { + + String date = DateUtil.formatDate(new Date(), "dd-MM-yyyy"); + String exportFilename = t("tutti.exportCpsCsv.fileName", getDataContext().getCruise().getName(), date); + + // choose file to export + file = saveFile( + exportFilename, + "csv", + t("tutti.exportCpsCsv.title.choose.exportFile"), + t("tutti.exportCpsCsv.action.chooseFile"), + "^.+\\.csv$", t("tutti.common.file.csv") + ); + doAction = file != null; + } + return doAction; + } + + @Override + public void doAction() throws Exception { + Cruise cruise = getDataContext().getCruise(); + Preconditions.checkNotNull(cruise); + Preconditions.checkNotNull(file); + + if (log.isInfoEnabled()) { + log.info("Will export cps for cruise " + cruise.getId() + + " to file: " + file); + } + ProgressionModel pm = new ProgressionModel(); + setProgressionModel(pm); + + long cruiseFishingOperationIds = getDataContext().getCruiseFishingOperationIds().stream().count(); + pm.setTotal((int) (1 + cruiseFishingOperationIds)); + + if (!getDataContext().isCruiseSamplingCacheLoaded()) { + CruiseSamplingCacheLoader cruiseSamplingCacheLoader = new CruiseSamplingCacheLoader(getContext().getPersistenceService(), + getContext().getDecoratorService(), getProgressionModel()); + getDataContext().loadCruiseSamplingCache(cruiseSamplingCacheLoader); + } + + + // export sampling report + + CalcifiedPiecesSamplingExportService service = getContext().getCalcifiedPiecesSamplingExportService(); + service.exportCruiseCalcifiedPiecesSamplingsReport(file, pm); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + sendMessage(t("tutti.exportCpsCsv.action.success", file)); + } + + @Override + public void releaseAction() { + file = null; + super.releaseAction(); + } + +} diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 3a279cf..3d5e6fe 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -1682,6 +1682,14 @@ tutti.error.update.bad.url.syntax= tutti.error.update.could.not.found.url= tutti.error.update.could.not.reach.url= tutti.error.write.startActionFile=could not write action content to file %s +tutti.exportCpsCsv.action.chooseFile= +tutti.exportCpsCsv.action.success= +tutti.exportCpsCsv.fileName= +tutti.exportCpsCsv.message.missing.protocol= +tutti.exportCpsCsv.message.sampling.notActivated= +tutti.exportCpsCsv.title.choose.exportFile= +tutti.exportCpsCsv.title.missing.protocol= +tutti.exportCpsCsv.title.sampling.notActivated= tutti.exportCruise.action.computeNbSteps= tutti.exportCruise.action.exportErrors= tutti.exportCruise.action.success= @@ -2356,6 +2364,8 @@ tutti.rtpEdit.askCancelEditBeforeLeaving= tutti.rtpEdit.askSaveBeforeLeaving= tutti.rtpEdit.title= tutti.selectBenthos.title= +tutti.selectCruise.action.calcifiedPiecesSamplingReport= +tutti.selectCruise.action.calcifiedPiecesSamplingReport.tip= tutti.selectCruise.action.chooseCruiseExportFile= tutti.selectCruise.action.chooseProgramExportFile= tutti.selectCruise.action.cloneProtocol= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 343d943..4fba820 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -1568,6 +1568,14 @@ tutti.error.update.bad.url.syntax=Mise à jour impossible (le format de l'url <s tutti.error.update.could.not.found.url=Mise à jour impossible (l'url <strong>%s</strong> n'existe pas) tutti.error.update.could.not.reach.url=Mise à jour impossible (l'url <strong>%s</strong> n'est pas joignable) tutti.error.write.startActionFile=impossible d'écrire dans le fichier %s +tutti.exportCpsCsv.action.chooseFile=Exporter +tutti.exportCpsCsv.action.success=Le rapport des prélèvements de la campagne a été exporté daans le fichier <strong>%s</strong>. +tutti.exportCpsCsv.fileName=Rapport_prelevement_%1$s_%2$s +tutti.exportCpsCsv.message.missing.protocol=<html><body>Pas de protocole renseigné, impossible d'exporter le rapport de prélèvement.</body></html> +tutti.exportCpsCsv.message.sampling.notActivated=<html><body>L'algorithme de prélèvement n'a pas été activé dans le protocole, impossible d'exporter le rapport de prélèvement.</body></html> +tutti.exportCpsCsv.title.choose.exportFile=Exporter le rapport de prélèvement +tutti.exportCpsCsv.title.missing.protocol=Pas de protocole renseigné +tutti.exportCpsCsv.title.sampling.notActivated=Algorithme de prélèvement non activé tutti.exportCruise.action.computeNbSteps=Calcul du nombre d'opérations à réaliser tutti.exportCruise.action.exportErrors=Des erreurs sont apparues pendant l'élévation des poids de la campagne <strong>%s</strong>.<br/>L'export a cependant été réalisé.<hr/>Erreur(s) rencontrée(s) \: <br/>%s tutti.exportCruise.action.success=La campagne <strong>%s</strong> a été exportée dans le fichier <strong>%s</strong>. @@ -2163,6 +2171,8 @@ tutti.rtpEdit.askCancelEditBeforeLeaving=Les relations taille-poids ne sont pas tutti.rtpEdit.askSaveBeforeLeaving=Des modifications n'ont pas été enregistrées tutti.rtpEdit.title=Relations taille-poids de l'espèce %s tutti.selectBenthos.title=Choisissez une espèce du benthos +tutti.selectCruise.action.calcifiedPiecesSamplingReport=Exporter le rapport de prélèvements +tutti.selectCruise.action.calcifiedPiecesSamplingReport.tip=Exporter le rapport de prélèvements tutti.selectCruise.action.chooseCruiseExportFile=Exporter tutti.selectCruise.action.chooseProgramExportFile=Exporter tutti.selectCruise.action.cloneProtocol=Cloner -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit a4eecf336a0ddb10695345eaa1a203e996b71af1 Author: Kevin Morin <morin@codelutin.com> Date: Fri Apr 1 23:34:13 2016 +0200 i18n (fixes #8157) --- tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties | 3 +++ .../src/main/resources/i18n/tutti-ui-swing_fr_FR.properties | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) 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 cd062bf..e528d17 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 @@ -1,3 +1,6 @@ +adagio.enumeration.QualitativeValueId.SEX_FEMALE.description=Femelle +adagio.enumeration.QualitativeValueId.SEX_MALE.description=Male +adagio.enumeration.QualitativeValueId.SEX_UNDEFINED.description=Inconnu tutti.caracteristicType.GEAR_USE_FEATURE=Caractéristiques de l'engin tutti.caracteristicType.INDIVIDUAL_OBSERVATION=Observations individuelles tutti.caracteristicType.LENGTH_STEP=Classes de tailles diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 4fba820..56171e9 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -1573,7 +1573,7 @@ tutti.exportCpsCsv.action.success=Le rapport des prélèvements de la campagne a tutti.exportCpsCsv.fileName=Rapport_prelevement_%1$s_%2$s tutti.exportCpsCsv.message.missing.protocol=<html><body>Pas de protocole renseigné, impossible d'exporter le rapport de prélèvement.</body></html> tutti.exportCpsCsv.message.sampling.notActivated=<html><body>L'algorithme de prélèvement n'a pas été activé dans le protocole, impossible d'exporter le rapport de prélèvement.</body></html> -tutti.exportCpsCsv.title.choose.exportFile=Exporter le rapport de prélèvement +tutti.exportCpsCsv.title.choose.exportFile=Rapport de prélèvements tutti.exportCpsCsv.title.missing.protocol=Pas de protocole renseigné tutti.exportCpsCsv.title.sampling.notActivated=Algorithme de prélèvement non activé tutti.exportCruise.action.computeNbSteps=Calcul du nombre d'opérations à réaliser @@ -2171,7 +2171,7 @@ tutti.rtpEdit.askCancelEditBeforeLeaving=Les relations taille-poids ne sont pas tutti.rtpEdit.askSaveBeforeLeaving=Des modifications n'ont pas été enregistrées tutti.rtpEdit.title=Relations taille-poids de l'espèce %s tutti.selectBenthos.title=Choisissez une espèce du benthos -tutti.selectCruise.action.calcifiedPiecesSamplingReport=Exporter le rapport de prélèvements +tutti.selectCruise.action.calcifiedPiecesSamplingReport=Rapport de prélèvements tutti.selectCruise.action.calcifiedPiecesSamplingReport.tip=Exporter le rapport de prélèvements tutti.selectCruise.action.chooseCruiseExportFile=Exporter tutti.selectCruise.action.chooseProgramExportFile=Exporter -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 4cb6f60369a083fec68bea923745dc67475dc574 Author: Kevin Morin <morin@codelutin.com> Date: Tue Apr 5 16:06:49 2016 +0200 on demande au cache de créer les lignes pour l'export (refs #8157) --- .../cps/CalcifiedPiecesSamplingExportService.java | 89 +++------------------- ...ngRowModel.java => SamplingNumberRowModel.java} | 23 +++--- .../CacheExtractedKey.java} | 5 +- .../service/sampling/CruiseSamplingCache.java | 15 +++- .../sampling/CruiseSamplingInternalCache.java | 51 ++++++++----- .../resources/i18n/tutti-service_en_GB.properties | 1 + .../resources/i18n/tutti-service_fr_FR.properties | 1 + 7 files changed, 68 insertions(+), 117 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java index 7e103a6..dfb814a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java @@ -2,15 +2,8 @@ package fr.ifremer.tutti.service.export.cps; import com.google.common.base.Charsets; import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import com.google.common.io.Files; -import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; -import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Speciess; import fr.ifremer.tutti.service.AbstractTuttiService; @@ -18,21 +11,18 @@ import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.sampling.CacheExtractedKey; +import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Export; -import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.BufferedWriter; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.TreeMap; -import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.t; @@ -68,43 +58,18 @@ public class CalcifiedPiecesSamplingExportService extends AbstractTuttiService { TuttiDataContext dataContext = context.getDataContext(); Preconditions.checkState(dataContext.isCruiseSamplingCacheLoaded()); - List<CalcifiedPiecesSamplingRow> rows = Lists.newArrayList(); + SamplingNumberRowModel csvModel = new SamplingNumberRowModel(context.getConfig().getCsvSeparator()); - CalcifiedPiecesSamplingRowModel csvModel = new CalcifiedPiecesSamplingRowModel(context.getConfig().getCsvSeparator()); + Map<String, Species> referenceSpeciesByReferenceTaxonId = Speciess.splitReferenceSpeciesByReferenceTaxonId(dataContext.getReferentSpecies()); - TuttiProtocol protocol = dataContext.getProtocol(); - - Map<Integer, Species> referenceSpeciesByReferenceTaxonId = Maps.uniqueIndex(dataContext.getReferentSpecies(), Speciess.GET_REFERECE_TAXON_ID_AS_INT); - - List<SpeciesProtocol> speciesInAlogirthm = - protocol.getSpecies().stream().filter(speciesProtocol -> !speciesProtocol.isCalcifiedPiecesSamplingDefinitionEmpty()).collect(Collectors.toList()); - - progressionModel.adaptTotal(progressionModel.getTotal() + speciesInAlogirthm.size()); - - Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class, DecoratorService.WITH_SURVEY_CODE); - - speciesInAlogirthm.forEach(speciesProtocol -> { - - Species species = referenceSpeciesByReferenceTaxonId.get(speciesProtocol.getSpeciesReferenceTaxonId()); - if (log.isDebugEnabled()) { - log.debug("export species " + species.getReferenceTaxonId() + " " + speciesDecorator.toString(species)); - } - progressionModel.increments(t("tutti.service.cpsExport.step.export.species", speciesDecorator.toString(species))); - - Collection<CalcifiedPiecesSamplingDefinition> cpsDefs = speciesProtocol.getCalcifiedPiecesSamplingDefinition(); - - cpsDefs.forEach(cpsDef -> { - if (cpsDef.isSex()) { - dataContext.getGenderValues().forEach(gender -> rows.addAll(getRows(species, cpsDef, gender))); - - } else { - rows.addAll(getRows(species, cpsDef, null)); - } - }); - }); + CruiseSamplingCache cruiseSamplingCache = context.getDataContext().getOptionalCruiseSamplingCache().get(); + List<CacheExtractedKey> rows = cruiseSamplingCache.getSamplingNumbers(referenceSpeciesByReferenceTaxonId); BufferedWriter writer = null; try { + + progressionModel.increments(t("tutti.service.cpsExport.step.toFile", file.getName())); + writer = Files.newWriter(file, Charsets.UTF_8); Export export = Export.newExport(csvModel, rows); export.write(writer); @@ -117,40 +82,4 @@ public class CalcifiedPiecesSamplingExportService extends AbstractTuttiService { } } - protected List<CalcifiedPiecesSamplingRow> getRows(Species species, CalcifiedPiecesSamplingDefinition cpsDef, CaracteristicQualitativeValue gender) { - Preconditions.checkState(context.getDataContext().isCruiseSamplingCacheLoaded()); - - Integer speciesId = species.getReferenceTaxonId(); - Boolean maturity = cpsDef.getMaturity(); - Integer maxByLenghtStep = cpsDef.getMaxByLenghtStep(); - int minSize = cpsDef.getMinSize(); - Integer maxSize = cpsDef.getMaxSize(); - - if (log.isDebugEnabled()) { - log.debug("create rows for " + speciesId + " (mat: " + maturity + ", sex: " + gender.getName() + ", max/lengthstep : " + maxByLenghtStep + ", min: " + minSize + ", max: " + maxSize + ")"); - } - - TreeMap<Integer, Integer> samplingNbByLengthStep = - context.getDataContext().getOptionalCruiseSamplingCache().get() - .getSamplingNbByLengthStepForCruise(speciesId, gender, maturity, minSize, maxSize); - - List<CalcifiedPiecesSamplingRow> rows = new ArrayList<>(); - samplingNbByLengthStep.keySet().forEach(lengthStep -> { - CalcifiedPiecesSamplingRow row = new CalcifiedPiecesSamplingRow(); - row.setSpecies(species); - row.setMaturity(maturity); - row.setSex(gender == null ? null : QualitativeValueId.fromValue(gender.getIdAsInt())); - row.setMaxByLengthStep(maxByLenghtStep); - row.setLengthStep(lengthStep); - row.setSamplingNb(samplingNbByLengthStep.getOrDefault(lengthStep, 0)); - rows.add(row); - }); - - if (log.isDebugEnabled()) { - log.debug("==> " + rows.size() + " found"); - } - - return rows; - } - } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java similarity index 62% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java index 81cb5af..8c2bbe6 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java @@ -4,6 +4,7 @@ import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.csv.AbstractTuttiImportExportModel; import fr.ifremer.tutti.service.csv.TuttiCsvUtil; +import fr.ifremer.tutti.service.sampling.CacheExtractedKey; import org.nuiton.csv.ValueFormatter; import static org.nuiton.i18n.I18n.t; @@ -12,27 +13,27 @@ import static org.nuiton.i18n.I18n.t; * @author Kevin Morin (Code Lutin) * @since 4.5 */ -public class CalcifiedPiecesSamplingRowModel extends AbstractTuttiImportExportModel<CalcifiedPiecesSamplingRow> { +public class SamplingNumberRowModel extends AbstractTuttiImportExportModel<CacheExtractedKey> { - public CalcifiedPiecesSamplingRowModel(char separator) { + public SamplingNumberRowModel(char separator) { super(separator); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.surveyCode"), CalcifiedPiecesSamplingRow.PROPERTY_SPECIES, new ValueFormatter<Species>() { + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.surveyCode"), CacheExtractedKey.PROPERTY_SPECIES, new ValueFormatter<Species>() { @Override public String format(Species species) { return String.valueOf(species.getSurveyCode()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.geniusName"), CalcifiedPiecesSamplingRow.PROPERTY_SPECIES, new ValueFormatter<Species>() { + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.geniusName"), CacheExtractedKey.PROPERTY_SPECIES, new ValueFormatter<Species>() { @Override public String format(Species species) { return String.valueOf(species.getName()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CalcifiedPiecesSamplingRow.PROPERTY_LENGTH_STEP, TuttiCsvUtil.PRIMITIVE_INTEGER); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maturity"), CalcifiedPiecesSamplingRow.PROPERTY_MATURITY, new ValueFormatter<Boolean>() { + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CacheExtractedKey.PROPERTY_LENGTH_STEP, TuttiCsvUtil.PRIMITIVE_INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maturity"), CacheExtractedKey.PROPERTY_MATURITY, new ValueFormatter<Boolean>() { @Override public String format(Boolean maturity) { @@ -42,7 +43,7 @@ public class CalcifiedPiecesSamplingRowModel extends AbstractTuttiImportExportMo return maturity ? t("tutti.maturity.mature") : t("tutti.maturity.immature"); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.gender"), CalcifiedPiecesSamplingRow.PROPERTY_SEX, new ValueFormatter<QualitativeValueId>() { + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.gender"), CacheExtractedKey.PROPERTY_SEX, new ValueFormatter<QualitativeValueId>() { @Override public String format(QualitativeValueId sex) { @@ -52,12 +53,12 @@ public class CalcifiedPiecesSamplingRowModel extends AbstractTuttiImportExportMo return t(sex.getDescription()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.samplingNb"), CalcifiedPiecesSamplingRow.PROPERTY_SAMPLING_NB, TuttiCsvUtil.PRIMITIVE_INTEGER); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maxByLengthStep"), CalcifiedPiecesSamplingRow.PROPERTY_MAX_BY_LENGTH_STEP, TuttiCsvUtil.INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.samplingNb"), CacheExtractedKey.PROPERTY_SAMPLING_NB, TuttiCsvUtil.PRIMITIVE_INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maxByLengthStep"), CacheExtractedKey.PROPERTY_MAX_BY_LENGTH_STEP, TuttiCsvUtil.INTEGER); } @Override - public CalcifiedPiecesSamplingRow newEmptyInstance() { - return new CalcifiedPiecesSamplingRow(); + public CacheExtractedKey newEmptyInstance() { + return new CacheExtractedKey(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java similarity index 94% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java index c719b51..7b9d064 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.export.cps; +package fr.ifremer.tutti.service.sampling; import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.entities.referential.Species; @@ -9,8 +9,7 @@ import java.io.Serializable; * @author Kevin Morin (Code Lutin) * @since 4.5 */ -public class CalcifiedPiecesSamplingRow implements Serializable { - +public class CacheExtractedKey implements Serializable { public static final String PROPERTY_SPECIES = "species"; public static final String PROPERTY_LENGTH_STEP = "lengthStep"; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index d917ea2..cc370bd 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -47,11 +47,11 @@ import javax.swing.event.EventListenerList; import java.io.Closeable; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.TreeMap; /** * @author Kevin Morin (Code Lutin) @@ -671,7 +671,7 @@ public class CruiseSamplingCache implements Closeable { listeners.remove(SamplingListener.class, listener); } - protected Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, float lengthStep) { + public Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, float lengthStep) { Collection<CalcifiedPiecesSamplingDefinition> cpsDefinitions = cpsDefinitionsBySpecies.get(species.getReferenceTaxonId()); return cpsDefinitions.stream() .filter(cpsDef -> Objects.equals(cpsDef.getMaturity(), maturity) @@ -783,8 +783,15 @@ public class CruiseSamplingCache implements Closeable { // (key, highestSamplingCode) -> code.equals(highestSamplingCode) ? code - 1 : highestSamplingCode); } - public TreeMap<Integer, Integer> getSamplingNbByLengthStepForCruise(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity, int minSize, Integer maxSize) { - return totalCruiseCache.getSamplingNbByLengthStep(speciesId, gender, maturity, minSize, maxSize); + public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { + List<CacheExtractedKey> result = totalCruiseCache.getSamplingNumbers(speciesById); + result.forEach(key -> { + Optional<CalcifiedPiecesSamplingDefinition> cpsDef = getCalcifiedPiecesSamplingDefinition(key.getSpecies(), key.getMaturity(), key.getLengthStep()); + if (cpsDef.isPresent()) { + key.setMaxByLengthStep(cpsDef.get().getMaxByLenghtStep()); + } + }); + return result; } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java index 2c11465..a92541a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java @@ -24,16 +24,20 @@ package fr.ifremer.tutti.service.sampling; * #L% */ +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.Closeable; import java.io.Serializable; +import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -54,11 +58,8 @@ class CruiseSamplingInternalCache implements Closeable { public static String createSamplingKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, int lengthStep) { Objects.requireNonNull(species); - return createSamplingKey(species.getReferenceTaxonId(), gender, maturity) + lengthStep; - } - - public static String createSamplingKey(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity) { - return speciesId + KEY_SEPARATOR + (gender == null ? null : gender.getId()) + KEY_SEPARATOR + maturity + KEY_SEPARATOR; + return species.getReferenceTaxonId() + KEY_SEPARATOR + (gender == null ? "" : gender.getId()) + + KEY_SEPARATOR + (maturity == null ? "" : maturity.toString()) + KEY_SEPARATOR + lengthStep; } public static String addPrefixKey(Serializable prefix, String key) { @@ -176,31 +177,43 @@ class CruiseSamplingInternalCache implements Closeable { /** * Get the number of samplings by lengthstep for a species, maturity and gender, for the lengthsteps between min size and max size - * @param speciesId - * @param gender - * @param maturity - * @param minSize - * @param maxSize * @return a map of the number of samplings for each lengthstep in millimeters */ - public TreeMap<Integer, Integer> getSamplingNbByLengthStep(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity, int minSize, Integer maxSize) { - String keyPrefix = createSamplingKey(speciesId, gender, maturity); + public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { - TreeMap<Integer, Integer> result = new TreeMap<>(); Iterator<Map.Entry<String, SamplingData>> iterator = data.entrySet().iterator(); + List<CacheExtractedKey> result = new ArrayList<>(data.size()); - int keyPrefixLength = keyPrefix.length(); while (iterator.hasNext()) { Map.Entry<String, SamplingData> entry = iterator.next(); - String key = entry.getKey(); - if (key.startsWith(keyPrefix)) { - int lengthStep = Integer.parseInt(key.substring(keyPrefixLength)); - if (lengthStep >= minSize && (maxSize == null || lengthStep <= maxSize)) { - result.put(lengthStep, entry.getValue().getSamplingNb()); + if (entry.getValue() != null) { + String[] keyTokens = entry.getKey().split(KEY_SEPARATOR); + + CacheExtractedKey key = new CacheExtractedKey(); + + Species species = speciesById.get(keyTokens[0]); + key.setSpecies(species); + + if (!StringUtils.isEmpty(keyTokens[1])) { + QualitativeValueId sex = QualitativeValueId.fromValue(Integer.parseInt(keyTokens[1])); + key.setSex(sex); + } + + if (!StringUtils.isEmpty(keyTokens[2])) { + Boolean maturity = Boolean.parseBoolean(keyTokens[2]); + key.setMaturity(maturity); } + + int lengthStep = Integer.parseInt(keyTokens[3]); + key.setLengthStep(lengthStep); + + key.setSamplingNb(entry.getValue().getSamplingNb()); + + result.add(key); } + } return result; } 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 1514c68..127895d 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 @@ -92,6 +92,7 @@ tutti.service.compressZipFile.error= tutti.service.context.serviceInstanciation.error= tutti.service.cpsExport.error= tutti.service.cpsExport.step.export.species= +tutti.service.cpsExport.step.toFile= tutti.service.csv.caracteristic.qualitativeValue.notFound= tutti.service.csv.parse.entityNotFound= tutti.service.csv.parse.foreignEntityNotFound= 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 e528d17..cd64b5c 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 @@ -84,6 +84,7 @@ tutti.service.compressZipFile.error=Erreur lors de la compression du dossier %1s tutti.service.context.serviceInstanciation.error=Erreur lors de l'instanciation du service %s tutti.service.cpsExport.error=Erreur à l'export du rapport des prélèvements tutti.service.cpsExport.step.export.species=Export des prélèvements pour l'espèce %s +tutti.service.cpsExport.step.toFile= tutti.service.csv.caracteristic.qualitativeValue.notFound=La caractéristique qualitative %s n'a pas de value d'id %s tutti.service.csv.parse.entityNotFound=L'entité de type %1s avec la propriété %2s de valeur %3s n'a pas été trouvée tutti.service.csv.parse.foreignEntityNotFound=L'entité de type %1s avec l'identifiant %3s n'a pas été trouvée -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit d31ed9aa0d320f92e2dd54d6ae7532b0cf2bc5f2 Author: Kevin Morin <morin@codelutin.com> Date: Tue Apr 5 16:58:47 2016 +0200 On prend en compte les prélèvements qui ne rentrent pas dans le protocole (fixes #8157) --- .../service/export/cps/SamplingNumberRowModel.java | 2 +- .../tutti/service/sampling/CacheExtractedKey.java | 6 +- .../service/sampling/CruiseSamplingCache.java | 115 ++++++++++----------- .../sampling/CruiseSamplingCacheLoader.java | 2 +- .../sampling/CruiseSamplingInternalCache.java | 36 +++++-- .../tutti/service/sampling/SamplingEvent.java | 6 +- .../resources/i18n/tutti-service_fr_FR.properties | 5 +- 7 files changed, 87 insertions(+), 85 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java index 8c2bbe6..4bbea86 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java @@ -32,7 +32,7 @@ public class SamplingNumberRowModel extends AbstractTuttiImportExportModel<Cache return String.valueOf(species.getName()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CacheExtractedKey.PROPERTY_LENGTH_STEP, TuttiCsvUtil.PRIMITIVE_INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CacheExtractedKey.PROPERTY_LENGTH_STEP, TuttiCsvUtil.INTEGER); newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maturity"), CacheExtractedKey.PROPERTY_MATURITY, new ValueFormatter<Boolean>() { @Override diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java index 7b9d064..a86bb28 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java @@ -19,17 +19,17 @@ public class CacheExtractedKey implements Serializable { public static final String PROPERTY_MAX_BY_LENGTH_STEP = "maxByLengthStep"; protected Species species; - protected int lengthStep; + protected Integer lengthStep; protected Boolean maturity; protected QualitativeValueId sex; protected int samplingNb; protected Integer maxByLengthStep; - public int getLengthStep() { + public Integer getLengthStep() { return lengthStep; } - public void setLengthStep(int lengthStep) { + public void setLengthStep(Integer lengthStep) { this.lengthStep = lengthStep; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index cc370bd..773297f 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -200,8 +200,8 @@ public class CruiseSamplingCache implements Closeable { Boolean maturity = getMaturity(individualObservationBatch); - float lengthStep = individualObservationBatch.getSize(); - int lengthStepInMm = Numbers.convertToMm(lengthStep, individualObservationBatch.getLengthStepCaracteristic().getUnit()); + Float lengthStep = individualObservationBatch.getSize(); + Integer lengthStepInMm = lengthStep == null ? null : Numbers.convertToMm(lengthStep, individualObservationBatch.getLengthStepCaracteristic().getUnit()); CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); @@ -263,7 +263,7 @@ public class CruiseSamplingCache implements Closeable { Species species, CaracteristicQualitativeValue gender, Boolean maturity, - int lengthStep) { + Integer lengthStep) { Objects.requireNonNull(fishingOperationId); Objects.requireNonNull(species); @@ -363,7 +363,7 @@ public class CruiseSamplingCache implements Closeable { Species species, CaracteristicQualitativeValue gender, Boolean maturity, - int lengthStep, + Integer lengthStep, String samplingCode) { Objects.requireNonNull(fishingOperationId); @@ -371,31 +371,28 @@ public class CruiseSamplingCache implements Closeable { Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); - if (cpsDefinitionOpt.isPresent()) { - - CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); - - if (!cpsDefinition.isSex()) { - gender = null; - } - String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + if (cpsDefinitionOpt.isPresent() && !cpsDefinitionOpt.get().isSex()) { + gender = null; + } + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - int totalSamplingNb = totalCruiseCache.incrementSamplingNb(samplingKey); + int totalSamplingNb = totalCruiseCache.incrementSamplingNb(samplingKey); - int zoneSamplingNb = 0; - if (optionalZone.isPresent()) { - String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); - zoneSamplingNb = zoneCache.incrementSamplingNb(zoneKey); - } - String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + int zoneSamplingNb = 0; + if (optionalZone.isPresent()) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); + zoneSamplingNb = zoneCache.incrementSamplingNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); - int operationSamplingNb = operationCache.incrementSamplingNb(operationKey); + int operationSamplingNb = operationCache.incrementSamplingNb(operationKey); - if (log.isInfoEnabled()) { - log.info("add Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); - } + if (log.isInfoEnabled()) { + log.info("add Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + } - SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + if (cpsDefinitionOpt.isPresent()) { + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinitionOpt.get(), optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); fireResumeUpdated(event); } @@ -574,31 +571,29 @@ public class CruiseSamplingCache implements Closeable { Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); - if (cpsDefinitionOpt.isPresent()) { - - CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); + if (cpsDefinitionOpt.isPresent() && !cpsDefinitionOpt.get().isSex()) { + gender = null; + } + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - if (!cpsDefinition.isSex()) { - gender = null; - } - String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + int totalSamplingNb = totalCruiseCache.decrementSamplingNb(samplingKey); - int totalSamplingNb = totalCruiseCache.decrementSamplingNb(samplingKey); + int zoneSamplingNb = 0; + if (optionalZone.isPresent()) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); + zoneSamplingNb = zoneCache.decrementSamplingNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); - int zoneSamplingNb = 0; - if (optionalZone.isPresent()) { - String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); - zoneSamplingNb = zoneCache.decrementSamplingNb(zoneKey); - } - String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); - int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); + if (log.isInfoEnabled()) { + log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + } - if (log.isInfoEnabled()) { - log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); - } + if (cpsDefinitionOpt.isPresent()) { - SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinitionOpt.get(), optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); fireResumeUpdated(event); } @@ -671,7 +666,10 @@ public class CruiseSamplingCache implements Closeable { listeners.remove(SamplingListener.class, listener); } - public Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, float lengthStep) { + public Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, Integer lengthStep) { + if (lengthStep == null) { + return Optional.empty(); + } Collection<CalcifiedPiecesSamplingDefinition> cpsDefinitions = cpsDefinitionsBySpecies.get(species.getReferenceTaxonId()); return cpsDefinitions.stream() .filter(cpsDef -> Objects.equals(cpsDef.getMaturity(), maturity) @@ -749,25 +747,16 @@ public class CruiseSamplingCache implements Closeable { // return highestSamplingCodeBySpecies.compute(speciesId, // (key, highestSamplingCode) -> highestSamplingCode == null ? code : Math.max(highestSamplingCode, code)); - MutableInt samplingCodeFound = highestSamplingCodeBySpecies.get(speciesId); - if (samplingCodeFound == null) { - samplingCodeFound = new MutableInt(code); - highestSamplingCodeBySpecies.put(speciesId, samplingCodeFound); - } else { - samplingCodeFound.setValue(Math.max(samplingCodeFound.intValue(), code)); - } - return samplingCodeFound.intValue(); - // Ce code ne compile pas. -// return highestSamplingCodeBySpecies.compute(speciesId, -// (key, highestSamplingCode) -> { -// if (highestSamplingCode == null) { -// highestSamplingCode = new MutableInt(code); -// } else { -// int nexValue = Math.max(highestSamplingCode.intValue(), code); -// highestSamplingCode.setValue(nexValue); -// } -// return highestSamplingCode; -// }); + return highestSamplingCodeBySpecies.compute(speciesId, + (key, highestSamplingCode) -> { + if (highestSamplingCode == null) { + highestSamplingCode = new MutableInt(code); + } else { + int nexValue = Math.max(highestSamplingCode.intValue(), code); + highestSamplingCode.setValue(nexValue); + } + return highestSamplingCode; + }).intValue(); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java index 6406a1a..ad42381 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java @@ -95,7 +95,7 @@ public class CruiseSamplingCacheLoader { Optional<Zone> optionalZone = cruiseSamplingCache.tryFindZone(fishingOperation); - allIndividualObservationBatchsForFishingOperation.stream().filter(obs -> obs.getSize() != null).forEach( + allIndividualObservationBatchsForFishingOperation.stream().filter(obs -> obs.getSize() != null || obs.getSamplingCode() != null).forEach( individualObservationBatch -> cruiseSamplingCache.addIndividualObservation(fishingOperationId, optionalZone, individualObservationBatch)); }); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java index a92541a..de97c1a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java @@ -56,10 +56,10 @@ class CruiseSamplingInternalCache implements Closeable { private static final String KEY_SEPARATOR = "#"; - public static String createSamplingKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, int lengthStep) { + public static String createSamplingKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, Integer lengthStep) { Objects.requireNonNull(species); return species.getReferenceTaxonId() + KEY_SEPARATOR + (gender == null ? "" : gender.getId()) + - KEY_SEPARATOR + (maturity == null ? "" : maturity.toString()) + KEY_SEPARATOR + lengthStep; + KEY_SEPARATOR + (maturity == null ? "" : maturity.toString()) + KEY_SEPARATOR + (lengthStep == null ? "" : lengthStep.intValue()); } public static String addPrefixKey(Serializable prefix, String key) { @@ -193,21 +193,35 @@ class CruiseSamplingInternalCache implements Closeable { CacheExtractedKey key = new CacheExtractedKey(); - Species species = speciesById.get(keyTokens[0]); + int i = 0; + String nextToken = keyTokens[i++]; + + Species species = speciesById.get(nextToken); key.setSpecies(species); - if (!StringUtils.isEmpty(keyTokens[1])) { - QualitativeValueId sex = QualitativeValueId.fromValue(Integer.parseInt(keyTokens[1])); - key.setSex(sex); + if (i < keyTokens.length) { + nextToken = keyTokens[i++]; + if (!StringUtils.isEmpty(nextToken)) { + QualitativeValueId sex = QualitativeValueId.fromValue(Integer.parseInt(nextToken)); + key.setSex(sex); + } } - if (!StringUtils.isEmpty(keyTokens[2])) { - Boolean maturity = Boolean.parseBoolean(keyTokens[2]); - key.setMaturity(maturity); + if (i < keyTokens.length) { + nextToken = keyTokens[i++]; + if (!StringUtils.isEmpty(nextToken)) { + Boolean maturity = Boolean.parseBoolean(nextToken); + key.setMaturity(maturity); + } } - int lengthStep = Integer.parseInt(keyTokens[3]); - key.setLengthStep(lengthStep); + if (i < keyTokens.length) { + nextToken = keyTokens[i++]; + if (!StringUtils.isEmpty(nextToken)) { + Integer lengthStep = Integer.parseInt(nextToken); + key.setLengthStep(lengthStep); + } + } key.setSamplingNb(entry.getValue().getSamplingNb()); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java index dc53227..17a7fa3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java @@ -37,7 +37,7 @@ import java.util.Optional; */ public class SamplingEvent extends EventObject { - protected final float lengthStep; + protected final Integer lengthStep; protected final CaracteristicQualitativeValue gender; @@ -53,7 +53,7 @@ public class SamplingEvent extends EventObject { protected final int nbSamplingForOperation; - public SamplingEvent(CruiseSamplingCache source, float lengthStep, CaracteristicQualitativeValue gender, Boolean maturity, + public SamplingEvent(CruiseSamplingCache source, Integer lengthStep, CaracteristicQualitativeValue gender, Boolean maturity, CalcifiedPiecesSamplingDefinition cpsDef, Optional<Zone> zone, int nbSamplingForCruise, int nbSamplingForZone, int nbSamplingForOperation) { super(source); this.lengthStep = lengthStep; @@ -66,7 +66,7 @@ public class SamplingEvent extends EventObject { this.nbSamplingForOperation = nbSamplingForOperation; } - public float getLengthStep() { + public Integer getLengthStep() { return lengthStep; } 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 cd64b5c..7eea13f 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 @@ -83,8 +83,7 @@ tutti.service.calcifiedPiecesSamplingReport.header.surveyCode=Code campagne tutti.service.compressZipFile.error=Erreur lors de la compression du dossier %1s dans le fichier %2s tutti.service.context.serviceInstanciation.error=Erreur lors de l'instanciation du service %s tutti.service.cpsExport.error=Erreur à l'export du rapport des prélèvements -tutti.service.cpsExport.step.export.species=Export des prélèvements pour l'espèce %s -tutti.service.cpsExport.step.toFile= +tutti.service.cpsExport.step.toFile=Ecriture des données dans le fichier %s tutti.service.csv.caracteristic.qualitativeValue.notFound=La caractéristique qualitative %s n'a pas de value d'id %s tutti.service.csv.parse.entityNotFound=L'entité de type %1s avec la propriété %2s de valeur %3s n'a pas été trouvée tutti.service.csv.parse.foreignEntityNotFound=L'entité de type %1s avec l'identifiant %3s n'a pas été trouvée @@ -305,7 +304,7 @@ tutti.service.protocol.export.caracteristics.protocol.error=Erreur lors de l'exp tutti.service.protocol.export.cps.error=Erreur lors de l'export de l'algorithme de prélèvements des pièces calcifiées dans le fichier %s tutti.service.protocol.export.species.error=Erreur lors de l'export des espèces dans le fichier %s tutti.service.protocol.import.benthos.error=Erreur lors de l'import du benthos du protocole %1s du fichier %2s -tutti.service.protocol.import.cps.error= +tutti.service.protocol.import.cps.error=Erreur lors de l'import de l'algorithme de prélèvements des pièces calcifiées dans le protocole %s depuis le fichier %s tutti.service.protocol.import.cps.interval.error=Erreur sur la ligne espèces %s (%s) taille minimale attendue \: %s, réelle \: %s tutti.service.protocol.import.cps.maturity.error=Erreur sur la maturité pour l'espèces %s tutti.service.protocol.import.species.error=Erreur lors de l'import des espèces du protocole %1s du fichier %2s -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm