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 fa3f076c4a5774fd3d8bd4b9185cce78f29f866f Author: Benjamin POUSSIN <poussin@codelutin.com> Date: Wed Jun 8 18:12:51 2016 +0200 fixes #8337 --- .../entities/referential/CaracteristicBean.java | 27 ++++++++++++++++ .../src/main/xmi/tutti-persistence.zargo | Bin 59750 -> 59923 bytes .../tutti/service/bigfin/BigfinImportService.java | 25 ++++++++------- .../catches/multipost/MultiPostImportService.java | 14 ++++----- .../tutti/service/cruise/CruiseCacheLoader.java | 7 +++-- .../service/sampling/CruiseSamplingCache.java | 29 +++++++++++++++--- .../species/frequency/SpeciesFrequencyUIModel.java | 34 ++++++++++++++------- 7 files changed, 98 insertions(+), 38 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/CaracteristicBean.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/CaracteristicBean.java index b3a3b35..8b9cd2b 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/CaracteristicBean.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/CaracteristicBean.java @@ -25,11 +25,38 @@ package fr.ifremer.tutti.persistence.entities.referential; */ import com.google.common.base.MoreObjects; +import fr.ifremer.tutti.util.Numbers; public class CaracteristicBean extends AbstractCaracteristicBean { private static final long serialVersionUID = 1L; + public static final Float DEFAULT_PRECISION = 0.1f; + + @Override + public Integer getLengthStepInMm(Float lengthStep) { + Integer lengthClass; + if (lengthStep == null) { + lengthClass = null; + } else { + int intValue = (int) (lengthStep * 10); + int intStep = (int) (getPrecision() * 10); + int correctIntStep = intValue - (intValue % intStep); + lengthClass = Numbers.convertToMm(correctIntStep / 10f, getUnit()); + } + return lengthClass; + } + + @Override + public Float getPrecision() { + Float result = super.getPrecision(); + if (result == null) { + // on ne met pas 1 c'est la valeur par défaut + result = DEFAULT_PRECISION; + } + return result; + } + @Override public String toString() { return MoreObjects.toStringHelper(Caracteristic.class) diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo b/tutti-persistence/src/main/xmi/tutti-persistence.zargo index 76c03f3..99a9040 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo differ diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportService.java index f3178d9..97a331c 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportService.java @@ -62,16 +62,6 @@ import fr.ifremer.tutti.service.bigfin.signs.Sign; import fr.ifremer.tutti.service.bigfin.signs.Size; import fr.ifremer.tutti.service.bigfin.signs.VracHorsVrac; import fr.ifremer.tutti.type.WeightUnit; -import fr.ifremer.tutti.util.Weights; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.IterableUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.csv.Import; -import org.nuiton.csv.ImportRuntimeException; -import org.nuiton.jaxx.application.ApplicationBusinessException; - import java.io.File; import java.io.IOException; import java.io.Reader; @@ -83,6 +73,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.IterableUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.Import; +import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.jaxx.application.ApplicationBusinessException; import static org.nuiton.i18n.I18n.t; @@ -483,9 +481,10 @@ public class BigfinImportService extends AbstractTuttiService { Preconditions.checkNotNull(lengthStepPmfm); String unit = lengthStepPmfm.getUnit(); Float precision = lengthStepPmfm.getPrecision(); - if (precision == null) { - precision = 1f; - } + // CHANGE poussin 2016, maintenant getPrecision retourne toujours quelque chose +// if (precision == null) { +// precision = 1f; +// } // board measurements are in mm diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostImportService.java index d4c0e5b..7023a09 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostImportService.java @@ -51,6 +51,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequencys; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchs; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicBean; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType; import fr.ifremer.tutti.persistence.entities.referential.Species; @@ -81,12 +82,6 @@ import fr.ifremer.tutti.service.catches.multipost.csv.MarineLitterWeightRow; import fr.ifremer.tutti.service.catches.multipost.csv.MarineLitterWeightRowModel; import fr.ifremer.tutti.service.csv.CaracteristicValueParserFormatter; import fr.ifremer.tutti.type.WeightUnit; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.nuiton.csv.Import; -import org.nuiton.jaxx.application.ApplicationBusinessException; -import org.nuiton.jaxx.application.ApplicationTechnicalException; - import java.io.File; import java.io.IOException; import java.io.Reader; @@ -102,6 +97,11 @@ import java.util.Map; import java.util.Objects; import java.util.TreeMap; import java.util.function.Supplier; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.nuiton.csv.Import; +import org.nuiton.jaxx.application.ApplicationBusinessException; +import org.nuiton.jaxx.application.ApplicationTechnicalException; import static org.nuiton.i18n.I18n.t; @@ -1420,7 +1420,7 @@ public class MultiPostImportService extends AbstractTuttiService implements Mult step = caracteristic.getPrecision(); } if (step == null) { - step = 1f; + step = CaracteristicBean.DEFAULT_PRECISION; } return step; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/cruise/CruiseCacheLoader.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/cruise/CruiseCacheLoader.java index 00be5f3..24ed1b3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/cruise/CruiseCacheLoader.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/cruise/CruiseCacheLoader.java @@ -33,13 +33,12 @@ import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; import fr.ifremer.tutti.service.sampling.SamplingCodeCache; +import java.util.Collection; +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; -import java.util.Collection; -import java.util.List; - import static org.nuiton.i18n.I18n.t; /** @@ -100,6 +99,8 @@ public class CruiseCacheLoader { log.info("Loading cruise cache: " + cruiseCache); } + // FIXME poussin 20160608 a reecrire pour de meilleur performance, il faut remonter + // tous les fishingOperation en une fois et non pas faire N requete Decorator<FishingOperation> fishingOperationDecorator = decoratorService.getDecoratorByType(FishingOperation.class); persistenceService.getAllFishingOperationIds(cruiseCache.getCruiseId()).forEach(fishingOperationId -> { 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 f6c4e19..8670c37 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 @@ -40,9 +40,6 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.service.cruise.CruiseCacheAble; import fr.ifremer.tutti.util.Numbers; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -50,6 +47,8 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.IntStream; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import static fr.ifremer.tutti.service.sampling.CruiseSamplingInternalCache.addPrefixKey; @@ -177,7 +176,8 @@ public class CruiseSamplingCache implements CruiseCacheAble { Boolean maturity = getMaturity(individualObservationBatch); - int lengthStepInMm = Numbers.convertToMm(lengthStep, individualObservationBatch.getLengthStepCaracteristic().getUnit()); + // don't forget to compute lengthStep with Caracteristic https://forge.codelutin.com/issues/8337 + int lengthStepInMm = individualObservationBatch.getLengthStepCaracteristic().getLengthStepInMm(lengthStep); CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); @@ -404,9 +404,25 @@ public class CruiseSamplingCache implements CruiseCacheAble { String zoneSamplingKey = context.getZoneSamplingKey(); CruiseSamplingInternalCache.SamplingData zoneSamplingData = zoneCache.getSamplingData(zoneSamplingKey); + if (zoneSamplingData == null) { + // poussin 20160608 fallback code to prevent UI error + // fixes with https://forge.codelutin.com/issues/8337 + log.error(String.format("Can't find zoneSamplingData, create one" + + " (zoneSamplingKey: '%s'; request: '%s'; zone: '%s')", + zoneSamplingKey, request, optionalZone.get())); + zoneSamplingData = zoneCache.getOrCreateSamplingData(zoneSamplingKey); + } String fishingOperationSamplingKey = context.getFishingOperationSamplingKey(); CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.getSamplingData(fishingOperationSamplingKey); + if (fishingOperationSamplingData == null) { + // poussin 20160608 fallback code to prevent UI error + // fixes with https://forge.codelutin.com/issues/8337 + log.error(String.format("Can't find fishingOperationSamplingData, create one" + + " (fishingOperationSamplingData: '%s'; request: '%s'; zone: '%s)", + zoneSamplingKey, request, optionalZone.get())); + fishingOperationSamplingData = fishingOperationCache.getOrCreateSamplingData(fishingOperationSamplingKey); + } // on demande à calculer needSampling uniquement s'il n'y a pas de code de prélèvement sur l'observation boolean computeSampling = !request.withSamplingCode(); @@ -500,6 +516,11 @@ public class CruiseSamplingCache implements CruiseCacheAble { private Optional<Zone> tryFindZone(TuttiLocation location) { + // FIXME poussin 20160608 si on est obligé de parcourir pour chacun la + // collection, c'est que ce n'est pas le bon format de stockage. + // Modifier pour que la recherche soit faite sans parcours + // il faudrait plutot Map[locationId -> Zone] + // ce code est appeler de très nombreuse fois Integer locationId = location.getIdAsInt(); return locationIdsPerZone.keySet() .stream() 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 aedbb88..42b8325 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 @@ -28,6 +28,7 @@ import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.protocol.Rtp; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicBean; import fr.ifremer.tutti.service.cruise.CruiseCache; import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingCacheRequest; import fr.ifremer.tutti.type.WeightUnit; @@ -37,15 +38,14 @@ import fr.ifremer.tutti.ui.swing.util.computable.ComputableData; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; import fr.ifremer.tutti.util.Numbers; import fr.ifremer.tutti.util.Weights; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * @author Tony Chemit - chemit@codelutin.com @@ -433,7 +433,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } if (step == null) { // on ne met pas 1 c'est la valeur par défaut - step = 0.1f; + step = CaracteristicBean.DEFAULT_PRECISION; } setStep(step); } @@ -560,15 +560,27 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return correctIntStep / 10f; } + // FIXME poussin 20160608 ce code est duplique avec le CaracteristicBean#getLengthStepInMm + // Il faudrait supprimer le code qui est ici pour utiliser celui de l'objet. + // public Integer getLengthStepInMm(Float lengthStep) { Integer lengthClass; - if (lengthStep == null) { - lengthClass = null; + + Caracteristic c = getLengthStepCaracteristic(); + if (c != null && c.getPrecision().equals(step)) { + lengthClass = c.getLengthStepInMm(lengthStep); } else { - int intValue = (int) (lengthStep * 10); - int intStep = (int) (step * 10); - int correctIntStep = intValue - (intValue % intStep); - lengthClass = Numbers.convertToMm(correctIntStep / 10f, getLengthStepCaracteristicUnit()); + // legacy code, here because step and unit can be set independantly :( + // this is very strange, and must be refactored (step and unit must + // be all time associate via Caracteristic object) + if (lengthStep == null) { + lengthClass = null; + } else { + int intValue = (int) (lengthStep * 10); + int intStep = (int) (step * 10); + int correctIntStep = intValue - (intValue % intStep); + lengthClass = Numbers.convertToMm(correctIntStep / 10f, getLengthStepCaracteristicUnit()); + } } return lengthClass; } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.