branch feature/8145 created (now 63ec6b1)
This is an automated email from the git hooks/post-receive script. New change to branch feature/8145 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git at 63ec6b1 Amélioration de l'API dans DataContext This branch includes the following new commits: new 89a8c71 Amélioration log new 0c63c73 Revue du cache new d30824b Ajout méthodes utiles + un toString digne de ce nom new a8ef33d Création d'un cache d'ui et suppression du code du handler new 63ec6b1 Amélioration de l'API dans DataContext The 5 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 63ec6b1ac53336c9e91e1108aa0c64e4245f975b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:36:03 2016 +0100 Amélioration de l'API dans DataContext commit a8ef33d1ecf304f42635b17899ff4f2848bd2568 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:35:42 2016 +0100 Création d'un cache d'ui et suppression du code du handler commit d30824b47d3cfb9b4cba1fba76177458ba023f7b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:33:39 2016 +0100 Ajout méthodes utiles + un toString digne de ce nom commit 0c63c73a7a09cbcdd7827035ad99096e85f50e7e Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:33:11 2016 +0100 Revue du cache commit 89a8c716257f277947de449d18431ecb88d6babf Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 09:45:12 2016 +0100 Amélioration log -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8145 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 89a8c716257f277947de449d18431ecb88d6babf Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 09:45:12 2016 +0100 Amélioration log --- .../service/referential/SpeciesPersistenceServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/SpeciesPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/SpeciesPersistenceServiceImpl.java index 3b18643..93f33bd 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/SpeciesPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/SpeciesPersistenceServiceImpl.java @@ -207,6 +207,10 @@ public class SpeciesPersistenceServiceImpl extends ReferentialPersistenceService } if (log.isInfoEnabled()) { + log.info("Loaded allObsoleteReferentTaxons : " + result.size()); + } + + if (log.isDebugEnabled()) { log.info("Loaded allObsoleteReferentTaxons : " + result.keySet()); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8145 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 0c63c73a7a09cbcdd7827035ad99096e85f50e7e Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:33:11 2016 +0100 Revue du cache --- .../service/samplingCache/CruiseSamplingCache.java | 171 ++++++++++----------- .../samplingCache/CruiseSamplingInternalCache.java | 146 ++++++++++++++++++ 2 files changed, 226 insertions(+), 91 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCache.java index ec5a295..0d67031 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingCache.java @@ -34,56 +34,52 @@ 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.persistence.entities.referential.TuttiLocation; -import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.util.ArrayList; +import javax.swing.event.EventListenerList; +import java.io.Closeable; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.TreeMap; import java.util.stream.Collectors; /** * @author Kevin Morin (Code Lutin) * @since 4.5 */ -public class CruiseSamplingCache { +public class CruiseSamplingCache implements Closeable { /** Logger. */ private static final Log log = LogFactory.getLog(CruiseSamplingCache.class); - protected static final String KEY_SEPARATOR = "#"; - - protected final Map<String, MutableInt> totalCruiseCache = new TreeMap<>(); - protected final Map<String, MutableInt> zoneCache = new TreeMap<>(); - protected final Map<String, MutableInt> operationCache = new TreeMap<>(); + protected final CruiseSamplingInternalCache totalCruiseCache = new CruiseSamplingInternalCache(); + protected final CruiseSamplingInternalCache zoneCache = new CruiseSamplingInternalCache(); + protected final CruiseSamplingInternalCache operationCache = new CruiseSamplingInternalCache(); protected final Map<TuttiLocation, Zone> zonesByLocations = new HashMap<>(); protected final Multimap<Integer, CalcifiedPiecesSamplingDefinition> cpsDefinitionsBySpecies = HashMultimap.create(); - protected final List<SamplingListener> listeners = new ArrayList<>(); + protected final EventListenerList listeners = new EventListenerList(); public CruiseSamplingCache(TuttiProtocol protocol) { // fill the zones by location protocol.getZone().forEach(zone -> { Map<TuttiLocation, Zone> zoneByLocations = zone.getStrata().stream() - .map(strata -> { - if (strata.isSubstrataEmpty()) { - return Collections.singleton(strata.getLocation()); - } - return strata.getSubstrata().stream() - .map(SubStrata::getLocation) - .collect(Collectors.toSet()); - }) - .flatMap(Collection::stream) - .collect(Collectors.toMap(location -> location, location -> zone)); + .map(strata -> { + if (strata.isSubstrataEmpty()) { + return Collections.singleton(strata.getLocation()); + } + return strata.getSubstrata().stream() + .map(SubStrata::getLocation) + .collect(Collectors.toSet()); + }) + .flatMap(Collection::stream) + .collect(Collectors.toMap(location -> location, location -> zone)); zonesByLocations.putAll(zoneByLocations); }); @@ -93,6 +89,22 @@ public class CruiseSamplingCache { speciesProtocol.getCalcifiedPiecesSamplingDefinition())); } + @Override + public void close() { + if (log.isInfoEnabled()) { + log.info("Closing cruise sampling cache."); + } + totalCruiseCache.close(); + zoneCache.close(); + operationCache.close(); + zonesByLocations.clear(); + cpsDefinitionsBySpecies.clear(); + SamplingListener[] samplingListeners = listeners.getListeners(SamplingListener.class); + for (SamplingListener listener : samplingListeners) { + removeSamplingListener(listener); + } + } + public void increment(FishingOperation operation, Species species, CaracteristicQualitativeValue gender, @@ -107,6 +119,10 @@ public class CruiseSamplingCache { if (cpsDefinitionOpt.isPresent()) { CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); + + if (log.isInfoEnabled()) { + log.info("Found matching sampling definition: " + cpsDefinition); + } int samplingInterval = cpsDefinition.getSamplingInterval(); // on ne prend pas en compte les intervales à 0, ni quand l'espece doit etre sexee et que le sexe est nul @@ -115,28 +131,30 @@ public class CruiseSamplingCache { if (!cpsDefinition.isSex()) { gender = null; } + CruiseSamplingInternalCache.CruiseSamplingInternalCacheKey samplingKey = CruiseSamplingInternalCache.newCruiseSamplingInternalCacheKey(species, gender, maturity, lengthStep); + Optional<Zone> zone = findZone(operation); - String samplingKey = toKey(species, gender, maturity, lengthStep); - int totalValue = increment(totalCruiseCache, samplingKey); + int totalValue = totalCruiseCache.increment(samplingKey); int zoneValue = 0; if (zone.isPresent()) { - zoneValue = increment(zoneCache, toKey(zone.get(), samplingKey)); + CruiseSamplingInternalCache.ZoneCruiseSamplingInternalCacheKey zoneKey = samplingKey.toZoneKey(zone.get()); + zoneValue = zoneCache.increment(zoneKey); } - int operationValue = increment(operationCache, toKey(operation, samplingKey)); + CruiseSamplingInternalCache.FishingOperationCruiseSamplingInternalCacheKey operationKey = samplingKey.toFishingOperationKey(operation); + int operationValue = operationCache.increment(operationKey); if (log.isInfoEnabled()) { log.info("increment " + samplingKey + " => op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); } - if (!listeners.isEmpty()) { - if (totalValue == 1 || totalValue % samplingInterval == 1) { - if (log.isInfoEnabled()) { - log.info("-> needs sampling"); - } - fireSamplingNeeded(lengthStep, gender, maturity, cpsDefinition, samplingInterval, totalValue, zoneValue, operationValue); + if (totalValue == 1 || totalValue % samplingInterval == 1) { + if (log.isInfoEnabled()) { + log.info("-> needs sampling"); } + fireSamplingNeeded(lengthStep, gender, maturity, cpsDefinition, samplingInterval, totalValue, zoneValue, operationValue); } + } } } @@ -156,6 +174,9 @@ public class CruiseSamplingCache { if (cpsDefinitionOpt.isPresent()) { CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); + if (log.isInfoEnabled()) { + log.info("Found matching sampling definition: " + cpsDefinition); + } int samplingInterval = cpsDefinition.getSamplingInterval(); // on ne prend pas en compte les intervales à 0, ni quand l'espece doit etre sexee et que le sexe est nul @@ -165,16 +186,18 @@ public class CruiseSamplingCache { gender = null; } + CruiseSamplingInternalCache.CruiseSamplingInternalCacheKey samplingKey = CruiseSamplingInternalCache.newCruiseSamplingInternalCacheKey(species, gender, maturity, lengthStep); + Optional<Zone> zone = findZone(operation); - String samplingKey = toKey(species, gender, maturity, lengthStep); - int totalValue = decrement(totalCruiseCache, samplingKey); + int totalValue = totalCruiseCache.decrement(samplingKey); int zoneValue = 0; if (zone.isPresent()) { - zoneValue = decrement(zoneCache, toKey(zone.get(), samplingKey)); + CruiseSamplingInternalCache.ZoneCruiseSamplingInternalCacheKey zoneKey = samplingKey.toZoneKey(zone.get()); + zoneValue = zoneCache.decrement(zoneKey); } - int operationValue = decrement(operationCache, toKey(operation, samplingKey)); - + CruiseSamplingInternalCache.FishingOperationCruiseSamplingInternalCacheKey operationKey = samplingKey.toFishingOperationKey(operation); + int operationValue = operationCache.decrement(operationKey); if (log.isInfoEnabled()) { log.info("decrement " + samplingKey + " => op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); @@ -184,64 +207,21 @@ public class CruiseSamplingCache { } public void addSamplingListener(SamplingListener listener) { - listeners.add(listener); + listeners.add(SamplingListener.class, listener); } public void removeSamplingListener(SamplingListener listener) { - listeners.remove(listener); - } - - protected String toKey(Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - Float lengthStep) { - - Objects.requireNonNull(species); - Objects.requireNonNull(lengthStep); - - return species.getReferenceTaxonId() + KEY_SEPARATOR + - (gender != null ? gender.getId() : null) + KEY_SEPARATOR + - maturity + KEY_SEPARATOR + - lengthStep; - } - - protected String toKey(FishingOperation operation, String samplingKey) { - - Objects.requireNonNull(operation); - Objects.requireNonNull(samplingKey); - - return operation.getId() + KEY_SEPARATOR + samplingKey; - } - - protected String toKey(Zone zone, String samplingKey) { - - //FIXME should never be null -// Objects.requireNonNull(zone); - Objects.requireNonNull(samplingKey); - - return (zone == null ? null : zone.getId()) + KEY_SEPARATOR + samplingKey; - } - - protected int increment(Map<String, MutableInt> map, String samplingKey) { - MutableInt value = map.computeIfAbsent(samplingKey, s -> new MutableInt(0)); - value.increment(); - return value.intValue(); - } - - protected int decrement(Map<String, MutableInt> map, String samplingKey) { - MutableInt value = map.get(samplingKey); - value.decrement(); - return value.intValue(); + listeners.remove(SamplingListener.class, listener); } protected Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, float lengthStep) { Collection<CalcifiedPiecesSamplingDefinition> cpsDefinitions = cpsDefinitionsBySpecies.get(species.getReferenceTaxonId()); return cpsDefinitions.stream() - .filter(cpsDef -> Objects.equals(cpsDef.getMaturity(), maturity) - && lengthStep >= cpsDef.getMinSize() - && (cpsDef.getMaxSize() == null - || lengthStep <= cpsDef.getMaxSize())) - .findFirst(); + .filter(cpsDef -> Objects.equals(cpsDef.getMaturity(), maturity) + && lengthStep >= cpsDef.getMinSize() + && (cpsDef.getMaxSize() == null + || lengthStep <= cpsDef.getMaxSize())) + .findFirst(); } protected Optional<Zone> findZone(FishingOperation operation) { @@ -270,12 +250,21 @@ public class CruiseSamplingCache { protected void fireSamplingNeeded(float lengthStep, CaracteristicQualitativeValue gender, Boolean maturity, CalcifiedPiecesSamplingDefinition cpsDefinition, int samplingInterval, int totalValue, int zoneValue, int operationValue) { - int nbForCruise = getSamplingNumber(totalValue, samplingInterval); - int nbForZone = getSamplingNumber(zoneValue, samplingInterval); - int nbForOperation = getSamplingNumber(operationValue, samplingInterval); - SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, nbForCruise, nbForZone, nbForOperation); - listeners.forEach(listener -> listener.samplingNeeded(event)); + SamplingListener[] samplingListeners = listeners.getListeners(SamplingListener.class); + if (samplingListeners.length > 0) { + + int nbForCruise = getSamplingNumber(totalValue, samplingInterval); + int nbForZone = getSamplingNumber(zoneValue, samplingInterval); + int nbForOperation = getSamplingNumber(operationValue, samplingInterval); + + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, nbForCruise, nbForZone, nbForOperation); + for (SamplingListener listener : samplingListeners) { + listener.samplingNeeded(event); + } + + } + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingInternalCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingInternalCache.java new file mode 100644 index 0000000..97f51c9 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/CruiseSamplingInternalCache.java @@ -0,0 +1,146 @@ +package fr.ifremer.tutti.service.samplingCache; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +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 org.apache.commons.lang3.mutable.MutableInt; + +import java.io.Closeable; +import java.util.Map; +import java.util.Objects; +import java.util.TreeMap; + +/** + * Created on 19/03/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.5 + */ +class CruiseSamplingInternalCache implements Closeable { + + protected final Map<String, MutableInt> data = new TreeMap<>(); + + public int increment(CruiseSamplingInternalCacheKey samplingKey) { + MutableInt value = data.computeIfAbsent(samplingKey.toString(), s -> new MutableInt(0)); + value.increment(); + return value.intValue(); + } + + public int decrement(CruiseSamplingInternalCacheKey samplingKey) { + MutableInt value = data.get(samplingKey.toString()); + value.decrement(); + return value.intValue(); + } + + @Override + public void close() { + data.clear(); + } + + public static CruiseSamplingInternalCacheKey newCruiseSamplingInternalCacheKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, Float lengthStep) { + Objects.requireNonNull(species); + Objects.requireNonNull(lengthStep); + return new CruiseSamplingInternalCacheKey(species, gender, maturity, lengthStep); + } + + /** + * Représente la clef d'un objet du cache. + * + * Created on 19/03/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.5 + */ + static class CruiseSamplingInternalCacheKey { + + protected static final String KEY_SEPARATOR = "#"; + + private final Species species; + private final CaracteristicQualitativeValue gender; + private final Boolean maturity; + private final Float lengthStep; + + CruiseSamplingInternalCacheKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, Float lengthStep) { + Objects.requireNonNull(species); + Objects.requireNonNull(lengthStep); + + this.species = species; + this.gender = gender; + this.maturity = maturity; + this.lengthStep = lengthStep; + } + + CruiseSamplingInternalCacheKey(CruiseSamplingInternalCacheKey cruiseSamplingInternalCacheKey) { + this(cruiseSamplingInternalCacheKey.species, + cruiseSamplingInternalCacheKey.gender, + cruiseSamplingInternalCacheKey.maturity, + cruiseSamplingInternalCacheKey.lengthStep); + } + + public ZoneCruiseSamplingInternalCacheKey toZoneKey(Zone zone) { + Objects.requireNonNull(zone); + return new ZoneCruiseSamplingInternalCacheKey(this, zone); + } + + public FishingOperationCruiseSamplingInternalCacheKey toFishingOperationKey(FishingOperation fishingOperation) { + Objects.requireNonNull(fishingOperation); + return new FishingOperationCruiseSamplingInternalCacheKey(this, fishingOperation); + } + + @Override + public String toString() { + return species.getReferenceTaxonId() + + KEY_SEPARATOR + (gender != null ? gender.getId() : null) + + KEY_SEPARATOR + maturity + + KEY_SEPARATOR + lengthStep; + } + + } + + /** + * Représente la clef d'un objet du cache. + * + * Created on 19/03/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.5 + */ + static class FishingOperationCruiseSamplingInternalCacheKey extends CruiseSamplingInternalCacheKey { + + private final FishingOperation fishingOperation; + + FishingOperationCruiseSamplingInternalCacheKey(CruiseSamplingInternalCacheKey cruiseSamplingInternalCacheKey, FishingOperation fishingOperation) { + super(cruiseSamplingInternalCacheKey); + this.fishingOperation = fishingOperation; + } + + @Override + public String toString() { + return fishingOperation.getId() + KEY_SEPARATOR + super.toString(); + } + } + + /** + * Représente la clef d'un objet du cache. + * + * Created on 19/03/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.5 + */ + static class ZoneCruiseSamplingInternalCacheKey extends CruiseSamplingInternalCacheKey { + + private final Zone zone; + + ZoneCruiseSamplingInternalCacheKey(CruiseSamplingInternalCacheKey cruiseSamplingInternalCacheKey, Zone zone) { + super(cruiseSamplingInternalCacheKey); + this.zone = zone; + } + + @Override + public String toString() { + return zone.getId() + KEY_SEPARATOR + super.toString(); + } + } +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8145 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit d30824b47d3cfb9b4cba1fba76177458ba023f7b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:33:39 2016 +0100 Ajout méthodes utiles + un toString digne de ce nom --- .../CalcifiedPiecesSamplingDefinitionBean.java | 30 ++++++++++++++++++++-- .../CalcifiedPiecesSamplingDefinitions.java | 21 +++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CalcifiedPiecesSamplingDefinitionBean.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CalcifiedPiecesSamplingDefinitionBean.java index fed6c1e..f512b24 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CalcifiedPiecesSamplingDefinitionBean.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CalcifiedPiecesSamplingDefinitionBean.java @@ -24,6 +24,8 @@ package fr.ifremer.tutti.persistence.entities.protocol; * #L% */ +import com.google.common.base.MoreObjects; + import java.util.Objects; public class CalcifiedPiecesSamplingDefinitionBean extends AbstractCalcifiedPiecesSamplingDefinitionBean { @@ -34,8 +36,8 @@ public class CalcifiedPiecesSamplingDefinitionBean extends AbstractCalcifiedPiec if (o == null || getClass() != o.getClass()) return false; CalcifiedPiecesSamplingDefinitionBean that = (CalcifiedPiecesSamplingDefinitionBean) o; return minSize == that.minSize && - Objects.equals(maxSize, that.maxSize) && - Objects.equals(maturity, that.maturity); + Objects.equals(maxSize, that.maxSize) && + Objects.equals(maturity, that.maturity); } @Override @@ -43,4 +45,28 @@ public class CalcifiedPiecesSamplingDefinitionBean extends AbstractCalcifiedPiec return Objects.hash(minSize, maxSize, maturity); } + @Override + public String toString() { + MoreObjects.ToStringHelper toStringHelper = + MoreObjects.toStringHelper(CalcifiedPiecesSamplingDefinition.class) + .add(PROPERTY_MIN_SIZE, minSize) + .add(PROPERTY_MAX_SIZE, maxSize == null ? "∞" : maxSize) + .add(PROPERTY_SEX, sex) + .add(PROPERTY_SAMPLING_INTERVAL, samplingInterval); + + if (maturity != null) { + toStringHelper.add(PROPERTY_MATURITY, maturity); + } + if (maxByLenghtStep != null && maxByLenghtStep > 0) { + toStringHelper.add(PROPERTY_MAX_BY_LENGHT_STEP, maxByLenghtStep); + } + if (operationLimitation != null && operationLimitation > 0) { + toStringHelper.add(PROPERTY_OPERATION_LIMITATION, operationLimitation); + } + if (zoneLimitation != null && zoneLimitation > 0) { + toStringHelper.add(PROPERTY_ZONE_LIMITATION, zoneLimitation); + } + + return toStringHelper.toString(); + } } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CalcifiedPiecesSamplingDefinitions.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CalcifiedPiecesSamplingDefinitions.java new file mode 100644 index 0000000..a4cd053 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CalcifiedPiecesSamplingDefinitions.java @@ -0,0 +1,21 @@ +package fr.ifremer.tutti.persistence.entities.protocol; + +public class CalcifiedPiecesSamplingDefinitions extends AbstractCalcifiedPiecesSamplingDefinitions { + + public static boolean isOperationValueUpperMax(CalcifiedPiecesSamplingDefinition cpsDef, int value) { + return isValueUpperMax(value, cpsDef.getOperationLimitation()); + } + + public static boolean isZoneValueUpperMax(CalcifiedPiecesSamplingDefinition cpsDef, int value) { + return isValueUpperMax(value, cpsDef.getZoneLimitation()); + } + + public static boolean isCruiseValueUpperMax(CalcifiedPiecesSamplingDefinition cpsDef, int value) { + return isValueUpperMax(value, cpsDef.getMaxByLenghtStep()); + } + + static boolean isValueUpperMax(int value, Integer max) { + return max != null && max > 0 && value > max; + } + +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8145 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit a8ef33d1ecf304f42635b17899ff4f2848bd2568 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:35:42 2016 +0100 Création d'un cache d'ui et suppression du code du handler --- .../IndividualObservationBatchRowModel.java | 20 +- .../frequency/IndividualObservationUICache.java | 303 +++++++++++++++++++++ .../frequency/SpeciesFrequencyUIHandler.java | 211 +++++--------- .../species/frequency/SpeciesFrequencyUIModel.java | 18 ++ .../actions/CancelEditSpeciesFrequencyAction.java | 5 +- .../frequency/actions/RemoveObservationAction.java | 5 +- .../actions/ResetSpeciesFrequencyAction.java | 5 +- 7 files changed, 414 insertions(+), 153 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java index 5029d7d..f7b2b0d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java @@ -32,6 +32,7 @@ import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatchs; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; 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.type.WeightUnit; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; @@ -399,11 +400,11 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel public boolean isEmpty(Collection<Caracteristic> caracteristicsToIgnore) { return getSize() == null - && getWeight() == null - && (getCaracteristics() == null || !getCaracteristics().hasNonNullValues(caracteristicsToIgnore)) - && (getDefaultCaracteristics() == null || !getDefaultCaracteristics().hasNonNullValues(caracteristicsToIgnore)) - && getComment() == null - && (getAttachment() == null || getAttachment().isEmpty()); + && getWeight() == null + && (getCaracteristics() == null || !getCaracteristics().hasNonNullValues(caracteristicsToIgnore)) + && (getDefaultCaracteristics() == null || !getDefaultCaracteristics().hasNonNullValues(caracteristicsToIgnore)) + && getComment() == null + && (getAttachment() == null || getAttachment().isEmpty()); } public void copy(IndividualObservationBatchRowModel source) { @@ -424,4 +425,13 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel allCaracteristics.putAll(getCaracteristics()); return allCaracteristics.get(caracteristic); } + + public CaracteristicQualitativeValue getGender(Caracteristic sexCaracteristic) { + return (CaracteristicQualitativeValue) getCaracteristicValue(sexCaracteristic); + } + + // FIXME Add it. + public Boolean getMaturityState() { + return null; + } } 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 new file mode 100644 index 0000000..7e57a8a --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java @@ -0,0 +1,303 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; +import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinitions; +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.samplingCache.CruiseSamplingCache; +import fr.ifremer.tutti.service.samplingCache.SamplingEvent; +import fr.ifremer.tutti.service.samplingCache.SamplingListener; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; +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.Objects; +import java.util.Optional; + +import static org.nuiton.i18n.I18n.t; + +/** + * Cache des observations individuelles. + * + * Gère notamment le cache de prélèvement des pièces calcifiés, mais aussi le cache des codes de prélèvements. + * + * Created on 19/03/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationUICache implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(IndividualObservationUICache.class); + + private final SamplingListener samplingListener; + private final Optional<CruiseSamplingCache> samplingCache; + private final Caracteristic sexCaracteristic; + private final SpeciesFrequencyUIModel uiModel; + + private SpeciesBatchRowModel speciesEditRow; + private FishingOperation fishingOperation; + private Species species; + private SpeciesFrequencyUI ui; + + /** + * Est-ce que le cache est actif ? + */ + private boolean on; + + + public IndividualObservationUICache(Optional<CruiseSamplingCache> samplingCache, SpeciesFrequencyUIModel uiModel, Caracteristic sexCaracteristic) { + + this.samplingCache = samplingCache; + this.uiModel = uiModel; + this.sexCaracteristic = sexCaracteristic; + + // 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 = samplingCache.isPresent(); + 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"); + } + } + + } + } + }); + + // Ecoute sur le cache de données pour savoir quand il faut afficher les notifications de prélèvements + this.samplingListener = new SamplingListener() { + + @Override + public void samplingNeeded(SamplingEvent event) { + + CalcifiedPiecesSamplingDefinition cpsDef = event.getCpsDef(); + if (log.isInfoEnabled()) { + log.info("samplingNeeded for " + cpsDef); + } + + int nbForOperation = event.getNbForOperation(); + int nbForZone = event.getNbForZone(); + int nbForCruise = event.getNbForCruise(); + + Integer operationLimitation = cpsDef.getOperationLimitation(); + Integer zoneLimitation = cpsDef.getZoneLimitation(); + Integer maxByLenghtStep = cpsDef.getMaxByLenghtStep(); + + if (log.isInfoEnabled()) { + log.info(String.format("nbForOperation: %d/%s - nbForZone: %d/%s - nbForCruise: %d/%s", + nbForOperation, operationLimitation == null ? "∞" : operationLimitation, + nbForZone, zoneLimitation == null ? "∞" : zoneLimitation, + nbForCruise, maxByLenghtStep == null ? "∞" : maxByLenghtStep)); + } + + boolean operationValueUpperMax = CalcifiedPiecesSamplingDefinitions.isOperationValueUpperMax(cpsDef, nbForOperation); + boolean zoneValueUpperMax = CalcifiedPiecesSamplingDefinitions.isZoneValueUpperMax(cpsDef, nbForZone); + boolean cruiseValueUpperMax = CalcifiedPiecesSamplingDefinitions.isCruiseValueUpperMax(cpsDef, nbForCruise); + + boolean showSamplingWarning = !operationValueUpperMax && !zoneValueUpperMax && !cruiseValueUpperMax; + if (log.isInfoEnabled()) { + log.info("showSamplingWarning " + showSamplingWarning); + } + ui.getSamplingWarningLabel().setVisible(showSamplingWarning); + + String nbForOperationLabel = getLabelForSamplingNumber(operationValueUpperMax, nbForOperation, operationLimitation); + String nbForZoneLabel = getLabelForSamplingNumber(zoneValueUpperMax, nbForZone, zoneLimitation); + String nbForCruiseLabel = getLabelForSamplingNumber(cruiseValueUpperMax, nbForCruise, maxByLenghtStep); + + //TODO add mauturity + String key = event.getLengthStep() + " " + uiModel.getLengthStepCaracteristicUnit(); + if (event.getGender() != null) { + key += " " + event.getGender().getDescription(); + } + if (event.getMaturity() != null) { + if (event.getMaturity()) { + key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.mature"); + } else { + key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.immature"); + } + } + ui.getSamplingResumeLabel().setText(t("tutti.editSpeciesFrequencies.samplingNeeded.resume", key, nbForOperationLabel, nbForZoneLabel, nbForCruiseLabel)); + + } + + String getLabelForSamplingNumber(boolean valueUpperMax, int value, Integer max) { + String result; + if (valueUpperMax) { + result = t("tutti.editSpeciesFrequencies.samplingNeeded.max"); + } else { + // min à 0 (pour le cas où on ne soit pas dans une zone (pas de strate ou de sous strate définie)) + result = String.valueOf(Math.max(0, value - 1)); + } + return result; + } + }; + + } + + public void init(SpeciesFrequencyUI ui, SpeciesBatchRowModel speciesEditRow, FishingOperation fishingOperation) { + + Objects.requireNonNull(ui); + Objects.requireNonNull(speciesEditRow); + Objects.requireNonNull(speciesEditRow.getSpecies()); + Objects.requireNonNull(fishingOperation); + + this.ui = ui; + this.speciesEditRow = speciesEditRow; + this.species = speciesEditRow.getSpecies(); + this.fishingOperation = fishingOperation; + if (samplingCache.isPresent()) { + samplingCache.get().addSamplingListener(samplingListener); + } + } + + @Override + public void close() { + this.ui = null; + this.speciesEditRow = null; + this.species = null; + this.fishingOperation = null; + if (samplingCache.isPresent()) { + samplingCache.get().removeSamplingListener(samplingListener); + } + } + + /** + * Ajoute une observation individuelle dans le cache. + * + * @param row la ligne à ajouter au cache + */ + public void increments(IndividualObservationBatchRowModel row) { + + increments(row.getGender(sexCaracteristic), row.getMaturityState(), row.getSize()); + + } + + /** + * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. + * + * @param gender le sexe + * @param maturity l'état de maturité + * @param lengthStep la classe de taille + */ + public void increments(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip increments individual observations in cache."); + } + return; + } + + samplingCache.get().increment(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStep(lengthStep)); + } + + /** + * Retire une observation individuelle dans le cache. + * + * @param row la ligne à retirer du cache + */ + public void decrements(IndividualObservationBatchRowModel row) { + + decrements(row.getGender(sexCaracteristic), row.getMaturityState(), row.getSize()); + + } + + /** + * Retire une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. + * + * @param gender le sexe + * @param maturity l'état de maturité + * @param lengthStep la classe de taille + */ + public void decrements(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip decrements individual observations in cache."); + } + return; + } + + samplingCache.get().decrement(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStep(lengthStep)); + + } + + /** + * Retire toutes les observations individuelles contenues dans le modèle d'UI du cache. + */ + public void decrementsAll() { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip decrements all individual observations in cache."); + } + return; + } + + uiModel.getIndividualObservationRows() + .stream() + .filter(IndividualObservationBatchRowModel::withSize) + .forEach(this::decrements); + + } + + /** + * 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() { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip reset individual observations in cache."); + } + return; + } + + decrementsAll(); + + speciesEditRow.getIndividualObservation() + .stream() + .filter(IndividualObservationBatchRowModel::withSize) + .forEach(this::increments); + + } + +} 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 b82607c..846ae02 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 @@ -33,7 +33,6 @@ import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.persistence.entities.data.SampleCategory; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; -import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; import fr.ifremer.tutti.persistence.entities.protocol.Rtp; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; @@ -44,14 +43,12 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TaxonCache; import fr.ifremer.tutti.persistence.entities.referential.TaxonCaches; import fr.ifremer.tutti.service.DecoratorService; -import fr.ifremer.tutti.service.samplingCache.SamplingEvent; -import fr.ifremer.tutti.service.samplingCache.SamplingListener; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.TuttiUIContext; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.EditSpeciesBatchPanelUI; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.EditSpeciesBatchPanelUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyCellComponent.FrequencyCellEditor; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions.ApplySpeciesFrequencyRafaleAction; @@ -170,7 +167,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci */ protected final FeedReaderListener feedReaderListener; - protected final SamplingListener samplingListener; + protected IndividualObservationUICache individualObservationUICache; protected ApplySpeciesFrequencyRafaleAction applySpeciesFrequencyRafaleAction; @@ -178,9 +175,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci protected Optional<CaracteristicColumnIdentifier> maturityColumnId = Optional.empty(); - // Flag to mark when preparing the batch edition - private boolean initBatchEdition; - protected SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; public SpeciesFrequencyUIHandler() { @@ -207,47 +201,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } }; - this.samplingListener = new SamplingListener() { - - @Override - public void samplingNeeded(SamplingEvent event) { - - if (log.isInfoEnabled()) { - log.info("samplingNeeded"); - } - - CalcifiedPiecesSamplingDefinition cpsDef = event.getCpsDef(); - - boolean showSamplingWarning = !isValueUpperMax(event.getNbForOperation(), cpsDef.getOperationLimitation()) - && !isValueUpperMax(event.getNbForZone(), cpsDef.getZoneLimitation()) - && !isValueUpperMax(event.getNbForCruise(), cpsDef.getMaxByLenghtStep()); - if (log.isInfoEnabled()) { - log.info("showSamplingWarning " + showSamplingWarning); - } - ui.getSamplingWarningLabel().setVisible(showSamplingWarning); - - String nbForOperation = getLabelForSamplingNumber(event.getNbForOperation(), cpsDef.getOperationLimitation()); - String nbForZone = getLabelForSamplingNumber(event.getNbForZone(), cpsDef.getZoneLimitation()); - String nbForCruise = getLabelForSamplingNumber(event.getNbForCruise(), cpsDef.getMaxByLenghtStep()); - - //TODO add mauturity - String key = event.getLengthStep() + " " + getModel().getLengthStepCaracteristicUnit(); - if (event.getGender() != null) { - key += " " + event.getGender().getDescription(); - } - if (event.getMaturity() != null) - if (event.getMaturity() != null) { - if (event.getMaturity()) { - key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.mature"); - } else { - key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.immature"); - } - } - ui.getSamplingResumeLabel().setText(t("tutti.editSpeciesFrequencies.samplingNeeded.resume", key, nbForOperation, nbForZone, nbForCruise)); - - } - }; - this.obsChangedListener = new PropertyChangeListener() { @Override @@ -258,7 +211,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); String propertyName = evt.getPropertyName(); - CaracteristicQualitativeValue gender = getRowGender(row); + CaracteristicQualitativeValue gender = row.getGender(sexCaracteristic); // we only update the frequencies if the row is valid if (row.isValid()) { @@ -272,10 +225,10 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Float newValue = (Float) evt.getNewValue(); if (oldValue != null) { - decrementSampling(gender, null, oldValue); + individualObservationUICache.decrements(gender, null, oldValue); } if (newValue != null) { - incrementSampling(gender, null, newValue); + individualObservationUICache.increments(gender, null, newValue); } if (getModel().mustCopyIndividualObservationSize()) { @@ -323,8 +276,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci CaracteristicQualitativeValue oldGender = (CaracteristicQualitativeValue) oldValue.get(sexCaracteristic); CaracteristicQualitativeValue newGender = (CaracteristicQualitativeValue) newValue.get(sexCaracteristic); if (!Objects.equals(oldGender, newGender)) { - decrementSampling(oldGender, null, row.getSize()); - incrementSampling(newGender, null, row.getSize()); + individualObservationUICache.decrements(oldGender, null, row.getSize()); + individualObservationUICache.increments(newGender, null, row.getSize()); } } } @@ -338,13 +291,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (oldValue && getModel().mustCopyIndividualObservationSize()) { updateFrequencyRowsNumbers(row.getSize(), null); - decrementSampling(gender, null, row.getSize()); + individualObservationUICache.decrements(gender, null, row.getSize()); } if (newValue) { if (getModel().mustCopyIndividualObservationSize()) { updateFrequencyRowsNumbers(null, row.getSize()); if (row.withSize()) { - incrementSampling(gender, null, row.getSize()); + individualObservationUICache.increments(gender, null, row.getSize()); } } if (getModel().mustCopyIndividualObservationWeight()) { @@ -501,6 +454,9 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SwingUtilities.invokeLater(this::updateLogVisibility); }); + + this.individualObservationUICache = new IndividualObservationUICache( + getDataContext().getOptionalCruiseSamplingCache(), model, sexCaracteristic); } @Override @@ -663,10 +619,11 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // Pour bloquer le changement du mode de recopie des observations individuelles → mensurations model.addVetoableChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { + SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); - if (initBatchEdition) { + if (source.isInitBatchEdition()) { if (log.isInfoEnabled()) { log.info("Skip ask user to confirm copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); @@ -726,8 +683,10 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } + SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); + // si on est en initialisation, ca ne sert à rien de regénérer les lignes, elles sont sensées être chargées - if (initBatchEdition) { + if (source.isInitBatchEdition()) { if (log.isInfoEnabled()) { log.info("Skip recompute frequencies from indivudal observations (flag initBatchEdition is on), copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); @@ -824,38 +783,41 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci getContext().getIchtyometerReader().removeFeedModeReaderListener(feedReaderListener); } - if (getDataContext().isCruiseSamplingCacheLoaded()) { - getDataContext().getCruiseSamplingCache().removeSamplingListener(samplingListener); - } + individualObservationUICache.close(); +// if (getDataContext().isCruiseSamplingCacheLoaded()) { +// getDataContext().getCruiseSamplingCache().removeSamplingListener(samplingListener); +// } } public void editBatch(FrequencyCellEditor editor, Optional<String> optionalTitle) { - initBatchEdition = true; - try { + SpeciesBatchRowModel speciesBatch = editor.getEditRow(); + Objects.requireNonNull(speciesBatch, "Impossible d'éditer un lot non renseigné"); - // on enlève la colonne spécifique à l'espèce précédente - if (maturityColumnId.isPresent()) { - TableColumnExt maturityColumn = ui.getObsTable().getColumnExt(maturityColumnId.get()); - ui.getObsTable().removeColumn(maturityColumn); - maturityColumnId = Optional.empty(); - } + // on enlève la colonne spécifique à l'espèce précédente + if (maturityColumnId.isPresent()) { + TableColumnExt maturityColumn = ui.getObsTable().getColumnExt(maturityColumnId.get()); + ui.getObsTable().removeColumn(maturityColumn); + maturityColumnId = Optional.empty(); + } - FrequencyConfigurationMode mode = FrequencyConfigurationMode.FREQUENCIES; - FrequencyConfigurationMode frequenciesMode = FrequencyConfigurationMode.AUTO_GEN; + if (optionalTitle.isPresent()) { - if (optionalTitle.isPresent()) { + String title = optionalTitle.get(); + frequenciesHistogramPopup.setTitle(title + t("tutti.editSpeciesFrequencies.title")); + averageWeightsHistogramPopup.setTitle(title + weightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight"))); - String title = optionalTitle.get(); - frequenciesHistogramPopup.setTitle(title + t("tutti.editSpeciesFrequencies.title")); - averageWeightsHistogramPopup.setTitle(title + weightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight"))); + } - } + SpeciesFrequencyUIModel model = getModel(); + + model.setInitBatchEdition(true); - SpeciesBatchRowModel speciesBatch = editor.getEditRow(); - Objects.requireNonNull(speciesBatch, "Impossible d'éditer un lot non renseigné"); + try { + + FrequencyConfigurationMode mode = FrequencyConfigurationMode.FREQUENCIES; + FrequencyConfigurationMode frequenciesMode = FrequencyConfigurationMode.AUTO_GEN; - SpeciesFrequencyUIModel model = getModel(); model.setNextEditableRowIndex(editor.getNextEditableRowIndex()); model.setTotalNumber(null); model.setTotalComputedWeight(null); @@ -1114,59 +1076,20 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - if (getDataContext().isCruiseSamplingCacheLoaded()) { - getDataContext().getCruiseSamplingCache().addSamplingListener(samplingListener); - } + individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation()); model.setModify(false); } finally { - initBatchEdition = false; - } - - } - - //TODO maturity - public void incrementSampling(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { - - if (!initBatchEdition && getDataContext().isCruiseSamplingCacheLoaded()) { - SpeciesBatchRowModel batch = getModel().getBatch(); - - getDataContext().getCruiseSamplingCache().increment(getDataContext().getFishingOperation(), - batch.getSpecies(), - gender, - maturity, - getModel().getLengthStep(lengthStep)); + model.setInitBatchEdition(false); + //FIXME Voir si c'est nécessaire ? + model.setModify(false); } - } - - public void decrementSampling(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { - if (!initBatchEdition && getDataContext().isCruiseSamplingCacheLoaded()) { - SpeciesBatchRowModel batch = getModel().getBatch(); - getDataContext().getCruiseSamplingCache().decrement(getDataContext().getFishingOperation(), - batch.getSpecies(), - gender, - maturity, - getModel().getLengthStep(lengthStep)); - } } - public void decrementAllSamplings() { - if (!initBatchEdition && getDataContext().isCruiseSamplingCacheLoaded()) { - getModel().getIndividualObservationRows().forEach(row -> { - if (row.withSize()) { - decrementSampling(getRowGender(row), null, row.getSize()); - } - }); - } - } - public void resetSamplings() { - if (!initBatchEdition && getDataContext().isCruiseSamplingCacheLoaded()) { - frequencyEditor.getEditRow().getIndividualObservation().stream() - .filter(IndividualObservationBatchRowModel::withSize) - .forEach(row -> incrementSampling(getRowGender(row), null, row.getSize())); - } + public IndividualObservationUICache getIndividualObservationUICache() { + return individualObservationUICache; } public void updateFrequencyRowsNumbers(Float lengthStepToDec, Float lengthStepToInc) { @@ -1230,9 +1153,9 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } } - public CaracteristicQualitativeValue getRowGender(IndividualObservationBatchRowModel row) { - return (CaracteristicQualitativeValue) row.getCaracteristicValue(sexCaracteristic); - } +// public CaracteristicQualitativeValue getGender(IndividualObservationBatchRowModel row) { +// return (CaracteristicQualitativeValue) row.getCaracteristicValue(sexCaracteristic); +// } //------------------------------------------------------------------------// //-- Internal methods --// @@ -1596,8 +1519,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } protected void resetSamplingLabels() { - if (log.isInfoEnabled()) { - log.info("reset smapling panel"); + if (log.isDebugEnabled()) { + log.debug("reset smapling panel"); } ui.getSamplingWarningLabel().setVisible(false); ui.getSamplingResumeLabel().setText(null); @@ -1865,20 +1788,20 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.reloadRows(); } - protected boolean isValueUpperMax(int value, Integer max) { - return max != null && max > 0 && value > max; - } - - protected String getLabelForSamplingNumber(int value, Integer max) { - String result; - if (isValueUpperMax(value, max)) { - result = t("tutti.editSpeciesFrequencies.samplingNeeded.max"); - } else { - // min à 0 (pour le cas où on ne soit pas dans une zone (pas de strate ou de sous strate définie)) - result = String.valueOf(Math.max(0, value - 1)); - } - return result; - } +// protected boolean isValueUpperMax(int value, Integer max) { +// return max != null && max > 0 && value > max; +// } +// +// protected String getLabelForSamplingNumber(int value, Integer max) { +// String result; +// if (isValueUpperMax(value, max)) { +// result = t("tutti.editSpeciesFrequencies.samplingNeeded.max"); +// } else { +// // min à 0 (pour le cas où on ne soit pas dans une zone (pas de strate ou de sous strate définie)) +// result = String.valueOf(Math.max(0, value - 1)); +// } +// return result; +// } @Override public <E> void initBeanFilterableComboBox(BeanFilterableComboBox<E> comboBox, List<E> data, E selectedData) { 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 03b13cf..1dd8fa7 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 @@ -118,6 +118,9 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa public static final String PROPERTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "individualObservationRowsInError"; public static final String PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "nonEmptyIndividualObservationRowsInError"; + + public static final String PROPERTY_INIT_BATCH_EDITION = "initBatchEdition"; + private final SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; /** @@ -295,6 +298,11 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa protected boolean rowComputationInProgress; + /** + * Is the model is loading? + */ + protected boolean initBatchEdition; + protected final PropertyChangeListener rowInErrorChangedListener = new PropertyChangeListener() { @Override @@ -334,6 +342,16 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa setIndividualObservationRowsInError(new HashSet<>()); } + public boolean isInitBatchEdition() { + return initBatchEdition; + } + + public void setInitBatchEdition(boolean initBatchEdition) { + Object oldValue = isInitBatchEdition(); + this.initBatchEdition = initBatchEdition; + firePropertyChange(PROPERTY_INIT_BATCH_EDITION, oldValue, initBatchEdition); + } + public void reloadRows() { setEmptyRows(new HashSet<>()); 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 7f97f8d..0b02ca6 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,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.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; @@ -95,8 +96,8 @@ public class CancelEditSpeciesFrequencyAction extends LongActionSupport<SpeciesF log.debug("Cancel UI " + getUI()); } - handler.decrementAllSamplings(); - handler.resetSamplings(); + IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); + individualObservationUICache.reset(); // close dialog getHandler().onCloseUI(); 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 d538cbc..0a39e57 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,6 +26,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; +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; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; @@ -78,6 +79,8 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc SpeciesFrequencyUIModel model = ui.getModel(); SpeciesFrequencyUIHandler handler = ui.getHandler(); + + IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); rowsToDelete.forEach(row -> { if (row.withSize()) { @@ -89,7 +92,7 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc handler.updateFrequencyRowsWeights(row.getSize(), -row.getWeight()); } - handler.decrementSampling(handler.getRowGender(row), null, row.getSize()); + individualObservationUICache.decrements(row); } model.removeIndividualObservationRowInError(row); }); 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 d4e5fe6..c3643f2 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,6 +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.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; @@ -94,7 +95,9 @@ public class ResetSpeciesFrequencyAction extends LongActionSupport<SpeciesFreque model.setRows(new ArrayList<>()); // remove all individual observations - handler.decrementAllSamplings(); + IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); + + individualObservationUICache.decrementsAll(); model.setIndividualObservationRows(new ArrayList<>()); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8145 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 63ec6b1ac53336c9e91e1108aa0c64e4245f975b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:36:03 2016 +0100 Amélioration de l'API dans DataContext --- .../main/java/fr/ifremer/tutti/service/TuttiDataContext.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java index c345ab6..1306dae 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java @@ -51,6 +51,7 @@ import java.io.Closeable; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -323,7 +324,7 @@ public class TuttiDataContext extends AbstractBean implements Closeable { } if (cruise != null && - !cruise.getProgram().getId().equals(oldProgramId)) { + !cruise.getProgram().getId().equals(oldProgramId)) { // not matchin program, reset cruise id cruise = null; @@ -418,7 +419,7 @@ public class TuttiDataContext extends AbstractBean implements Closeable { } public boolean isFishingOperationFilled() { - return fishingOperationId!=null; + return fishingOperationId != null; } public boolean isCruiseSamplingCacheLoaded() { @@ -535,14 +536,13 @@ public class TuttiDataContext extends AbstractBean implements Closeable { return service.getProtocol(); } - public CruiseSamplingCache getCruiseSamplingCache() { - return cruiseSamplingCache; + public Optional<CruiseSamplingCache> getOptionalCruiseSamplingCache() { + return Optional.ofNullable(isCruiseSamplingCacheLoaded() ? cruiseSamplingCache : null); } public void loadCruiseSamplingCache() { checkOpened(); - if (!isCruiseSamplingCacheLoaded() - && isProtocolFilled() && isCruiseFilled()) { + if (!isCruiseSamplingCacheLoaded() && isProtocolFilled() && isCruiseFilled()) { TuttiProtocol protocol = getProtocol(); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm