This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit d31ed9aa0d320f92e2dd54d6ae7532b0cf2bc5f2 Author: Kevin Morin <morin@codelutin.com> Date: Tue Apr 5 16:58:47 2016 +0200 On prend en compte les prélèvements qui ne rentrent pas dans le protocole (fixes #8157) --- .../service/export/cps/SamplingNumberRowModel.java | 2 +- .../tutti/service/sampling/CacheExtractedKey.java | 6 +- .../service/sampling/CruiseSamplingCache.java | 115 ++++++++++----------- .../sampling/CruiseSamplingCacheLoader.java | 2 +- .../sampling/CruiseSamplingInternalCache.java | 36 +++++-- .../tutti/service/sampling/SamplingEvent.java | 6 +- .../resources/i18n/tutti-service_fr_FR.properties | 5 +- 7 files changed, 87 insertions(+), 85 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java index 8c2bbe6..4bbea86 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java @@ -32,7 +32,7 @@ public class SamplingNumberRowModel extends AbstractTuttiImportExportModel<Cache return String.valueOf(species.getName()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CacheExtractedKey.PROPERTY_LENGTH_STEP, TuttiCsvUtil.PRIMITIVE_INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CacheExtractedKey.PROPERTY_LENGTH_STEP, TuttiCsvUtil.INTEGER); newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maturity"), CacheExtractedKey.PROPERTY_MATURITY, new ValueFormatter<Boolean>() { @Override diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java index 7b9d064..a86bb28 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java @@ -19,17 +19,17 @@ public class CacheExtractedKey implements Serializable { public static final String PROPERTY_MAX_BY_LENGTH_STEP = "maxByLengthStep"; protected Species species; - protected int lengthStep; + protected Integer lengthStep; protected Boolean maturity; protected QualitativeValueId sex; protected int samplingNb; protected Integer maxByLengthStep; - public int getLengthStep() { + public Integer getLengthStep() { return lengthStep; } - public void setLengthStep(int lengthStep) { + public void setLengthStep(Integer lengthStep) { this.lengthStep = lengthStep; } 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 cc370bd..773297f 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 @@ -200,8 +200,8 @@ public class CruiseSamplingCache implements Closeable { Boolean maturity = getMaturity(individualObservationBatch); - float lengthStep = individualObservationBatch.getSize(); - int lengthStepInMm = Numbers.convertToMm(lengthStep, individualObservationBatch.getLengthStepCaracteristic().getUnit()); + Float lengthStep = individualObservationBatch.getSize(); + Integer lengthStepInMm = lengthStep == null ? null : Numbers.convertToMm(lengthStep, individualObservationBatch.getLengthStepCaracteristic().getUnit()); CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); @@ -263,7 +263,7 @@ public class CruiseSamplingCache implements Closeable { Species species, CaracteristicQualitativeValue gender, Boolean maturity, - int lengthStep) { + Integer lengthStep) { Objects.requireNonNull(fishingOperationId); Objects.requireNonNull(species); @@ -363,7 +363,7 @@ public class CruiseSamplingCache implements Closeable { Species species, CaracteristicQualitativeValue gender, Boolean maturity, - int lengthStep, + Integer lengthStep, String samplingCode) { Objects.requireNonNull(fishingOperationId); @@ -371,31 +371,28 @@ public class CruiseSamplingCache implements Closeable { 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); + if (cpsDefinitionOpt.isPresent() && !cpsDefinitionOpt.get().isSex()) { + gender = null; + } + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - int totalSamplingNb = totalCruiseCache.incrementSamplingNb(samplingKey); + 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 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); + int operationSamplingNb = operationCache.incrementSamplingNb(operationKey); - if (log.isInfoEnabled()) { - log.info("add Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); - } + if (log.isInfoEnabled()) { + log.info("add Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + } - SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + if (cpsDefinitionOpt.isPresent()) { + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinitionOpt.get(), optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); fireResumeUpdated(event); } @@ -574,31 +571,29 @@ public class CruiseSamplingCache implements Closeable { Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); - if (cpsDefinitionOpt.isPresent()) { - - CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); + if (cpsDefinitionOpt.isPresent() && !cpsDefinitionOpt.get().isSex()) { + gender = null; + } + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - if (!cpsDefinition.isSex()) { - gender = null; - } - String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + int totalSamplingNb = totalCruiseCache.decrementSamplingNb(samplingKey); - 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 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); - int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); + if (log.isInfoEnabled()) { + log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + } - if (log.isInfoEnabled()) { - log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); - } + if (cpsDefinitionOpt.isPresent()) { - SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinitionOpt.get(), optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); fireResumeUpdated(event); } @@ -671,7 +666,10 @@ public class CruiseSamplingCache implements Closeable { listeners.remove(SamplingListener.class, listener); } - public Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, float lengthStep) { + public Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, Integer lengthStep) { + if (lengthStep == null) { + return Optional.empty(); + } Collection<CalcifiedPiecesSamplingDefinition> cpsDefinitions = cpsDefinitionsBySpecies.get(species.getReferenceTaxonId()); return cpsDefinitions.stream() .filter(cpsDef -> Objects.equals(cpsDef.getMaturity(), maturity) @@ -749,25 +747,16 @@ public class CruiseSamplingCache implements Closeable { // return highestSamplingCodeBySpecies.compute(speciesId, // (key, highestSamplingCode) -> highestSamplingCode == null ? code : Math.max(highestSamplingCode, code)); - MutableInt samplingCodeFound = highestSamplingCodeBySpecies.get(speciesId); - if (samplingCodeFound == null) { - samplingCodeFound = new MutableInt(code); - highestSamplingCodeBySpecies.put(speciesId, samplingCodeFound); - } else { - samplingCodeFound.setValue(Math.max(samplingCodeFound.intValue(), code)); - } - return samplingCodeFound.intValue(); - // Ce code ne compile pas. -// return highestSamplingCodeBySpecies.compute(speciesId, -// (key, highestSamplingCode) -> { -// if (highestSamplingCode == null) { -// highestSamplingCode = new MutableInt(code); -// } else { -// int nexValue = Math.max(highestSamplingCode.intValue(), code); -// highestSamplingCode.setValue(nexValue); -// } -// return highestSamplingCode; -// }); + return highestSamplingCodeBySpecies.compute(speciesId, + (key, highestSamplingCode) -> { + if (highestSamplingCode == null) { + highestSamplingCode = new MutableInt(code); + } else { + int nexValue = Math.max(highestSamplingCode.intValue(), code); + highestSamplingCode.setValue(nexValue); + } + return highestSamplingCode; + }).intValue(); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java index 6406a1a..ad42381 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java @@ -95,7 +95,7 @@ public class CruiseSamplingCacheLoader { Optional<Zone> optionalZone = cruiseSamplingCache.tryFindZone(fishingOperation); - allIndividualObservationBatchsForFishingOperation.stream().filter(obs -> obs.getSize() != null).forEach( + allIndividualObservationBatchsForFishingOperation.stream().filter(obs -> obs.getSize() != null || obs.getSamplingCode() != null).forEach( individualObservationBatch -> cruiseSamplingCache.addIndividualObservation(fishingOperationId, optionalZone, individualObservationBatch)); }); 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 a92541a..de97c1a 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 @@ -56,10 +56,10 @@ class CruiseSamplingInternalCache implements Closeable { private static final String KEY_SEPARATOR = "#"; - public static String createSamplingKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, int lengthStep) { + public static String createSamplingKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, Integer lengthStep) { Objects.requireNonNull(species); return species.getReferenceTaxonId() + KEY_SEPARATOR + (gender == null ? "" : gender.getId()) + - KEY_SEPARATOR + (maturity == null ? "" : maturity.toString()) + KEY_SEPARATOR + lengthStep; + KEY_SEPARATOR + (maturity == null ? "" : maturity.toString()) + KEY_SEPARATOR + (lengthStep == null ? "" : lengthStep.intValue()); } public static String addPrefixKey(Serializable prefix, String key) { @@ -193,21 +193,35 @@ class CruiseSamplingInternalCache implements Closeable { CacheExtractedKey key = new CacheExtractedKey(); - Species species = speciesById.get(keyTokens[0]); + int i = 0; + String nextToken = keyTokens[i++]; + + Species species = speciesById.get(nextToken); key.setSpecies(species); - if (!StringUtils.isEmpty(keyTokens[1])) { - QualitativeValueId sex = QualitativeValueId.fromValue(Integer.parseInt(keyTokens[1])); - key.setSex(sex); + if (i < keyTokens.length) { + nextToken = keyTokens[i++]; + if (!StringUtils.isEmpty(nextToken)) { + QualitativeValueId sex = QualitativeValueId.fromValue(Integer.parseInt(nextToken)); + key.setSex(sex); + } } - if (!StringUtils.isEmpty(keyTokens[2])) { - Boolean maturity = Boolean.parseBoolean(keyTokens[2]); - key.setMaturity(maturity); + if (i < keyTokens.length) { + nextToken = keyTokens[i++]; + if (!StringUtils.isEmpty(nextToken)) { + Boolean maturity = Boolean.parseBoolean(nextToken); + key.setMaturity(maturity); + } } - int lengthStep = Integer.parseInt(keyTokens[3]); - key.setLengthStep(lengthStep); + if (i < keyTokens.length) { + nextToken = keyTokens[i++]; + if (!StringUtils.isEmpty(nextToken)) { + Integer lengthStep = Integer.parseInt(nextToken); + key.setLengthStep(lengthStep); + } + } key.setSamplingNb(entry.getValue().getSamplingNb()); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java index dc53227..17a7fa3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java @@ -37,7 +37,7 @@ import java.util.Optional; */ public class SamplingEvent extends EventObject { - protected final float lengthStep; + protected final Integer lengthStep; protected final CaracteristicQualitativeValue gender; @@ -53,7 +53,7 @@ public class SamplingEvent extends EventObject { protected final int nbSamplingForOperation; - public SamplingEvent(CruiseSamplingCache source, float lengthStep, CaracteristicQualitativeValue gender, Boolean maturity, + public SamplingEvent(CruiseSamplingCache source, Integer lengthStep, CaracteristicQualitativeValue gender, Boolean maturity, CalcifiedPiecesSamplingDefinition cpsDef, Optional<Zone> zone, int nbSamplingForCruise, int nbSamplingForZone, int nbSamplingForOperation) { super(source); this.lengthStep = lengthStep; @@ -66,7 +66,7 @@ public class SamplingEvent extends EventObject { this.nbSamplingForOperation = nbSamplingForOperation; } - public float getLengthStep() { + public Integer getLengthStep() { return lengthStep; } diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index cd64b5c..7eea13f 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -83,8 +83,7 @@ tutti.service.calcifiedPiecesSamplingReport.header.surveyCode=Code campagne tutti.service.compressZipFile.error=Erreur lors de la compression du dossier %1s dans le fichier %2s tutti.service.context.serviceInstanciation.error=Erreur lors de l'instanciation du service %s tutti.service.cpsExport.error=Erreur à l'export du rapport des prélèvements -tutti.service.cpsExport.step.export.species=Export des prélèvements pour l'espèce %s -tutti.service.cpsExport.step.toFile= +tutti.service.cpsExport.step.toFile=Ecriture des données dans le fichier %s tutti.service.csv.caracteristic.qualitativeValue.notFound=La caractéristique qualitative %s n'a pas de value d'id %s tutti.service.csv.parse.entityNotFound=L'entité de type %1s avec la propriété %2s de valeur %3s n'a pas été trouvée tutti.service.csv.parse.foreignEntityNotFound=L'entité de type %1s avec l'identifiant %3s n'a pas été trouvée @@ -305,7 +304,7 @@ tutti.service.protocol.export.caracteristics.protocol.error=Erreur lors de l'exp tutti.service.protocol.export.cps.error=Erreur lors de l'export de l'algorithme de prélèvements des pièces calcifiées dans le fichier %s tutti.service.protocol.export.species.error=Erreur lors de l'export des espèces dans le fichier %s tutti.service.protocol.import.benthos.error=Erreur lors de l'import du benthos du protocole %1s du fichier %2s -tutti.service.protocol.import.cps.error= +tutti.service.protocol.import.cps.error=Erreur lors de l'import de l'algorithme de prélèvements des pièces calcifiées dans le protocole %s depuis le fichier %s tutti.service.protocol.import.cps.interval.error=Erreur sur la ligne espèces %s (%s) taille minimale attendue \: %s, réelle \: %s tutti.service.protocol.import.cps.maturity.error=Erreur sur la maturité pour l'espèces %s tutti.service.protocol.import.species.error=Erreur lors de l'import des espèces du protocole %1s du fichier %2s -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.