branch feature/8177 created (now c14178f)
This is an automated email from the git hooks/post-receive script. New change to branch feature/8177 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git at c14178f gestion des prélèvements + affichage des prélèvements réels (refs #8177 refs #8152) This branch includes the following new commits: new c5d0c17 on déclenche un évènement quand le résumé est mis à jour (refs #8152) new debfb6e on ajoute le nombre de prélèvement par clé (espece/taille/maturité/sexe) (refs #8152) new c9cd250 gestion des prélèvements dans le cache (refs #8152 refs #8177) new c14178f gestion des prélèvements + affichage des prélèvements réels (refs #8177 refs #8152) The 4 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 c14178ff3d68973315266dcb80f78a3055eaf92e Author: Kevin Morin <morin@codelutin.com> Date: Tue Mar 29 11:56:16 2016 +0200 gestion des prélèvements + affichage des prélèvements réels (refs #8177 refs #8152) 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) commit debfb6eaf0871ef75092782a36386d473257dedf Author: Kevin Morin <morin@codelutin.com> Date: Tue Mar 29 11:53:53 2016 +0200 on ajoute le nombre de prélèvement par clé (espece/taille/maturité/sexe) (refs #8152) commit c5d0c171d16e2e440df5cfccecac5452a09f1f7c Author: Kevin Morin <morin@codelutin.com> Date: Tue Mar 29 11:52:16 2016 +0200 on déclenche un évènement quand le résumé est mis à jour (refs #8152) -- 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/8177 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit c5d0c171d16e2e440df5cfccecac5452a09f1f7c Author: Kevin Morin <morin@codelutin.com> Date: Tue Mar 29 11:52:16 2016 +0200 on déclenche un évènement quand le résumé est mis à jour (refs #8152) --- .../tutti/service/samplingCache/SamplingEvent.java | 28 ++++++++++++---------- .../service/samplingCache/SamplingListener.java | 1 + 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/SamplingEvent.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/SamplingEvent.java index d8847e1..ac76441 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/SamplingEvent.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/SamplingEvent.java @@ -43,22 +43,22 @@ public class SamplingEvent extends EventObject { protected final CalcifiedPiecesSamplingDefinition cpsDef; - protected final int nbForCruise; + protected final int nbSamplingForCruise; - protected final int nbForZone; + protected final int nbSamplingForZone; - protected final int nbForOperation; + protected final int nbSamplingForOperation; public SamplingEvent(CruiseSamplingCache source, float lengthStep, CaracteristicQualitativeValue gender, Boolean maturity, - CalcifiedPiecesSamplingDefinition cpsDef, int nbForCruise, int nbForZone, int nbForOperation) { + CalcifiedPiecesSamplingDefinition cpsDef, int nbSamplingForCruise, int nbSamplingForZone, int nbSamplingForOperation) { super(source); this.lengthStep = lengthStep; this.gender = gender; this.maturity = maturity; this.cpsDef = cpsDef; - this.nbForCruise = nbForCruise; - this.nbForZone = nbForZone; - this.nbForOperation = nbForOperation; + this.nbSamplingForCruise = nbSamplingForCruise; + this.nbSamplingForZone = nbSamplingForZone; + this.nbSamplingForOperation = nbSamplingForOperation; } public float getLengthStep() { @@ -73,20 +73,22 @@ public class SamplingEvent extends EventObject { return maturity; } + + public CalcifiedPiecesSamplingDefinition getCpsDef() { return cpsDef; } - public int getNbForCruise() { - return nbForCruise; + public int getNbSamplingForCruise() { + return nbSamplingForCruise; } - public int getNbForZone() { - return nbForZone; + public int getNbSamplingForZone() { + return nbSamplingForZone; } - public int getNbForOperation() { - return nbForOperation; + public int getNbSamplingForOperation() { + return nbSamplingForOperation; } @Override diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/SamplingListener.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/SamplingListener.java index f1b3219..1c58284 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/SamplingListener.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/samplingCache/SamplingListener.java @@ -34,5 +34,6 @@ public interface SamplingListener extends EventListener { void samplingNeeded(SamplingEvent event); + void resumeUpdated(SamplingEvent event); } -- 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/8177 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit debfb6eaf0871ef75092782a36386d473257dedf Author: Kevin Morin <morin@codelutin.com> Date: Tue Mar 29 11:53:53 2016 +0200 on ajoute le nombre de prélèvement par clé (espece/taille/maturité/sexe) (refs #8152) --- .../samplingCache/CruiseSamplingInternalCache.java | 98 ++++++++++++++++++---- 1 file changed, 81 insertions(+), 17 deletions(-) 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 index 858c3cf..9117f2d 100644 --- 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 @@ -67,35 +67,34 @@ class CruiseSamplingInternalCache implements Closeable { return prefix + KEY_SEPARATOR + key; } - private final Map<String, MutableInt> data = new TreeMap<>(); + private final Map<String, SamplingData> data = new TreeMap<>(); - public int increment(String samplingKey) { + public int incrementObservationNb(String samplingKey) { Objects.requireNonNull(samplingKey); - MutableInt value = data.computeIfAbsent(samplingKey, s -> new MutableInt(0)); - value.increment(); + SamplingData value = data.computeIfAbsent(samplingKey, s -> new SamplingData()); + int obsNb = value.incrementObservationNb(); if (log.isDebugEnabled()) { - log.debug(samplingKey + " → " + value); + log.debug(samplingKey + " → " + obsNb); } - return value.intValue(); + return obsNb; } - public int decrement(String samplingKey) { + public int decrementObservationNb(String samplingKey) { Objects.requireNonNull(samplingKey); - MutableInt value = data.get(samplingKey); - value.decrement(); + SamplingData value = data.get(samplingKey); + int obsNb = value.decrementObservationNb(); if (log.isDebugEnabled()) { - log.debug(samplingKey + " → " + value); + log.debug(samplingKey + " → " + obsNb); } - return value.intValue(); + return obsNb; } - public Integer decrementIfExist(String samplingKey) { + public Integer decrementObservationNbIfExist(String samplingKey) { Objects.requireNonNull(samplingKey); Integer result = null; - MutableInt value = data.get(samplingKey); + SamplingData value = data.get(samplingKey); if (value != null) { - value.decrement(); - result = value.intValue(); + result = value.decrementObservationNb(); if (log.isDebugEnabled()) { log.debug(samplingKey + " → " + value); } @@ -103,6 +102,36 @@ class CruiseSamplingInternalCache implements Closeable { return result; } + public int incrementSamplingNb(String samplingKey) { + Objects.requireNonNull(samplingKey); + SamplingData value = data.computeIfAbsent(samplingKey, s -> new SamplingData()); + int samplingNb = value.incrementSamplingNb(); + if (log.isDebugEnabled()) { + log.debug(samplingKey + " → " + samplingNb); + } + return samplingNb; + } + + public int decrementSamplingNb(String samplingKey) { + Objects.requireNonNull(samplingKey); + SamplingData value = data.get(samplingKey); + int samplingNb = value.decrementSamplingNb(); + if (log.isDebugEnabled()) { + log.debug(samplingKey + " → " + samplingNb); + } + return samplingNb; + } + + public int getSamplingNb(String samplingKey) { + Objects.requireNonNull(samplingKey); + SamplingData value = data.get(samplingKey); + int samplingNb = value.getSamplingNb(); + if (log.isDebugEnabled()) { + log.debug(samplingKey + " → " + samplingNb); + } + return samplingNb; + } + @Override public void close() { data.clear(); @@ -128,10 +157,10 @@ class CruiseSamplingInternalCache implements Closeable { log.debug("Ask to remove all keys starting with: " + keyPrefix); } Set<String> result = new LinkedHashSet<>(); - Iterator<Map.Entry<String, MutableInt>> iterator = data.entrySet().iterator(); + Iterator<Map.Entry<String, SamplingData>> iterator = data.entrySet().iterator(); int keyPrefixLength = keyPrefix.length(); while (iterator.hasNext()) { - Map.Entry<String, MutableInt> entry = iterator.next(); + Map.Entry<String, SamplingData> entry = iterator.next(); String key = entry.getKey(); if (key.startsWith(keyPrefix)) { @@ -145,4 +174,39 @@ class CruiseSamplingInternalCache implements Closeable { return result; } + private class SamplingData { + + private MutableInt observationNb = new MutableInt(0); + private MutableInt samplingNb = new MutableInt(0); + + public int incrementObservationNb() { + observationNb.increment(); + return getObservationNb(); + } + + public int decrementObservationNb() { + observationNb.decrement(); + return getObservationNb(); + } + + public int getObservationNb() { + return observationNb.intValue(); + } + + public int incrementSamplingNb() { + samplingNb.increment(); + return getSamplingNb(); + } + + public int decrementSamplingNb() { + samplingNb.decrement(); + return getSamplingNb(); + } + + public int getSamplingNb() { + return samplingNb.intValue(); + } + + + } } -- 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/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>.
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 c14178ff3d68973315266dcb80f78a3055eaf92e Author: Kevin Morin <morin@codelutin.com> Date: Tue Mar 29 11:56:16 2016 +0200 gestion des prélèvements + affichage des prélèvements réels (refs #8177 refs #8152) --- .../frequency/IndividualObservationUICache.java | 155 +++++++++++++++++---- .../frequency/SpeciesFrequencyUIHandler.java | 138 +++++++++--------- 2 files changed, 200 insertions(+), 93 deletions(-) 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 e4a8f0d..4f385a7 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 @@ -122,15 +122,16 @@ public class IndividualObservationUICache implements Closeable { 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(); + int nbForOperation = event.getNbSamplingForOperation(); + int nbForZone = event.getNbSamplingForZone(); + int nbForCruise = event.getNbSamplingForCruise(); if (log.isInfoEnabled()) { + + Integer operationLimitation = cpsDef.getOperationLimitation(); + Integer zoneLimitation = cpsDef.getZoneLimitation(); + Integer maxByLenghtStep = cpsDef.getMaxByLenghtStep(); + log.info(String.format("nbForOperation: %d/%s - nbForZone: %d/%s - nbForCruise: %d/%s", nbForOperation, operationLimitation == null ? "∞" : operationLimitation, nbForZone, zoneLimitation == null ? "∞" : zoneLimitation, @@ -146,12 +147,28 @@ public class IndividualObservationUICache implements Closeable { log.info("showSamplingWarning " + showSamplingWarning); } ui.getSamplingWarningLabel().setVisible(showSamplingWarning); + } + + @Override + public void resumeUpdated(SamplingEvent event) { + + CalcifiedPiecesSamplingDefinition cpsDef = event.getCpsDef(); + if (log.isInfoEnabled()) { + log.info("samplingNeeded for " + cpsDef); + } + + int nbForOperation = event.getNbSamplingForOperation(); + int nbForZone = event.getNbSamplingForZone(); + int nbForCruise = event.getNbSamplingForCruise(); - String nbForOperationLabel = getLabelForSamplingNumber(operationValueUpperMax, nbForOperation, operationLimitation); - String nbForZoneLabel = getLabelForSamplingNumber(zoneValueUpperMax, nbForZone, zoneLimitation); - String nbForCruiseLabel = getLabelForSamplingNumber(cruiseValueUpperMax, nbForCruise, maxByLenghtStep); +// boolean operationValueUpperMax = CalcifiedPiecesSamplingDefinitions.isOperationValueUpperMax(cpsDef, nbForOperation); +// boolean zoneValueUpperMax = CalcifiedPiecesSamplingDefinitions.isZoneValueUpperMax(cpsDef, nbForZone); +// boolean cruiseValueUpperMax = CalcifiedPiecesSamplingDefinitions.isCruiseValueUpperMax(cpsDef, nbForCruise); + + String nbForOperationLabel = getLabelForSamplingNumber(nbForOperation, cpsDef.getOperationLimitation()); + String nbForZoneLabel = getLabelForSamplingNumber(nbForZone, cpsDef.getZoneLimitation()); + String nbForCruiseLabel = getLabelForSamplingNumber(nbForCruise, cpsDef.getMaxByLenghtStep()); - //TODO add mauturity String key = event.getLengthStep() + " " + uiModel.getLengthStepCaracteristicUnit(); if (event.getGender() != null) { key += " " + event.getGender().getDescription(); @@ -164,18 +181,10 @@ public class IndividualObservationUICache implements Closeable { } } 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; + String getLabelForSamplingNumber(int value, Integer max) { + return value + "(" + max + ")"; } }; @@ -215,8 +224,19 @@ public class IndividualObservationUICache implements Closeable { */ public void increments(IndividualObservationBatchRowModel row) { - increments(row.getGender(sexCaracteristic), row.getMaturityState(), row.getSize()); + incrementsObservationNb(row.getGender(sexCaracteristic), row.getMaturityState(), row.getSize(), Optional.ofNullable(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 + */ + public void incrementsObservationNb(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, float lengthStep) { + incrementsObservationNb(gender, maturityQualitativeValue, lengthStep, Optional.empty()); } /** @@ -225,8 +245,12 @@ public class IndividualObservationUICache implements Closeable { * @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 increments(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, float lengthStep) { + public void incrementsObservationNb(CaracteristicQualitativeValue gender, + Optional<CaracteristicQualitativeValue> maturityQualitativeValue, + float lengthStep, + Optional<String> samplingCode) { if (!on) { if (log.isDebugEnabled()) { @@ -241,6 +265,39 @@ public class IndividualObservationUICache implements Closeable { gender, maturity, uiModel.getLengthStep(lengthStep)); + + if (samplingCode.isPresent()) { + incrementsSamplingNb(gender, maturityQualitativeValue, lengthStep, samplingCode.get()); + } + } + + /** + * 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é + */ + public void incrementsSamplingNb(CaracteristicQualitativeValue gender, + Optional<CaracteristicQualitativeValue> maturityQualitativeValue, + float lengthStep, + String samplingCode) { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip increments sampling in cache."); + } + return; + } + + Boolean maturity = samplingCache.get().getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); + samplingCache.get().addSampling(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStep(lengthStep), + samplingCode); } /** @@ -250,8 +307,20 @@ public class IndividualObservationUICache implements Closeable { */ public void decrements(IndividualObservationBatchRowModel row) { - decrements(row.getGender(sexCaracteristic), row.getMaturityState(), row.getSize()); + decrementsObservationNb(row.getGender(sexCaracteristic), row.getMaturityState(), row.getSize(), Optional.ofNullable(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, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, float lengthStep) { + decrementsObservationNb(gender, maturityQualitativeValue, lengthStep, Optional.empty()); } /** @@ -260,8 +329,12 @@ public class IndividualObservationUICache implements Closeable { * @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 decrements(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, float lengthStep) { + public void decrementsObservationNb(CaracteristicQualitativeValue gender, + Optional<CaracteristicQualitativeValue> maturityQualitativeValue, + float lengthStep, + Optional<String> samplingCode) { if (!on) { if (log.isDebugEnabled()) { @@ -277,6 +350,38 @@ public class IndividualObservationUICache implements Closeable { maturity, uiModel.getLengthStep(lengthStep)); + if (samplingCode.isPresent()) { + decrementsSamplingNb(gender, maturityQualitativeValue, uiModel.getLengthStep(lengthStep), samplingCode.get()); + } + } + + /** + * 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 supprimé + */ + public void decrementsSamplingNb(CaracteristicQualitativeValue gender, + Optional<CaracteristicQualitativeValue> maturityQualitativeValue, + float lengthStep, + String samplingCode) { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip increments sampling in cache."); + } + return; + } + + Boolean maturity = samplingCache.get().getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); + samplingCache.get().removeSampling(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStep(lengthStep), + samplingCode); } /** 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 7c5dde2..3771adf 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 @@ -51,10 +51,6 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SamplingCodeCellEditor; 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; @@ -225,88 +221,94 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci CaracteristicQualitativeValue gender = row.getGender(sexCaracteristic); Optional<CaracteristicQualitativeValue> maturity = row.getMaturityState(); - // we only update the frequencies if the row is valid - if (row.isValid()) { + if (IndividualObservationBatchRowModel.PROPERTY_SIZE.equals(propertyName)) { - if (log.isDebugEnabled()) { - log.debug("Row is valid"); - } - if (IndividualObservationBatchRowModel.PROPERTY_SIZE.equals(propertyName)) { + Float oldValue = (Float) evt.getOldValue(); + Float newValue = (Float) evt.getNewValue(); - Float oldValue = (Float) evt.getOldValue(); - Float newValue = (Float) evt.getNewValue(); - - if (oldValue != null) { - individualObservationUICache.decrements(gender, maturity, oldValue); - } - if (newValue != null) { - individualObservationUICache.increments(gender, maturity, newValue); - } + if (oldValue != null) { + individualObservationUICache.decrementsObservationNb(gender, maturity, oldValue, Optional.ofNullable(row.getSamplingCode())); + } + if (newValue != null) { + individualObservationUICache.incrementsObservationNb(gender, maturity, newValue, Optional.ofNullable(row.getSamplingCode())); + } - if (getModel().mustCopyIndividualObservationSize()) { - updateFrequencyRowsNumbers(oldValue, newValue); + // we only update the frequencies if the row is valid + if (row.isValid() && getModel().mustCopyIndividualObservationSize()) { + updateFrequencyRowsNumbers(oldValue, newValue); - Float weight = row.getWeight(); - if (getModel().mustCopyIndividualObservationWeight() && weight != null) { - updateFrequencyRowsWeights(oldValue, -weight); - updateFrequencyRowsWeights(newValue, weight); - } + Float weight = row.getWeight(); + if (getModel().mustCopyIndividualObservationWeight() && weight != null) { + updateFrequencyRowsWeights(oldValue, -weight); + updateFrequencyRowsWeights(newValue, weight); } } + } - if (getModel().mustCopyIndividualObservationWeight() - && IndividualObservationBatchRowModel.PROPERTY_WEIGHT.equals(propertyName)) { + if (row.isValid() && getModel().mustCopyIndividualObservationWeight() + && IndividualObservationBatchRowModel.PROPERTY_WEIGHT.equals(propertyName)) { - Float oldValue = (Float) evt.getOldValue(); - Float newValue = (Float) evt.getNewValue(); - Float weightToAdd; + Float oldValue = (Float) evt.getOldValue(); + Float newValue = (Float) evt.getNewValue(); + Float weightToAdd; - if (oldValue == null) { - weightToAdd = newValue; + if (oldValue == null) { + weightToAdd = newValue; - } else if (newValue == null) { - weightToAdd = -oldValue; + } else if (newValue == null) { + weightToAdd = -oldValue; - } else { - weightToAdd = newValue - oldValue; - } + } else { + weightToAdd = newValue - oldValue; + } - if (weightToAdd != null) { - updateFrequencyRowsWeights(row.getSize(), weightToAdd); - } + if (weightToAdd != null) { + updateFrequencyRowsWeights(row.getSize(), weightToAdd); } + } - if (row.withSize() - && (IndividualObservationBatchRowModel.PROPERTY_DEFAULT_CARACTERISTICS.equals(propertyName) - || IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS.equals(propertyName))) { + if (row.withSize() + && (IndividualObservationBatchRowModel.PROPERTY_DEFAULT_CARACTERISTICS.equals(propertyName) + || IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS.equals(propertyName))) { - CaracteristicMap oldValue = (CaracteristicMap) evt.getOldValue(); - CaracteristicMap newValue = (CaracteristicMap) evt.getNewValue(); + CaracteristicMap oldValue = (CaracteristicMap) evt.getOldValue(); + CaracteristicMap newValue = (CaracteristicMap) evt.getNewValue(); + + if (log.isInfoEnabled()) { + log.info("caracteristics changed"); + } + if (row.getMaturityCaracteristic().isPresent()) { + Optional<CaracteristicQualitativeValue> oldMaturity = Optional.ofNullable((CaracteristicQualitativeValue) oldValue.get(row.getMaturityCaracteristic().get())); + Optional<CaracteristicQualitativeValue> newMaturity = Optional.ofNullable((CaracteristicQualitativeValue) newValue.get(row.getMaturityCaracteristic().get())); if (log.isInfoEnabled()) { - log.info("caracteristics changed"); + log.info("maturities : " + oldMaturity + " " + newMaturity); } - - if (row.getMaturityCaracteristic().isPresent()) { - Optional<CaracteristicQualitativeValue> oldMaturity = Optional.ofNullable((CaracteristicQualitativeValue) oldValue.get(row.getMaturityCaracteristic().get())); - Optional<CaracteristicQualitativeValue> newMaturity = Optional.ofNullable((CaracteristicQualitativeValue) newValue.get(row.getMaturityCaracteristic().get())); - if (log.isInfoEnabled()) { - log.info("maturities : " + oldMaturity + " " + newMaturity); - } - if (!Objects.equals(oldMaturity, newMaturity)) { - individualObservationUICache.decrements(gender, oldMaturity, row.getSize()); - individualObservationUICache.increments(gender, newMaturity, row.getSize()); - } + if (!Objects.equals(oldMaturity, newMaturity)) { + individualObservationUICache.decrementsObservationNb(gender, oldMaturity, row.getSize()); + individualObservationUICache.incrementsObservationNb(gender, newMaturity, row.getSize(), Optional.ofNullable(row.getSamplingCode())); } + } - CaracteristicQualitativeValue oldGender = (CaracteristicQualitativeValue) oldValue.get(sexCaracteristic); - CaracteristicQualitativeValue newGender = (CaracteristicQualitativeValue) newValue.get(sexCaracteristic); - if (!Objects.equals(oldGender, newGender)) { - individualObservationUICache.decrements(oldGender, maturity, row.getSize()); - individualObservationUICache.increments(newGender, maturity, row.getSize()); - } + CaracteristicQualitativeValue oldGender = (CaracteristicQualitativeValue) oldValue.get(sexCaracteristic); + CaracteristicQualitativeValue newGender = (CaracteristicQualitativeValue) newValue.get(sexCaracteristic); + if (!Objects.equals(oldGender, newGender)) { + individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); + individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), Optional.ofNullable(row.getSamplingCode())); + } + + } + + if (IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE.equals(propertyName) && row.withSize()) { + String oldValue = (String) evt.getOldValue(); + String newValue = (String) evt.getNewValue(); + if (StringUtils.isNotBlank(oldValue)) { + individualObservationUICache.decrementsSamplingNb(gender, maturity, row.getSize(), oldValue); + } + if (StringUtils.isNotBlank(newValue)) { + individualObservationUICache.incrementsSamplingNb(gender, maturity, row.getSize(), newValue); } } @@ -319,14 +321,14 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (oldValue && getModel().mustCopyIndividualObservationSize()) { updateFrequencyRowsNumbers(row.getSize(), null); - individualObservationUICache.decrements(gender, maturity, row.getSize()); +// individualObservationUICache.decrementsObservationNb(gender, maturity, row.getSize()); } if (newValue) { if (getModel().mustCopyIndividualObservationSize()) { updateFrequencyRowsNumbers(null, row.getSize()); - if (row.withSize()) { - individualObservationUICache.increments(gender, maturity, row.getSize()); - } +// if (row.withSize()) { +// individualObservationUICache.incrementsObservationNb(gender, maturity, row.getSize()); +// } } if (getModel().mustCopyIndividualObservationWeight()) { updateFrequencyRowsWeights(row.getSize(), row.getWeight()); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm