This is an automated email from the git hooks/post-receive script. New commit to branch feature/8177 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit c9cd2505bf7cb7b024fd3f368c67f4b92863a9a2 Author: Kevin Morin <morin@codelutin.com> Date: Tue Mar 29 11:55:10 2016 +0200 gestion des prélèvements dans le cache (refs #8152 refs #8177) --- .../service/samplingCache/CruiseSamplingCache.java | 259 ++++++++++++++++++--- 1 file changed, 222 insertions(+), 37 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 296f9c0..2dd3b62 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 @@ -201,23 +201,18 @@ public class CruiseSamplingCache implements Closeable { CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); - addIndividualObservation(fishingOperationId, optionalZone, species, gender, maturity, lengthStep); - String samplingCode = individualObservationBatch.getSamplingCode(); if (samplingCode != null) { - String[] codeParts = samplingCode.split("#"); - Integer code = Integer.parseInt(codeParts[codeParts.length - 1]); - Integer highestSmaplingCode = highestSamplingCodeBySpecies.get(species.getReferenceTaxonId()); - if (highestSmaplingCode == null || code > highestSmaplingCode) { - highestSamplingCodeBySpecies.put(species.getReferenceTaxonId(), code); - } + addSampling(fishingOperationId, optionalZone, species, gender, maturity, lengthStep, samplingCode); + } + addIndividualObservation(fishingOperationId, optionalZone, species, gender, maturity, lengthStep); } /** - * Ajout d'un échantillon dans le cache. + * Ajout d'un observation dans le cache. * * @param fishingOperation l'opération de pêche concernée * @param species l'espèces concernée @@ -237,11 +232,10 @@ public class CruiseSamplingCache implements Closeable { Optional<Zone> optionalZone = tryFindZone(fishingOperation); addIndividualObservation(fishingOperation.getIdAsInt(), optionalZone, species, gender, maturity, lengthStep); - } /** - * Ajout d'un échantillon dans le cache. + * Ajout d'une observation dans le cache. * * @param fishingOperationId l'identifiant de l'opération de pêche concernée * @param optionalZone la zone (facultative) de l'opération de pêche concernée @@ -280,32 +274,121 @@ public class CruiseSamplingCache implements Closeable { } String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - int totalValue = totalCruiseCache.increment(samplingKey); + int totalValue = totalCruiseCache.incrementObservationNb(samplingKey); + int totalSamplingNb = totalCruiseCache.getSamplingNb(samplingKey); + int zoneValue = 0; + int zoneSamplingNb = 0; if (optionalZone.isPresent()) { String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); - zoneValue = zoneCache.increment(zoneKey); + zoneValue = zoneCache.incrementObservationNb(zoneKey); + zoneSamplingNb = zoneCache.getSamplingNb(zoneKey); } String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); - int operationValue = operationCache.increment(operationKey); + int operationValue = operationCache.incrementObservationNb(operationKey); + int operationSamplingNb = operationCache.getSamplingNb(operationKey); if (log.isInfoEnabled()) { - log.info("addIndividualObservation " + samplingKey + " => op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); + log.info("add Individual Observation " + samplingKey + " => op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); } + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + if (!isLoading() && (totalValue == 1 || totalValue % samplingInterval == 1)) { if (log.isInfoEnabled()) { log.info("-> needs sampling"); } - fireSamplingNeeded(lengthStep, gender, maturity, cpsDefinition, samplingInterval, totalValue, zoneValue, operationValue); + fireSamplingNeeded(event); } + fireResumeUpdated(event); + } } } /** + * 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 + * @param samplingCode le code de prélèvement ajouté + */ + public void addSampling(FishingOperation fishingOperation, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + float lengthStep, + String samplingCode) { + + Objects.requireNonNull(fishingOperation); + Objects.requireNonNull(species); + + Optional<Zone> optionalZone = tryFindZone(fishingOperation); + + addSampling(fishingOperation.getIdAsInt(), optionalZone, species, gender, maturity, lengthStep, samplingCode); + } + + /** + * Ajout d'un prélèvement dans le cache. + * + * @param fishingOperationId l'identifiant de l'opération de pêche concernée + * @param optionalZone la zone (facultative) de 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 + * @param samplingCode le code de prélèvement ajouté + */ + public void addSampling(Integer fishingOperationId, + Optional<Zone> optionalZone, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + float lengthStep, + String samplingCode) { + + Objects.requireNonNull(fishingOperationId); + Objects.requireNonNull(species); + + Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); + + if (cpsDefinitionOpt.isPresent()) { + + CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); + + if (!cpsDefinition.isSex()) { + gender = null; + } + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + + int totalSamplingNb = totalCruiseCache.incrementSamplingNb(samplingKey); + + int zoneSamplingNb = 0; + if (optionalZone.isPresent()) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); + zoneSamplingNb = zoneCache.incrementSamplingNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + + int operationSamplingNb = operationCache.incrementSamplingNb(operationKey); + + addSamplingCode(species.getReferenceTaxonId(), samplingCode); + + if (log.isInfoEnabled()) { + log.info("add Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + } + + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + fireResumeUpdated(event); + } + } + + /** * Suppression d'un échantillon du cache. * * @param fishingOperationId l'identifiant de l'opération de pêche concernée @@ -330,8 +413,15 @@ public class CruiseSamplingCache implements Closeable { Objects.requireNonNull(lengthStep); CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); - removeIndividualObservation(fishingOperationId, optionalZone, species, gender, maturity, lengthStep); + String samplingCode = individualObservationBatch.getSamplingCode(); + if (samplingCode != null) { + + removeSampling(fishingOperationId, optionalZone, species, gender, maturity, lengthStep, samplingCode); + + } + + removeIndividualObservation(fishingOperationId, optionalZone, species, gender, maturity, lengthStep); }); } @@ -402,15 +492,15 @@ public class CruiseSamplingCache implements Closeable { String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - int totalValue = totalCruiseCache.decrement(samplingKey); + int totalValue = totalCruiseCache.decrementObservationNb(samplingKey); int zoneValue = 0; if (optionalZone.isPresent()) { String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); - zoneValue = zoneCache.decrement(zoneKey); + zoneValue = zoneCache.decrementObservationNb(zoneKey); } String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); - int operationValue = operationCache.decrement(operationKey); + int operationValue = operationCache.decrementObservationNb(operationKey); if (log.isInfoEnabled()) { log.info("remove individual observation " + samplingKey + " ⇒ op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); @@ -421,6 +511,86 @@ public class CruiseSamplingCache implements Closeable { } /** + * 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 + * @param samplingCode le code de prélèvement supprimé + */ + public void removeSampling(FishingOperation fishingOperation, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + float lengthStep, + String samplingCode) { + + Objects.requireNonNull(fishingOperation); + Objects.requireNonNull(species); + + Optional<Zone> optionalZone = tryFindZone(fishingOperation); + + removeSampling(fishingOperation.getIdAsInt(), optionalZone, species, gender, maturity, lengthStep, samplingCode); + } + + /** + * Suppression d'un prélèvement dans le cache. + * + * @param fishingOperationId l'identifiant de l'opération de pêche concernée + * @param optionalZone la zone (facultative) de 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 + * @param samplingCode le code de prélèvement supprimé + */ + public void removeSampling(Integer fishingOperationId, + Optional<Zone> optionalZone, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + float lengthStep, + String samplingCode) { + + Objects.requireNonNull(fishingOperationId); + Objects.requireNonNull(species); + + Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); + + if (cpsDefinitionOpt.isPresent()) { + + CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); + + if (!cpsDefinition.isSex()) { + gender = null; + } + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + + int totalSamplingNb = totalCruiseCache.decrementSamplingNb(samplingKey); + + int zoneSamplingNb = 0; + if (optionalZone.isPresent()) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); + zoneSamplingNb = zoneCache.decrementSamplingNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + + int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); + + removeSamplingCode(species.getReferenceTaxonId(), samplingCode); + + if (log.isInfoEnabled()) { + log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + } + + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + fireResumeUpdated(event); + } + } + + /** * Suppression de toutes les observations individuelles du cache. * * @param fishingOperation l'opération de pêche concernée @@ -442,7 +612,7 @@ public class CruiseSamplingCache implements Closeable { log.info("Fishing operation: " + fishingOperationId + " removed from operationCache: " + operationCache.size()); } - removedKeys.forEach(totalCruiseCache::decrement); + removedKeys.forEach(totalCruiseCache::decrementObservationNb); if (log.isInfoEnabled()) { log.info("Fishing operation: " + fishingOperationId + " removed from totalCruiseCache: " + totalCruiseCache.size()); @@ -452,7 +622,7 @@ public class CruiseSamplingCache implements Closeable { if (optionalZone.isPresent()) { String zoneId = optionalZone.get().getId(); - removedKeys.forEach(key -> zoneCache.decrementIfExist(CruiseSamplingInternalCache.addPrefixKey(zoneId, key))); + removedKeys.forEach(key -> zoneCache.decrementObservationNbIfExist(CruiseSamplingInternalCache.addPrefixKey(zoneId, key))); if (log.isInfoEnabled()) { log.info("Fishing operation: " + fishingOperationId + " removed from zoneCache: " + zoneCache.size()); @@ -495,24 +665,24 @@ public class CruiseSamplingCache implements Closeable { .findFirst(); } - protected int getSamplingNumber(int value, int interval) { - return 1 + (value - 1) / interval; + protected void fireSamplingNeeded(SamplingEvent event) { + + SamplingListener[] samplingListeners = listeners.getListeners(SamplingListener.class); + if (samplingListeners.length > 0) { + + for (SamplingListener listener : samplingListeners) { + listener.samplingNeeded(event); + } + } } - protected void fireSamplingNeeded(float lengthStep, CaracteristicQualitativeValue gender, Boolean maturity, - CalcifiedPiecesSamplingDefinition cpsDefinition, - int samplingInterval, int totalValue, int zoneValue, int operationValue) { + protected void fireResumeUpdated(SamplingEvent 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); + listener.resumeUpdated(event); } } } @@ -550,10 +720,25 @@ public class CruiseSamplingCache implements Closeable { } public int getNextSamplingCodeId(Integer speciesId) { - Integer highestSamplingCode = highestSamplingCodeBySpecies.getOrDefault(speciesId, 0); - int newHighestCode = highestSamplingCode + 1; - highestSamplingCodeBySpecies.put(speciesId, newHighestCode); - return newHighestCode; + return highestSamplingCodeBySpecies.getOrDefault(speciesId, 0) + 1; + } + + public int addSamplingCode(Integer speciesId, String samplingCode) { + String[] codeParts = samplingCode.split("#"); + Integer code = Integer.parseInt(codeParts[codeParts.length - 1]); + + // increment the highest sampling code if it is this code + return highestSamplingCodeBySpecies.compute(speciesId, + (key, highestSamplingCode) -> highestSamplingCode == null ? code : Math.max(highestSamplingCode, code)); + } + + public int removeSamplingCode(Integer speciesId, String samplingCode) { + String[] codeParts = samplingCode.split("#"); + Integer code = Integer.parseInt(codeParts[codeParts.length - 1]); + + // decrement the highest sampling code if it is this code + return highestSamplingCodeBySpecies.computeIfPresent(speciesId, + (key, highestSamplingCode) -> code.equals(highestSamplingCode) ? code - 1 : highestSamplingCode); } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.