This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit d2fde3ea96cd590242dfd45bf8a59450075d9e6f Author: Kevin Morin <morin@codelutin.com> Date: Thu Mar 24 11:32:46 2016 +0100 gestion des maturités dans l'algo de prélèvement (fixes #8109) --- .../service/samplingCache/CruiseSamplingCache.java | 23 +++++++---- .../samplingCache/CruiseSamplingCacheLoader.java | 5 +-- .../IndividualObservationBatchRowModel.java | 21 ++++++++-- .../IndividualObservationBatchTableModel.java | 11 ++++++ .../frequency/IndividualObservationUICache.java | 18 +++++---- .../frequency/SpeciesFrequencyUIHandler.java | 45 +++++++++++++--------- ...yCaracteristicPopupUIModel-error-validation.xml | 2 +- .../resources/i18n/tutti-ui-swing_fr_FR.properties | 5 ++- 8 files changed, 88 insertions(+), 42 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCache.java index cd13e9b..011aec1 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCache.java @@ -27,6 +27,7 @@ package fr.ifremer.tutti.service.samplingCache; import com.google.common.base.MoreObjects; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; @@ -48,8 +49,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; /** * @author Kevin Morin (Code Lutin) @@ -109,7 +108,7 @@ public class CruiseSamplingCache implements Closeable { */ private boolean loading; - public CruiseSamplingCache(Integer cruiseId, TuttiProtocol protocol, Caracteristic sexCaracteristic, Collection<Caracteristic> allCaracteristics) { + public CruiseSamplingCache(Integer cruiseId, TuttiProtocol protocol, Caracteristic sexCaracteristic, Collection<Caracteristic> maturityCaracteristics) { this.cruiseId = cruiseId; this.sexCaracteristic = sexCaracteristic; this.protocolId = protocol.getId(); @@ -117,13 +116,13 @@ public class CruiseSamplingCache implements Closeable { locationIdsPerZone = HashMultimap.create(); protocol.getZone().forEach(zone -> locationIdsPerZone.putAll(zone, Zones.getAllLocationIds(zone))); - Map<String, Caracteristic> caracteristicsById = allCaracteristics.stream().collect(Collectors.toMap(Caracteristic::getId, Function.identity())); + Map<String, Caracteristic> maturityCaracteristicsById = TuttiEntities.splitById(maturityCaracteristics); protocol.getSpecies().forEach(speciesProtocol -> { cpsDefinitionsBySpecies.putAll(speciesProtocol.getSpeciesReferenceTaxonId(), speciesProtocol.getCalcifiedPiecesSamplingDefinition()); maturityCaracteristicBySpecies.put(speciesProtocol.getSpeciesReferenceTaxonId(), - caracteristicsById.get(speciesProtocol.getMaturityPmfmId())); + maturityCaracteristicsById.get(speciesProtocol.getMaturityPmfmId())); }); protocol.getMaturityCaracteristics().forEach(mc -> matureStatesByMaturityCracteristic.putAll(mc.getId(), mc.getMatureStateIds())); @@ -311,7 +310,7 @@ public class CruiseSamplingCache implements Closeable { Species species = individualObservationBatch.getSpecies(); Objects.requireNonNull(species); - Boolean maturity = null; + Boolean maturity = getMaturity(individualObservationBatch); Float lengthStep = individualObservationBatch.getSize(); Objects.requireNonNull(lengthStep); CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); @@ -514,7 +513,7 @@ public class CruiseSamplingCache implements Closeable { protected Boolean getMaturity(IndividualObservationBatch individualObservationBatch) { Boolean maturity = null; - Caracteristic maturityCaracteristic = maturityCaracteristicBySpecies.get(individualObservationBatch.getSpecies().getIdAsInt()); + Caracteristic maturityCaracteristic = maturityCaracteristicBySpecies.get(individualObservationBatch.getSpecies().getReferenceTaxonId()); // if a maturity caracteristic is defined in the protocol for this species if (maturityCaracteristic != null) { CaracteristicQualitativeValue qualitativeValue = individualObservationBatch.getCaracteristics().getQualitativeValue(maturityCaracteristic); @@ -525,4 +524,14 @@ public class CruiseSamplingCache implements Closeable { } return maturity; } + + public Boolean getMaturity(Integer speciesId, Optional<CaracteristicQualitativeValue> maturityQualitativeValue) { + Boolean maturity = null; + Optional<Caracteristic> maturityCaracteristic = Optional.ofNullable(maturityCaracteristicBySpecies.get(speciesId)); + if (maturityCaracteristic.isPresent() && maturityQualitativeValue.isPresent()) { + maturity = matureStatesByMaturityCracteristic.containsEntry(maturityCaracteristic.get().getId(), maturityQualitativeValue.get().getId()); + } + return maturity; + } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCacheLoader.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCacheLoader.java index 6bc75df..44354f5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCacheLoader.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCacheLoader.java @@ -45,10 +45,9 @@ public class CruiseSamplingCacheLoader { Caracteristic sexCaracteristic = persistenceService.getSexCaracteristic(); - //FIXME il faudrait seulement charger les caracteristiques de maturité du protocole - Collection<Caracteristic> allCaracteristics = persistenceService.getAllCaracteristic(); + Collection<Caracteristic> maturityCaracteristics = persistenceService.getMaturityCaracteristics(persistenceService.getAllCaracteristic()); - CruiseSamplingCache cruiseSamplingCache = new CruiseSamplingCache(cruiseId, protocol, sexCaracteristic, allCaracteristics); + CruiseSamplingCache cruiseSamplingCache = new CruiseSamplingCache(cruiseId, protocol, sexCaracteristic, maturityCaracteristics); cruiseSamplingCache.setLoading(true); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java index f7b2b0d..38ba62b 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java @@ -46,6 +46,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; /** * @author Kevin Morin - kmorin@codelutin.com @@ -87,6 +88,13 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel */ protected final WeightUnit weightUnit; + /** + * Caracteristique de maturité + * + * @since 4.5 + */ + protected Optional<Caracteristic> maturityCaracteristic = Optional.empty(); + protected static final Binder<IndividualObservationBatch, IndividualObservationBatchRowModel> fromBeanBinder = BinderFactory.newBinder(IndividualObservationBatch.class, IndividualObservationBatchRowModel.class); @@ -430,8 +438,15 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel return (CaracteristicQualitativeValue) getCaracteristicValue(sexCaracteristic); } - // FIXME Add it. - public Boolean getMaturityState() { - return null; + public Optional<Caracteristic> getMaturityCaracteristic() { + return maturityCaracteristic; + } + + public void setMaturityCaracteristic(Optional<Caracteristic> maturityCaracteristic) { + this.maturityCaracteristic = maturityCaracteristic; + } + + public Optional<CaracteristicQualitativeValue> getMaturityState() { + return Optional.ofNullable((CaracteristicQualitativeValue) getCaracteristicValue(maturityCaracteristic.get())); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java index 8161804..43a1c8c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java @@ -38,6 +38,7 @@ import javax.swing.event.TableColumnModelEvent; import javax.swing.event.TableColumnModelListener; import java.io.Serializable; import java.util.Collection; +import java.util.Optional; import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.n; @@ -93,6 +94,8 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab protected Caracteristic lengthstepCaracteristic; + protected Optional<Caracteristic> maturityCaracteristic; + public IndividualObservationBatchTableModel(WeightUnit weightUnit, Collection<Caracteristic> defaultCaracteristicsSet, TableColumnModelExt columnModel) { @@ -143,6 +146,13 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } } + public void setMaturityCaracteristic(Optional<Caracteristic> maturityCaracteristic) { + this.maturityCaracteristic = maturityCaracteristic; + if (rows != null) { + rows.forEach(row -> row.setLengthStepCaracteristic(lengthstepCaracteristic)); + } + } + public void setDefaultCaracteristicValues(CaracteristicMap defaultCaracteristicValues) { defaultCaracteristicsMap.replaceAll( (caracteristic, serializable) -> defaultCaracteristicValues.get(caracteristic) @@ -159,6 +169,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab result.setRankOrder(getRowCount() + 1); result.setSpecies(species); result.setLengthStepCaracteristic(lengthstepCaracteristic); + result.setMaturityCaracteristic(maturityCaracteristic); return result; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java index c5fec05..80447c6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java @@ -198,11 +198,11 @@ public class IndividualObservationUICache implements Closeable { /** * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. * - * @param gender le sexe - * @param maturity l'état de maturité - * @param lengthStep la classe de taille + * @param gender le sexe + * @param maturityQualitativeValue l'état de maturité + * @param lengthStep la classe de taille */ - public void increments(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { + public void increments(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, float lengthStep) { if (!on) { if (log.isDebugEnabled()) { @@ -211,6 +211,7 @@ public class IndividualObservationUICache implements Closeable { return; } + Boolean maturity = samplingCache.get().getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); samplingCache.get().addIndividualObservation(fishingOperation, species, gender, @@ -232,11 +233,11 @@ public class IndividualObservationUICache implements Closeable { /** * Retire une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. * - * @param gender le sexe - * @param maturity l'état de maturité - * @param lengthStep la classe de taille + * @param gender le sexe + * @param maturityQualitativeValue l'état de maturité + * @param lengthStep la classe de taille */ - public void decrements(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { + public void decrements(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, float lengthStep) { if (!on) { if (log.isDebugEnabled()) { @@ -245,6 +246,7 @@ public class IndividualObservationUICache implements Closeable { return; } + Boolean maturity = samplingCache.get().getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); samplingCache.get().removeIndividualObservation(fishingOperation, species, gender, diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index 9d8baac..4ee18a5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -217,6 +217,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci String propertyName = evt.getPropertyName(); CaracteristicQualitativeValue gender = row.getGender(sexCaracteristic); + Optional<CaracteristicQualitativeValue> maturity = row.getMaturityState(); // we only update the frequencies if the row is valid if (row.isValid()) { @@ -230,10 +231,10 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Float newValue = (Float) evt.getNewValue(); if (oldValue != null) { - individualObservationUICache.decrements(gender, null, oldValue); + individualObservationUICache.decrements(gender, maturity, oldValue); } if (newValue != null) { - individualObservationUICache.increments(gender, null, newValue); + individualObservationUICache.increments(gender, maturity, newValue); } if (getModel().mustCopyIndividualObservationSize()) { @@ -277,18 +278,21 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci CaracteristicMap oldValue = (CaracteristicMap) evt.getOldValue(); CaracteristicMap newValue = (CaracteristicMap) evt.getNewValue(); - Boolean maturity = null; + if (log.isInfoEnabled()) { + log.info("caracteristics changed"); + } -// if (maturityColumnId.isPresent()) { -// Caracteristic maturityCaracteristic = maturityColumnId.get().getCaracteristic(); -// CaracteristicQualitativeValue oldMaturity = (CaracteristicQualitativeValue) oldValue.get(maturityCaracteristic); -// CaracteristicQualitativeValue newMaturityr = (CaracteristicQualitativeValue) newValue.get(maturityCaracteristic); -// if (!Objects.equals(oldMaturity, newMaturityr)) { -// individualObservationUICache.decrements(oldGender, null, row.getSize()); -// individualObservationUICache.increments(newGender, null, row.getSize()); -// } -// -// } + if (row.getMaturityCaracteristic().isPresent()) { + Optional<CaracteristicQualitativeValue> oldMaturity = Optional.ofNullable((CaracteristicQualitativeValue) oldValue.get(row.getMaturityCaracteristic().get())); + Optional<CaracteristicQualitativeValue> newMaturity = Optional.ofNullable((CaracteristicQualitativeValue) newValue.get(row.getMaturityCaracteristic().get())); + if (log.isInfoEnabled()) { + log.info("maturities : " + oldMaturity + " " + newMaturity); + } + if (!Objects.equals(oldMaturity, newMaturity)) { + individualObservationUICache.decrements(gender, oldMaturity, row.getSize()); + individualObservationUICache.increments(gender, newMaturity, row.getSize()); + } + } CaracteristicQualitativeValue oldGender = (CaracteristicQualitativeValue) oldValue.get(sexCaracteristic); CaracteristicQualitativeValue newGender = (CaracteristicQualitativeValue) newValue.get(sexCaracteristic); @@ -309,13 +313,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (oldValue && getModel().mustCopyIndividualObservationSize()) { updateFrequencyRowsNumbers(row.getSize(), null); - individualObservationUICache.decrements(gender, null, row.getSize()); + individualObservationUICache.decrements(gender, maturity, row.getSize()); } if (newValue) { if (getModel().mustCopyIndividualObservationSize()) { updateFrequencyRowsNumbers(null, row.getSize()); if (row.withSize()) { - individualObservationUICache.increments(gender, null, row.getSize()); + individualObservationUICache.increments(gender, maturity, row.getSize()); } } if (getModel().mustCopyIndividualObservationWeight()) { @@ -943,9 +947,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Optional<Caracteristic> maturityCaracteristic = speciesMaturityPmfmId.map(maturityCaracteristics::get); - if (maturityCaracteristic.isPresent()) { - addMaturityCaracteristicColumnToModel(maturityCaracteristic.get()); - } + setMaturityCaracteristic(maturityCaracteristic); // // try to load existing individual observations @@ -1576,6 +1578,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getSamplingResumeLabel().setText(null); } + public void setMaturityCaracteristic(Optional<Caracteristic> maturityCaracteristic) { + getObsTableModel().setMaturityCaracteristic(maturityCaracteristic); + if (maturityCaracteristic.isPresent()) { + addMaturityCaracteristicColumnToModel(maturityCaracteristic.get()); + } + } + protected void addMaturityCaracteristicColumnToModel(Caracteristic caracteristic) { Decorator<Caracteristic> caracteristicDecorator = diff --git a/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/maturity/EditMaturityCaracteristicPopupUIModel-error-validation.xml b/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/maturity/EditMaturityCaracteristicPopupUIModel-error-validation.xml index 610f47c..afff6e5 100644 --- a/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/maturity/EditMaturityCaracteristicPopupUIModel-error-validation.xml +++ b/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/maturity/EditMaturityCaracteristicPopupUIModel-error-validation.xml @@ -33,7 +33,7 @@ <![CDATA[ hasMatureValues() && hasImmatureValues() ]]> </param> <message> - tutti.validator.error.maturityCaracteristicEditor.dialog.qualitativeValues.bithStates + tutti.validator.error.maturityCaracteristicEditor.dialog.qualitativeValues.bothStates </message> </field-validator> </field> 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 d1a9c34..1dfec08 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 @@ -1505,8 +1505,8 @@ tutti.editSpeciesFrequencies.label.no.configuration=< Pas de configuration > tutti.editSpeciesFrequencies.logTable.header.label=Logs tutti.editSpeciesFrequencies.logTable.removeRow.confirm.message=Êtes-vous sûr de vouloir supprimer la mesure %s ? tutti.editSpeciesFrequencies.logTable.removeRow.confirm.title=Suppression d'une mesure -tutti.editSpeciesFrequencies.samplingNeeded.immature= -tutti.editSpeciesFrequencies.samplingNeeded.mature= +tutti.editSpeciesFrequencies.samplingNeeded.immature=Immature +tutti.editSpeciesFrequencies.samplingNeeded.mature=Mature tutti.editSpeciesFrequencies.samplingNeeded.max=max tutti.editSpeciesFrequencies.samplingNeeded.resume=<html><body><strong>%s</strong> \: trait \: %s | zone \: %s | campagne \: %s tutti.editSpeciesFrequencies.samplingNeeded.warning=<html><body><strong>Prélevez les pièces calcifiées \!</body></html> @@ -2348,6 +2348,7 @@ tutti.validator.error.longitude.end.required=La longitude de fin de traîne est tutti.validator.error.longitude.minute.outOfBounds=La minute de la longitude doit être comprise entre 0 et 59 tutti.validator.error.longitude.second.outOfBounds=La seconde de la longitude doit être comprise entre 0 et 59 tutti.validator.error.longitude.start.required=La longitude de début de traîne est obligatoire +tutti.validator.error.maturityCaracteristicEditor.dialog.qualitativeValues.bothStates= tutti.validator.error.maturityCaracteristics.statesNotDefined=Les états de maturités doivent être définis pour toutes les caractéristiques de maturités tutti.validator.error.program.zone.required=La zone de la série est obligatoire tutti.validator.error.replaceTemporaryReferential.source.required=Un référentiel temporaire doit être sélectionné -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.