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 e9b7163e496e96ff5b1f5051ef1a8230427e243d Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 27 13:35:09 2016 +0200 Import des observations individuelles ok (See #8252) --- .../GenericFormatImportOperationContext.java | 24 +++++++- .../genericformat/GenericFormatImportService.java | 2 +- .../GenericformatImportPersistenceHelper.java | 36 ++++++++++++ .../CsvConsumerForIndividualObservation.java | 23 ++++---- .../importactions/ImportCatchAction.java | 3 + .../ImportIndividualObservationAction.java | 61 ++++++++++++++------ .../ValidateIndividualObservationAction.java | 67 +++++++++++++++++++++- 7 files changed, 181 insertions(+), 35 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationContext.java index bf65e20..b262a20 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportOperationContext.java @@ -87,8 +87,16 @@ public class GenericFormatImportOperationContext implements Closeable { private final Map<Integer, SpeciesBatch> horsVracBenthosBatches; + /** + * Dictionnaire des ids de lot espèces (clef : l'id assigné pendant l'import, valeur l'id dans les fichiers d'import). + */ private final Map<Integer, Integer> batchesObjectIds; + /** + * Dictionnaire des ids des lots espèces importés (clef : id dans les fichiers d'import, valeur l'id persisté). + */ + private final Map<Integer, Integer> speciesBatchIds; + private final ArrayListMultimap<Integer, SpeciesBatchFrequency> benthosFrequencies; private final CaracteristicMap gearUseFeatures; @@ -121,6 +129,7 @@ public class GenericFormatImportOperationContext implements Closeable { this.vesselUseFeatures = new CaracteristicMap(); this.checkErrors = new LinkedHashSet<>(); this.batchesObjectIds = new TreeMap<>(); + this.speciesBatchIds = new TreeMap<>(); } @@ -176,7 +185,7 @@ public class GenericFormatImportOperationContext implements Closeable { return accidentalBatchesById.get(accidentalBatchId); } - public IndividualObservationBatch getIndividualObservationBatchesById(Integer individualObservationBatchId) { + public IndividualObservationBatch getIndividualObservationBatchById(Integer individualObservationBatchId) { return individualObservationBatchesById.get(individualObservationBatchId); } @@ -236,7 +245,7 @@ public class GenericFormatImportOperationContext implements Closeable { return ImmutableList.copyOf(accidentalBatchesById.values()); } - public Collection<IndividualObservationBatch> getIndividualObservationBatches() { + public ImmutableList<IndividualObservationBatch> getIndividualObservationBatches() { return ImmutableList.copyOf(individualObservationBatchesById.values()); } @@ -304,6 +313,8 @@ public class GenericFormatImportOperationContext implements Closeable { speciesFrequencies.clear(); vracSpeciesBatches.clear(); horsVracSpeciesBatches.clear(); + batchesObjectIds.clear(); + speciesBatchIds.clear(); } @@ -318,6 +329,14 @@ public class GenericFormatImportOperationContext implements Closeable { } + public void registerPersistedSpeciesBatchId(Integer importBatchId, Integer persistBatchId) { + speciesBatchIds.put(importBatchId, persistBatchId); + } + + public Integer getSpeciesBatchId(Integer importBatchId) { + return speciesBatchIds.get(importBatchId); + } + public void setWeightsDeleted(boolean weightsDeleted) { this.weightsDeleted = weightsDeleted; } @@ -325,6 +344,5 @@ public class GenericFormatImportOperationContext implements Closeable { public boolean isWeightsDeleted() { return weightsDeleted; } - } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java index cb4d6fe..c5bc415 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java @@ -339,7 +339,7 @@ public class GenericFormatImportService extends AbstractTuttiService { actions.add(new ValidateCatchAction(importContext)); actions.add(new ValidateMarineLitterAction(importContext)); actions.add(new ValidateAccidentalCatchAction(importContext)); - actions.add(new ValidateIndividualObservationAction(importContext)); + actions.add(new ValidateIndividualObservationAction(importContext, persitenceHelper)); return actions; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersistenceHelper.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersistenceHelper.java index bee006e..d07a64c 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersistenceHelper.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericformatImportPersistenceHelper.java @@ -24,6 +24,7 @@ package fr.ifremer.tutti.service.genericformat; * #L% */ +import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; @@ -32,11 +33,13 @@ import fr.ifremer.tutti.persistence.entities.data.BatchContainer; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.data.MarineLitterBatch; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.Species; @@ -81,6 +84,10 @@ public class GenericformatImportPersistenceHelper { private final ProtocolImportExportService protocolImportExportService; + private final Caracteristic copyIndividualObservationModeCaracteristic; + private final Caracteristic weightMeasuredCaracteristic; + private final Caracteristic pmfmIdCaracteristic; + public GenericformatImportPersistenceHelper(TuttiServiceContext context, GenericFormatContextSupport importContext) { this.importContext = importContext; this.persistenceService = context.getService(PersistenceService.class); @@ -89,6 +96,9 @@ public class GenericformatImportPersistenceHelper { this.referentialTemporarySpeciesService = context.getService(ReferentialTemporarySpeciesService.class); this.referentialTemporaryVesselService = context.getService(ReferentialTemporaryVesselService.class); this.protocolImportExportService = context.getService(ProtocolImportExportService.class); + this.weightMeasuredCaracteristic = persistenceService.getWeightMeasuredCaracteristic(); + this.copyIndividualObservationModeCaracteristic = persistenceService.getCopyIndividualObservationModeCaracteristic(); + this.pmfmIdCaracteristic = persistenceService.getPmfmIdCaracteristic(); } public Set<FishingOperation> getFishingOperations(Integer cruiseId) { @@ -275,4 +285,30 @@ public class GenericformatImportPersistenceHelper { public Map<Integer, Integer> getAllObsoleteReferentTaxons() { return persistenceService.getAllObsoleteReferentTaxons(); } + + public void deleteIndividualObservationBatchForFishingOperation(Integer fishingOperationId) { + persistenceService.deleteAllIndividualObservationsForFishingOperation(fishingOperationId); + } + + public List<IndividualObservationBatch> createIndividualObservationBatch(FishingOperation fishingOperation, ImmutableList<IndividualObservationBatch> individualObservationBatch) { + return persistenceService.createIndividualObservationBatches(fishingOperation, individualObservationBatch); + } + + public Caracteristic getCaracteristic(Integer caracteristicId) { + return persistenceService.getCaracteristic(caracteristicId); + } + + public Caracteristic getCopyIndividualObservationModeCaracteristic() { + return copyIndividualObservationModeCaracteristic; + } + + public Caracteristic getPmfmIdCaracteristic() { + return pmfmIdCaracteristic; + } + + public Caracteristic getWeightMeasuredCaracteristic() { + return weightMeasuredCaracteristic; + } + + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForIndividualObservation.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForIndividualObservation.java index f0ca721..ee79cd3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForIndividualObservation.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/consumer/CsvConsumerForIndividualObservation.java @@ -63,18 +63,15 @@ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualO if (operationContext != null) { - //TODO checks! IndividualObservationRow bean = row.getBean(); - //TODO Use a validator ? Caracteristic caracteristic = bean.getCaracteristic(); if (caracteristic == null) { - //TODO Should done by parser ? + addCheckError(row, new NullPointerException("Caracteristique non définie.")); } - //TODO Use a validator ? if (bean.getCaracteristicValue() == null) { - + addCheckError(row, new NullPointerException("Valeur de caracteristique non définie.")); } // parse caracteristic value @@ -97,12 +94,12 @@ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualO public void prepareRowForPersist(GenericFormatImportOperationContext operationContext, ImportRow<IndividualObservationRow> row) { IndividualObservationRow bean = row.getBean(); - Integer batchId = bean.getBatchId(); - IndividualObservationBatch batch = operationContext.getIndividualObservationBatchesById(batchId); + Integer individualObservationBatchId = bean.getId(); + IndividualObservationBatch batch = operationContext.getIndividualObservationBatchById(individualObservationBatchId); if (batch == null) { if (log.isInfoEnabled()) { - log.info("Detects individualObservationBatch: " + batchId); + log.info("Detects individualObservationBatch: " + individualObservationBatchId); } batch = IndividualObservationBatchs.newIndividualObservationBatch(); @@ -110,12 +107,16 @@ public class CsvConsumerForIndividualObservation extends CsvComsumer<IndividualO batch.setCaracteristics(new CaracteristicMap()); batch.setComment(bean.getComment()); batch.setSpecies(bean.getSpecies()); - batch.setId(bean.getBatchId()); - operationContext.addIndividualObservationBatch(batchId, batch); + batch.setId(individualObservationBatchId); + batch.setBatchId(bean.getBatchId()); + batch.setRankOrder(bean.getRankOrder()); + operationContext.addIndividualObservationBatch(individualObservationBatchId, batch); } - batch.getCaracteristics().put(bean.getCaracteristic(), bean.getCaracteristicValue()); + Caracteristic caracteristic = bean.getCaracteristic(); + Serializable caracteristicValue = bean.getCaracteristicValue(); + batch.getCaracteristics().put(caracteristic, caracteristicValue); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportCatchAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportCatchAction.java index a6685c5..5f17023 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportCatchAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportCatchAction.java @@ -191,6 +191,9 @@ public class ImportCatchAction extends ImportActionSupport { Collection<AttachmentRow> attachmentRows = importContext.popAttachmentRows(ObjectTypeCode.BATCH, batchObjectId); persistenceHelper.persistAttachments(createdBatch.getIdAsInt(), attachmentRows); + // keep id translation (will be used by individual observations) + fishingOperationContext.registerPersistedSpeciesBatchId(batchObjectId, createdBatch.getIdAsInt()); + if (CollectionUtils.isNotEmpty(frequencies)) { Integer batchId = batch.getIdAsInt(); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportIndividualObservationAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportIndividualObservationAction.java index fca8915..5d4a3ec 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportIndividualObservationAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportIndividualObservationAction.java @@ -24,6 +24,7 @@ package fr.ifremer.tutti.service.genericformat.importactions; * #L% */ +import com.google.common.collect.ImmutableList; import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; @@ -44,6 +45,8 @@ import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.IOException; import java.util.Collection; +import java.util.List; +import java.util.Objects; import static org.nuiton.i18n.I18n.t; @@ -68,9 +71,9 @@ public class ImportIndividualObservationAction extends ImportActionSupport { @Override protected boolean canExecute() { return importContext.isTechnicalFilesValid() - && importContext.getSurveyFileResult().isValid() - && importContext.getOperationFileResult().isValid() - && importContext.getImportRequest().isImportIndividualObservation(); + && importContext.getSurveyFileResult().isValid() + && importContext.getOperationFileResult().isValid() + && importContext.getImportRequest().isImportIndividualObservation(); } @Override @@ -94,6 +97,7 @@ public class ImportIndividualObservationAction extends ImportActionSupport { importContext.increments(t("tutti.service.genericFormat.import.individualObservations")); GenericFormatCsvFileResult importFileResult = importContext.getIndividualObservationFileResult(); try (CsvConsumerForIndividualObservation consumer = importContext.loadIndividualObservations(true)) { + for (ImportRow<IndividualObservationRow> row : consumer) { GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext); @@ -102,6 +106,7 @@ public class ImportIndividualObservationAction extends ImportActionSupport { } } + } catch (IOException e) { throw new ApplicationTechnicalException("Could not close individualObservation.csv file", e); } catch (ImportRuntimeException e) { @@ -114,7 +119,7 @@ public class ImportIndividualObservationAction extends ImportActionSupport { } - private void persistIndividualObservationBatches() { + private void persistIndividualObservationBatches() { importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() { @@ -138,11 +143,17 @@ public class ImportIndividualObservationAction extends ImportActionSupport { if (fishingOperationContext.withIndividualObservationBatches()) { - Collection<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches(); + ImmutableList<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches(); + + if (log.isInfoEnabled()) { + log.info("Check " + individualObservationBatches.size() + " individual observation(s) of " + operationStr + " for cruise: " + cruiseStr); + } + ValidateIndividualObservationAction.prepareIndividualObservationsForPersist(persistenceHelper, individualObservationBatches); + if (log.isInfoEnabled()) { log.info("Persist " + individualObservationBatches.size() + " individual observation(s) of " + operationStr + " for cruise: " + cruiseStr); } - persistIndividualObservationBatches(individualObservationBatches); + persistIndividualObservationBatches(fishingOperationContext, individualObservationBatches); } @@ -153,25 +164,41 @@ public class ImportIndividualObservationAction extends ImportActionSupport { private void deleteIndividualObservationBatches(GenericFormatImportOperationContext fishingOperationContext) { FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - //FIXME -// persistenceHelper.deleteIndividualObservationBatchForFishingOperation(fishingOperation.getIdAsInt()); + persistenceHelper.deleteIndividualObservationBatchForFishingOperation(fishingOperation.getIdAsInt()); } - private void persistIndividualObservationBatches(Collection<IndividualObservationBatch> batches) { + private void persistIndividualObservationBatches(GenericFormatImportOperationContext fishingOperationContext, ImmutableList<IndividualObservationBatch> batches) { + + for (IndividualObservationBatch individualObservation : batches) { - for (IndividualObservationBatch individualObservationBatch : batches) { + Integer batchId = individualObservation.getBatchId(); + Integer speciesBatchId = fishingOperationContext.getSpeciesBatchId(batchId); + Objects.requireNonNull(speciesBatchId, "Persisted Species batch id not found for import species batch id: " + batchId); + individualObservation.setBatchId(speciesBatchId); - Integer objectId = individualObservationBatch.getIdAsInt(); - Collection<AttachmentRow> attachmentRows = importContext.popAttachmentRows(ObjectTypeCode.SAMPLE, objectId); + } + + + // On conserve l'ordre des ids d'imports qui vont servir ensuite pour persister les pièces jointes + ImmutableList.Builder<Integer> idsBuilder = ImmutableList.builder(); + batches.forEach(batch -> idsBuilder.add(batch.getIdAsInt())); + ImmutableList<Integer> importIds = idsBuilder.build(); + + // on enlève les ids pour la persistence + batches.forEach(batch -> batch.setId((String) null)); + + FishingOperation fishingOperation = fishingOperationContext.getFishingOperation(); - // Id was only here to get attachments - individualObservationBatch.setId((String) null); + List<IndividualObservationBatch> savedBatches = persistenceHelper.createIndividualObservationBatch(fishingOperation, batches); - //FIXME -// IndividualObservationBatch createdIndividualObservationBatch = persistenceHelper.createIndividualObservationBatch(individualObservationBatch); -// persistenceHelper.persistAttachments(createdIndividualObservationBatch.getIdAsInt(), attachmentRows); + // Persistence des pièces-jointes associées aux observations individuelles + int index = 0; + for (IndividualObservationBatch savedBatch : savedBatches) { + Integer importId = importIds.get(index++); + Collection<AttachmentRow> attachmentRows = importContext.popAttachmentRows(ObjectTypeCode.SAMPLE, importId); + persistenceHelper.persistAttachments(savedBatch.getIdAsInt(), attachmentRows); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ValidateIndividualObservationAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ValidateIndividualObservationAction.java index dd62f13..2a53c6a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ValidateIndividualObservationAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ValidateIndividualObservationAction.java @@ -24,9 +24,15 @@ package fr.ifremer.tutti.service.genericformat.importactions; * #L% */ +import com.google.common.collect.ImmutableList; +import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.service.genericformat.GenericFormatContextSupport; import fr.ifremer.tutti.service.genericformat.GenericFormatCsvFileResult; import fr.ifremer.tutti.service.genericformat.GenericFormatImportOperationContext; +import fr.ifremer.tutti.service.genericformat.GenericformatImportPersistenceHelper; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForIndividualObservation; import fr.ifremer.tutti.service.genericformat.csv.IndividualObservationRow; import org.apache.commons.logging.Log; @@ -36,6 +42,7 @@ import org.nuiton.csv.ImportRuntimeException; import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.IOException; +import java.util.Objects; import static org.nuiton.i18n.I18n.t; @@ -50,19 +57,22 @@ public class ValidateIndividualObservationAction extends ImportActionSupport { /** Logger. */ private static final Log log = LogFactory.getLog(ValidateIndividualObservationAction.class); - public ValidateIndividualObservationAction(GenericFormatContextSupport importContext) { + private final GenericformatImportPersistenceHelper persitenceHelper; + + public ValidateIndividualObservationAction(GenericFormatContextSupport importContext, + GenericformatImportPersistenceHelper persitenceHelper) { super(importContext); + this.persitenceHelper = persitenceHelper; } @Override protected boolean canExecute() { - return importContext.isTechnicalFilesValid()&& importContext.getOperationFileResult().isValid(); + return importContext.isTechnicalFilesValid() && importContext.getOperationFileResult().isValid(); } @Override protected void doExecute() { - if (log.isInfoEnabled()) { log.info("Validate individualObservation.csv file."); } @@ -71,6 +81,7 @@ public class ValidateIndividualObservationAction extends ImportActionSupport { GenericFormatCsvFileResult importFileResult = importContext.getIndividualObservationFileResult(); try (CsvConsumerForIndividualObservation consumer = importContext.loadIndividualObservations(false)) { + for (ImportRow<IndividualObservationRow> row : consumer) { importContext.increments(t("tutti.service.genericFormat.validate.individualObservations", row.getLineNumber())); @@ -100,6 +111,56 @@ public class ValidateIndividualObservationAction extends ImportActionSupport { } + importContext.doActionOnCruiseContexts((cruiseContext, progressionModel) -> { + + for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) { + + String cruiseStr = cruiseContext.getCruiseLabel(); + String operationStr = fishingOperationContext.getFishingOperationLabel(); + + if (fishingOperationContext.withIndividualObservationBatches()) { + + ImmutableList<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches(); + + if (log.isInfoEnabled()) { + log.info("Check " + individualObservationBatches.size() + " individual observation(s) of " + operationStr + " for cruise: " + cruiseStr); + } + prepareIndividualObservationsForPersist(persitenceHelper, individualObservationBatches); + + } + + } + + }); + + } + + public static void prepareIndividualObservationsForPersist(GenericformatImportPersistenceHelper persistenceHelper, + ImmutableList<IndividualObservationBatch> individualObservations) { + + + for (IndividualObservationBatch individualObservation : individualObservations) { + + CaracteristicQualitativeValue copyModeCaracteristic = individualObservation.getCaracteristics().removeQualitativeValue(persistenceHelper.getCopyIndividualObservationModeCaracteristic()); + Objects.requireNonNull(copyModeCaracteristic, "No copy mode found for individual observation: " + individualObservation.getId()); + CopyIndividualObservationMode copyMode = CopyIndividualObservationMode.valueOf(copyModeCaracteristic.getIdAsInt()); + individualObservation.setCopyIndividualObservationMode(copyMode); + + String lengthClassId = individualObservation.getCaracteristics().removeStringValue(persistenceHelper.getPmfmIdCaracteristic()); + Objects.requireNonNull(lengthClassId, "No lengthClassId found for individual observation: " + individualObservation.getId()); + + Caracteristic lengthStepCaracteristic = persistenceHelper.getCaracteristic(Integer.valueOf(lengthClassId)); + Objects.requireNonNull(lengthStepCaracteristic, "lengthStepCaracteristic " + lengthClassId + " does not exist."); + individualObservation.setLengthStepCaracteristic(lengthStepCaracteristic); + + Float length = individualObservation.getCaracteristics().removeFloatValue(lengthStepCaracteristic); + individualObservation.setSize(length); + + Float weigth = individualObservation.getCaracteristics().removeFloatValue(persistenceHelper.getWeightMeasuredCaracteristic()); + individualObservation.setWeight(weigth); + + } + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.