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 6e821cb6c99d4447a01170b92bc01617cc37f61f Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Apr 24 19:51:07 2016 +0200 Correction de la suppression d'une opération de pêche dans le cache des échantillons --- .../service/sampling/CruiseSamplingCache.java | 66 +++++++++++--------- .../sampling/CruiseSamplingInternalCache.java | 70 ++++++++++------------ 2 files changed, 69 insertions(+), 67 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 d7c30af..23d5743 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 @@ -49,9 +49,10 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.Set; import java.util.stream.IntStream; +import static fr.ifremer.tutti.service.sampling.CruiseSamplingInternalCache.addPrefixKey; + /** * @author Kevin Morin (Code Lutin) * @since 4.5 @@ -280,44 +281,53 @@ public class CruiseSamplingCache implements CruiseCacheAble { Zone zone = optionalZone.get(); - setLoading(true); - try { + String fishingOperationId = fishingOperation.getId(); - String fishingOperationId = fishingOperation.getId(); + if (log.isInfoEnabled()) { + log.info("Removing fishing operation: " + fishingOperation + " from " + this); + } - if (log.isInfoEnabled()) { - log.info("Removing fishing operation: " + fishingOperation + " from " + this); - } + // suppression de toutes les entrées du cache des opérations (et récupération des clefs) - // suppression de toutes les entrées du cache des opérations (et récupération des clefs) - Set<String> removedKeys = fishingOperationCache.removeAllWhereKeyStartingWith(fishingOperationId); + String keyPrefix = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, ""); + int keyPrefixLength = keyPrefix.length(); - if (log.isInfoEnabled()) { - log.info("Fishing operation: " + fishingOperation + " removed from fishingOperationCache: " + fishingOperationCache.size()); - } + String zoneId = zone.getId(); - removedKeys.forEach(cruiseCache::removeOneIndividualObservation); + fishingOperationCache.getKeys() + .stream() + .filter(key -> key.startsWith(keyPrefix)) + .forEach(fishingOperationSamplingKey -> { - if (log.isInfoEnabled()) { - log.info("Fishing operation: " + fishingOperation + " removed from cruiseCache: " + cruiseCache.size()); - } + CruiseSamplingInternalCache.SamplingData samplingData = fishingOperationCache.getSamplingData(fishingOperationSamplingKey); - String zoneId = zone.getId(); - removedKeys.forEach(key -> zoneCache.removeOneIndividualObservation(CruiseSamplingInternalCache.addPrefixKey(zoneId, key))); + if (log.isInfoEnabled()) { + log.info("Found " + fishingOperationSamplingKey + " to remove from fishing operation cache (" + samplingData + ")."); + } - if (log.isInfoEnabled()) { - log.info("Fishing operation: " + fishingOperation + " removed from zoneCache: " + zoneCache.size()); - } + int individualObservationCount = samplingData.getIndividualObservationCount(); + int samplingCount = samplingData.getSamplingCount(); - if (log.isInfoEnabled()) { - log.info("Fishing operation: " + fishingOperation + " removed from " + this); - } + String cruiseSamplingKey = fishingOperationSamplingKey.substring(keyPrefixLength); + cruiseCache.remove(cruiseSamplingKey, individualObservationCount, samplingCount); - } finally { + String zoneSamplingKey = addPrefixKey(zoneId, cruiseSamplingKey); + zoneCache.remove(zoneSamplingKey, individualObservationCount, samplingCount); - setLoading(false); + fishingOperationCache.remove(fishingOperationSamplingKey, individualObservationCount, samplingCount); + + }); + cruiseCache.cleanEmptyEntries(); + zoneCache.cleanEmptyEntries(); + fishingOperationCache.cleanEmptyEntries(); + + if (log.isInfoEnabled()) { + log.info("Fishing operation: " + fishingOperation + " removed from fishingOperationCache: " + fishingOperationCache.size()); + log.info("Fishing operation: " + fishingOperation + " removed from cruiseCache: " + cruiseCache.size()); + log.info("Fishing operation: " + fishingOperation + " removed from zoneCache: " + zoneCache.size()); + log.info("Fishing operation: " + fishingOperation + " removed from " + this); } } @@ -531,11 +541,11 @@ public class CruiseSamplingCache implements CruiseCacheAble { } private String createZoneSamplingKey(String cruiseSamplingKey, Zone zone) { - return CruiseSamplingInternalCache.addPrefixKey(zone.getId(), cruiseSamplingKey); + return addPrefixKey(zone.getId(), cruiseSamplingKey); } private String createFishingOperationSamplingKey(String cruiseSamplingKey, int fishingOperationId) { - return CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, cruiseSamplingKey); + return addPrefixKey(fishingOperationId, cruiseSamplingKey); } private void addIndividualObservation(IndividualObservationSamplingContext individualObservationSamplingContext, boolean addSampling) { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java index 9b896d4..d327d78 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java @@ -29,13 +29,11 @@ import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import java.io.Closeable; import java.io.Serializable; +import java.util.Collections; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -51,9 +49,6 @@ import java.util.TreeMap; */ class CruiseSamplingInternalCache implements Closeable { - /** Logger. */ - private static final Log log = LogFactory.getLog(CruiseSamplingInternalCache.class); - private static final String KEY_SEPARATOR = "#"; public static String createSamplingKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, int lengthStep) { @@ -90,39 +85,6 @@ class CruiseSamplingInternalCache implements Closeable { } /** - * Supprime du cache toutes les entrées dont la clef commence par l'identifiant donné (suivant du séparateur de clef) - * et retourne l'ensemble des clefs supprimées du cache. - * - * À noter que sur les clefs retournées, on a retirer le préfixe de concordance. - * - * @param id l'identifiant de début de clef à supprimer - * @return l'ensemble des clefs supprimées du cache (amputées du préfixe de concordance). - */ - public Set<String> removeAllWhereKeyStartingWith(String id) { - Objects.requireNonNull(id); - String keyPrefix = addPrefixKey(id, ""); - if (log.isDebugEnabled()) { - log.debug("Ask to remove all keys starting with: " + keyPrefix); - } - Set<String> result = new LinkedHashSet<>(); - Iterator<Map.Entry<String, SamplingData>> iterator = data.entrySet().iterator(); - int keyPrefixLength = keyPrefix.length(); - while (iterator.hasNext()) { - Map.Entry<String, SamplingData> entry = iterator.next(); - String key = entry.getKey(); - - if (key.startsWith(keyPrefix)) { - iterator.remove(); - if (log.isDebugEnabled()) { - log.debug("Removing key: " + key); - } - result.add(key.substring(keyPrefixLength)); - } - } - return result; - } - - /** * Get the number of samplings by lengthstep for a species, maturity and gender, for the lengthsteps between min size and max size * * @return a map of the number of samplings for each lengthstep in millimeters @@ -207,6 +169,36 @@ class CruiseSamplingInternalCache implements Closeable { return samplingData; } + public Set<String> getKeys() { + return Collections.unmodifiableSet(data.keySet()); + } + + public void remove(String key, int individualObservationCountToRemove, int samplingCountToRemove) { + + SamplingData samplingData = getSamplingData(key); + Objects.requireNonNull(samplingData, "[" + key + "] not found."); + + int individualObservationCount = samplingData.getIndividualObservationCount(); + Preconditions.checkState(individualObservationCount >= individualObservationCountToRemove, "[" + key + "] You cannot decrement " + individualObservationCountToRemove + " individual observation(s), you just have " + individualObservationCount); + samplingData.individualObservationCount -= individualObservationCountToRemove; + + int samplingCount = samplingData.getSamplingCount(); + Preconditions.checkState(samplingCount >= samplingCountToRemove, "[" + key + "] You cannot decrement " + samplingCountToRemove + " sampling(s), you just have " + samplingCount); + samplingData.samplingCount -= samplingCountToRemove; + + } + + public void cleanEmptyEntries() { + Iterator<Map.Entry<String, SamplingData>> iterator = data.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry<String, SamplingData> entry = iterator.next(); + SamplingData samplingData = entry.getValue(); + if (!(samplingData.withSampling() || samplingData.withIndividualObservation())) { + iterator.remove(); + } + } + } + class SamplingData { /** -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.