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 c3169952215774d51b261d78c8d3f51b38cd55bb Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Apr 21 20:38:11 2016 +0200 Utilisation de la requete sur le cache d'échantillon + continue à simplifier et assainir le code --- .../IndividualObservationBatchRowModel.java | 21 +- .../IndividualObservationBatchRowState.java | 38 ++- .../IndividualObservationBatchTableHandler.java | 332 +++++++++++------- .../IndividualObservationBatchTableModel.java | 6 +- ...dividualObservationToSamplingCacheResolver.java | 147 ++++++++ .../frequency/IndividualObservationUICache.java | 371 ++++++--------------- .../frequency/SpeciesFrequencyTableModel.java | 4 +- .../frequency/SpeciesFrequencyUIHandler.java | 184 +++++----- .../species/frequency/SpeciesFrequencyUIModel.java | 32 +- .../actions/CancelEditSpeciesFrequencyAction.java | 13 +- .../frequency/actions/EditSampleCodeAction.java | 52 +-- .../frequency/actions/RemoveObservationAction.java | 8 +- .../actions/ResetSpeciesFrequencyAction.java | 8 +- 13 files changed, 642 insertions(+), 574 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java index 8244875..4809cea 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java @@ -60,8 +60,6 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel public static final String PROPERTY_DEFAULT_CARACTERISTICS = "defaultCaracteristics"; - public static final String PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE = "individualObservationBatchRowState"; - /** * Delegate edit object. * @@ -255,13 +253,8 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel @Override public void setWeight(Float weight) { Float oldValue = getWeight(); - IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(getSize(), oldValue, computeValid()); editObject.setWeight(weight); firePropertyChange(PROPERTY_WEIGHT, oldValue, weight); - - IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(getSize(), weight, computeValid()); - firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE, oldState, newState); - } public boolean withWeight() { @@ -288,14 +281,8 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel @Override public void setSize(Float size) { Float oldValue = getSize(); - IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(oldValue, getWeight(), computeValid()); - editObject.setSize(size); firePropertyChange(PROPERTY_SIZE, oldValue, size); - - IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(size, getWeight(), computeValid()); - firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE, oldState, newState); - } public boolean withSize() { @@ -485,10 +472,14 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel } public boolean computeValid() { + return computeValid(withSize(), withWeight()); + } + + public boolean computeValid(boolean withSize, boolean withWeight) { CopyIndividualObservationMode copyIndividualObservationMode = getCopyIndividualObservationMode(); return copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING - || (copyIndividualObservationMode == CopyIndividualObservationMode.SIZE && withSize()) - || (copyIndividualObservationMode == CopyIndividualObservationMode.ALL && withSize() && withWeight()); + || (copyIndividualObservationMode == CopyIndividualObservationMode.SIZE && withSize) + || (copyIndividualObservationMode == CopyIndividualObservationMode.ALL && withSize && withWeight); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowState.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowState.java index 8f4085b..23365ec 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowState.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowState.java @@ -1,6 +1,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import com.google.common.base.MoreObjects; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import java.util.Objects; @@ -16,11 +17,22 @@ public class IndividualObservationBatchRowState { private final Float size; private final Float weight; + private final CaracteristicQualitativeValue maturity; + private final CaracteristicQualitativeValue gender; + private final String samplingCode; private final boolean valid; - public IndividualObservationBatchRowState(Float size, Float weight, boolean valid) { + public IndividualObservationBatchRowState(Float size, + Float weight, + CaracteristicQualitativeValue maturity, + CaracteristicQualitativeValue gender, + String samplingCode, + boolean valid) { this.size = size; this.weight = weight; + this.maturity = maturity; + this.gender = gender; + this.samplingCode = samplingCode; this.valid = valid; } @@ -36,13 +48,32 @@ public class IndividualObservationBatchRowState { return weight; } + public CaracteristicQualitativeValue getMaturity() { + return maturity; + } + + public CaracteristicQualitativeValue getGender() { + return gender; + } + + public String getSamplingCode() { + return samplingCode; + } + + public boolean withSamplingCode() { + return samplingCode != null; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; IndividualObservationBatchRowState that = (IndividualObservationBatchRowState) o; return Objects.equals(size, that.size) && - Objects.equals(weight, that.weight); + Objects.equals(weight, that.weight) && + Objects.equals(maturity, that.maturity) && + Objects.equals(gender, that.gender) && + Objects.equals(samplingCode, that.samplingCode); } @Override @@ -55,6 +86,9 @@ public class IndividualObservationBatchRowState { return MoreObjects.toStringHelper(this) .add("size", size) .add("weight", weight) + .add("maturity", maturity) + .add("gender", gender) + .add("samplingCode", samplingCode) .add("valid", valid) .toString(); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java index b7140b6..91f6ae8 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java @@ -5,15 +5,16 @@ import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.SampleCategory; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.cruise.CruiseCache; +import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingCacheRequest; import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SamplingCodeCellEditor; @@ -46,6 +47,7 @@ import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; import java.io.Closeable; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -53,6 +55,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.function.Function; import static org.nuiton.i18n.I18n.t; import static org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler.CONFIRMATION_FORMAT; @@ -69,7 +72,6 @@ public class IndividualObservationBatchTableHandler implements Closeable { /** Logger. */ private static final Log log = LogFactory.getLog(IndividualObservationBatchTableHandler.class); - private final SpeciesFrequencyUI ui; private final SpeciesFrequencyUIHandler uiHandler; private final JXTable individualObservationTable; @@ -84,16 +86,108 @@ public class IndividualObservationBatchTableHandler implements Closeable { private ColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId; /** - * Added on each individual observation row in the dedicated table. - * Notify each time a modification is done on a such row. + * Pour écouter le changement de la taille sur une ligne. */ - private final PropertyChangeListener individualObservationRowChangedListener; + private final PropertyChangeListener individualObservationRowSizeChangedListener; + private final PropertyChangeListener individualObservationRowWeightChangedListener; + private final PropertyChangeListener individualObservationRowSamplingCodeChangedListener; + private final PropertyChangeListener individualObservationRowCaracteristicsChangedListener; private final IndividualObservationToFrequencyEngine individualObservationToFrequencyEngine; + private final IndividualObservationToSamplingCacheResolver individualObservationToSamplingCacheResolver; + + private final Function<IndividualObservationBatchRowModel, Void> installListenersOnRow = new Function<IndividualObservationBatchRowModel, Void>() { + @Override + public Void apply(IndividualObservationBatchRowModel row) { + row.addPropertyChangeListener(IndividualObservationBatchRowModel.PROPERTY_SIZE, individualObservationRowSizeChangedListener); + row.addPropertyChangeListener(IndividualObservationBatchRowModel.PROPERTY_WEIGHT, individualObservationRowWeightChangedListener); + row.addPropertyChangeListener(IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE, individualObservationRowSamplingCodeChangedListener); + row.addPropertyChangeListener(IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS, individualObservationRowCaracteristicsChangedListener); + row.addPropertyChangeListener(IndividualObservationBatchRowModel.PROPERTY_DEFAULT_CARACTERISTICS, individualObservationRowCaracteristicsChangedListener); + return null; + } + }; + + private void onSamplingRowChanged(IndividualObservationBatchRowModel row, + IndividualObservationBatchRowState oldValue, + IndividualObservationBatchRowState newValue) { + + IndividualObservationToSamplingCacheResolver.SamplingCacheUpdate samplingCacheUpdate = individualObservationToSamplingCacheResolver.computeSamplingCacheUpdate(oldValue, newValue); + + Optional<IndividualObservationSamplingCacheRequest> optionalAddIndividualObservation = samplingCacheUpdate.getAddIndividualObservationRequest(); + if (optionalAddIndividualObservation.isPresent()) { + individualObservationUICache.addIndividualObservation(optionalAddIndividualObservation.get()); + } + Optional<IndividualObservationSamplingCacheRequest> optionalRemoveIndividualObservation = samplingCacheUpdate.getRemoveIndividualObservationRequest(); + if (optionalRemoveIndividualObservation.isPresent()) { + individualObservationUICache.removeIndividualObservation(optionalRemoveIndividualObservation.get()); + } + Optional<IndividualObservationSamplingCacheRequest> optionalAddSampling = samplingCacheUpdate.getAddSamplingRequest(); + if (optionalAddSampling.isPresent()) { + individualObservationUICache.addSampling(optionalAddSampling.get()); + } + Optional<IndividualObservationSamplingCacheRequest> optionalRemoveSampling = samplingCacheUpdate.getRemoveSamplingRequest(); + if (optionalRemoveSampling.isPresent()) { + individualObservationUICache.removeSampling(optionalRemoveSampling.get()); + } + + // recalcul de la zone de notification + model2.getSamplingNotificationZoneModel().setSelectedRow(row); + + } + + private void onRowChangedForFrequencies(IndividualObservationBatchRowModel row, + IndividualObservationBatchRowState oldValue, + IndividualObservationBatchRowState newValue) { + + Optional<IndividualObservationToFrequencyEngine.FrequencyUpdate> optionalFrequencyUpdate = + individualObservationToFrequencyEngine.computeFrequencyUpdate(model.getCopyIndividualObservationMode(), oldValue, newValue); + + if (optionalFrequencyUpdate.isPresent()) { + + IndividualObservationToFrequencyEngine.FrequencyUpdate frequencyUpdate = optionalFrequencyUpdate.get(); + + Optional<Float> optionalDecrementSize = frequencyUpdate.getDecrementSize(); + if (optionalDecrementSize.isPresent()) { + float lengthStepToDecrement = optionalDecrementSize.get(); + frequencyTableModel.decrementFrequencyRowsNumbers(lengthStepToDecrement); + } + + Optional<Float> optionalIncrementSize = frequencyUpdate.getIncrementSize(); + if (optionalIncrementSize.isPresent()) { + float lengthStepToIncrement = optionalIncrementSize.get(); + frequencyTableModel.incrementFrequencyRowsNumbers(lengthStepToIncrement); + } + + Optional<Pair<Float, Float>> optionalSubstractWeight = frequencyUpdate.getSubstractWeight(); + if (optionalSubstractWeight.isPresent()) { + Pair<Float, Float> substractWeight = optionalSubstractWeight.get(); + float weight = substractWeight.getValue(); + float weightToRemove = frequencyTableModel.convertWeightFromIndividualObservation(weight); + frequencyTableModel.removeWeightToFrequencyRow(substractWeight.getKey(), weightToRemove); + } + + Optional<Pair<Float, Float>> optionalAddWeight = frequencyUpdate.getAddWeight(); + if (optionalAddWeight.isPresent()) { + Pair<Float, Float> addWeight = optionalAddWeight.get(); + float weight = addWeight.getValue(); + float weightToAdd = frequencyTableModel.convertWeightFromIndividualObservation(weight); + frequencyTableModel.addWeightToFrequencyRow(addWeight.getKey(), weightToAdd); + } + + } + + if (individualObservationToFrequencyEngine.isValidStateChanged(oldValue, newValue)) { + + // l'état de validité de la ligne a changé, on recalcule les lignes en erreurs + model2.recomputeRowValidState(row); + + } + + } public IndividualObservationBatchTableHandler(SpeciesFrequencyUI ui) { - this.ui = ui; this.model = ui.getModel(); this.model2 = ui.getModel().getIndividualObservationModel(); this.uiHandler = ui.getHandler(); @@ -103,165 +197,148 @@ public class IndividualObservationBatchTableHandler implements Closeable { if (!optionalCruiseCache.isPresent()) { throw new IllegalStateException("Can't find cruise cache"); } - this.individualObservationUICache = new IndividualObservationUICache(optionalCruiseCache.get(), model, dataContext); + TuttiProtocol protocol = dataContext.isProtocolFilled()?dataContext.getProtocol():null; + this.individualObservationUICache = new IndividualObservationUICache(optionalCruiseCache.get(), model, protocol); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model2.getIndividualObservationWeightUnit()); + this.individualObservationToSamplingCacheResolver = new IndividualObservationToSamplingCacheResolver(model); List<Caracteristic> maturityCaracteristics = new ArrayList<>(dataContext.getMaturityCaracteristics()); this.maturityCaracteristics = TuttiEntities.splitById(maturityCaracteristics); - // When any change on any individual observation - this.individualObservationRowChangedListener = evt -> { + // Ecoute quand la taille a changé sur une observation + this.individualObservationRowSizeChangedListener = event -> { - IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); - String propertyName = evt.getPropertyName(); + IndividualObservationBatchRowModel source = (IndividualObservationBatchRowModel) event.getSource(); + Float oldSize = (Float) event.getOldValue(); - CaracteristicQualitativeValue gender = model2.getGender(row); - CaracteristicQualitativeValue maturity = model2.getMaturityValue(row); - boolean recomputeSamplingNotificationZone = false; + Float weight = source.getWeight(); - switch (propertyName) { - case IndividualObservationBatchRowModel.PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE: { + CaracteristicQualitativeValue maturity = model2.getMaturityValue(source); + CaracteristicQualitativeValue gender = model2.getGender(source); - IndividualObservationBatchRowState oldValue = (IndividualObservationBatchRowState) evt.getOldValue(); - IndividualObservationBatchRowState newValue = (IndividualObservationBatchRowState) evt.getNewValue(); + String samplingCode = source.getSamplingCode(); - Optional<IndividualObservationToFrequencyEngine.FrequencyUpdate> optionalFrequencyUpdate = - individualObservationToFrequencyEngine.computeFrequencyUpdate(model.getCopyIndividualObservationMode(), oldValue, newValue); + boolean oldValid = source.computeValid(oldSize != null, weight != null); + boolean newValid = source.computeValid(); - if (optionalFrequencyUpdate.isPresent()) { + IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(oldSize, weight, maturity, gender, samplingCode, oldValid); + IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(source.getSize(), weight, maturity, gender, samplingCode, newValid); + onSamplingRowChanged(source, oldState, newState); + onRowChangedForFrequencies(source, oldState, newState); - IndividualObservationToFrequencyEngine.FrequencyUpdate frequencyUpdate = optionalFrequencyUpdate.get(); + model.recomputeCanEditLengthStep(); + model.setModify(true); - Optional<Float> optionalDecrementSize = frequencyUpdate.getDecrementSize(); - if (optionalDecrementSize.isPresent()) { - float lengthStepToDecrement = optionalDecrementSize.get(); - frequencyTableModel.decrementFrequencyRowsNumbers(lengthStepToDecrement); - individualObservationUICache.decrementsObservationNb(gender, maturity, lengthStepToDecrement, row.getSamplingCode()); - recomputeSamplingNotificationZone = true; - } + }; - Optional<Float> optionalIncrementSize = frequencyUpdate.getIncrementSize(); - if (optionalIncrementSize.isPresent()) { - float lengthStepToIncrement = optionalIncrementSize.get(); - frequencyTableModel.incrementFrequencyRowsNumbers(lengthStepToIncrement); - individualObservationUICache.incrementsObservationNb(gender, maturity, lengthStepToIncrement, row.getSamplingCode()); - recomputeSamplingNotificationZone = true; - } + // Ecoute quand le poids a changé sur une observation + this.individualObservationRowWeightChangedListener = event -> { - Optional<Pair<Float, Float>> optionalSubstractWeight = frequencyUpdate.getSubstractWeight(); - if (optionalSubstractWeight.isPresent()) { - Pair<Float, Float> substractWeight = optionalSubstractWeight.get(); - float weight = substractWeight.getValue(); - float weightToRemove = frequencyTableModel.convertWeightFromIndividualObservation(weight); - frequencyTableModel.removeWeightToFrequencyRow(substractWeight.getKey(), weightToRemove); - } + IndividualObservationBatchRowModel source = (IndividualObservationBatchRowModel) event.getSource(); + if (!source.withSize()) { + return; + } - Optional<Pair<Float, Float>> optionalAddWeight = frequencyUpdate.getAddWeight(); - if (optionalAddWeight.isPresent()) { - Pair<Float, Float> addWeight = optionalAddWeight.get(); - float weight = addWeight.getValue(); - float weightToAdd = frequencyTableModel.convertWeightFromIndividualObservation(weight); - frequencyTableModel.addWeightToFrequencyRow(addWeight.getKey(), weightToAdd); - } + Float oldWeight = (Float) event.getOldValue(); + Float size = source.getSize(); - } + CaracteristicQualitativeValue maturity = model2.getMaturityValue(source); + CaracteristicQualitativeValue gender = model2.getGender(source); - if (individualObservationToFrequencyEngine.isValidStateChanged(oldValue, newValue)) { + String samplingCode = source.getSamplingCode(); - // l'état de validité de la ligne a changé, on recalcule les lignes en erreurs - model2.recomputeRowValidState(row); + boolean oldValid = source.computeValid(size != null, oldWeight != null); + boolean newValid = source.computeValid(); - } + IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(size, oldWeight, maturity, gender, samplingCode, oldValid); + IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(size, source.getWeight(), maturity, gender, samplingCode, newValid); + onSamplingRowChanged(source, oldState, newState); + onRowChangedForFrequencies(source, oldState, newState); - } - break; + model.recomputeCanEditLengthStep(); + model.setModify(true); - case IndividualObservationBatchRowModel.PROPERTY_DEFAULT_CARACTERISTICS: - case IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS: + }; - if (row.withSize()) { + // Ecoute quand le code de prélèvement a changé + this.individualObservationRowSamplingCodeChangedListener = event -> { - CaracteristicMap oldValue = (CaracteristicMap) evt.getOldValue(); - CaracteristicMap newValue = (CaracteristicMap) evt.getNewValue(); + IndividualObservationBatchRowModel source = (IndividualObservationBatchRowModel) event.getSource(); + if (!source.withSize()) { + return; + } - if (log.isInfoEnabled()) { - log.info("caracteristics changed"); - } + String oldSamplingCode = (String) event.getOldValue(); - if (model2.withMaturityCaracteristic()) { - CaracteristicQualitativeValue oldMaturity = model2.getMaturityValue(oldValue); - CaracteristicQualitativeValue newMaturity = model2.getMaturityValue(newValue); - if (log.isInfoEnabled()) { - log.info("maturities : " + oldMaturity + " " + newMaturity); - } - if (!Objects.equals(oldMaturity, newMaturity)) { - individualObservationUICache.decrementsObservationNb(gender, oldMaturity, row.getSize()); - individualObservationUICache.incrementsObservationNb(gender, newMaturity, row.getSize(), row.getSamplingCode()); - recomputeSamplingNotificationZone = true; - } - } + Float size = source.getSize(); + Float weight = source.getWeight(); + CaracteristicQualitativeValue maturity = model2.getMaturityValue(source); + CaracteristicQualitativeValue gender = model2.getGender(source); - CaracteristicQualitativeValue oldGender = model2.getGender(oldValue); - CaracteristicQualitativeValue newGender = model2.getGender(newValue); - if (!Objects.equals(oldGender, newGender)) { - individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); - individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); - recomputeSamplingNotificationZone = true; - } + boolean validState = source.computeValid(); - } + IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(size, weight, maturity, gender, oldSamplingCode, validState); + IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(size, weight, maturity, gender, source.getSamplingCode(), validState); + onSamplingRowChanged(source, oldState, newState); - break; + model.setModify(true); - case IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE: + }; - String oldValue = (String) evt.getOldValue(); - String newValue = (String) evt.getNewValue(); + // Ecoute quand les caractéristiques ont changées + this.individualObservationRowCaracteristicsChangedListener = event -> { - boolean withOldSamplingCode = StringUtils.isNotBlank(oldValue); - boolean withNewSamplingCode = StringUtils.isNotBlank(newValue); + IndividualObservationBatchRowModel source = (IndividualObservationBatchRowModel) event.getSource(); - if (withOldSamplingCode) { - individualObservationUICache.decrementsSamplingCode(oldValue); - } - if (withNewSamplingCode) { - individualObservationUICache.incrementsSamplingCode(newValue); - } + if (!source.withSize()) { + return; + } - if (row.withSize()) { + CaracteristicMap oldCaracteristicMap = (CaracteristicMap) event.getOldValue(); - boolean removeSampling = withOldSamplingCode && !withNewSamplingCode; - boolean addSampling = withNewSamplingCode && !withOldSamplingCode; + CaracteristicQualitativeValue oldGender = model2.getGender(oldCaracteristicMap); + CaracteristicQualitativeValue newGender = model2.getGender(source); - if (removeSampling) { + if (Objects.equals(oldGender, newGender)) { - individualObservationUICache.decrementsSamplingNb(gender, maturity, row.getSize()); - recomputeSamplingNotificationZone = true; + // Le sexe a changé - } else if (addSampling) { + Float size = source.getSize(); + Float weight = source.getWeight(); + CaracteristicQualitativeValue maturity = model2.getMaturityValue(source); + String samplingCode = source.getSamplingCode(); - individualObservationUICache.incrementsSamplingNb(gender, maturity, row.getSize()); - recomputeSamplingNotificationZone = true; + boolean validState = source.computeValid(); - } + IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(size, weight, maturity, oldGender, samplingCode, validState); + IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(size, weight, maturity, newGender, samplingCode, validState); + onSamplingRowChanged(source, oldState, newState); - } + } else if (model2.withMaturityCaracteristic()) { - break; + CaracteristicQualitativeValue oldMaturity = model2.getMaturityValue(oldCaracteristicMap); + CaracteristicQualitativeValue newMaturity = model2.getMaturityValue(source); - } + if (!Objects.equals(oldMaturity, newMaturity)) { - if (recomputeSamplingNotificationZone) { + // La maturité a changée + Float size = source.getSize(); + Float weight = source.getWeight(); + CaracteristicQualitativeValue gender = model2.getGender(source); + String samplingCode = source.getSamplingCode(); - // recalcul de la zone de notification - model2.getSamplingNotificationZoneModel().setSelectedRow(row); - } + boolean validState = source.computeValid(); -// model2.recomputeRowValidState(row); - model.recomputeCanEditLengthStep(); + IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(size, weight, oldMaturity, gender, samplingCode, validState); + IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(size, weight, newMaturity, gender, samplingCode, validState); + onSamplingRowChanged(source, oldState, newState); + + } + + } model.setModify(true); @@ -348,7 +425,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { IndividualObservationBatchTableModel.ATTACHMENT); } - // create obsTable model + // create table model individualObservationTableModel = new IndividualObservationBatchTableModel(individualObservationWeightUnit, model, columnModel); individualObservationTable.setModel(individualObservationTableModel); @@ -394,7 +471,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { case TableModelEvent.INSERT: for (int i = firstRow; i <= lastRow; i++) { IndividualObservationBatchRowModel newRow = individualObservationTableModel.getEntry(i); - newRow.addPropertyChangeListener(individualObservationRowChangedListener); + installListenersOnRow.apply(newRow); if (model.mustCopyIndividualObservationSize() && newRow.withSize()) { @@ -539,6 +616,16 @@ public class IndividualObservationBatchTableHandler implements Closeable { } + public void removeIndividualObservations(Collection<IndividualObservationBatchRowModel> rows) { + + // on supprime les observations individuelles du cache + individualObservationUICache.removeIndividualObservations(rows); + + // on supprime les observations individuelles du model + individualObservationTableModel.removeRows(rows); + + } + protected void removeMaturityColumnIfPresent() { if (maturityColumnId != null) { TableColumnExt maturityColumn = individualObservationTable.getColumnExt(maturityColumnId); @@ -555,7 +642,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { SamplingCodePrefix samplingCodePrefix = new SamplingCodePrefix(uiHandler.getConfig().getSamplingCodePrefix(), uiHandler.decorate(species, DecoratorService.WITH_SURVEY_CODE_NO_NAME)); individualObservationTableModel.setSamplingCodePrefix(samplingCodePrefix); - return individualObservationTableModel.loadRows(individualObservations, individualObservationRowChangedListener); + return individualObservationTableModel.loadRows(individualObservations, installListenersOnRow); } @@ -575,6 +662,8 @@ public class IndividualObservationBatchTableHandler implements Closeable { individualObservationTableModel.setRows(individualObservationRows); model2.recomputeRowsValidateState(); + individualObservationUICache.init(speciesBatch.getSpecies(), model2.getRows()); + } public boolean isSampleCodeMenusEnabled(int modelRowIndex) { @@ -582,11 +671,6 @@ public class IndividualObservationBatchTableHandler implements Closeable { && individualObservationTableModel.getRows().get(individualObservationTable.getSelectedRow()).withSamplingCode(); } - public void initObservationsCache(SpeciesBatchRowModel incomingSpeciesBatch, FishingOperation fishingOperation) { - - individualObservationUICache.init(ui, incomingSpeciesBatch, fishingOperation, model2.getRows()); - - } public IndividualObservationUICache getIndividualObservationUICache() { return individualObservationUICache; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java index 7f74b71..a1eee9d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java @@ -44,6 +44,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.n; @@ -242,7 +243,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } - public List<IndividualObservationBatchRowModel> loadRows(List<IndividualObservationBatchRowModel> individualObservations, PropertyChangeListener individualObservationRowChangedListener) { + public List<IndividualObservationBatchRowModel> loadRows(List<IndividualObservationBatchRowModel> individualObservations, Function<IndividualObservationBatchRowModel, Void> individualObservationRowChangedListener) { List<IndividualObservationBatchRowModel> obsRows = new ArrayList<>(); @@ -266,12 +267,13 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab IndividualObservationBatchRowModel newRow = createNewRow(); newRow.copy(rowModel); newRow.setRankOrder(rankOrder++); - newRow.addPropertyChangeListener(individualObservationRowChangedListener); newRow.setValid(true); model.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); obsRows.add(newRow); + + individualObservationRowChangedListener.apply(newRow); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToSamplingCacheResolver.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToSamplingCacheResolver.java new file mode 100644 index 0000000..2d8b5f8 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToSamplingCacheResolver.java @@ -0,0 +1,147 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import com.google.common.base.MoreObjects; +import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingCacheRequest; + +import java.util.Objects; +import java.util.Optional; + +/** + * Pour déduire depuis une modification sur une observation individuelle, ce qui doit être fait sur le cache + * des prélèvements. + * + * Created on 20/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationToSamplingCacheResolver { + + private final SpeciesFrequencyUIModel speciesFrequencyUIModel; + + public IndividualObservationToSamplingCacheResolver(SpeciesFrequencyUIModel speciesFrequencyUIModel) { + + this.speciesFrequencyUIModel = speciesFrequencyUIModel; + } + + /** + * Ce qui doit être fait sur la table des mensurations suite à une modification d'une observation individuelle. + */ + public static class SamplingCacheUpdate { + + /** + * Pour ajouter une observation individuelle du cache. + */ + private final IndividualObservationSamplingCacheRequest addIndividualObservationRequest; + /** + * Pour supprimer une observation individuelle du cache. + */ + private final IndividualObservationSamplingCacheRequest removeIndividualObservationRequest; + + /** + * Pour ajouter un prélèvement dans le cache. + */ + private final IndividualObservationSamplingCacheRequest addSamplingRequest; + /** + * Pour supprimer un prélèvement du cache. + */ + private final IndividualObservationSamplingCacheRequest removeSamplingRequest; + + public SamplingCacheUpdate(IndividualObservationSamplingCacheRequest addIndividualObservationRequest, + IndividualObservationSamplingCacheRequest removeIndividualObservationRequest, + IndividualObservationSamplingCacheRequest addSamplingRequest, + IndividualObservationSamplingCacheRequest removeSamplingRequest) { + this.addIndividualObservationRequest = addIndividualObservationRequest; + this.removeIndividualObservationRequest = removeIndividualObservationRequest; + this.addSamplingRequest = addSamplingRequest; + this.removeSamplingRequest = removeSamplingRequest; + } + + public Optional<IndividualObservationSamplingCacheRequest> getAddIndividualObservationRequest() { + return Optional.ofNullable(addIndividualObservationRequest); + } + + public Optional<IndividualObservationSamplingCacheRequest> getRemoveIndividualObservationRequest() { + return Optional.ofNullable(removeIndividualObservationRequest); + } + + public Optional<IndividualObservationSamplingCacheRequest> getAddSamplingRequest() { + return Optional.ofNullable(addSamplingRequest); + } + + public Optional<IndividualObservationSamplingCacheRequest> getRemoveSamplingRequest() { + return Optional.ofNullable(removeSamplingRequest); + } + + @Override + public String toString() { + MoreObjects.ToStringHelper toStringHelper = MoreObjects.toStringHelper(this); + if (addIndividualObservationRequest != null) { + toStringHelper.add("addIndividualObservationRequest", addIndividualObservationRequest); + } + if (removeIndividualObservationRequest != null) { + toStringHelper.add("removeIndividualObservationRequest", removeIndividualObservationRequest); + } + if (addSamplingRequest != null) { + toStringHelper.add("addSamplingRequest", addSamplingRequest); + } + if (removeSamplingRequest != null) { + toStringHelper.add("removeSamplingRequest", removeSamplingRequest); + } + return toStringHelper.toString(); + } + + } + + public SamplingCacheUpdate computeSamplingCacheUpdate(IndividualObservationBatchRowState oldState, + IndividualObservationBatchRowState newState) { + + IndividualObservationSamplingCacheRequest addIndividualObservation = null; + IndividualObservationSamplingCacheRequest removeIndividualObservation = null; + IndividualObservationSamplingCacheRequest addSamplingAction = null; + IndividualObservationSamplingCacheRequest removeSamplingAction = null; + + boolean sizeChanged = !Objects.equals(oldState.getSize(), newState.getSize()); + boolean maturityChanged = !Objects.equals(oldState.getMaturity(), newState.getMaturity()); + boolean genderChanged = !Objects.equals(oldState.getGender(), newState.getGender()); + boolean samplingCodeChanged = !Objects.equals(oldState.getSamplingCode(), newState.getSamplingCode()); + + if (sizeChanged || maturityChanged || genderChanged) { + + removeIndividualObservation = toRequest(oldState); + addIndividualObservation = toRequest(newState); + + } else if (samplingCodeChanged) { + + boolean withOldSamplingCode = oldState.withSamplingCode(); + boolean withNewSamplingCode = newState.withSamplingCode(); + + boolean removeSampling = withOldSamplingCode && !withNewSamplingCode; + boolean addSampling = withNewSamplingCode && !withOldSamplingCode; + + if (removeSampling) { + + removeSamplingAction = toRequest(oldState); + + } else if (addSampling) { + + addSamplingAction = toRequest(newState); + + } + + } + + return new SamplingCacheUpdate(addIndividualObservation, removeIndividualObservation, addSamplingAction, removeSamplingAction); + + } + + private IndividualObservationSamplingCacheRequest toRequest(IndividualObservationBatchRowState state) { + + return new IndividualObservationSamplingCacheRequest(speciesFrequencyUIModel.getFishingOperation(), + speciesFrequencyUIModel.getBatch().getSpecies(), + speciesFrequencyUIModel.getLengthStepInMm(state.getSize()), + state.getMaturity(), + state.getGender(), + state.getSamplingCode()); + } + +} 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 f487a6a..5652ecf 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 @@ -24,26 +24,23 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; * #L% */ -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.Zone; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; -import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.cruise.CruiseCache; import fr.ifremer.tutti.service.sampling.CalcifiedPiecesSamplingAlgorithmEntryNotFoundException; import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; +import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingCacheRequest; import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingStatus; import fr.ifremer.tutti.service.sampling.SamplingCodeCache; import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; import fr.ifremer.tutti.service.sampling.SizeNotDefinedOnIndividualObservationException; import fr.ifremer.tutti.service.sampling.ZoneNotDefinedOnFishingOperationException; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.io.Closeable; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -75,10 +72,8 @@ public class IndividualObservationUICache implements Closeable { private final SpeciesFrequencyUIModel uiModel; private final IndividualObservationBatchUIModel individualObservationModel; - private FishingOperation fishingOperation; private Zone fishingOperationZone; - private SpeciesBatchRowModel speciesEditRow; - private Species species; + private Integer speciesReferenceTaxonId; /** * Contient les codes de prélèvements qu'on sait non utilisables. @@ -92,70 +87,30 @@ public class IndividualObservationUICache implements Closeable { * Dès qu'un code de prélèvement est ajouté ou modifié dans l'écran, on l'ajoute ici. */ private final Set<Integer> samplingCodesAvailable = new TreeSet<>(); - /** - * Est-ce que le cache est actif ? - */ - private boolean on; - public IndividualObservationUICache(CruiseCache cruiseCache, SpeciesFrequencyUIModel uiModel, TuttiDataContext tuttiDataContext) { + public IndividualObservationUICache(CruiseCache cruiseCache, SpeciesFrequencyUIModel uiModel, TuttiProtocol protocol) { this.useCruiseSamplingCache = cruiseCache.useSamplingCache(); this.cruiseSamplingCache = cruiseCache.getSamplingCruiseCache().orElse(null); this.samplingCodeCache = cruiseCache.getSamplingCodeCache(); this.uiModel = uiModel; this.individualObservationModel = uiModel.getIndividualObservationModel(); - this.protocolFilled = tuttiDataContext.isProgramFilled(); - this.protocolUseCalcifiedPieceSampling = protocolFilled && tuttiDataContext.getProtocol().isUseCalcifiedPieceSampling(); - - // Ecoute sur le modèle de l'ui pour savoir quand on peut activer le cache (i.e uand le modèle n'est pas en construction) - this.uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INIT_BATCH_EDITION, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - - Boolean newValue = (Boolean) evt.getNewValue(); - if (newValue) { - - // model is loading, - on = false; - if (log.isInfoEnabled()) { - log.info("Cache is off while loading ui model."); - } - } else { - - // model no more loading, cache is on if data cache is present - on = true; - if (log.isInfoEnabled()) { - if (on) { - log.info("Cache is on : ui model loading is done and sampling cache is present"); - } else { - log.info("Cache is off : ui model loading is done bu not sampling cache present"); - } - } - - } - } - }); - + this.protocolFilled = protocol != null; + this.protocolUseCalcifiedPieceSampling = protocolFilled && protocol.isUseCalcifiedPieceSampling(); } public boolean useCruiseSamplingCache() { return useCruiseSamplingCache; } - public void init(SpeciesFrequencyUI ui, SpeciesBatchRowModel speciesEditRow, FishingOperation fishingOperation, List<IndividualObservationBatchRowModel> individualObservationRows) { + public void init(Species species, List<IndividualObservationBatchRowModel> individualObservationRows) { - Objects.requireNonNull(ui); - Objects.requireNonNull(speciesEditRow); - Objects.requireNonNull(speciesEditRow.getSpecies()); - Objects.requireNonNull(fishingOperation); + Objects.requireNonNull(species); - this.speciesEditRow = speciesEditRow; - this.species = speciesEditRow.getSpecies(); - this.fishingOperation = fishingOperation; + this.speciesReferenceTaxonId = species.getReferenceTaxonId(); if (useCruiseSamplingCache) { // calcule de la zone associée à l'opération de pêche - - Optional<Zone> optionalZone = cruiseSamplingCache.tryFindZone(fishingOperation); + Optional<Zone> optionalZone = cruiseSamplingCache.tryFindZone(uiModel.getFishingOperation()); fishingOperationZone = optionalZone.orElse(null); // est-ce que l'espèce du lot existe dans l'algortihme des pièces calcifiées @@ -189,294 +144,170 @@ public class IndividualObservationUICache implements Closeable { @Override public void close() { - this.speciesEditRow = null; - this.species = null; - this.fishingOperation = null; + this.speciesReferenceTaxonId = null; } public IndividualObservationSamplingStatus getIndividualObservationSamplingStatus(IndividualObservationBatchRowModel row) throws CalcifiedPiecesSamplingAlgorithmEntryNotFoundException, SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException { - Float size = row.getSize(); - return cruiseSamplingCache.getIndividualObservationSamplingStatus(fishingOperation, - row, - size == null ? null : uiModel.getLengthStepInMm(size), - individualObservationModel.getGender(row), - individualObservationModel.getMaturityValue(row)); + Objects.requireNonNull(row); + + IndividualObservationSamplingCacheRequest samplingCacheRequest = toIndividualObservationSamplingCacheRequest(row); + return cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest); } - /** - * Ajoute une observation individuelle dans le cache. - * - * @param row la ligne à ajouter au cache - */ - public void increments(IndividualObservationBatchRowModel row) { + public void removeIndividualObservations(Collection<IndividualObservationBatchRowModel> individualObservationBatchRows) { + + individualObservationBatchRows.stream() + .filter(IndividualObservationBatchRowModel::withSize) + .forEach(row -> { + + IndividualObservationSamplingCacheRequest samplingCacheRequest = toIndividualObservationSamplingCacheRequest(row); + removeIndividualObservation(samplingCacheRequest); - incrementsObservationNb(individualObservationModel.getGender(row), - individualObservationModel.getMaturityValue(row), - row.getSize(), - row.getSamplingCode()); + }); } - /** - * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. - * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - * @param samplingCode le code de prélèvement ajouté s'il y en a un - */ - public void incrementsObservationNb(CaracteristicQualitativeValue gender, - CaracteristicQualitativeValue maturityQualitativeValue, - float lengthStep, - String samplingCode) { - - boolean withSamplingCode = samplingCode != null; - if (withSamplingCode) { - incrementsSamplingCode(samplingCode); - } + public void addIndividualObservations(Collection<IndividualObservationBatchRowModel> individualObservationBatchRows) { - if (!on) { - if (log.isDebugEnabled()) { - log.debug("Cache is off, skip increments individual observations in cache."); - } - return; - } + individualObservationBatchRows.stream() + .filter(IndividualObservationBatchRowModel::withSize) + .forEach(row -> { - if (useCruiseSamplingCache) { + IndividualObservationSamplingCacheRequest samplingCacheRequest = toIndividualObservationSamplingCacheRequest(row); + addIndividualObservation(samplingCacheRequest); - Boolean maturity = cruiseSamplingCache.getMaturity(species.getReferenceTaxonId(), maturityQualitativeValue); - cruiseSamplingCache.addIndividualObservation(fishingOperation, - species, - gender, - maturity, - uiModel.getLengthStepInMm(lengthStep)); + }); - } + } - if (withSamplingCode) { - incrementsSamplingNb(gender, maturityQualitativeValue, lengthStep); - } + public boolean isSamplingCodeNotAvailable(int samplingCode) { + return samplingCodesNotAvailable.contains(samplingCode); } - /** - * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. - * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - */ - public void incrementsSamplingNb(CaracteristicQualitativeValue gender, - CaracteristicQualitativeValue maturityQualitativeValue, - float lengthStep) { - - if (!on) { - if (log.isDebugEnabled()) { - log.debug("Cache is off, skip increments sampling in cache."); - } - return; - } + public boolean isSamplingCodeAvailable(int samplingCode) { + return samplingCodesAvailable.contains(samplingCode); + } - if (useCruiseSamplingCache) { + public void addIndividualObservation(IndividualObservationSamplingCacheRequest samplingCacheRequest) { - Boolean maturity = cruiseSamplingCache.getMaturity(species.getReferenceTaxonId(), maturityQualitativeValue); - int lengthStepInMm = uiModel.getLengthStepInMm(lengthStep); - cruiseSamplingCache.addSampling(fishingOperation, - species, - gender, - maturity, - lengthStepInMm); + Objects.requireNonNull(samplingCacheRequest); - } + if (useCruiseSamplingCache && samplingCacheRequest.withLengthClass()) { + cruiseSamplingCache.addIndividualObservation(samplingCacheRequest); - } + } - /** - * Retire une observation individuelle dans le cache. - * - * @param row la ligne à retirer du cache - */ - public void decrements(IndividualObservationBatchRowModel row) { + if (samplingCacheRequest.withSamplingCode()) { + + addSampling0(samplingCacheRequest, false); - decrementsObservationNb(individualObservationModel.getGender(row), - individualObservationModel.getMaturityValue(row), - row.getSize(), - row.getSamplingCode()); + } } - /** - * Retire une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. - * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - */ - public void decrementsObservationNb(CaracteristicQualitativeValue gender, CaracteristicQualitativeValue maturityQualitativeValue, float lengthStep) { + public void removeIndividualObservation(IndividualObservationSamplingCacheRequest samplingCacheRequest) { - decrementsObservationNb(gender, maturityQualitativeValue, lengthStep, null); - } + Objects.requireNonNull(samplingCacheRequest); - /** - * Retire une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. - * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - * @param samplingCode le code de prélèvement supprimée - */ - public void decrementsObservationNb(CaracteristicQualitativeValue gender, - CaracteristicQualitativeValue maturityQualitativeValue, - float lengthStep, - String samplingCode) { - - if (!on) { - if (log.isDebugEnabled()) { - log.debug("Cache is off, skip decrements individual observations in cache."); - } - return; - } + if (useCruiseSamplingCache && samplingCacheRequest.withLengthClass()) { - boolean withSamplingCode = samplingCode != null; + cruiseSamplingCache.removeIndividualObservation(samplingCacheRequest); - if (withSamplingCode) { - decrementsSamplingCode(samplingCode); } - if (useCruiseSamplingCache) { + if (samplingCacheRequest.withSamplingCode()) { - Boolean maturity = cruiseSamplingCache.getMaturity(species.getReferenceTaxonId(), maturityQualitativeValue); - cruiseSamplingCache.removeIndividualObservation(fishingOperation, - species, - gender, - maturity, - uiModel.getLengthStepInMm(lengthStep)); + removeSampling0(samplingCacheRequest, false); - if (withSamplingCode) { - decrementsSamplingNb(gender, maturityQualitativeValue, lengthStep); - } } } - public void decrementsSamplingNb(CaracteristicQualitativeValue gender, - CaracteristicQualitativeValue maturityQualitativeValue, - Float lengthStep) { + public void addSampling(IndividualObservationSamplingCacheRequest samplingCacheRequest) { - if (!on) { - if (log.isDebugEnabled()) { - log.debug("Cache is off, skip increments sampling in cache."); - } - return; - } + addSampling0(samplingCacheRequest, true); - if (useCruiseSamplingCache) { + } - Boolean maturity = cruiseSamplingCache.getMaturity(species.getReferenceTaxonId(), maturityQualitativeValue); - cruiseSamplingCache.removeSampling(fishingOperation, - species, - gender, - maturity, - uiModel.getLengthStepInMm(lengthStep)); + public void removeSampling(IndividualObservationSamplingCacheRequest samplingCacheRequest) { + + removeSampling0(samplingCacheRequest, true); - } } - /** - * Retire toutes les observations individuelles contenues dans le modèle d'UI du cache. - */ - public void decrementsAll() { + private void addSamplingCodeAvailable(String samplingCode) { - if (!on) { - if (log.isDebugEnabled()) { - log.debug("Cache is off, skip decrements all individual observations in cache."); - } - return; + int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); + if (log.isDebugEnabled()) { + log.debug(String.format("Make samplingCode: %s (%d) available", samplingCode, samplingCodeNumber)); } - - individualObservationModel.getRows() - .stream() - .filter(IndividualObservationBatchRowModel::withSize) - .forEach(this::decrements); + samplingCodesNotAvailable.remove(samplingCodeNumber); + samplingCodesAvailable.add(samplingCodeNumber); } - /** - * Réinitialise le cache en oubiant toutes les modifications sur les observations individuelles du modèle. - * - * <ul> - * <li>Retire toutes les observations indivudelles contenues dans le modèle d'UI ({@link #decrementsAll()})</li> - * <li>Ajoute toutes les observations individuelles contenues dans le modèle d'origine (i.e en base)</li> - * </ul> - * - * Cette méthode est utilisée quand l'utilisateur quitte l'écran en annulant toutes ses modifications. - */ - public void reset() { + private void addSamplingCodeNotAvailable(String samplingCode) { - if (!on) { - if (log.isDebugEnabled()) { - log.debug("Cache is off, skip reset individual observations in cache."); - } - return; + int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); + if (log.isDebugEnabled()) { + log.debug(String.format("Make samplingCode: %s (%d) not available", samplingCode, samplingCodeNumber)); } + samplingCodesNotAvailable.add(samplingCodeNumber); + samplingCodesAvailable.remove(samplingCodeNumber); - decrementsAll(); + } - speciesEditRow.getIndividualObservation() - .stream() - .filter(IndividualObservationBatchRowModel::withSize) - .forEach(this::increments); + private void addSampling0(IndividualObservationSamplingCacheRequest samplingCacheRequest, boolean addToCruiseSamplingCache) { - } + Objects.requireNonNull(samplingCacheRequest); - public boolean isSamplingCodeNotAvailable(int samplingCode) { - return samplingCodesNotAvailable.contains(samplingCode); - } + String samplingCode = samplingCacheRequest.getSamplingCode(); + Objects.requireNonNull(samplingCode); - public boolean isSamplingCodeAvailable(int samplingCode) { - return samplingCodesAvailable.contains(samplingCode); - } + samplingCodeCache.addSamplingCode(speciesReferenceTaxonId, samplingCode); - public void decrementsSamplingCode(String samplingCode) { + // Le code n'est plus utilisable + addSamplingCodeNotAvailable(samplingCode); - samplingCodeCache.removeSamplingCode(species.getReferenceTaxonId(), samplingCode); + if (addToCruiseSamplingCache && useCruiseSamplingCache && samplingCacheRequest.withLengthClass()) { - // Le code est utilisable - addSamplingCodeAvailable(samplingCode); + cruiseSamplingCache.addSampling(samplingCacheRequest); + + } } - public void incrementsSamplingCode(String samplingCode) { + private void removeSampling0(IndividualObservationSamplingCacheRequest samplingCacheRequest, boolean removeFromCruiseSamplingCache) { - samplingCodeCache.addSamplingCode(species.getReferenceTaxonId(), samplingCode); + Objects.requireNonNull(samplingCacheRequest); - // Le code n'est plus utilisable - addSamplingCodeNotAvailable(samplingCode); + String samplingCode = samplingCacheRequest.getSamplingCode(); + Objects.requireNonNull(samplingCode); - } + samplingCodeCache.removeSamplingCode(speciesReferenceTaxonId, samplingCode); - private void addSamplingCodeNotAvailable(String samplingCode) { + // Le code est réutilisable + addSamplingCodeAvailable(samplingCode); + + if (removeFromCruiseSamplingCache && useCruiseSamplingCache && samplingCacheRequest.withLengthClass()) { + + cruiseSamplingCache.removeSampling(samplingCacheRequest); - int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); - if (log.isDebugEnabled()) { - log.debug(String.format("Make samplingCode: %s (%d) not available", samplingCode, samplingCodeNumber)); } - samplingCodesNotAvailable.add(samplingCodeNumber); - samplingCodesAvailable.remove(samplingCodeNumber); } - private void addSamplingCodeAvailable(String samplingCode) { + private IndividualObservationSamplingCacheRequest toIndividualObservationSamplingCacheRequest(IndividualObservationBatchRowModel row) { - int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); - if (log.isDebugEnabled()) { - log.debug(String.format("Make samplingCode: %s (%d) available", samplingCode, samplingCodeNumber)); - } - samplingCodesNotAvailable.remove(samplingCodeNumber); - samplingCodesAvailable.add(samplingCodeNumber); + return new IndividualObservationSamplingCacheRequest(uiModel.getFishingOperation(), + row.getSpecies(), + uiModel.getLengthStepInMm(row.getSize()), + individualObservationModel.getMaturityValue(row), + individualObservationModel.getGender(row), + row.getSamplingCode()); } - } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java index 73d8bdb..7c3defb 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java @@ -442,8 +442,8 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp public void generateRows() { - Float minStep = uiModel.getLengthStep(uiModel.getMinStep()); - Float maxStep = uiModel.getLengthStep(uiModel.getMaxStep()); + float minStep = uiModel.getLengthStep(uiModel.getMinStep()); + float maxStep = uiModel.getLengthStep(uiModel.getMaxStep()); Caracteristic lengthStepCaracteristic = uiModel.getLengthStepCaracteristic(); Map<Float, SpeciesFrequencyRowModel> rowsByStep = modelCache.getRowCache(); 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 4fbff29..2960158 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 @@ -561,111 +561,60 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci List<SpeciesFrequencyRowModel> frequency = speciesBatch.getFrequency(); List<IndividualObservationBatchRowModel> individualObservations = speciesBatch.getIndividualObservation(); - model.setInitBatchEdition(true); - model.setCanDisplayNotifications(false); - - try { - // keep batch (will be used to push back editing entry) - model.setBatch(speciesBatch); - model.setMinStep(null); - model.setMaxStep(null); - model.setRtp(null); - model.setCopyRtpWeights(false); - model.setAddIndividualObservationOnRafale(false); + // keep batch (will be used to push back editing entry) + model.setBatch(speciesBatch); + model.setFishingOperation(getDataContext().getFishingOperation()); + model.setMinStep(null); + model.setMaxStep(null); + model.setRtp(null); + model.setCopyRtpWeights(false); + model.setAddIndividualObservationOnRafale(false); - // get species from protocol - SpeciesProtocol speciesProtocol = getDataContext().isProtocolFilled() ? speciesOrBenthosBatchUISupport.getSpeciesProtocol(speciesBatch.getSpecies()) : null; + // get species from protocol + SpeciesProtocol speciesProtocol = getDataContext().isProtocolFilled() ? speciesOrBenthosBatchUISupport.getSpeciesProtocol(speciesBatch.getSpecies()) : null; - // set rtp - Rtp rtp = null; + // set rtp + Rtp rtp = null; - if (speciesProtocol != null) { + if (speciesProtocol != null) { - Caracteristic sexCaracteristic = model.getIndividualObservationModel().getSexCaracteristic(); - CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(sexCaracteristic.getIdAsInt()); + Caracteristic sexCaracteristic = model.getIndividualObservationModel().getSexCaracteristic(); + CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(sexCaracteristic.getIdAsInt()); - if (sampleCategoryValue != null) { - - if (Sexs.isMale(sampleCategoryValue)) { - rtp = speciesProtocol.getRtpMale(); - } else if (Sexs.isFemale(sampleCategoryValue)) { - rtp = speciesProtocol.getRtpFemale(); - } else { - rtp = speciesProtocol.getRtpUndefined(); - } + if (sampleCategoryValue != null) { + if (Sexs.isMale(sampleCategoryValue)) { + rtp = speciesProtocol.getRtpMale(); + } else if (Sexs.isFemale(sampleCategoryValue)) { + rtp = speciesProtocol.getRtpFemale(); } else { rtp = speciesProtocol.getRtpUndefined(); } + } else { + rtp = speciesProtocol.getRtpUndefined(); } - model.setRtp(rtp); - - // init maturity caracteristic - individualObservationBatchTableHandler.initMaturityCaracteristic(speciesProtocol); - -// Optional<String> optionalMaturityPmfmId; -// Optional<SpeciesProtocol> optSpeciesProtocol = -// protocol.getSpecies().stream() -// .filter(sp -> sp.getSpeciesReferenceTaxonId().equals(referenceTaxonId)) -// .findFirst(); -// -// if (optSpeciesProtocol.isPresent()) { -// SpeciesProtocol speciesProtocol = optSpeciesProtocol.get(); -// Rtp rtp; -// CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(getModel().getSexCaracteristic().getIdAsInt()); -// -// if (sampleCategoryValue != null) { -// -// if (Sexs.isMale(sampleCategoryValue)) { -// rtp = speciesProtocol.getRtpMale(); -// } else if (Sexs.isFemale(sampleCategoryValue)) { -// rtp = speciesProtocol.getRtpFemale(); -// } else { -// rtp = speciesProtocol.getRtpUndefined(); -// } -// -// } else { -// rtp = speciesProtocol.getRtpUndefined(); -// } -// getModel().setRtp(rtp); -// -// speciesMaturityPmfmId = Optional.ofNullable(speciesProtocol.getMaturityPmfmId()); -// } - -// } -// -// // Add maturity column if necessary -// -// Optional<Caracteristic> optionalMaturityCaracteristic = speciesMaturityPmfmId.map(maturityCaracteristics::get); -// -// setMaturityCaracteristic(optionalMaturityCaracteristic.orElse(null)); - - loadFrequenciesAndObservations(frequency, individualObservations); - - individualObservationBatchTableHandler.initObservationsCache(speciesBatch, getDataContext().getFishingOperation()); - - samplingNotificationZoneHandler.editBatch(speciesBatch); - -// individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getRows()); - - if (getContext().isIchtyometerConnected()) { - - // let's listen the ichtyometer - listenItchtyometer(); + } - } + model.setRtp(rtp); - model.setModify(false); + // init maturity caracteristic + individualObservationBatchTableHandler.initMaturityCaracteristic(speciesProtocol); + + loadFrequenciesAndObservations(frequency, individualObservations); + + samplingNotificationZoneHandler.editBatch(speciesBatch); + + if (getContext().isIchtyometerConnected()) { + + // let's listen the ichtyometer + listenItchtyometer(); - } finally { - model.setInitBatchEdition(false); - model.setCanDisplayNotifications(true); - //FIXME Voir si c'est nécessaire ? - model.setModify(false); } + model.setModify(false); + } public boolean askCancelEditBeforeLeaving() { @@ -1019,9 +968,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci for (IndividualObservationBatchRowModel obsRow : validObsRow) { - Float size = obsRow.getSize(); - if (size != null) { - size = model.getLengthStep(size); + if (obsRow.withSize()) { + float size = model.getLengthStep(obsRow.getSize()); if (log.isInfoEnabled()) { log.info("size : " + size); } @@ -1034,13 +982,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.getCache().getRowCache().put(size, row); } row.incNumber(); - Float weight = obsRow.getWeight(); - if (CopyIndividualObservationMode.ALL == copyMode && weight != null) { + if (CopyIndividualObservationMode.ALL == copyMode && obsRow.withWeight()) { // conversion de poids - weight = Weights.convert(individualObservationWeightUnit, weightUnit, weight); + Float weight = Weights.convert(individualObservationWeightUnit, weightUnit, obsRow.getWeight()); row.addToWeight(weight); } } + } if (model.getRowCount() == 0) { @@ -1162,8 +1110,10 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.computeRowWeightWithRtp(); } finally { + model.setInitBatchEdition(false); model.setCanDisplayNotifications(true); + } } @@ -1265,4 +1215,50 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci return lengthStepCaracteristic; } + + public IndividualObservationBatchTableHandler getIndividualObservationBatchTableHandler() { + return individualObservationBatchTableHandler; + } + + public boolean isSamplingCodeAvailable(Integer sampleCode, IndividualObservationBatchRowModel selectedRow) { + + IndividualObservationUICache individualObservationUICache = ui.getHandler().getIndividualObservationUICache(); + + + if (individualObservationUICache.isSamplingCodeNotAvailable(sampleCode)) { + + // le code n'est pas disponible (on le sait depuis le cache de l'écran) + if (log.isDebugEnabled()) { + log.debug("Sampling code " + sampleCode + " is known as not available from cache. Can't use it."); + } + return false; + } + + if (individualObservationUICache.isSamplingCodeAvailable(sampleCode)) { + + // le code est pas disponible (on le sait depuis le cache de l'écran) + if (log.isDebugEnabled()) { + log.debug("Sampling code " + sampleCode + " is known as available from cache. Can use it."); + } + return true; + } + + // on demande en base si le code est disponible + + String samplingCodeSuffix = selectedRow.getSamplingCodePrefix().toSpeciesOnlySamplingCode(sampleCode); + boolean samplingCodeAvailable = getPersistenceService().isSamplingCodeAvailable(getDataContext().getCruiseId(), + selectedRow.getSpecies().getReferenceTaxonId(), + samplingCodeSuffix); + + if (log.isDebugEnabled()) { + if (samplingCodeAvailable) { + log.debug("Sampling code " + sampleCode + " is known as available from database. Can use it."); + } else { + log.debug("Sampling code " + sampleCode + " is known as not available from database. Can't use it."); + } + } + + return samplingCodeAvailable; + + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java index 41f5e37..9ba4669 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java @@ -23,6 +23,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; */ import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.protocol.Rtp; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; @@ -129,6 +130,13 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa private FrequencyConfigurationMode frequenciesConfigurationMode; /** + * Fishing operation of the species batch. + * + * @since 4.5 + */ + private FishingOperation fishingOperation; + + /** * Batch that contains frequencies. * * @since 0.2 @@ -503,6 +511,14 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return minStep != null && maxStep != null && maxStep > minStep && lengthStepCaracteristic != null; } + public FishingOperation getFishingOperation() { + return fishingOperation; + } + + public void setFishingOperation(FishingOperation fishingOperation) { + this.fishingOperation = fishingOperation; + } + public SpeciesBatchRowModel getBatch() { return batch; } @@ -519,11 +535,17 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return correctIntStep / 10f; } - public int getLengthStepInMm(float lengthStep) { - int intValue = (int) (lengthStep * 10); - int intStep = (int) (step * 10); - int correctIntStep = intValue - (intValue % intStep); - return Numbers.convertToMm(correctIntStep / 10f, getLengthStepCaracteristicUnit()); + public Integer getLengthStepInMm(Float lengthStep) { + Integer lengthClass; + if (lengthStep == null) { + lengthClass = null; + } else { + int intValue = (int) (lengthStep * 10); + int intStep = (int) (step * 10); + int correctIntStep = intValue - (intValue % intStep); + lengthClass = Numbers.convertToMm(correctIntStep / 10f, getLengthStepCaracteristicUnit()); + } + return lengthClass; } public Integer getTotalNumber() { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/CancelEditSpeciesFrequencyAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/CancelEditSpeciesFrequencyAction.java index 4708ec5..8fdecd0 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/CancelEditSpeciesFrequencyAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/CancelEditSpeciesFrequencyAction.java @@ -24,6 +24,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; @@ -32,6 +34,8 @@ import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.List; + /** * Created on 1/1/15. * @@ -71,7 +75,14 @@ public class CancelEditSpeciesFrequencyAction extends LongActionSupport<SpeciesF getModel().setCanDisplayNotifications(false); IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); - individualObservationUICache.reset(); + + List<IndividualObservationBatchRowModel> individualObservationRows = getModel().getIndividualObservationModel().getRows(); + + handler.getIndividualObservationBatchTableHandler().removeIndividualObservations(individualObservationRows); + + SpeciesBatchRowModel batch = getModel().getBatch(); + + individualObservationUICache.addIndividualObservations(batch.getIndividualObservation()); // close dialog getHandler().onCloseUI(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java index 8e6fba3..e69938a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java @@ -24,13 +24,11 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ -import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SampleCodeEditionPopupUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SampleCodeEditionPopupUIModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; import org.apache.commons.logging.Log; @@ -79,9 +77,7 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI log.debug("Test if sampling code " + samplingCode + " is available."); } - IndividualObservationUICache individualObservationUICache = ui.getHandler().getIndividualObservationUICache(); - - samplingCodeAvailable = samplingCodeId.equals(sampleCode) || isSamplingCodeAvailable(individualObservationUICache, sampleCode, selectedRow); + samplingCodeAvailable = samplingCodeId.equals(sampleCode) || ui.getHandler().isSamplingCodeAvailable(sampleCode, selectedRow); if (!samplingCodeAvailable) { if (log.isDebugEnabled()) { @@ -105,46 +101,4 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI } - protected boolean isSamplingCodeAvailable(IndividualObservationUICache individualObservationUICache, - Integer sampleCode, - IndividualObservationBatchRowModel selectedRow) { - - if (individualObservationUICache.isSamplingCodeNotAvailable(sampleCode)) { - - // le code n'est pas disponible (on le sait depuis le cache de l'écran) - if (log.isDebugEnabled()) { - log.debug("Sampling code " + sampleCode + " is known as not available from cache. Can't use it."); - } - return false; - } - - if (individualObservationUICache.isSamplingCodeAvailable(sampleCode)) { - - // le code est pas disponible (on le sait depuis le cache de l'écran) - if (log.isDebugEnabled()) { - log.debug("Sampling code " + sampleCode + " is known as available from cache. Can use it."); - } - return true; - } - - // on demande en base si le code est disponible - TuttiUIContext applicationContext = TuttiUIContext.getApplicationContext(); - PersistenceService persistenceService = applicationContext.getPersistenceService(); - - String samplingCodeSuffix = selectedRow.getSamplingCodePrefix().toSpeciesOnlySamplingCode(sampleCode); - boolean samplingCodeAvailable = persistenceService.isSamplingCodeAvailable(applicationContext.getCruiseId(), - selectedRow.getSpecies().getReferenceTaxonId(), - samplingCodeSuffix); - - if (log.isDebugEnabled()) { - if (samplingCodeAvailable) { - log.debug("Sampling code " + sampleCode + " is known as available from database. Can use it."); - } else { - log.debug("Sampling code " + sampleCode + " is known as not available from database. Can't use it."); - } - } - - return samplingCodeAvailable; - - } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java index a2337bf..8f9cb28 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java @@ -26,7 +26,6 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; @@ -80,9 +79,8 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc SpeciesFrequencyUIModel model = ui.getModel(); SpeciesFrequencyUIHandler handler = ui.getHandler(); - IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); SpeciesFrequencyTableModel frequencyTableModel = handler.getTableModel(); - + // Attention, on ne traite ici que les observations individuelles qui ont une taille rowsToDelete.stream().filter(IndividualObservationBatchRowModel::withSize).forEach(row -> { @@ -100,11 +98,9 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc frequencyTableModel.decrementFrequencyRowsNumbers(row.getSize()); } - individualObservationUICache.decrements(row); - }); - obsTableModel.removeRows(rowsToDelete); + handler.getIndividualObservationBatchTableHandler().removeIndividualObservations(rowsToDelete); model.setModify(true); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java index 7957c95..2e9d9b4 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java @@ -24,7 +24,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; @@ -33,6 +33,7 @@ import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler; import javax.swing.JOptionPane; import java.util.ArrayList; +import java.util.List; import static org.nuiton.i18n.I18n.t; @@ -97,10 +98,9 @@ public class ResetSpeciesFrequencyAction extends LongActionSupport<SpeciesFreque model.setRows(new ArrayList<>()); // remove all individual observations - IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); + List<IndividualObservationBatchRowModel> rows = model.getIndividualObservationModel().getRows(); + handler.getIndividualObservationBatchTableHandler().removeIndividualObservations(rows); - individualObservationUICache.decrementsAll(); - model.getIndividualObservationModel().setRows(new ArrayList<>()); model.setCanDisplayNotifications(true); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.