branch develop updated (524e139 -> 50f07c7)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git from 524e139 Livrable #8247 Merge branch 'feature/8247' into develop new 41feecb Ne plus cacher le status dans la zone de notification new 72ca87d Ne plus conserver les états dans le modèle de zone de notification + renommage propriété new c74e5c1 Si un des max est atteint on ne propose plus de prélever new 8cd62f9 Amélioration des logs sur le cache new 5f9e52e Introduction d'une requète sur le cache d'échantillons + amélioration du cache new c316995 Utilisation de la requete sur le cache d'échantillon + continue à simplifier et assainir le code new bac64af Fin du ménage même s'il reste encore des choses à revoir... new 50f07c7 Retour sur develop pour intégrer les autres tickets avant release Merge branch 'feature/8242' into develop The 8 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 50f07c7c218c1fa632fc511381cc995a6b5612d1 Merge: 524e139 bac64af Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 22 10:21:48 2016 +0200 Retour sur develop pour intégrer les autres tickets avant release Merge branch 'feature/8242' into develop commit bac64afb829011015fdb66554e1f0ed5a4e3351b Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 22 10:21:42 2016 +0200 Fin du ménage même s'il reste encore des choses à revoir... 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 commit 5f9e52eb0d50d860afba559748c7fb4c3b1473b6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Apr 21 20:37:34 2016 +0200 Introduction d'une requète sur le cache d'échantillons + amélioration du cache commit 8cd62f9b5921d830b5e8073f97605866e836a403 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 12:01:51 2016 +0200 Amélioration des logs sur le cache commit c74e5c16722a58ead5846549d0a2f1492b6e5d30 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 09:58:56 2016 +0200 Si un des max est atteint on ne propose plus de prélever commit 72ca87d8dcb41cbe7eeddc192bcf2f6710894b0f Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 09:48:03 2016 +0200 Ne plus conserver les états dans le modèle de zone de notification + renommage propriété commit 41feecb29c66e2f075e3b94d92a45e5b2d6c99f1 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 09:46:49 2016 +0200 Ne plus cacher le status dans la zone de notification Summary of changes: ...cesSamplingAlgorithmEntryNotFoundException.java | 6 +- .../service/sampling/CruiseSamplingCache.java | 395 +++++++++------------ .../IndividualObservationSamplingCacheRequest.java | 80 +++++ .../IndividualObservationSamplingStatus.java | 3 +- ...lObservationSamplingStatusExceptionSupport.java | 15 +- ...NotDefinedOnIndividualObservationException.java | 6 +- .../ZoneNotDefinedOnFishingOperationException.java | 6 +- .../IndividualObservationBatchRowModel.java | 21 +- .../IndividualObservationBatchRowState.java | 38 +- .../IndividualObservationBatchTableHandler.java | 375 +++++++++++-------- .../IndividualObservationBatchTableModel.java | 14 +- .../IndividualObservationBatchUIModel.java | 8 + ...dividualObservationToSamplingCacheResolver.java | 147 ++++++++ .../frequency/IndividualObservationUICache.java | 371 ++++++------------- .../frequency/SamplingNotificationZoneHandler.java | 8 +- .../frequency/SamplingNotificationZoneModel.java | 27 +- .../frequency/SpeciesFrequencyRowModel.java | 4 + .../frequency/SpeciesFrequencyTableModel.java | 4 +- .../frequency/SpeciesFrequencyUIHandler.java | 223 +++++------- .../species/frequency/SpeciesFrequencyUIModel.java | 135 +++---- .../actions/ApplySpeciesFrequencyRafaleAction.java | 51 +-- .../actions/CancelEditSpeciesFrequencyAction.java | 15 +- .../frequency/actions/EditSampleCodeAction.java | 52 +-- .../frequency/actions/RemoveObservationAction.java | 8 +- .../actions/ResetSpeciesFrequencyAction.java | 13 +- 25 files changed, 989 insertions(+), 1036 deletions(-) create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingCacheRequest.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToSamplingCacheResolver.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 41feecb29c66e2f075e3b94d92a45e5b2d6c99f1 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 09:46:49 2016 +0200 Ne plus cacher le status dans la zone de notification --- .../species/frequency/IndividualObservationBatchTableHandler.java | 2 -- .../catches/species/frequency/SpeciesFrequencyUIHandler.java | 7 ------- .../frequency/actions/ApplySpeciesFrequencyRafaleAction.java | 2 -- 3 files changed, 11 deletions(-) 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 37eacb1..b7140b6 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 @@ -532,8 +532,6 @@ public class IndividualObservationBatchTableHandler implements Closeable { @Override public void close() { - uiHandler.resetSamplingLabel(); - // on supprime la colonne maturité en fermant, pour avoir les même colonnes qu'à la création de l'écran (important pour la swing session) removeMaturityColumnIfPresent(); 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 5e9960f..4fbff29 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 @@ -830,13 +830,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci logTable.addHighlighter(evenHighlighter); } - public void resetSamplingLabel() { - if (log.isDebugEnabled()) { - log.debug("reset smapling panel"); - } - ui.getSamplingWarningLabel().setVisible(false); - } - protected CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> addCaracteristicColumnToModel(JXTable table, TableColumnModelExt columnModel, Caracteristic caracteristic) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java index 95c61d1..6f29f2c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java @@ -71,8 +71,6 @@ public class ApplySpeciesFrequencyRafaleAction { SpeciesFrequencyUIModel model = ui.getModel(); SpeciesFrequencyUIHandler handler = ui.getHandler(); - handler.resetSamplingLabel(); - float aroundLengthStep = model.getLengthStep(step); if (model.isCopyIndividualObservationNothing()) { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 72ca87d8dcb41cbe7eeddc192bcf2f6710894b0f Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 09:48:03 2016 +0200 Ne plus conserver les états dans le modèle de zone de notification + renommage propriété --- .../frequency/SamplingNotificationZoneHandler.java | 8 +++---- .../frequency/SamplingNotificationZoneModel.java | 27 +++------------------- 2 files changed, 7 insertions(+), 28 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java index 9c9b2b0..d643d78 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java @@ -183,12 +183,12 @@ public class SamplingNotificationZoneHandler implements Closeable { // toujours supprimer les listeners listSelectionModel.removeListSelectionListener(listSelectionListener); - model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_NOTIFICATION_ZONE_STATUS, modelStatusChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SELECTED_ROW, modelSelectedRowChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); // on les ajoutent (on peut en avoir besoin pour désactiver la zone de notification) - model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_NOTIFICATION_ZONE_STATUS, modelStatusChanged); model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SELECTED_ROW, modelSelectedRowChanged); model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); @@ -232,7 +232,7 @@ public class SamplingNotificationZoneHandler implements Closeable { public void close() { listSelectionModel.removeListSelectionListener(listSelectionListener); - model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_NOTIFICATION_ZONE_STATUS, modelStatusChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SELECTED_ROW, modelSelectedRowChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); @@ -248,7 +248,7 @@ public class SamplingNotificationZoneHandler implements Closeable { private void stopUsingStatusNotication(String message) { whenCanNotUseSampling(message); - model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_NOTIFICATION_ZONE_STATUS, modelStatusChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SELECTED_ROW, modelSelectedRowChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java index 1572e0d..33e0d4d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java @@ -9,32 +9,16 @@ import org.jdesktop.beans.AbstractSerializableBean; */ public class SamplingNotificationZoneModel extends AbstractSerializableBean { - public static final String PROPERTY_SAMPLING_STATUS = "samplingNotificationZoneStatus"; + public static final String PROPERTY_SAMPLING_NOTIFICATION_ZONE_STATUS = "samplingNotificationZoneStatus"; public static final String PROPERTY_SUMMARY_TEXT = "summaryText"; public static final String PROPERTY_SELECTED_ROW = "selectedRow"; - private IndividualObservationBatchRowModel selectedRow; - private SamplingNotificationZoneStatus samplingNotificationZoneStatus; - private String summaryText; - - public SamplingNotificationZoneStatus getSamplingNotificationZoneStatus() { - return samplingNotificationZoneStatus; - } - public void setSamplingNotificationZoneStatus(SamplingNotificationZoneStatus samplingNotificationZoneStatus) { - Object oldValue = getSamplingNotificationZoneStatus(); - this.samplingNotificationZoneStatus = samplingNotificationZoneStatus; - firePropertyChange(PROPERTY_SAMPLING_STATUS, oldValue, samplingNotificationZoneStatus); - } - - public String getSummaryText() { - return summaryText; + firePropertyChange(PROPERTY_SAMPLING_NOTIFICATION_ZONE_STATUS, null /* On force la propagation de l'évènement! */, samplingNotificationZoneStatus); } public void setSummaryText(String summaryText) { - Object oldValue = getSummaryText(); - this.summaryText = summaryText; - firePropertyChange(PROPERTY_SUMMARY_TEXT, oldValue, summaryText); + firePropertyChange(PROPERTY_SUMMARY_TEXT, null /* On force la propagation de l'évènement! */, summaryText); } public void reset() { @@ -44,12 +28,7 @@ public class SamplingNotificationZoneModel extends AbstractSerializableBean { } - public IndividualObservationBatchRowModel getSelectedRow() { - return selectedRow; - } - public void setSelectedRow(IndividualObservationBatchRowModel selectedRow) { - this.selectedRow = selectedRow; firePropertyChange(PROPERTY_SELECTED_ROW, null /* On force la propagation de l'évènement! */, selectedRow); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit c74e5c16722a58ead5846549d0a2f1492b6e5d30 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 09:58:56 2016 +0200 Si un des max est atteint on ne propose plus de prélever --- .../tutti/service/sampling/IndividualObservationSamplingStatus.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java index 46dcfdb..df0a8e1 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java @@ -64,7 +64,6 @@ public class IndividualObservationSamplingStatus { Objects.requireNonNull(cruiseSamplingData); Objects.requireNonNull(zoneSamplingData); Objects.requireNonNull(fishingOperationSamplingData); - this.needSampling = needSampling; this.individualObservationSamplingContext = individualObservationSamplingContext; this.samplingCountInCruise = cruiseSamplingData.getSamplingCount(); this.individualObservationCountInCruise = cruiseSamplingData.getIndividualObservationCount(); @@ -72,6 +71,8 @@ public class IndividualObservationSamplingStatus { this.individualObservationCountInZone = zoneSamplingData.getIndividualObservationCount(); this.samplingCountInFishingOperation = fishingOperationSamplingData.getSamplingCount(); this.individualObservationCountInFishingOperation = fishingOperationSamplingData.getIndividualObservationCount(); + // on ne peux demander un prélèvement uniquement si la limite n'est pas atteinte + this.needSampling = needSampling && !isOneTotalCountIsAttained(); } public IndividualObservationSamplingContext getIndividualObservationSamplingContext() { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 8cd62f9b5921d830b5e8073f97605866e836a403 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 12:01:51 2016 +0200 Amélioration des logs sur le cache --- .../service/sampling/CruiseSamplingCache.java | 57 ++++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index 7d8bed0..fcc89e3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -50,6 +50,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.stream.IntStream; /** * @author Kevin Morin (Code Lutin) @@ -734,7 +735,13 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.addOneIndividualObservation(fishingOperationSamplingKey); if (log.isInfoEnabled()) { - log.info("add individual observation " + cruiseSamplingKey + " ⇒ op " + fishingOperationSamplingData + " / zone " + zoneSamplingData + " / cruise " + cruiseSamplingData); + log.info(getLogMessage("add individual observation ", + cruiseSamplingKey, + zoneSamplingKey, + fishingOperationSamplingKey, + cruiseSamplingData, + zoneSamplingData, + fishingOperationSamplingData)); } } @@ -753,7 +760,13 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.removeOneIndividualObservation(fishingOperationSamplingKey); if (log.isInfoEnabled()) { - log.info("remove individual observation " + cruiseSamplingKey + " ⇒ op " + fishingOperationSamplingData + " / zone " + zoneSamplingData + " / cruise " + cruiseSamplingData); + log.info(getLogMessage("remove individual observation ", + cruiseSamplingKey, + zoneSamplingKey, + fishingOperationSamplingKey, + cruiseSamplingData, + zoneSamplingData, + fishingOperationSamplingData)); } } @@ -772,7 +785,13 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.addOneSampling(fishingOperationSamplingKey); if (log.isInfoEnabled()) { - log.info("add sampling " + cruiseSamplingKey + " ⇒ op " + fishingOperationSamplingData + " / zone " + zoneSamplingData + " / cruise " + cruiseSamplingData); + log.info(getLogMessage("add sampling ", + cruiseSamplingKey, + zoneSamplingKey, + fishingOperationSamplingKey, + cruiseSamplingData, + zoneSamplingData, + fishingOperationSamplingData)); } } @@ -791,7 +810,13 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.removeOneSampling(fishingOperationSamplingKey); if (log.isInfoEnabled()) { - log.info("remove sampling " + cruiseSamplingKey + " ⇒ op " + fishingOperationSamplingData + " / zone " + zoneSamplingData + " / cruise " + cruiseSamplingData); + log.info(getLogMessage("remove sampling ", + cruiseSamplingKey, + zoneSamplingKey, + fishingOperationSamplingKey, + cruiseSamplingData, + zoneSamplingData, + fishingOperationSamplingData)); } } @@ -909,4 +934,28 @@ public class CruiseSamplingCache implements CruiseCacheAble { return Optional.ofNullable(result); } + + private String getLogMessage(String prefix, + String cruiseSamplingKey, + String zoneSamplingKey, + String fishingOperationSamplingKey, + CruiseSamplingInternalCache.SamplingData cruiseSamplingData, + CruiseSamplingInternalCache.SamplingData zoneSamplingData, + CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData) { + + int maxSize = IntStream + .builder() + .add(cruiseSamplingKey.length()) + .add(zoneSamplingKey.length()) + .add(fishingOperationSamplingKey.length()) + .build() + .max() + .getAsInt(); + return prefix + + "\n[cruise " + (String.format("%1$" + maxSize + "s", cruiseSamplingKey).replaceAll(" ", ".")) + "] → " + cruiseSamplingData + + "\n[zone " + (String.format("%1$" + maxSize + "s", zoneSamplingKey).replaceAll(" ", ".")) + "] → " + zoneSamplingData + + "\n[fishing operation " + (String.format("%1$" + maxSize + "s", fishingOperationSamplingKey).replaceAll(" ", ".")) + "] → " + fishingOperationSamplingData; + + } + } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 5f9e52eb0d50d860afba559748c7fb4c3b1473b6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Apr 21 20:37:34 2016 +0200 Introduction d'une requète sur le cache d'échantillons + amélioration du cache --- ...cesSamplingAlgorithmEntryNotFoundException.java | 6 +- .../service/sampling/CruiseSamplingCache.java | 342 +++++++-------------- .../IndividualObservationSamplingCacheRequest.java | 80 +++++ ...lObservationSamplingStatusExceptionSupport.java | 15 +- ...NotDefinedOnIndividualObservationException.java | 6 +- .../ZoneNotDefinedOnFishingOperationException.java | 6 +- 6 files changed, 206 insertions(+), 249 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CalcifiedPiecesSamplingAlgorithmEntryNotFoundException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CalcifiedPiecesSamplingAlgorithmEntryNotFoundException.java index b099a83..c071413 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CalcifiedPiecesSamplingAlgorithmEntryNotFoundException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CalcifiedPiecesSamplingAlgorithmEntryNotFoundException.java @@ -1,7 +1,5 @@ package fr.ifremer.tutti.service.sampling; -import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; - /** * Quand l'algorithme de prélèvement de pièces calcifiés n'est pas trouvé pour une observation individuelle. * @@ -11,7 +9,7 @@ import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; */ public class CalcifiedPiecesSamplingAlgorithmEntryNotFoundException extends IndividualObservationSamplingStatusExceptionSupport { - public CalcifiedPiecesSamplingAlgorithmEntryNotFoundException(IndividualObservationBatch individualObservationBatch) { - super(individualObservationBatch); + public CalcifiedPiecesSamplingAlgorithmEntryNotFoundException(IndividualObservationSamplingCacheRequest samplingCacheRequest) { + super(samplingCacheRequest); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index fcc89e3..06c3cf8 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -189,14 +189,7 @@ public class CruiseSamplingCache implements CruiseCacheAble { maturity, gender); - addIndividualObservation(individualObservationSamplingContext); - - String samplingCode = individualObservationBatch.getSamplingCode(); - if (samplingCode != null) { - - addSampling(individualObservationSamplingContext); - - } + addIndividualObservation(individualObservationSamplingContext, individualObservationBatch.getSamplingCode() != null); } @@ -259,15 +252,7 @@ public class CruiseSamplingCache implements CruiseCacheAble { maturity, gender); - String samplingCode = individualObservationBatch.getSamplingCode(); - if (samplingCode != null) { - - removeSampling(individualObservationSamplingContext); - - } - - - removeIndividualObservation(individualObservationSamplingContext); + removeIndividualObservation(individualObservationSamplingContext, individualObservationBatch.getSamplingCode() != null); } @@ -361,45 +346,45 @@ public class CruiseSamplingCache implements CruiseCacheAble { .toString(); } - public IndividualObservationSamplingStatus getIndividualObservationSamplingStatus(FishingOperation fishingOperation, - IndividualObservationBatch individualObservationBatch, - Integer lengthStep, - CaracteristicQualitativeValue gender, - CaracteristicQualitativeValue maturity) throws SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException, CalcifiedPiecesSamplingAlgorithmEntryNotFoundException { + public IndividualObservationSamplingStatus getIndividualObservationSamplingStatus(IndividualObservationSamplingCacheRequest request) throws SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException, CalcifiedPiecesSamplingAlgorithmEntryNotFoundException { - Objects.requireNonNull(fishingOperation); - Objects.requireNonNull(individualObservationBatch); + Objects.requireNonNull(request); - Species species = individualObservationBatch.getSpecies(); + Species species = request.getSpecies(); Objects.requireNonNull(species); + Integer lengthStep = request.getLengthClass(); if (lengthStep == null) { - throw new SizeNotDefinedOnIndividualObservationException(individualObservationBatch); + throw new SizeNotDefinedOnIndividualObservationException(request); } + FishingOperation fishingOperation = request.getFishingOperation(); + Objects.requireNonNull(fishingOperation); + Optional<Zone> optionalZone = tryFindZone(fishingOperation); if (!optionalZone.isPresent()) { - throw new ZoneNotDefinedOnFishingOperationException(individualObservationBatch); + throw new ZoneNotDefinedOnFishingOperationException(request); } - Boolean maturityAsBoolean = getMaturity(individualObservationBatch, maturity); + CaracteristicQualitativeValue gender = request.getGender(); + Boolean maturity = getMaturity(request); Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = - tryToFindCalcifiedPiecesSamplingDefinition(species, maturityAsBoolean, lengthStep, gender); + tryToFindCalcifiedPiecesSamplingDefinition(species, lengthStep, maturity, gender); if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { - throw new CalcifiedPiecesSamplingAlgorithmEntryNotFoundException(individualObservationBatch); + throw new CalcifiedPiecesSamplingAlgorithmEntryNotFoundException(request); } IndividualObservationSamplingContext context = createContext(fishingOperation.getIdAsInt(), - individualObservationBatch.getSpecies(), + species, optionalZone.get(), optionalCalcifiedPiecesSamplingDefinition.get(), lengthStep, - maturityAsBoolean, + maturity, gender); String cruiseSamplingKey = context.getCruiseSamplingKey(); @@ -412,7 +397,7 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.getSamplingData(fishingOperationSamplingKey); boolean needSampling; - if (individualObservationBatch.getSamplingCode() != null) { + if (request.withSamplingCode()) { needSampling = false; } else { int samplingInterval = context.getCalcifiedPiecesSamplingDefinition().getSamplingInterval(); @@ -423,207 +408,52 @@ public class CruiseSamplingCache implements CruiseCacheAble { return new IndividualObservationSamplingStatus(context, needSampling, cruiseSamplingData, zoneSamplingData, fishingOperationSamplingData); } - /** - * Ajout d'un observation dans le cache. - * - * @param fishingOperation l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) - */ - public void addIndividualObservation(FishingOperation fishingOperation, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep) { - - Objects.requireNonNull(fishingOperation); - Objects.requireNonNull(species); - - Optional<Zone> optionalZone = tryFindZone(fishingOperation); - if (!optionalZone.isPresent()) { + public void addIndividualObservation(IndividualObservationSamplingCacheRequest request) { - if (log.isInfoEnabled()) { - log.info("Do not add individual observation in cache, fishing operation has no matching zone."); - } - return; - } + IndividualObservationSamplingContext individualObservationSamplingContext = getIndividualObservationSamplingContext(request); - Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = - tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); + if (individualObservationSamplingContext != null) { - if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { + addIndividualObservation(individualObservationSamplingContext, request.withSamplingCode()); - if (log.isInfoEnabled()) { - log.info("Do not add individual observation in cache, no definition matched."); - } - return; } - IndividualObservationSamplingContext individualObservationSamplingContext = - createContext(fishingOperation.getIdAsInt(), - species, - optionalZone.get(), - optionalCalcifiedPiecesSamplingDefinition.get(), - lengthStep, - maturity, - gender); - - addIndividualObservation(individualObservationSamplingContext); - } - /** - * Suppression d'un échantillon du cache. - * - * @param fishingOperation l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) - */ - public void removeIndividualObservation(FishingOperation fishingOperation, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep) { - - Objects.requireNonNull(fishingOperation); - Objects.requireNonNull(species); - - Optional<Zone> optionalZone = tryFindZone(fishingOperation); - if (!optionalZone.isPresent()) { + public void removeIndividualObservation(IndividualObservationSamplingCacheRequest request) { - if (log.isInfoEnabled()) { - log.info("Do not remove individual observation from cache, fishing operation has no matching zone."); - } - return; - } + IndividualObservationSamplingContext individualObservationSamplingContext = getIndividualObservationSamplingContext(request); - Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = - tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); + if (individualObservationSamplingContext != null) { - if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { + removeIndividualObservation(individualObservationSamplingContext, request.withSamplingCode()); - if (log.isInfoEnabled()) { - log.info("Do not remove individual observation from cache, no definition matched."); - } - return; } - IndividualObservationSamplingContext individualObservationSamplingContext = - createContext(fishingOperation.getIdAsInt(), - species, - optionalZone.get(), - optionalCalcifiedPiecesSamplingDefinition.get(), - lengthStep, - maturity, - gender); - - removeIndividualObservation(individualObservationSamplingContext); - } - /** - * Ajout d'un prélèvement dans le cache. - * - * @param fishingOperation l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) - */ - public void addSampling(FishingOperation fishingOperation, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep) { - - Objects.requireNonNull(fishingOperation); - Objects.requireNonNull(species); - - Optional<Zone> optionalZone = tryFindZone(fishingOperation); - if (!optionalZone.isPresent()) { + public void addSampling(IndividualObservationSamplingCacheRequest request) { - if (log.isInfoEnabled()) { - log.info("Do not record sampling in cache, fishing operation has no matching zone."); - } - return; - } + IndividualObservationSamplingContext individualObservationSamplingContext = getIndividualObservationSamplingContext(request); - Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = - tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); + if (individualObservationSamplingContext != null) { - if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { + addSampling(individualObservationSamplingContext); - if (log.isInfoEnabled()) { - log.info("Do not record sampling in cache, no definition matched."); - } - return; } - IndividualObservationSamplingContext individualObservationSamplingContext = - createContext(fishingOperation.getIdAsInt(), - species, - optionalZone.get(), - optionalCalcifiedPiecesSamplingDefinition.get(), - lengthStep, - maturity, - gender); - - addSampling(individualObservationSamplingContext); - } - /** - * Suppression d'un prélèvement dans le cache. - * - * @param fishingOperation l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) - */ - public void removeSampling(FishingOperation fishingOperation, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep) { - - Objects.requireNonNull(fishingOperation); - Objects.requireNonNull(species); + public void removeSampling(IndividualObservationSamplingCacheRequest request) { - Optional<Zone> optionalZone = tryFindZone(fishingOperation); - if (!optionalZone.isPresent()) { - - if (log.isInfoEnabled()) { - log.info("Do not remove sampling from cache, fishing operation has no matching zone."); - } - return; - } + IndividualObservationSamplingContext individualObservationSamplingContext = getIndividualObservationSamplingContext(request); - Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); + if (individualObservationSamplingContext != null) { - if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { + removeSampling(individualObservationSamplingContext); - if (log.isInfoEnabled()) { - log.info("Do not remove sampling from cache, no definition matched."); - } - return; } - IndividualObservationSamplingContext individualObservationSamplingContext = - createContext(fishingOperation.getIdAsInt(), - species, - optionalZone.get(), - optionalCalcifiedPiecesSamplingDefinition.get(), - lengthStep, - maturity, - gender); - - removeSampling(individualObservationSamplingContext); - } public boolean isZoneChanged(FishingOperation operation1, FishingOperation operation2) { @@ -634,19 +464,10 @@ public class CruiseSamplingCache implements CruiseCacheAble { } - public Boolean getMaturity(int speciesId, CaracteristicQualitativeValue maturityQualitativeValue) { - Boolean maturity = null; - Caracteristic maturityCaracteristic = maturityCaracteristicBySpecies.get(speciesId); - if (maturityCaracteristic != null && maturityQualitativeValue != null) { - maturity = matureStatesByMaturityCracteristic.containsEntry(maturityCaracteristic.getId(), maturityQualitativeValue.getId()); - } - return maturity; - } - public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { List<CacheExtractedKey> result = cruiseCache.getSamplingNumbers(speciesById, sexQualitativeValues); result.forEach(key -> { - Optional<CalcifiedPiecesSamplingDefinition> cpsDef = tryToFindCalcifiedPiecesSamplingDefinition(key.getSpecies(), key.getMaturity(), key.getLengthStep(), key.getSex()); + Optional<CalcifiedPiecesSamplingDefinition> cpsDef = tryToFindCalcifiedPiecesSamplingDefinition(key.getSpecies(), key.getLengthStep(), key.getMaturity(), key.getSex()); if (cpsDef.isPresent()) { key.setMaxByLengthStep(cpsDef.get().getMaxByLenghtStep()); } @@ -677,27 +498,28 @@ public class CruiseSamplingCache implements CruiseCacheAble { .stream() .filter(zone -> locationIdsPerZone.containsEntry(zone, locationId)) .findFirst(); + } - private Boolean getMaturity(IndividualObservationBatch individualObservationBatch) { + private Boolean getMaturity(IndividualObservationSamplingCacheRequest samplingCacheRequest) { Boolean maturity = null; - 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); - // it the maturity is set - if (qualitativeValue != null) { - maturity = matureStatesByMaturityCracteristic.containsEntry(maturityCaracteristic.getId(), qualitativeValue.getId()); + if (samplingCacheRequest.withMaturity()) { + Caracteristic maturityCaracteristic = maturityCaracteristicBySpecies.get(samplingCacheRequest.getSpecies().getReferenceTaxonId()); + if (maturityCaracteristic != null) { + CaracteristicQualitativeValue maturityQualitativeValue = samplingCacheRequest.getMaturity(); + maturity = matureStatesByMaturityCracteristic.containsEntry(maturityCaracteristic.getId(), maturityQualitativeValue.getId()); } } + return maturity; } - private Boolean getMaturity(IndividualObservationBatch individualObservationBatch, CaracteristicQualitativeValue qualitativeValue) { + private Boolean getMaturity(IndividualObservationBatch individualObservationBatch) { Boolean maturity = null; 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); // it the maturity is set if (qualitativeValue != null) { maturity = matureStatesByMaturityCracteristic.containsEntry(maturityCaracteristic.getId(), qualitativeValue.getId()); @@ -721,7 +543,7 @@ public class CruiseSamplingCache implements CruiseCacheAble { return CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, cruiseSamplingKey); } - private void addIndividualObservation(IndividualObservationSamplingContext individualObservationSamplingContext) { + private void addIndividualObservation(IndividualObservationSamplingContext individualObservationSamplingContext, boolean addSampling) { Objects.requireNonNull(individualObservationSamplingContext); @@ -744,9 +566,15 @@ public class CruiseSamplingCache implements CruiseCacheAble { fishingOperationSamplingData)); } + if (addSampling) { + + addSampling(individualObservationSamplingContext); + + } + } - private void removeIndividualObservation(IndividualObservationSamplingContext individualObservationSamplingContext) { + private void removeIndividualObservation(IndividualObservationSamplingContext individualObservationSamplingContext, boolean removeSampling) { Objects.requireNonNull(individualObservationSamplingContext); @@ -769,6 +597,12 @@ public class CruiseSamplingCache implements CruiseCacheAble { fishingOperationSamplingData)); } + if (removeSampling) { + + removeSampling(individualObservationSamplingContext); + + } + } private void addSampling(IndividualObservationSamplingContext individualObservationSamplingContext) { @@ -821,6 +655,52 @@ public class CruiseSamplingCache implements CruiseCacheAble { } + private IndividualObservationSamplingContext getIndividualObservationSamplingContext(IndividualObservationSamplingCacheRequest request) { + + Objects.requireNonNull(request); + + FishingOperation fishingOperation = request.getFishingOperation(); + Objects.requireNonNull(fishingOperation); + + Optional<Zone> optionalZone = tryFindZone(fishingOperation); + if (!optionalZone.isPresent()) { + + if (log.isInfoEnabled()) { + log.info("Do not record sampling in cache, fishing operation has no matching zone."); + } + return null; + } + + Integer lengthStep = request.getLengthClass(); + Objects.requireNonNull(lengthStep); + + Species species = request.getSpecies(); + Objects.requireNonNull(species); + + Boolean maturity = getMaturity(request); + CaracteristicQualitativeValue gender = request.getGender(); + + Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = + tryToFindCalcifiedPiecesSamplingDefinition(species, lengthStep, maturity, gender); + + if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { + + if (log.isInfoEnabled()) { + log.info("Do not record sampling in cache, no definition matched."); + } + return null; + } + + return createContext(fishingOperation.getIdAsInt(), + species, + optionalZone.get(), + optionalCalcifiedPiecesSamplingDefinition.get(), + lengthStep, + maturity, + gender); + + } + private IndividualObservationSamplingContext createContext(int fishingOperationId, Species species, Zone zone, @@ -866,7 +746,7 @@ public class CruiseSamplingCache implements CruiseCacheAble { CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); - result = tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStepInMm, gender); + result = tryToFindCalcifiedPiecesSamplingDefinition(species, lengthStepInMm, maturity, gender); } @@ -874,7 +754,10 @@ public class CruiseSamplingCache implements CruiseCacheAble { } - private Optional<CalcifiedPiecesSamplingDefinition> tryToFindCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, int lengthStep, CaracteristicQualitativeValue gender) { + private Optional<CalcifiedPiecesSamplingDefinition> tryToFindCalcifiedPiecesSamplingDefinition(Species species, + int lengthStep, + Boolean maturity, + CaracteristicQualitativeValue gender) { Collection<CalcifiedPiecesSamplingDefinition> cpsDefinitions = cpsDefinitionsBySpecies.get(species.getReferenceTaxonId()); @@ -950,11 +833,12 @@ public class CruiseSamplingCache implements CruiseCacheAble { .add(fishingOperationSamplingKey.length()) .build() .max() - .getAsInt(); + .orElseGet(() -> 0); + return prefix + "\n[cruise " + (String.format("%1$" + maxSize + "s", cruiseSamplingKey).replaceAll(" ", ".")) + "] → " + cruiseSamplingData + "\n[zone " + (String.format("%1$" + maxSize + "s", zoneSamplingKey).replaceAll(" ", ".")) + "] → " + zoneSamplingData - + "\n[fishing operation " + (String.format("%1$" + maxSize + "s", fishingOperationSamplingKey).replaceAll(" ", ".")) + "] → " + fishingOperationSamplingData; + + "\n[fishing operation" + (String.format("%1$" + maxSize + "s", fishingOperationSamplingKey).replaceAll(" ", ".")) + "] → " + fishingOperationSamplingData; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingCacheRequest.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingCacheRequest.java new file mode 100644 index 0000000..3e528b7 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingCacheRequest.java @@ -0,0 +1,80 @@ +package fr.ifremer.tutti.service.sampling; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.Species; + +import java.util.Objects; + +/** + * Définit une requète sur le cache des échantillons. + * + * Created on 20/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.5 + */ +public class IndividualObservationSamplingCacheRequest { + + private final FishingOperation fishingOperation; + private final Species species; + private final Integer lengthClass; + private final CaracteristicQualitativeValue maturity; + private final CaracteristicQualitativeValue gender; + private final String samplingCode; + + public IndividualObservationSamplingCacheRequest(FishingOperation fishingOperation, + Species species, + Integer lengthClass, + CaracteristicQualitativeValue maturity, + CaracteristicQualitativeValue gender, + String samplingCode) { + this.fishingOperation = fishingOperation; + Objects.requireNonNull(species); + this.species = species; + this.lengthClass = lengthClass; + this.maturity = maturity; + this.gender = gender; + this.samplingCode = samplingCode; + } + + public FishingOperation getFishingOperation() { + return fishingOperation; + } + + public Species getSpecies() { + return species; + } + + public Integer getLengthClass() { + return lengthClass; + } + + public CaracteristicQualitativeValue getMaturity() { + return maturity; + } + + public CaracteristicQualitativeValue getGender() { + return gender; + } + + public String getSamplingCode() { + return samplingCode; + } + + public boolean withMaturity() { + return maturity != null; + } + + public boolean withGender() { + return gender != null; + } + + public boolean withLengthClass() { + return lengthClass != null; + } + + public boolean withSamplingCode() { + return samplingCode != null; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatusExceptionSupport.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatusExceptionSupport.java index 7bfc5db..0a769e0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatusExceptionSupport.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatusExceptionSupport.java @@ -1,7 +1,6 @@ package fr.ifremer.tutti.service.sampling; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import java.util.Objects; @@ -12,18 +11,18 @@ import java.util.Objects; */ public abstract class IndividualObservationSamplingStatusExceptionSupport extends Exception { - private final IndividualObservationBatch individualObservationBatch; + private final IndividualObservationSamplingCacheRequest samplingCacheRequest; - public IndividualObservationSamplingStatusExceptionSupport(IndividualObservationBatch individualObservationBatch) { - Objects.requireNonNull(individualObservationBatch); - this.individualObservationBatch = individualObservationBatch; + public IndividualObservationSamplingStatusExceptionSupport(IndividualObservationSamplingCacheRequest samplingCacheRequest) { + Objects.requireNonNull(samplingCacheRequest); + this.samplingCacheRequest = samplingCacheRequest; } - public IndividualObservationBatch getIndividualObservationBatch() { - return individualObservationBatch; + public IndividualObservationSamplingCacheRequest getSamplingCacheRequest() { + return samplingCacheRequest; } public FishingOperation getFishingOperation() { - return individualObservationBatch.getFishingOperation(); + return samplingCacheRequest.getFishingOperation(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SizeNotDefinedOnIndividualObservationException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SizeNotDefinedOnIndividualObservationException.java index 8a5ac44..208788a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SizeNotDefinedOnIndividualObservationException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SizeNotDefinedOnIndividualObservationException.java @@ -1,7 +1,5 @@ package fr.ifremer.tutti.service.sampling; -import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; - /** * Quand la taille n'est pas définie sur l'observation individuelle. * @@ -11,7 +9,7 @@ import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; */ public class SizeNotDefinedOnIndividualObservationException extends IndividualObservationSamplingStatusExceptionSupport { - public SizeNotDefinedOnIndividualObservationException(IndividualObservationBatch individualObservationBatch) { - super(individualObservationBatch); + public SizeNotDefinedOnIndividualObservationException(IndividualObservationSamplingCacheRequest samplingCacheRequest) { + super(samplingCacheRequest); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/ZoneNotDefinedOnFishingOperationException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/ZoneNotDefinedOnFishingOperationException.java index 8a0cdb1..e2330b3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/ZoneNotDefinedOnFishingOperationException.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/ZoneNotDefinedOnFishingOperationException.java @@ -1,7 +1,5 @@ package fr.ifremer.tutti.service.sampling; -import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; - /** * Quand la zone n'est pas définie sur l'opération de pêche de l'observation individuelle. * @@ -11,7 +9,7 @@ import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; */ public class ZoneNotDefinedOnFishingOperationException extends IndividualObservationSamplingStatusExceptionSupport { - public ZoneNotDefinedOnFishingOperationException(IndividualObservationBatch individualObservationBatch) { - super(individualObservationBatch); + public ZoneNotDefinedOnFishingOperationException(IndividualObservationSamplingCacheRequest samplingCacheRequest) { + super(samplingCacheRequest); } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch 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>.
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 bac64afb829011015fdb66554e1f0ed5a4e3351b Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 22 10:21:42 2016 +0200 Fin du ménage même s'il reste encore des choses à revoir... --- .../IndividualObservationBatchTableHandler.java | 43 +++------ .../IndividualObservationBatchTableModel.java | 8 ++ .../IndividualObservationBatchUIModel.java | 8 ++ .../frequency/SpeciesFrequencyRowModel.java | 4 + .../frequency/SpeciesFrequencyUIHandler.java | 40 ++------ .../species/frequency/SpeciesFrequencyUIModel.java | 103 ++++++++------------- .../actions/ApplySpeciesFrequencyRafaleAction.java | 49 +--------- .../actions/CancelEditSpeciesFrequencyAction.java | 4 +- .../frequency/actions/RemoveObservationAction.java | 2 +- .../actions/ResetSpeciesFrequencyAction.java | 7 +- 10 files changed, 89 insertions(+), 179 deletions(-) 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 91f6ae8..40afae2 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 @@ -197,7 +197,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { if (!optionalCruiseCache.isPresent()) { throw new IllegalStateException("Can't find cruise cache"); } - TuttiProtocol protocol = dataContext.isProtocolFilled()?dataContext.getProtocol():null; + TuttiProtocol protocol = dataContext.isProtocolFilled() ? dataContext.getProtocol() : null; this.individualObservationUICache = new IndividualObservationUICache(optionalCruiseCache.get(), model, protocol); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); @@ -459,14 +459,6 @@ public class IndividualObservationBatchTableHandler implements Closeable { int lastRow = e.getLastRow(); switch (e.getType()) { - case TableModelEvent.DELETE: - if (individualObservationTableModel.getRowCount() == 0) { - individualObservationTableModel.addNewRow(); - - } else { - individualObservationTableModel.recomputeRankOrders(firstRow); - } - break; case TableModelEvent.INSERT: for (int i = firstRow; i <= lastRow; i++) { @@ -483,10 +475,6 @@ public class IndividualObservationBatchTableHandler implements Closeable { } break; - case TableModelEvent.UPDATE: - if (individualObservationTableModel.getRowCount() == 0) { - individualObservationTableModel.addNewRow(); - } } model.recomputeCanEditLengthStep(); @@ -516,14 +504,14 @@ public class IndividualObservationBatchTableHandler implements Closeable { long rowsWithUserData; // si on etait en mode taille et que l'utilisateur avait saisi des tailles - if (oldCopyMode == CopyIndividualObservationMode.SIZE) { + if (CopyIndividualObservationMode.SIZE == oldCopyMode) { rowsWithUserData = model.getRows().stream() .filter(SpeciesFrequencyRowModel::withWeight) .count(); } else { rowsWithUserData = model.getRows().stream() - .filter(row -> row.getLengthStep() != null || row.withNumber() || row.withWeight()) + .filter(row -> row.withLengthStep() || row.withNumber() || row.withWeight()) .count(); } @@ -544,7 +532,9 @@ public class IndividualObservationBatchTableHandler implements Closeable { throw new PropertyVetoException("The user does not want to erase his data.", evt); } } + } + }); // Pour mettre à jour les mensurations suite au changement du mode de recopie des observations individuelles @@ -560,7 +550,6 @@ public class IndividualObservationBatchTableHandler implements Closeable { } boolean nothingCopyMode = CopyIndividualObservationMode.NOTHING == newCopyMode; - if (!nothingCopyMode) { source.setFrequenciesConfigurationMode(FrequencyConfigurationMode.RAFALE); @@ -568,7 +557,6 @@ public class IndividualObservationBatchTableHandler implements Closeable { } - // si on est en initialisation, ca ne sert à rien de regénérer les lignes, elles sont sensées être chargées if (source.isInitBatchEdition()) { @@ -578,19 +566,14 @@ public class IndividualObservationBatchTableHandler implements Closeable { return; } - model.setRowComputationInProgress(true); + model.clear(); + model.reloadRows(); - try { + // On change le mode de recopie sur toutes les observation individuelles + model2.setCopyIndividualObservationMode(newCopyMode); - model.getRows().clear(); - model.getRowsInError().clear(); - model.reloadRows(); - model2.recomputeRowsValidateState(); - uiHandler.reloadRowsFromIndividualObservations(); - - } finally { - model.setRowComputationInProgress(false); - } + // Recalcul des mensurations à partir des observations individuelles + uiHandler.reloadRowsFromIndividualObservations(); frequencyTableModel.fireTableDataChanged(); individualObservationTableModel.fireTableDataChanged(); @@ -659,7 +642,9 @@ public class IndividualObservationBatchTableHandler implements Closeable { model2.setNotEditableCaracteristic(sampleCategoryValues.keySet()); model2.setRows(individualObservationRows); - individualObservationTableModel.setRows(individualObservationRows); + if (individualObservationRows.isEmpty()) { + individualObservationTableModel.addNewRow(); + } model2.recomputeRowsValidateState(); individualObservationUICache.init(speciesBatch.getSpecies(), model2.getRows()); 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 a1eee9d..550333b 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 @@ -344,5 +344,13 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab fireTableRowsDeleted(minSelection, maxSelection); + if (getRowCount() == 0) { + addNewRow(); + + } else { + recomputeRankOrders(minSelection); + } + } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java index 7c7f4b6..666646a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java @@ -1,6 +1,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.type.WeightUnit; @@ -210,4 +211,11 @@ public class IndividualObservationBatchUIModel extends AbstractTuttiTableUIModel } + public void setCopyIndividualObservationMode(CopyIndividualObservationMode newCopyMode) { + + getRows().forEach(row -> row.setCopyIndividualObservationMode(newCopyMode)); + recomputeRowsValidateState(); + + } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyRowModel.java index 0600305..7bbb448 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyRowModel.java @@ -339,4 +339,8 @@ public class SpeciesFrequencyRowModel extends AbstractTuttiBeanUIModel<SpeciesBa setNumber(source.getNumber()); setWeight(source.getWeight()); } + + public boolean withLengthStep() { + return lengthStep != null; + } } 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 2960158..321da99 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 @@ -91,6 +91,7 @@ import java.awt.event.KeyEvent; import java.beans.PropertyVetoException; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -336,8 +337,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci modelCaracteristic); // get step from the pmfm - float step = getStep(modelCaracteristic); - model.setStep(step); + model.setStep(modelCaracteristic); model.setMinStep(null); model.setMaxStep(null); @@ -363,8 +363,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC, evt -> { Caracteristic newValue = (Caracteristic) evt.getNewValue(); // get step from the pmfm - float step1 = getStep(newValue); - model.setStep(step1); + model.setStep(newValue); if (CollectionUtils.isNotEmpty(getModel().getRows())) { for (SpeciesFrequencyRowModel rowModel : getModel().getRows()) { @@ -505,8 +504,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SpeciesFrequencyUIModel model = getModel(); - model.setCanDisplayNotifications(false); - IOUtils.closeQuietly(individualObservationBatchTableHandler); IOUtils.closeQuietly(averageWeightsHistogramHandler); IOUtils.closeQuietly(frequenciesHistogramHandler); @@ -568,7 +565,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci 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; @@ -806,13 +802,11 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci break; case QUALITATIVE: - List<CaracteristicQualitativeValue> values = - caracteristic.getQualitativeValue(); - addComboDataColumnToModel( - columnModel, - id, - caracteristicQualitativeDecorator, - values); + List<CaracteristicQualitativeValue> values = caracteristic.getQualitativeValue(); + addComboDataColumnToModel(columnModel, + id, + caracteristicQualitativeDecorator, + values); break; case TEXT: @@ -926,17 +920,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci return componentToFocus; } - protected float getStep(Caracteristic caracteristic) { - Float precision = null; - if (caracteristic != null) { - precision = caracteristic.getPrecision(); - } - if (precision == null) { - precision = 1f; - } - return precision; - } - protected void updateLogVisibility() { boolean logVisible = getModel().isRafaleMode() || getContext().isIchtyometerConnected(); @@ -1031,7 +1014,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SpeciesBatchRowModel speciesBatch = model.getBatch(); model.setInitBatchEdition(true); - model.setCanDisplayNotifications(false); try { @@ -1112,7 +1094,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } finally { model.setInitBatchEdition(false); - model.setCanDisplayNotifications(true); } } @@ -1216,15 +1197,14 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - public IndividualObservationBatchTableHandler getIndividualObservationBatchTableHandler() { - return individualObservationBatchTableHandler; + public void removeIndividualObservations(Collection<IndividualObservationBatchRowModel> rows) { + individualObservationBatchTableHandler.removeIndividualObservations(rows); } 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) 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 9ba4669..973fa0b 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 @@ -110,7 +110,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa public static final String PROPERTY_INIT_BATCH_EDITION = "initBatchEdition"; - public static final String PROPERTY_CAN_DISPLAY_NOTIFICATIONS = "canDisplayNotifications"; public static final String PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "nonEmptyIndividualObservationRowsInError"; private final SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; @@ -260,7 +259,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa */ private CopyIndividualObservationMode copyIndividualObservationMode; - private boolean rowComputationInProgress; +// private boolean rowComputationInProgress; /** * Is the model is loading? @@ -272,10 +271,10 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa */ private boolean canDisplayNotifications; - /** - * A row is being created in rafale. Do not remove the sampling warning in this state. - */ - private boolean inRafaleRowCreation; +// /** +// * A row is being created in rafale. Do not remove the sampling warning in this state. +// */ +// private boolean inRafaleRowCreation; private final AverageWeightsHistogramModel averageWeightsHistogramModel; private final FrequenciesHistogramModel frequenciesHistogramModel; @@ -417,6 +416,17 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return step; } + public void setStep(Caracteristic caracteristic) { + Float step = null; + if (caracteristic != null) { + step = caracteristic.getPrecision(); + } + if (step == null) { + step = 1f; + } + setStep(step); + } + public void setStep(Float step) { Object oldValue = getStep(); this.step = step; @@ -562,12 +572,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return totalComputedOrNotWeight; } -// public void setTotalComputedOrNotWeight(ComputableData<Float> totalComputedOrNotWeight) { -// Object oldValue = getTotalComputedOrNotWeight(); -// this.totalComputedOrNotWeight = totalComputedOrNotWeight; -// firePropertyChange(PROPERTY_TOTAL_COMPUTED_OR_NOT_WEIGHT, oldValue, totalComputedOrNotWeight); -// } - public Float getTotalWeight() { return totalComputedOrNotWeight.getData(); } @@ -625,16 +629,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } } - public boolean isAddIndividualObservationOnRafale() { - return addIndividualObservationOnRafale; - } - - public void setAddIndividualObservationOnRafale(boolean addIndividualObservationOnRafale) { - Object oldValue = isAddIndividualObservationOnRafale(); - this.addIndividualObservationOnRafale = addIndividualObservationOnRafale; - firePropertyChange(PROPERTY_ADD_INDIVIDUAL_OBSERVATION_ON_RAFALE, oldValue, addIndividualObservationOnRafale); - } - public CopyIndividualObservationMode getCopyIndividualObservationMode() { return copyIndividualObservationMode; } @@ -644,6 +638,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa this.copyIndividualObservationMode = copyIndividualObservationMode; try { + fireVetoableChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, oldValue, copyIndividualObservationMode); firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_ALL, oldValue == CopyIndividualObservationMode.ALL, copyIndividualObservationMode == CopyIndividualObservationMode.ALL); @@ -653,7 +648,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_SIZE, oldValue == CopyIndividualObservationMode.SIZE, copyIndividualObservationMode == CopyIndividualObservationMode.SIZE); - fireVetoableChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, oldValue, copyIndividualObservationMode); +// fireVetoableChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, oldValue, copyIndividualObservationMode); firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, oldValue, copyIndividualObservationMode); } catch (PropertyVetoException e) { @@ -661,15 +656,15 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa log.error("error in setting copyIndividualObservationMode", e); } this.copyIndividualObservationMode = oldValue; - firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_ALL, - copyIndividualObservationMode == CopyIndividualObservationMode.ALL, - oldValue == CopyIndividualObservationMode.ALL); - firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_NOTHING, - copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING, - oldValue == CopyIndividualObservationMode.NOTHING); - firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_SIZE, - copyIndividualObservationMode == CopyIndividualObservationMode.SIZE, - oldValue == CopyIndividualObservationMode.SIZE); +// firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_ALL, +// copyIndividualObservationMode == CopyIndividualObservationMode.ALL, +// oldValue == CopyIndividualObservationMode.ALL); +// firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_NOTHING, +// copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING, +// oldValue == CopyIndividualObservationMode.NOTHING); +// firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_SIZE, +// copyIndividualObservationMode == CopyIndividualObservationMode.SIZE, +// oldValue == CopyIndividualObservationMode.SIZE); } } @@ -698,14 +693,20 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa firePropertyChange(PROPERTY_EMPTY_ROWS, null, emptyRows); } + public boolean isAddIndividualObservationOnRafale() { + return addIndividualObservationOnRafale; + } + + public void setAddIndividualObservationOnRafale(boolean addIndividualObservationOnRafale) { + Object oldValue = isAddIndividualObservationOnRafale(); + this.addIndividualObservationOnRafale = addIndividualObservationOnRafale; + firePropertyChange(PROPERTY_ADD_INDIVIDUAL_OBSERVATION_ON_RAFALE, oldValue, addIndividualObservationOnRafale); + } + public int getNbRowsWithWeight() { return cache.getNbRowsWithWeight(); } -// public boolean isAllRowsWithWeight() { -// return cache.getNbRowsWithWeight() == rows.size(); -// } - public boolean isSomeRowsWithWeightAndOtherWithout() { boolean result; @@ -848,32 +849,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } - public boolean isRowComputationInProgress() { - return rowComputationInProgress; - } - - public void setRowComputationInProgress(boolean rowComputationInProgress) { - this.rowComputationInProgress = rowComputationInProgress; - } - - public boolean isCanDisplayNotifications() { - return canDisplayNotifications; - } - - public void setCanDisplayNotifications(boolean canDisplayNotifications) { - Object oldValue = isCanDisplayNotifications(); - this.canDisplayNotifications = canDisplayNotifications; - firePropertyChange(PROPERTY_CAN_DISPLAY_NOTIFICATIONS, oldValue, canDisplayNotifications); - } - - public boolean isInRafaleRowCreation() { - return inRafaleRowCreation; - } - - public void setInRafaleRowCreation(boolean inRafaleRowCreation) { - this.inRafaleRowCreation = inRafaleRowCreation; - } - protected final void recomputeRowValidState(SpeciesFrequencyRowModel row) { // recompute row valid state @@ -916,4 +891,8 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa firePropertyChanged(PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, oldValue, nonEmptyIndividualObservationRowsInError); } + public void clear() { + getRows().clear(); + getRowsInError().clear(); + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java index 6f29f2c..d10a1f5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java @@ -80,39 +80,6 @@ public class ApplySpeciesFrequencyRafaleAction { SpeciesFrequencyRowModel row = tableModel.addRafaleRow(aroundLengthStep); int rowIndex = tableModel.getRowIndex(row); -// Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); -// -// SpeciesFrequencyRowModel row = rowsByStep.get(aroundLengthStep); -// -// int rowIndex; -// -// if (row != null) { -// -// // increments current row -// Integer number = row.getNumber(); -// row.setNumber((number == null ? 0 : number) + 1); -// rowIndex = tableModel.updateRow(row); -// -// } else { -// -// // create a new row -// -// row = tableModel.createNewRow(); -// row.setLengthStep(aroundLengthStep); -// row.setNumber(1); -// row.setValid(handler.isRowValid(row)); -// -// // get new index -// List<Float> steps = new ArrayList<>(rowsByStep.keySet()); -// steps.add(aroundLengthStep); -// -// Collections.sort(steps); -// -// rowIndex = steps.indexOf(aroundLengthStep); -// -// tableModel.addNewRow(rowIndex, row); -// } - model.recomputeTotalNumber(); SwingUtilities.invokeLater(() -> selectRow(ui.getTable(), rowIndex)); @@ -132,25 +99,11 @@ public class ApplySpeciesFrequencyRafaleAction { IndividualObservationBatchRowModel obsRow = obsTableModel.addRafaleRow(step); -// IndividualObservationBatchRowModel obsRow = obsTableModel.getEmptyRow(); -// if (obsRow == null) { -// obsRow = obsTableModel.createNewRow(); -// obsTableModel.addNewRow(obsRow); -// } -// obsRow.setSize(step); -// obsTableModel.updateRow(obsRow); - newLogRow.setObsRow(obsRow); int rowIndex = obsTableModel.getRowIndex(obsRow); SwingUtilities.invokeLater(() -> { - - model.setInRafaleRowCreation(true); - try { - selectRow(ui.getObsTable(), rowIndex); - } finally { - model.setInRafaleRowCreation(false); - } + selectRow(ui.getObsTable(), rowIndex); }); 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 8fdecd0..fdd33b3 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 @@ -72,13 +72,11 @@ public class CancelEditSpeciesFrequencyAction extends LongActionSupport<SpeciesF log.debug("Cancel UI " + getUI()); } - getModel().setCanDisplayNotifications(false); - IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); List<IndividualObservationBatchRowModel> individualObservationRows = getModel().getIndividualObservationModel().getRows(); - handler.getIndividualObservationBatchTableHandler().removeIndividualObservations(individualObservationRows); + handler.removeIndividualObservations(individualObservationRows); SpeciesBatchRowModel batch = getModel().getBatch(); 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 8f9cb28..a9ff830 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 @@ -100,7 +100,7 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc }); - handler.getIndividualObservationBatchTableHandler().removeIndividualObservations(rowsToDelete); + handler.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 2e9d9b4..3bdc75b 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 @@ -92,17 +92,12 @@ public class ResetSpeciesFrequencyAction extends LongActionSupport<SpeciesFreque SpeciesFrequencyUIModel model = getModel(); - model.setCanDisplayNotifications(false); - // remove all frequencies model.setRows(new ArrayList<>()); // remove all individual observations List<IndividualObservationBatchRowModel> rows = model.getIndividualObservationModel().getRows(); - handler.getIndividualObservationBatchTableHandler().removeIndividualObservations(rows); - - - model.setCanDisplayNotifications(true); + handler.removeIndividualObservations(rows); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 50f07c7c218c1fa632fc511381cc995a6b5612d1 Merge: 524e139 bac64af Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 22 10:21:48 2016 +0200 Retour sur develop pour intégrer les autres tickets avant release Merge branch 'feature/8242' into develop ...cesSamplingAlgorithmEntryNotFoundException.java | 6 +- .../service/sampling/CruiseSamplingCache.java | 395 +++++++++------------ .../IndividualObservationSamplingCacheRequest.java | 80 +++++ .../IndividualObservationSamplingStatus.java | 3 +- ...lObservationSamplingStatusExceptionSupport.java | 15 +- ...NotDefinedOnIndividualObservationException.java | 6 +- .../ZoneNotDefinedOnFishingOperationException.java | 6 +- .../IndividualObservationBatchRowModel.java | 21 +- .../IndividualObservationBatchRowState.java | 38 +- .../IndividualObservationBatchTableHandler.java | 375 +++++++++++-------- .../IndividualObservationBatchTableModel.java | 14 +- .../IndividualObservationBatchUIModel.java | 8 + ...dividualObservationToSamplingCacheResolver.java | 147 ++++++++ .../frequency/IndividualObservationUICache.java | 371 ++++++------------- .../frequency/SamplingNotificationZoneHandler.java | 8 +- .../frequency/SamplingNotificationZoneModel.java | 27 +- .../frequency/SpeciesFrequencyRowModel.java | 4 + .../frequency/SpeciesFrequencyTableModel.java | 4 +- .../frequency/SpeciesFrequencyUIHandler.java | 223 +++++------- .../species/frequency/SpeciesFrequencyUIModel.java | 135 +++---- .../actions/ApplySpeciesFrequencyRafaleAction.java | 51 +-- .../actions/CancelEditSpeciesFrequencyAction.java | 15 +- .../frequency/actions/EditSampleCodeAction.java | 52 +-- .../frequency/actions/RemoveObservationAction.java | 8 +- .../actions/ResetSpeciesFrequencyAction.java | 13 +- 25 files changed, 989 insertions(+), 1036 deletions(-) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm