Author: tchemit Date: 2014-05-28 17:35:16 +0200 (Wed, 28 May 2014) New Revision: 1818 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1818 Log: refs #4959 implements it Modified: trunk/pom.xml trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/BenthosBatchPersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/MarineLitterBatchPersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/BatchPersistenceHelper.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/BatchTreeHelper.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/MeasurementPersistenceHelper.java trunk/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java trunk/tutti-ui-swing/src/license/THIRD-PARTY.properties trunk/tutti-ui-swing/src/main/filtered-resources/log4j.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ComputeBatchWeightsAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveCruiseToReadyToSynchAction.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/pom.xml 2014-05-28 15:35:16 UTC (rev 1818) @@ -146,7 +146,7 @@ <jaxxVersion>2.8.5</jaxxVersion> <swingXVersion>1.6.4</swingXVersion> <slf4jVersion>1.7.5</slf4jVersion> - <adagioVersion>3.5.2</adagioVersion> + <adagioVersion>3.5.5-SNAPSHOT</adagioVersion> <bluecoveVersion>2.1.0</bluecoveVersion> <hibernateVersion>4.3.1.Final</hibernateVersion> <springVersion>4.0.1.RELEASE</springVersion> @@ -425,7 +425,7 @@ <dependency> <groupId>com.esotericsoftware.yamlbeans</groupId> <artifactId>yamlbeans</artifactId> - <version>1.06</version> + <version>1.08</version> </dependency> <!-- flying-saucer --> Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -734,6 +734,11 @@ catchBatchService.deleteCatchBatch(fishingOperationId); } + @Override + public void recomputeCatchBatchSampleRatios(String fishingOperationId) { + catchBatchService.recomputeCatchBatchSampleRatios(fishingOperationId); + } + //------------------------------------------------------------------------// //-- Species Batch methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -493,6 +493,11 @@ } @Override + public void recomputeCatchBatchSampleRatios(String fishingOperationId) { + throw notImplemented(); + } + + @Override public BatchContainer<SpeciesBatch> getRootSpeciesBatch(String fishingOperationId, boolean validateTree) throws InvalidBatchModelException { throw notImplemented(); } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/BenthosBatchPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/BenthosBatchPersistenceServiceImpl.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/BenthosBatchPersistenceServiceImpl.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -3,10 +3,8 @@ /* * #%L * Tutti :: Persistence - * $Id$ - * $HeadURL$ * %% - * Copyright (C) 2012 - 2013 Ifremer + * Copyright (C) 2012 - 2014 Ifremer * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -28,18 +26,13 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.data.batch.Batch; import fr.ifremer.adagio.core.dao.data.batch.CatchBatch; import fr.ifremer.adagio.core.dao.data.batch.SortingBatch; -import fr.ifremer.adagio.core.dao.data.measure.QuantificationMeasurement; import fr.ifremer.adagio.core.dao.data.measure.SortingMeasurement; import fr.ifremer.adagio.core.dao.referential.QualityFlag; import fr.ifremer.adagio.core.dao.referential.QualityFlagCode; -import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; -import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId2; import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxon; -import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxonImpl; import fr.ifremer.tutti.persistence.InvalidBatchModelException; import fr.ifremer.tutti.persistence.entities.data.BatchContainer; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; @@ -59,10 +52,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -315,7 +306,7 @@ target = SortingBatch.Factory.newInstance(); // Fill the sorting batch from the source - beanToEntity(source, target, parentBatch, rankOrder); + batchHelper.beanToEntity(source, target, parentBatch, rankOrder); // Create the targeted batch, then update the source id batchHelper.createSortingBatch(source, catchBatch, target); @@ -326,7 +317,7 @@ target = batchHelper.getSortingBatchById(catchBatch, source.getIdAsInt()); // Fill the sorting batch from the source - beanToEntity(source, target, parentBatch, rankOrder); + batchHelper.beanToEntity(source, target, parentBatch, rankOrder); // Add the batch into a list (will be update later, using this list) batchsToUpdate.add(target); @@ -375,6 +366,14 @@ target.setSampleCategoryWeight(source.getWeightBeforeSampling()); } + if (CollectionUtils.isNotEmpty(source.getChildBatchs()) && target.getWeight() != null) { + + // can't use this sample weight on a node + // the weight comes from sampleRatioText, but must NOT be used here + target.setWeight(null); + + } + // Comments target.setComment(source.getComments()); @@ -434,20 +433,6 @@ Preconditions.checkNotNull(source.getFishingOperation()); Preconditions.checkNotNull(source.getFishingOperation().getId()); - Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); - Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); - - // Create lists to store all updates, then remove not updated items - - Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); - if (quantificationMeasurements != null) { - notChangedQuantificationMeasurements.addAll(quantificationMeasurements); - } - Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); - if (sortingMeasurements != null) { - notChangedSortingMeasurements.addAll(sortingMeasurements); - } - // If parent and root need to be set if (target.getId() == null || target.getRootBatch() == null @@ -460,179 +445,75 @@ catchBatch); } - // RankOrder (initialize once, at creation) - if (target.getRankOrder() == null) { - // Start rank order at 1 - short rankOrder = (short) 1; - if (source.getParentBatch() != null && source.getParentBatch().getChildBatchs() != null) { - int maxRankOrder = 0; - for (BenthosBatch batch : source.getParentBatch().getChildBatchs()) { - Integer r = batch.getRankOrder(); - if (r != null && r > maxRankOrder) { - maxRankOrder = r; - } - } - rankOrder += (short) maxRankOrder; - - } else if (target.getParentBatch() != null && target.getParentBatch().getChildBatchs() != null) { - short maxRankOrder = 0; - for (Batch batch : target.getParentBatch().getChildBatchs()) { - Short r = batch.getRankOrder(); - if (r != null && r > maxRankOrder) { - maxRankOrder = r; - } - } - rankOrder += maxRankOrder; - } - target.setRankOrder(rankOrder); - } - - // Force subgroup count to '1', as Allegro - target.setSubgroupCount(1f); - - // Weight or SampleCategoryWeight - if (source.getWeight() == null && source.getSampleCategoryWeight() != null) { - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getSampleCategoryWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } else if (source.getWeight() != null && source.getSampleCategoryWeight() == null) { - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } - - // Sampling Ratio - if (source.getSampleCategoryWeight() == null || source.getWeight() == null) { - target.setSamplingRatio(null); - target.setSamplingRatioText(null); - } else { - String samplingRatioText = source.getWeight() + "/" + source.getSampleCategoryWeight(); - samplingRatioText = samplingRatioText.replaceAll(",", "."); - target.setSamplingRatioText(samplingRatioText); - target.setSamplingRatio(source.getWeight() / source.getSampleCategoryWeight()); - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } - - // Sorting measurement - if (source.getSampleCategoryId() != null && source.getSampleCategoryValue() != null) { - Integer pmfmId = source.getSampleCategoryId(); - // Do not store sorting measurement if pmfm = SORTED (already store in an ancestor batch) - if (!pmfmId.equals(PmfmId2.SORTED_UNSORTED.getValue())) { - SortingMeasurement sortingMeasurement = measurementPersistenceHelper.setSortingMeasurement( - target, - pmfmId, - source.getSampleCategoryValue()); - notChangedSortingMeasurements.remove(sortingMeasurement); - } - } - - // Individual count - target.setIndividualCount(source.getNumber()); - - // Species - ReferenceTaxon referenceTaxon; - if (source.getSpecies() == null || parentBatchId != null) { - referenceTaxon = null; - } else { - referenceTaxon = load(ReferenceTaxonImpl.class, source.getSpecies().getReferenceTaxonId()); - } - target.setReferenceTaxon(referenceTaxon); - - // QualityFlag - String qualityFlag; - if (source.isSpeciesToConfirm()) { - qualityFlag = QualityFlagCode.DOUBTFUL.getValue(); - } else { - qualityFlag = QualityFlagCode.NOTQUALIFIED.getValue(); - } - target.setQualityFlag(load(QualityFlagImpl.class, qualityFlag)); - - // Comments - target.setComments(source.getComment()); - - // Exhaustive inventory (always true under a species batch) - target.setExhaustiveInventory(true); - - // Removed not changed measurements (in sorting and quantification measurement lists) - if (quantificationMeasurements != null) { - quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); - } - if (sortingMeasurements != null) { - sortingMeasurements.removeAll(notChangedSortingMeasurements); - } + batchHelper.beanToEntity(parentBatchId, source, target); } - protected void beanToEntity(BenthosBatchFrequency source, - SortingBatch target, - SortingBatch parentBatch, - short rankOrder) { - Preconditions.checkNotNull(source.getBatch()); - Preconditions.checkNotNull(source.getBatch().getId()); - - Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); - Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); - - // Create lists to store all updates, then remove not updated items - Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); - if (quantificationMeasurements != null) { - notChangedQuantificationMeasurements.addAll(quantificationMeasurements); - } - Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); - if (sortingMeasurements != null) { - notChangedSortingMeasurements.addAll(sortingMeasurements); - } - - // If parent and root need to be set - if (target.getId() == null - || target.getRootBatch() == null - || (target.getParentBatch() != null && !target.getParentBatch().getId().equals(parentBatch.getId()))) { - - target.setParentBatch(parentBatch); - target.setRootBatch(parentBatch.getRootBatch()); - } - - // RankOrder - target.setRankOrder(rankOrder); - - // Weight or SampleCategoryWeight - if (source.getWeight() != null) { - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } - - // Sorting measurement - if ((source.getLengthStepCaracteristic() != null && source.getLengthStep() != null)) { - Integer pmfmId = source.getLengthStepCaracteristic().getIdAsInt(); - SortingMeasurement sortingMeasurement = measurementPersistenceHelper.setSortingMeasurement(target, pmfmId, - source.getLengthStep()); - notChangedSortingMeasurements.remove(sortingMeasurement); - } - - // Individual count - target.setIndividualCount(source.getNumber()); - - // Species - target.setReferenceTaxon(null); - - // QualityFlag - target.setQualityFlag(parentBatch.getQualityFlag()); - - // Exhaustive inventory (always true under a species batch) - target.setExhaustiveInventory(true); - - // Removed not changed measurements (in sorting and quantification measurement lists) - if (quantificationMeasurements != null) { - quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); - } - if (sortingMeasurements != null) { - sortingMeasurements.removeAll(notChangedSortingMeasurements); - } - } +// protected void beanToEntity(BenthosBatchFrequency source, +// SortingBatch target, +// SortingBatch parentBatch, +// short rankOrder) { +// Preconditions.checkNotNull(source.getBatch()); +// Preconditions.checkNotNull(source.getBatch().getId()); +// +// Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); +// Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); +// +// // Create lists to store all updates, then remove not updated items +// Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); +// if (quantificationMeasurements != null) { +// notChangedQuantificationMeasurements.addAll(quantificationMeasurements); +// } +// Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); +// if (sortingMeasurements != null) { +// notChangedSortingMeasurements.addAll(sortingMeasurements); +// } +// +// // If parent and root need to be set +// if (target.getId() == null +// || target.getRootBatch() == null +// || (target.getParentBatch() != null && !target.getParentBatch().getId().equals(parentBatch.getId()))) { +// +// target.setParentBatch(parentBatch); +// target.setRootBatch(parentBatch.getRootBatch()); +// } +// +// // RankOrder +// target.setRankOrder(rankOrder); +// +// // Weight or SampleCategoryWeight +// if (source.getWeight() != null) { +// QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( +// target, +// source.getWeight()); +// notChangedQuantificationMeasurements.remove(quantificationMeasurement); +// } +// +// // Sorting measurement +// if ((source.getLengthStepCaracteristic() != null && source.getLengthStep() != null)) { +// Integer pmfmId = source.getLengthStepCaracteristic().getIdAsInt(); +// SortingMeasurement sortingMeasurement = measurementPersistenceHelper.setSortingMeasurement(target, pmfmId, +// source.getLengthStep()); +// notChangedSortingMeasurements.remove(sortingMeasurement); +// } +// +// // Individual count +// target.setIndividualCount(source.getNumber()); +// +// // Species +// target.setReferenceTaxon(null); +// +// // QualityFlag +// target.setQualityFlag(parentBatch.getQualityFlag()); +// +// // Exhaustive inventory (always true under a species batch) +// target.setExhaustiveInventory(true); +// +// // Removed not changed measurements (in sorting and quantification measurement lists) +// if (quantificationMeasurements != null) { +// quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); +// } +// if (sortingMeasurements != null) { +// sortingMeasurements.removeAll(notChangedSortingMeasurements); +// } +// } } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -77,4 +77,13 @@ @Transactional(readOnly = false) void deleteCatchBatch(String fishingOperationId); + /** + * Recompute all the sampleRatio and sampleRatioText for the catch batch + * and all his children batches for the given fishing operation id. + * + * @param fishingOperationId id of the fihsing operation + * @since 3.5 + */ + @Transactional(readOnly = false) + void recomputeCatchBatchSampleRatios(String fishingOperationId); } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -24,19 +24,22 @@ import com.google.common.base.Preconditions; -import com.google.common.collect.Sets; +import fr.ifremer.adagio.core.dao.data.batch.Batch; import fr.ifremer.adagio.core.dao.data.batch.CatchBatchImpl; import fr.ifremer.adagio.core.dao.data.batch.SortingBatch; import fr.ifremer.adagio.core.dao.data.measure.QuantificationMeasurement; import fr.ifremer.adagio.core.dao.data.operation.FishingOperationImpl; import fr.ifremer.adagio.core.dao.referential.QualityFlagCode; import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.CatchBatchBean; import fr.ifremer.tutti.persistence.service.util.BatchPersistenceHelper; import fr.ifremer.tutti.persistence.service.util.BatchTreeHelper; import fr.ifremer.tutti.persistence.service.util.MeasurementPersistenceHelper; import fr.ifremer.tutti.persistence.service.util.SynchronizationStatusHelper; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.FlushMode; @@ -46,8 +49,12 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.Collection; +import java.util.HashSet; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; @Service("batchPersistenceService") public class CatchBatchPersistenceServiceImpl @@ -170,6 +177,75 @@ batchHelper.deleteCatchBatch(fishingOperationId, catchBatchId); } + @Override + public void recomputeCatchBatchSampleRatios(String fishingOperationId) { + + Preconditions.checkNotNull(fishingOperationId); + Integer catchBatchId = batchHelper.getCatchBatchIdByFishingOperationId(Integer.valueOf(fishingOperationId)); + + if (catchBatchId == null) { + throw new DataRetrievalFailureException("Could not retrieve catch batch for fishingOperation id=" + fishingOperationId); + } + + fr.ifremer.adagio.core.dao.data.batch.CatchBatch catchBatch = batchTreeHelper.loadCatchBatch(catchBatchId); + + // To store computed indirect weights by batch + // If a batch has a weight before sampling then nothing is computed + Map<Integer, SortingBatch> indirectWeightByBatch = new TreeMap<>(); + + // To store quantification measurement ids which need to update to pass + // is_reference_quantification to false + // such measurements are only on batch nodes (leaf always keep the value to true) + Set<Integer> quantificationMeasurementIds = new HashSet<>(); + + Set<Integer> indirectWeightByBatchSkip = new HashSet<>(); + + for (Batch rootBatch : catchBatch.getChildBatchs()) { + + computeIndirectWeight(rootBatch, + indirectWeightByBatch, + indirectWeightByBatchSkip, + quantificationMeasurementIds); + + } + + if (!indirectWeightByBatch.isEmpty()) { + + // update batchs sample ratio + for (SortingBatch batch : indirectWeightByBatch.values()) { + + Float weight = batch.getWeight(); + Float indirectWeight = batch.getIndirectWeight(); + batch.setIndirectWeight(null); + + if (indirectWeight == null) { + + // will reuse then the weight + indirectWeight = weight; + } + + if (log.isInfoEnabled()) { + log.info(String.format("setWeightAndSampleRatio :: %d (%s // %s)", batch.getId(), weight, indirectWeight)); + } + + batchTreeHelper.setSortingSamplingRatio(batch, indirectWeight, weight); + + } + + } + if (!quantificationMeasurementIds.isEmpty()) { + + // update measurements + if (log.isInfoEnabled()) { + log.info("updateQuantificationMeasurementsForBatchNodes :: " + quantificationMeasurementIds); + } + queryUpdate("updateQuantificationMeasurementsForBatchNodes", + "ids", IntegerType.INSTANCE, quantificationMeasurementIds); + + } + + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -264,39 +340,27 @@ Preconditions.checkNotNull(source.getFishingOperation()); Preconditions.checkNotNull(source.getFishingOperation().getId()); - // Retrieve recorder department - // First initialization (when created) Integer fishingOperationId = source.getFishingOperation().getIdAsInt(); target.setFishingOperation(load(FishingOperationImpl.class, fishingOperationId)); + // Quality flag target.setQualityFlag(load(QualityFlagImpl.class, QualityFlagCode.NOTQUALIFIED.getValue())); + + // Rank order target.setRankOrder((short) 1); // Synchronization status synchronizationStatusHelper.setDirty(target); - // Create lists to store all updates, then remove not updated items - Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); - Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); - if (quantificationMeasurements != null) { - notChangedQuantificationMeasurements.addAll(quantificationMeasurements); - } - // Total Weight if (source.getCatchTotalWeight() != null) { - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( + measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( target, source.getCatchTotalWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); } - // Removed not changed measurements (in sorting and quantification measurement lists) - if (quantificationMeasurements != null) { - quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); - } - SortingBatch vracBatch = batchTreeHelper.getVracBatch(target); SortingBatch horsVracBatch = batchTreeHelper.getHorsVracBatch(target); @@ -486,4 +550,130 @@ } } + protected void computeIndirectWeight(Batch batch, + Map<Integer, SortingBatch> indirectWeightByBatch, + Set<Integer> indirectWeightByBatchSkip, + Set<Integer> quantificationMeasurements) { + + Integer batchId = batch.getId(); + + if (indirectWeightByBatch.containsKey(batchId) || + indirectWeightByBatchSkip.contains(batchId)) { + + // already computed + return; + + } + + Collection<Batch> childBatchs = batch.getChildBatchs(); + boolean batchIsLeaf = CollectionUtils.isEmpty(childBatchs); + + if (batchIsLeaf) { + + // on a leaf, nothing else to do + if (log.isDebugEnabled()) { + log.debug("[BATCH :: " + batchId + "] - Do not compute on a leaf "); + } + return; + + } + + QuantificationMeasurement measurement = measurementPersistenceHelper.getWeightMeasurementQuantificationMeasurement(batch); + if (measurement != null && + BooleanUtils.isTrue(measurement.getIsReferenceQuantification())) { + + // need to pass this to false + quantificationMeasurements.add(measurement.getId()); + + if (log.isDebugEnabled()) { + log.debug("[BATCH :: " + batchId + "] - Need to update the quantification measurement (not a leaf) :: " + measurement.getId()); + } + + } + + // compute indirect weights of childs before all + + for (Batch childBatch : childBatchs) { + + computeIndirectWeight(childBatch, indirectWeightByBatch, indirectWeightByBatchSkip, quantificationMeasurements); + + } + +// if (batch.getWeight() == null) { +// +// // no need to compute indirect weight, mark batch +// indirectWeightByBatchSkip.add(batchId); +// +// if (log.isDebugEnabled()) { +// log.debug("[BATCH :: " + batchId + "] - No need of indirect weight (no weight on it) "); +// } +// return; +// +// } + if (batch.getWeightBeforeSampling() != null) { + + // no need to compute indirect weight, mark batch + indirectWeightByBatchSkip.add(batchId); + + if (log.isDebugEnabled()) { + log.debug("[BATCH :: " + batchId + "] - No need of indirect weight (there is a weight before sampling) "); + } + return; + + } + + // At last, compute the indirect weight + Float indirectWeight = computeIndirectWeight(batch); + batch.setIndirectWeight(indirectWeight); + + if (batch.getWeight() != null) { + + // Can only update the sample ratio if there is a weight on the batch + indirectWeightByBatch.put(batchId, (SortingBatch) batch); + + } + + if (log.isDebugEnabled()) { + log.debug("[BATCH :: " + batchId + "] - " + "Computed indirect weight " + indirectWeight); + } + + } + + protected Float computeIndirectWeight(Batch batch) { + + if (log.isDebugEnabled()) { + log.debug("[BATCH :: " + batch.getId() + "] compute indirect weight"); + } + + BigDecimal result = new BigDecimal(0); + + for (Batch childBatch : batch.getChildBatchs()) { + + Float weight = TuttiEntities.getValueOrComputedValue(childBatch.getWeightBeforeSampling(), + childBatch.getWeight()); + + if (weight == null) { + + // at last use the indirectWeight + weight = childBatch.getIndirectWeight(); + + } + + if (weight == null) { + + if (log.isDebugEnabled()) { + log.debug("[BATCH :: " + batch.getId() + "] Found a child batch " + childBatch.getId() + " has no weight, skip computing indirect weight for batch :: ..."); + } + + return null; + + } + result = result.add(new BigDecimal(String.valueOf(weight))); + + } + + return TuttiEntities.roundKiloGram(result.floatValue()); + + } + } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/MarineLitterBatchPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/MarineLitterBatchPersistenceServiceImpl.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/MarineLitterBatchPersistenceServiceImpl.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -27,7 +27,6 @@ import fr.ifremer.adagio.core.dao.data.batch.Batch; import fr.ifremer.adagio.core.dao.data.batch.CatchBatch; import fr.ifremer.adagio.core.dao.data.batch.SortingBatch; -import fr.ifremer.adagio.core.dao.data.measure.QuantificationMeasurement; import fr.ifremer.adagio.core.dao.data.measure.SortingMeasurement; import fr.ifremer.adagio.core.dao.referential.QualityFlagCode; import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; @@ -206,20 +205,6 @@ Preconditions.checkNotNull(source.getFishingOperation()); Preconditions.checkNotNull(source.getFishingOperation().getId()); - Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); - Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); - - // Create lists to store all updates, then remove not updated items - - Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); - if (quantificationMeasurements != null) { - notChangedQuantificationMeasurements.addAll(quantificationMeasurements); - } - Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); - if (sortingMeasurements != null) { - notChangedSortingMeasurements.addAll(sortingMeasurements); - } - // If parent and root need to be set if (target.getId() == null || target.getRootBatch() == null) { batchHelper.setMarineLitterBatchParents(target, catchBatch); @@ -245,40 +230,44 @@ // Force subgroup count to '1', as Allegro target.setSubgroupCount(1f); - // Weight - if (source.getWeight() != null) { + // Sorting Measurements + { + Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } + Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); + if (sortingMeasurements != null) { + notChangedSortingMeasurements.addAll(sortingMeasurements); + } - // MarineLitterCategory - if (source.getMarineLitterCategory() != null) { + // MarineLitterCategory + if (source.getMarineLitterCategory() != null) { - SortingMeasurement measurement = measurementPersistenceHelper.setSortingMeasurement( - target, - marineLitterCategory, - source.getMarineLitterCategory().getIdAsInt() - ); - notChangedSortingMeasurements.remove(measurement); - } + SortingMeasurement measurement = measurementPersistenceHelper.setSortingMeasurement( + target, + marineLitterCategory, + source.getMarineLitterCategory().getIdAsInt() + ); + notChangedSortingMeasurements.remove(measurement); + } - // MarineLitterSizeCategory - if (source.getMarineLitterSizeCategory() != null) { + // MarineLitterSizeCategory + if (source.getMarineLitterSizeCategory() != null) { - SortingMeasurement measurement = measurementPersistenceHelper.setSortingMeasurement( - target, - marineLitterSizeCategory, - source.getMarineLitterSizeCategory().getIdAsInt() - ); - notChangedSortingMeasurements.remove(measurement); + SortingMeasurement measurement = measurementPersistenceHelper.setSortingMeasurement( + target, + marineLitterSizeCategory, + source.getMarineLitterSizeCategory().getIdAsInt() + ); + notChangedSortingMeasurements.remove(measurement); + } + + if (sortingMeasurements != null) { + sortingMeasurements.removeAll(notChangedSortingMeasurements); + } } - // Sampling Ratio - target.setSamplingRatio(1.0f); - target.setSamplingRatioText(null); + // Sampling Ratio + Weight + batchTreeHelper.setWeightAndSampleRatio(target, source.getWeight(), null); // Individual count target.setIndividualCount(source.getNumber()); @@ -293,12 +282,5 @@ // Exhaustive inventory (always true under a marine litter batch) target.setExhaustiveInventory(true); - // Removed not changed measurements (in sorting and quantification measurement lists) - if (quantificationMeasurements != null) { - quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); - } - if (sortingMeasurements != null) { - sortingMeasurements.removeAll(notChangedSortingMeasurements); - } } } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -3,10 +3,8 @@ /* * #%L * Tutti :: Persistence - * $Id$ - * $HeadURL$ * %% - * Copyright (C) 2012 - 2013 Ifremer + * Copyright (C) 2012 - 2014 Ifremer * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -28,18 +26,13 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.data.batch.Batch; import fr.ifremer.adagio.core.dao.data.batch.CatchBatch; import fr.ifremer.adagio.core.dao.data.batch.SortingBatch; -import fr.ifremer.adagio.core.dao.data.measure.QuantificationMeasurement; import fr.ifremer.adagio.core.dao.data.measure.SortingMeasurement; import fr.ifremer.adagio.core.dao.referential.QualityFlag; import fr.ifremer.adagio.core.dao.referential.QualityFlagCode; -import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; -import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId2; import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxon; -import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxonImpl; import fr.ifremer.tutti.persistence.InvalidBatchModelException; import fr.ifremer.tutti.persistence.entities.data.BatchContainer; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; @@ -59,10 +52,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -333,7 +324,7 @@ target = SortingBatch.Factory.newInstance(); // Fill the sorting batch from the source - beanToEntity(source, target, parentBatch, rankOrder); + batchHelper.beanToEntity(source, target, parentBatch, rankOrder); // Create the targeted batch, then update the source id batchHelper.createSortingBatch(source, catchBatch, target); @@ -350,7 +341,7 @@ target = batchHelper.loadSortingBatch(source.getIdAsInt(), catchBatch); // Fill the sorting batch from the source - beanToEntity(source, target, parentBatch, rankOrder); + batchHelper.beanToEntity(source, target, parentBatch, rankOrder); // Add the batch into a list (will be update later, using this list) batchsToUpdate.add(target); @@ -389,7 +380,8 @@ //-- Internal methods --// //------------------------------------------------------------------------// - protected SpeciesBatch entityToBean(SampleCategoryModel sampleCategoryModel, SortingBatch source, + protected SpeciesBatch entityToBean(SampleCategoryModel sampleCategoryModel, + SortingBatch source, SpeciesBatch target) { Preconditions.checkNotNull(target.getSpecies()); @@ -410,6 +402,15 @@ target.setSampleCategoryWeight(source.getWeightBeforeSampling()); } + if (CollectionUtils.isNotEmpty(source.getChildBatchs()) && target.getWeight() != null) { + + // can't use this sample weight on a node + // the weight comes from sampleRatioText, but must NOT be used here + target.setWeight(null); + + } + + // Comments target.setComment(source.getComments()); @@ -470,20 +471,6 @@ Preconditions.checkNotNull(source.getFishingOperation()); Preconditions.checkNotNull(source.getFishingOperation().getId()); - Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); - Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); - - // Create lists to store all updates, then remove not updated items - - Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); - if (quantificationMeasurements != null) { - notChangedQuantificationMeasurements.addAll(quantificationMeasurements); - } - Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); - if (sortingMeasurements != null) { - notChangedSortingMeasurements.addAll(sortingMeasurements); - } - // If parent and root need to be set if (target.getId() == null || target.getRootBatch() == null @@ -498,181 +485,77 @@ ); } - // RankOrder (initialize once, at creation) - if (target.getRankOrder() == null) { - // Start rank order at 1 - short rankOrder = (short) 1; - if (source.getParentBatch() != null && source.getParentBatch().getChildBatchs() != null) { - int maxRankOrder = 0; - for (SpeciesBatch batch : source.getParentBatch().getChildBatchs()) { - Integer r = batch.getRankOrder(); - if (r != null && r > maxRankOrder) { - maxRankOrder = r; - } - } - rankOrder += (short) maxRankOrder; + batchHelper.beanToEntity(parentBatchId, source, target); - } else if (target.getParentBatch() != null && target.getParentBatch().getChildBatchs() != null) { - short maxRankOrder = 0; - for (Batch batch : target.getParentBatch().getChildBatchs()) { - Short r = batch.getRankOrder(); - if (r != null && r > maxRankOrder) { - maxRankOrder = r; - } - } - rankOrder += maxRankOrder; - } - - target.setRankOrder(rankOrder); - } - - // Force subgroup count to '1', as Allegro - target.setSubgroupCount(1f); - - // Weight or SampleCategoryWeight - if (source.getSampleCategoryWeight() != null && source.getWeight() == null) { - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getSampleCategoryWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } else if (source.getWeight() != null && source.getSampleCategoryWeight() == null) { - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } - - // Sampling Ratio - if (source.getSampleCategoryWeight() == null || source.getWeight() == null) { - target.setSamplingRatio(null); - target.setSamplingRatioText(null); - } else { - String samplingRatioText = source.getWeight() + "/" + source.getSampleCategoryWeight(); - samplingRatioText = samplingRatioText.replaceAll(",", "."); - target.setSamplingRatioText(samplingRatioText); - target.setSamplingRatio(source.getWeight() / source.getSampleCategoryWeight()); - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } - - // Sorting measurement - if (source.getSampleCategoryId() != null && source.getSampleCategoryValue() != null) { - Integer pmfmId = source.getSampleCategoryId(); - // Do not store sorting measurement if pmfm = SORTED (already store in an ancestor batch) - if (!pmfmId.equals(PmfmId2.SORTED_UNSORTED.getValue())) { - SortingMeasurement sortingMeasurement = measurementPersistenceHelper.setSortingMeasurement( - target, - pmfmId, - source.getSampleCategoryValue()); - notChangedSortingMeasurements.remove(sortingMeasurement); - } - } - - // Individual count - target.setIndividualCount(source.getNumber()); - - // Species - ReferenceTaxon referenceTaxon; - if (source.getSpecies() == null || parentBatchId != null) { - referenceTaxon = null; - } else { - referenceTaxon = load(ReferenceTaxonImpl.class, source.getSpecies().getReferenceTaxonId()); - } - target.setReferenceTaxon(referenceTaxon); - - // QualityFlag - String qualityFlag; - if (source.isSpeciesToConfirm()) { - qualityFlag = QualityFlagCode.DOUBTFUL.getValue(); - } else { - qualityFlag = QualityFlagCode.NOTQUALIFIED.getValue(); - } - target.setQualityFlag(load(QualityFlagImpl.class, qualityFlag)); - - // Comments - target.setComments(source.getComment()); - - // Exhaustive inventory (always true under a species batch) - target.setExhaustiveInventory(true); - - // Removed not changed measurements (in sorting and quantification measurement lists) - if (quantificationMeasurements != null) { - quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); - } - if (sortingMeasurements != null) { - sortingMeasurements.removeAll(notChangedSortingMeasurements); - } } - protected void beanToEntity(SpeciesBatchFrequency source, - SortingBatch target, - SortingBatch parentBatch, - short rankOrder) { - Preconditions.checkNotNull(source.getBatch()); - Preconditions.checkNotNull(source.getBatch().getId()); +// protected void beanToEntity(SpeciesBatchFrequency source, +// SortingBatch target, +// SortingBatch parentBatch, +// short rankOrder) { +// Preconditions.checkNotNull(source.getBatch()); +// Preconditions.checkNotNull(source.getBatch().getId()); +// +// Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); +// Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); +// +// // Create lists to store all updates, then remove not updated items +// Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); +// if (quantificationMeasurements != null) { +// notChangedQuantificationMeasurements.addAll(quantificationMeasurements); +// } +// Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); +// if (sortingMeasurements != null) { +// notChangedSortingMeasurements.addAll(sortingMeasurements); +// } +// +// // If parent and root need to be set +// if (target.getId() == null +// || target.getRootBatch() == null +// || (target.getParentBatch() != null && !target.getParentBatch().getId().equals(parentBatch.getId()))) { +// +// target.setParentBatch(parentBatch); +// target.setRootBatch(parentBatch.getRootBatch()); +// } +// +// // RankOrder +// target.setRankOrder(rankOrder); +// +// // Weight or SampleCategoryWeight +// if (source.getWeight() != null) { +// QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( +// target, +// source.getWeight()); +// notChangedQuantificationMeasurements.remove(quantificationMeasurement); +// } +// +// // Sorting measurement +// if ((source.getLengthStepCaracteristic() != null && source.getLengthStep() != null)) { +// Integer pmfmId = source.getLengthStepCaracteristic().getIdAsInt(); +// SortingMeasurement sortingMeasurement = measurementPersistenceHelper.setSortingMeasurement(target, pmfmId, +// source.getLengthStep()); +// notChangedSortingMeasurements.remove(sortingMeasurement); +// } +// +// // Individual count +// target.setIndividualCount(source.getNumber()); +// +// // Species +// target.setReferenceTaxon(null); +// +// // QualityFlag +// target.setQualityFlag(parentBatch.getQualityFlag()); +// +// // Exhaustive inventory (always true under a species batch) +// target.setExhaustiveInventory(true); +// +// // Removed not changed measurements (in sorting and quantification measurement lists) +// if (quantificationMeasurements != null) { +// quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); +// } +// if (sortingMeasurements != null) { +// sortingMeasurements.removeAll(notChangedSortingMeasurements); +// } +// } - Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); - Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); - - // Create lists to store all updates, then remove not updated items - Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); - if (quantificationMeasurements != null) { - notChangedQuantificationMeasurements.addAll(quantificationMeasurements); - } - Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); - if (sortingMeasurements != null) { - notChangedSortingMeasurements.addAll(sortingMeasurements); - } - - // If parent and root need to be set - if (target.getId() == null - || target.getRootBatch() == null - || (target.getParentBatch() != null && !target.getParentBatch().getId().equals(parentBatch.getId()))) { - - target.setParentBatch(parentBatch); - target.setRootBatch(parentBatch.getRootBatch()); - } - - // RankOrder - target.setRankOrder(rankOrder); - - // Weight or SampleCategoryWeight - if (source.getWeight() != null) { - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - target, - source.getWeight()); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } - - // Sorting measurement - if ((source.getLengthStepCaracteristic() != null && source.getLengthStep() != null)) { - Integer pmfmId = source.getLengthStepCaracteristic().getIdAsInt(); - SortingMeasurement sortingMeasurement = measurementPersistenceHelper.setSortingMeasurement(target, pmfmId, - source.getLengthStep()); - notChangedSortingMeasurements.remove(sortingMeasurement); - } - - // Individual count - target.setIndividualCount(source.getNumber()); - - // Species - target.setReferenceTaxon(null); - - // QualityFlag - target.setQualityFlag(parentBatch.getQualityFlag()); - - // Exhaustive inventory (always true under a species batch) - target.setExhaustiveInventory(true); - - // Removed not changed measurements (in sorting and quantification measurement lists) - if (quantificationMeasurements != null) { - quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); - } - if (sortingMeasurements != null) { - sortingMeasurements.removeAll(notChangedSortingMeasurements); - } - } - } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/BatchPersistenceHelper.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/BatchPersistenceHelper.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/BatchPersistenceHelper.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -3,10 +3,8 @@ /* * #%L * Tutti :: Persistence - * $Id$ - * $HeadURL$ * %% - * Copyright (C) 2012 - 2013 Ifremer + * Copyright (C) 2012 - 2014 Ifremer * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -27,7 +25,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; -import fr.ifremer.adagio.core.dao.administration.user.DepartmentId; +import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.data.batch.Batch; import fr.ifremer.adagio.core.dao.data.batch.CatchBatch; import fr.ifremer.adagio.core.dao.data.batch.CatchBatchExtendDao; @@ -38,10 +36,14 @@ import fr.ifremer.adagio.core.dao.data.measure.SortingMeasurement; import fr.ifremer.adagio.core.dao.data.operation.FishingOperation; import fr.ifremer.adagio.core.dao.data.operation.FishingOperationDao; +import fr.ifremer.adagio.core.dao.referential.QualityFlagCode; +import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; import fr.ifremer.adagio.core.dao.referential.pmfm.ObjectTypeCode2; import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm; import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId2; import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxon; +import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxonImpl; import fr.ifremer.tutti.persistence.InvalidBatchModelException; import fr.ifremer.tutti.persistence.entities.TuttiEntity; import fr.ifremer.tutti.persistence.entities.data.BatchContainer; @@ -71,6 +73,7 @@ import java.text.MessageFormat; import java.util.Collection; import java.util.List; +import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -108,6 +111,9 @@ @Resource(name = "scientificCruiseCatchBatchValidator") protected TuttiCatchBatchValidator catchBatchValidator; + @Resource(name = "measurementPersistenceHelper") + protected MeasurementPersistenceHelper measurementPersistenceHelper; + @Resource(name = "batchTreeHelper") protected BatchTreeHelper batchTreeHelper; @@ -276,13 +282,13 @@ if (validate) { try { - result = catchBatchDao.loadFullTree(catchBatchId, true, false); + result = catchBatchDao.loadFullTree(catchBatchId, PmfmId2.WEIGHT_MEASURED.getValue(), true, false); } catch (CatchBatchValidationException e) { throw new InvalidBatchModelException( "L'arbre d'échantillonage n'est pas compatible avec celui de Tutti.", e); } } else { - result = catchBatchDao.loadFullTree(catchBatchId); + result = catchBatchDao.loadFullTree(catchBatchId, PmfmId2.WEIGHT_MEASURED.getValue()); } Preconditions.checkNotNull(result); return result; @@ -305,7 +311,7 @@ // whenever want to repair anything from Tutti fr.ifremer.adagio.core.dao.data.batch.CatchBatch result; - result = catchBatchDao.loadFullTree(catchBatchId); + result = catchBatchDao.loadFullTree(catchBatchId, PmfmId2.WEIGHT_MEASURED.getValue()); Preconditions.checkNotNull(result); return result; @@ -488,6 +494,201 @@ target.setRootBatch(catchBatch); } + public void beanToEntity(String parentBatchId, + SpeciesAbleBatch source, + SortingBatch target) { + + // --- RankOrder (initialize once, at creation) --- // + { + if (target.getRankOrder() == null) { + // Start rank order at 1 + short rankOrder = (short) 1; + if (source.getParentBatch() != null && source.getParentBatch().getChildBatchs() != null) { + int maxRankOrder = 0; + for (SpeciesAbleBatch batch : source.getParentBatch().getChildBatchs()) { + Integer r = batch.getRankOrder(); + if (r != null && r > maxRankOrder) { + maxRankOrder = r; + } + } + rankOrder += (short) maxRankOrder; + + } else if (target.getParentBatch() != null && target.getParentBatch().getChildBatchs() != null) { + short maxRankOrder = 0; + for (Batch batch : target.getParentBatch().getChildBatchs()) { + Short r = batch.getRankOrder(); + if (r != null && r > maxRankOrder) { + maxRankOrder = r; + } + } + rankOrder += maxRankOrder; + } + + target.setRankOrder(rankOrder); + } + } + + // --- Force subgroup count to '1', as Allegro --- // + target.setSubgroupCount(1f); + + // --- Individual count --- // + target.setIndividualCount(source.getNumber()); + + // --- Comments --- // + target.setComments(source.getComment()); + + // --- Exhaustive inventory (always true under a species batch) --- // + target.setExhaustiveInventory(true); + + // --- Species --- // + { + ReferenceTaxon referenceTaxon; + if (source.getSpecies() == null || parentBatchId != null) { + referenceTaxon = null; + } else { + referenceTaxon = load(ReferenceTaxonImpl.class, source.getSpecies().getReferenceTaxonId()); + } + target.setReferenceTaxon(referenceTaxon); + } + + // --- QualityFlag --- // + { + String qualityFlag; + if (source.isSpeciesToConfirm()) { + qualityFlag = QualityFlagCode.DOUBTFUL.getValue(); + } else { + qualityFlag = QualityFlagCode.NOTQUALIFIED.getValue(); + } + target.setQualityFlag(load(QualityFlagImpl.class, qualityFlag)); + } + + Float weight = source.getWeight(); + Float sampleCategoryWeight = source.getSampleCategoryWeight(); + + // --- Sampling Ratio + QuantificationMeasurement --- // + batchTreeHelper.setWeightAndSampleRatio(target, weight, sampleCategoryWeight); + +// // --- QuantificationMeasurement --- // +// { +// Float weightMeasurement = sampleCategoryWeight; +// +// if (weight != null) { +// +// // on converse toujours les poids le plus fin +// weightMeasurement = weight; +// } +// +//// Float weightMeasurement = null; +//// if (weight == null && sampleCategoryWeight != null) { +//// weightMeasurement = sampleCategoryWeight; +//// +//// } else if (weight != null && sampleCategoryWeight == null) { +//// weightMeasurement = weight; +//// } +//// +//// if (sampleCategoryWeight != null && weight != null) { +//// weightMeasurement = weight; +//// } +// +// Collection<QuantificationMeasurement> quantificationMeasurements = target.getQuantificationMeasurements(); +// Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); +// if (quantificationMeasurements != null) { +// notChangedQuantificationMeasurements.addAll(quantificationMeasurements); +// } +// +// if (weightMeasurement != null) { +// QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( +// target, +// weightMeasurement); +// notChangedQuantificationMeasurements.remove(quantificationMeasurement); +// } +// +// if (quantificationMeasurements != null) { +// quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); +// } +// } + + // --- Sorting measurement --- // + { + Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); + Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); + if (sortingMeasurements != null) { + notChangedSortingMeasurements.addAll(sortingMeasurements); + } + + if (source.getSampleCategoryId() != null && source.getSampleCategoryValue() != null) { + Integer pmfmId = source.getSampleCategoryId(); + // Do not store sorting measurement if pmfm = SORTED (already store in an ancestor batch) + if (!pmfmId.equals(PmfmId2.SORTED_UNSORTED.getValue())) { + SortingMeasurement sortingMeasurement = measurementPersistenceHelper.setSortingMeasurement( + target, + pmfmId, + source.getSampleCategoryValue()); + notChangedSortingMeasurements.remove(sortingMeasurement); + } + } + if (sortingMeasurements != null) { + sortingMeasurements.removeAll(notChangedSortingMeasurements); + } + } + + } + + + public void beanToEntity(SpeciesAbleBatchFrequency source, + SortingBatch target, + SortingBatch parentBatch, + short rankOrder) { + Preconditions.checkNotNull(source.getBatch()); + Preconditions.checkNotNull(source.getBatch().getId()); + + // If parent and root need to be set + if (target.getId() == null + || target.getRootBatch() == null + || (target.getParentBatch() != null && !target.getParentBatch().getId().equals(parentBatch.getId()))) { + + target.setParentBatch(parentBatch); + target.setRootBatch(parentBatch.getRootBatch()); + } + + // --- RankOrder --- // + target.setRankOrder(rankOrder); + + // --- Individual count --- // + target.setIndividualCount(source.getNumber()); + + // --- Species --- // + target.setReferenceTaxon(null); + + // --- QualityFlag --- // + target.setQualityFlag(parentBatch.getQualityFlag()); + + // --- Exhaustive inventory (always true under a species batch) --- // + target.setExhaustiveInventory(true); + + // --- Sampling Ratio + QuantificationMeasurement --- // + batchTreeHelper.setWeightAndSampleRatio(target, source.getWeight(), null); + + // --- Sorting measurement --- // + { + Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements(); + Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); + if (sortingMeasurements != null) { + notChangedSortingMeasurements.addAll(sortingMeasurements); + } + if ((source.getLengthStepCaracteristic() != null && source.getLengthStep() != null)) { + Integer pmfmId = source.getLengthStepCaracteristic().getIdAsInt(); + SortingMeasurement sortingMeasurement = measurementPersistenceHelper.setSortingMeasurement(target, pmfmId, + source.getLengthStep()); + notChangedSortingMeasurements.remove(sortingMeasurement); + } + if (sortingMeasurements != null) { + sortingMeasurements.removeAll(notChangedSortingMeasurements); + } + } + + } + public Integer convertSampleCategoryValueIntoQualitativeId(Serializable value) { if (value == null) { return null; @@ -632,11 +833,6 @@ //-- Internal methods --// //------------------------------------------------------------------------// - protected Integer getRecorderDepartmentId() { - // TODO BL : voir si on peut récupérer le departement (du 1er saisisseur ?) - return DepartmentId.UNKOWN_RECODER_DEPARTMENT.getValue(); - } - /** * Check if the given {@code sortingBatch} is a frequency one. * <p/> @@ -665,124 +861,4 @@ return result; } -// protected SortingBatch getOrCreate(fr.ifremer.adagio.core.dao.data.batch.CatchBatch target, -// Batch batch, -// Integer pmfmId, -// Integer pmfmValue, -// Float totalWeight, -// short rankOrder) { -// return getOrCreate( -// target, -// batch, -// pmfmId, -// pmfmValue, -// totalWeight, -// null, -// rankOrder -// ); -// } - -// protected SortingBatch getOrCreate(fr.ifremer.adagio.core.dao.data.batch.CatchBatch rootBatch, -// Batch parentBatch, -// Integer sortingPmfmId, -// Integer sortingQualitativeValueId, -// Float weight, -// Float weightBeforeSampling, -// short rankOrder) { -// SortingBatch result = batchTreeHelper.get( -// parentBatch, -// sortingPmfmId, -// sortingQualitativeValueId); -// -// if (result == null) { -// -// result = SortingBatch.Factory.newInstance(); -// if (parentBatch.getChildBatchs() == null) { -// parentBatch.setChildBatchs(Sets.<Batch>newHashSet()); -// } -// parentBatch.getChildBatchs().add(result); -// -// Collection<SortingMeasurement> sortingMeasurements = result.getSortingMeasurements(); -// -// // Create lists to store all updates, then remove not updated items -// Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); -// if (sortingMeasurements != null) { -// notChangedSortingMeasurements.addAll(sortingMeasurements); -// } -// -// // Some mandatory properties : -// QualityFlagImpl qualityFlag = load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED); -// result.setQualityFlag(qualityFlag); -// result.setRootBatch(rootBatch); -// result.setParentBatch(parentBatch); -// result.setExhaustiveInventory(true); -// -// // No taxon or taxon group -// result.setReferenceTaxon(null); -// result.setTaxonGroup(null); -// -// result.setRankOrder(rankOrder); -// -// // Sorting measurement -// if (sortingPmfmId != null && sortingQualitativeValueId != null) { -// SortingMeasurement sm = setSortingMeasurement( -// result, -// sortingPmfmId, -// sortingQualitativeValueId); -// notChangedSortingMeasurements.remove(sm); -// } -// // Removed not changed sorting measurements -// if (sortingMeasurements != null) { -// sortingMeasurements.removeAll(notChangedSortingMeasurements); -// } -// -// catchBatchDao.createSortingBatch(result, rootBatch); -// } -// -// Collection<QuantificationMeasurement> quantificationMeasurements = result.getQuantificationMeasurements(); -// Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); -// if (quantificationMeasurements != null) { -// notChangedQuantificationMeasurements.addAll(quantificationMeasurements); -// } -// -// // Sampling Ratio -// if (weightBeforeSampling == null || weight == null) { -// result.setSamplingRatio(null); -// result.setSamplingRatioText(null); -// } else { -// String samplingRatioText = weight + "/" + weightBeforeSampling; -// samplingRatioText = samplingRatioText.replaceAll(",", "."); -// result.setSamplingRatioText(samplingRatioText); -// result.setSamplingRatio(weight / weightBeforeSampling); -// } -// -// // Weight -// if (weightBeforeSampling != null || weight != null) { -// Float batchReferenceWeight = weight; -// if (batchReferenceWeight == null) { -// batchReferenceWeight = weightBeforeSampling; -// } -// QuantificationMeasurement quantificationMeasurement = setWeightMeasurementQuantificationMeasurement( -// result, -// batchReferenceWeight); -// notChangedQuantificationMeasurements.remove(quantificationMeasurement); -// } -// // Removed not changed quantification measurements -// if (quantificationMeasurements != null) { -// quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); -// } -// -// return result; -// } - -// protected SortingBatch get(Batch parentBatch, -// Integer sortingPmfmId, -// Integer sortingQualitativeValueId) { -// SortingBatch result = getSortingBatch( -// parentBatch, -// null, -// sortingPmfmId, -// sortingQualitativeValueId); -// return result; -// } } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/BatchTreeHelper.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/BatchTreeHelper.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/BatchTreeHelper.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -1,5 +1,27 @@ package fr.ifremer.tutti.persistence.service.util; +/* + * #%L + * Tutti :: Persistence + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + import com.google.common.base.Joiner; import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.data.batch.Batch; @@ -310,7 +332,6 @@ "Vrac > Benthos > Alive Itemized", SORTING_TYPE2_ID, QualitativeValueId.SORTING_TYPE2_ALIVE_ITEMIZED.getValue(), - null, (short) 3 ); } @@ -365,7 +386,6 @@ "Vrac > Benthos > Alive Itemized", SORTING_TYPE2_ID, QualitativeValueId.SORTING_TYPE2_ALIVE_ITEMIZED.getValue(), - null, (short) 3 ); } @@ -377,7 +397,6 @@ "Hors Vrac", PmfmId2.SORTED_UNSORTED.getValue(), QualitativeValueId.SORTED_HORS_VRAC.getValue(), - null, (short) 2 ); } @@ -390,7 +409,6 @@ "Hors Vrac > Species", SORTING_TYPE_ID, QualitativeValueId.SORTING_TYPE_SPECIES.getValue(), - null, (short) 1 ); } @@ -403,7 +421,6 @@ "Hors Vrac > Benthos", SORTING_TYPE_ID, QualitativeValueId.SORTING_TYPE_BENTHOS.getValue(), - null, (short) 2 ); } @@ -436,6 +453,24 @@ ); } + public void setWeightAndSampleRatio(SortingBatch target, Float weight, Float weightBeforeSampling) { + + catchBatchDao.setSortingBatchWeights(target, + weight, + weightBeforeSampling, + PmfmId2.WEIGHT_MEASURED.getValue(), + measurementPersistenceHelper.getRecorderDepartmentId()); + + } + + public void setSortingSamplingRatio(SortingBatch target, Float weight, Float weightBeforeSampling) { + + catchBatchDao.setSortingSamplingRatio(target, + weight, + weightBeforeSampling); + + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -484,6 +519,24 @@ String debugMessage, Integer sortingPmfmId, Integer sortingQualitativeValueId, + short rankOrder) { + return getOrCreate( + rootBatch, + batch, + debugMessage, + sortingPmfmId, + sortingQualitativeValueId, + null, + null, + rankOrder + ); + } + + protected SortingBatch getOrCreate(fr.ifremer.adagio.core.dao.data.batch.CatchBatch rootBatch, + Batch batch, + String debugMessage, + Integer sortingPmfmId, + Integer sortingQualitativeValueId, Float totalWeight, short rankOrder) { return getOrCreate( @@ -506,6 +559,7 @@ Float weight, Float weightBeforeSampling, short rankOrder) { + SortingBatch result = getSortingBatch( batch, debugMessage, @@ -520,28 +574,27 @@ } batch.getChildBatchs().add(result); - Collection<SortingMeasurement> sortingMeasurements = result.getSortingMeasurements(); + // --- Some mandatory properties --- // - // Create lists to store all updates, then remove not updated items - Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); - if (sortingMeasurements != null) { - notChangedSortingMeasurements.addAll(sortingMeasurements); - } - - // Some mandatory properties : QualityFlagImpl qualityFlag = load(QualityFlagImpl.class, QualityFlagCode.NOTQUALIFIED.getValue()); result.setQualityFlag(qualityFlag); result.setRootBatch(rootBatch); result.setParentBatch(batch); result.setExhaustiveInventory(true); + result.setRankOrder(rankOrder); // No taxon or taxon group result.setReferenceTaxon(null); result.setTaxonGroup(null); - result.setRankOrder(rankOrder); + // --- Sorting measurement --- // - // Sorting measurement + Collection<SortingMeasurement> sortingMeasurements = result.getSortingMeasurements(); + Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); + if (sortingMeasurements != null) { + notChangedSortingMeasurements.addAll(sortingMeasurements); + } + if (sortingPmfmId != null && sortingQualitativeValueId != null) { SortingMeasurement sm = measurementPersistenceHelper.setSortingMeasurement( result, @@ -549,7 +602,6 @@ sortingQualitativeValueId); notChangedSortingMeasurements.remove(sm); } - // Removed not changed sorting measurements if (sortingMeasurements != null) { sortingMeasurements.removeAll(notChangedSortingMeasurements); } @@ -557,38 +609,43 @@ catchBatchDao.createSortingBatch(result, rootBatch); } - Collection<QuantificationMeasurement> quantificationMeasurements = result.getQuantificationMeasurements(); - Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); - if (quantificationMeasurements != null) { - notChangedQuantificationMeasurements.addAll(quantificationMeasurements); - } + // --- Sampling Ratio + QuantificationMeasurement --- // - // Sampling Ratio - if (weightBeforeSampling == null || weight == null) { - result.setSamplingRatio(null); - result.setSamplingRatioText(null); - } else { - String samplingRatioText = weight + "/" + weightBeforeSampling; - samplingRatioText = samplingRatioText.replaceAll(",", "."); - result.setSamplingRatioText(samplingRatioText); - result.setSamplingRatio(weight / weightBeforeSampling); - } + setWeightAndSampleRatio(result, weight, weightBeforeSampling); - // Weight - if (weightBeforeSampling != null || weight != null) { - Float batchReferenceWeight = weight; - if (batchReferenceWeight == null) { - batchReferenceWeight = weightBeforeSampling; - } - QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( - result, - batchReferenceWeight); - notChangedQuantificationMeasurements.remove(quantificationMeasurement); - } - // Removed not changed quantification measurements - if (quantificationMeasurements != null) { - quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); - } +// // --- QuantificationMeasurement --- // +// +// Collection<QuantificationMeasurement> quantificationMeasurements = result.getQuantificationMeasurements(); +// Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); +// if (quantificationMeasurements != null) { +// notChangedQuantificationMeasurements.addAll(quantificationMeasurements); +// } +// +// Float batchReferenceWeight = weightBeforeSampling; +// if (weight != null) { +// batchReferenceWeight = weight; +// } +// +// if (batchReferenceWeight != null) { +// QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( +// result, +// batchReferenceWeight); +// notChangedQuantificationMeasurements.remove(quantificationMeasurement); +// } +// +//// if (weightBeforeSampling != null || weight != null) { +//// Float batchReferenceWeight = weight; +//// if (batchReferenceWeight == null) { +//// batchReferenceWeight = weightBeforeSampling; +//// } +//// QuantificationMeasurement quantificationMeasurement = measurementPersistenceHelper.setWeightMeasurementQuantificationMeasurement( +//// result, +//// batchReferenceWeight); +//// notChangedQuantificationMeasurements.remove(quantificationMeasurement); +//// } +// if (quantificationMeasurements != null) { +// quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); +// } return result; } @@ -675,7 +732,11 @@ } } + public CatchBatch loadCatchBatch(Integer catchBatchId) { + return catchBatchDao.loadFullTreeWithCache(catchBatchId, PmfmId2.WEIGHT_MEASURED.getValue(), true, true); + } + static final class BatchTreeToStringStyle extends ToStringStyle { private static final long serialVersionUID = 1L; Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/MeasurementPersistenceHelper.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/MeasurementPersistenceHelper.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/MeasurementPersistenceHelper.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -53,6 +53,8 @@ import javax.annotation.Resource; import java.io.Serializable; +import java.util.Collection; +import java.util.Set; /** * Helper around {@link Measurement}. @@ -117,11 +119,25 @@ } public QuantificationMeasurement setWeightMeasurementQuantificationMeasurement(Batch batch, Float weightValue) { - return catchBatchDao.setQuantificationMeasurement(batch, PmfmId2.WEIGHT_MEASURED.getValue(), getRecorderDepartmentId(), weightValue, true); + + Collection<QuantificationMeasurement> quantificationMeasurements = batch.getQuantificationMeasurements(); + Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); + if (quantificationMeasurements != null) { + notChangedQuantificationMeasurements.addAll(quantificationMeasurements); + } + + QuantificationMeasurement quantificationMeasurement = catchBatchDao.setQuantificationMeasurement(batch, PmfmId2.WEIGHT_MEASURED.getValue(), getRecorderDepartmentId(), weightValue, true); + + // Removed not changed measurements (in sorting and quantification measurement lists) + if (quantificationMeasurements != null) { + quantificationMeasurements.removeAll(notChangedQuantificationMeasurements); + } + + return quantificationMeasurement; } public QuantificationMeasurement getWeightMeasurementQuantificationMeasurement(Batch batch) { - QuantificationMeasurement quantificationMeasurement = catchBatchDao.getQuantificationMeasurement(batch, PmfmId2.WEIGHT_MEASURED.getValue(), getRecorderDepartmentId(), false); + QuantificationMeasurement quantificationMeasurement = catchBatchDao.getQuantificationMeasurement(batch, PmfmId2.WEIGHT_MEASURED.getValue()); return quantificationMeasurement; } @@ -283,7 +299,7 @@ } else if (measurement.getAlphanumericalValue() != null) { value = measurement.getAlphanumericalValue(); } - return pmfm.getParameter().getName() + " (" + pmfm.getId() + ") / " + value; + return "[id:" + measurement.getId() + "] - " + pmfm.getParameter().getName() + " (" + pmfm.getId() + ") / " + value; } //------------------------------------------------------------------------// @@ -368,7 +384,7 @@ return result; } - protected Integer getRecorderDepartmentId() { + public Integer getRecorderDepartmentId() { // TODO BL : voir si on peut récupérer le departement (du 1er saisisseur ?) return DepartmentId.UNKOWN_RECODER_DEPARTMENT.getValue(); } Modified: trunk/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml =================================================================== --- trunk/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml 2014-05-28 15:35:16 UTC (rev 1818) @@ -432,6 +432,16 @@ <query-param name="catchBatchId" type="java.lang.Integer"/> </query> + <query cacheable="true" name="updateQuantificationMeasurementsForBatchNodes"> + <![CDATA[ + UPDATE QuantificationMeasurementImpl qm + SET isReferenceQuantification = false + WHERE qm.id IN (:ids) + ]]> + <query-param name="ids" type="java.lang.List"/> + </query> + + <query cacheable="true" name="allFishingOperationSamplesWithoutBatch"> <![CDATA[ SELECT @@ -484,7 +494,7 @@ <query-param name="sampleId" type="java.lang.Integer"/> </query> - <query cacheable="true" name="catchBatch"> + <!--query cacheable="true" name="catchBatch"> <![CDATA[ SELECT cb.id AS catchBatchId, @@ -513,7 +523,7 @@ <query-param name="fishingOperationId" type="java.lang.Integer"/> <query-param name="pmfmIdSorted" type="java.lang.Integer"/> <query-param name="pmfmIdSortingType" type="java.lang.Integer"/> - </query> + </query--> <query cacheable="true" name="allSpeciesBatchFrequency"> <![CDATA[ Modified: trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo =================================================================== (Binary files differ) Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -1202,6 +1202,11 @@ driver.deleteCatchBatch(fishingOperationId); } + @Override + public void recomputeCatchBatchSampleRatios(String fishingOperationId) { + driver.recomputeCatchBatchSampleRatios(fishingOperationId); + } + //------------------------------------------------------------------------// //-- Species Batch methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-ui-swing/src/license/THIRD-PARTY.properties =================================================================== --- trunk/tutti-ui-swing/src/license/THIRD-PARTY.properties 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-ui-swing/src/license/THIRD-PARTY.properties 2014-05-28 15:35:16 UTC (rev 1818) @@ -39,7 +39,7 @@ # Please fill the missing licenses for dependencies : # # -#Thu Apr 24 15:55:59 CEST 2014 +#Tue May 27 17:05:30 CEST 2014 batik--batik-awt-util--1.6=The Apache Software License, Version 2.0 batik--batik-bridge--1.6=The Apache Software License, Version 2.0 batik--batik-css--1.6=The Apache Software License, Version 2.0 @@ -55,3 +55,4 @@ batik--batik-xml--1.6=The Apache Software License, Version 2.0 commons-primitives--commons-primitives--1.0=The Apache Software License, Version 2.0 dom4j--dom4j--1.6.1=BSD License +org.hibernate--hibernate-spatial--4.3-20140213=Lesser General Public License (LGPL) Modified: trunk/tutti-ui-swing/src/main/filtered-resources/log4j.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/log4j.properties 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-ui-swing/src/main/filtered-resources/log4j.properties 2014-05-28 15:35:16 UTC (rev 1818) @@ -36,6 +36,7 @@ #See https://forum.hibernate.org/viewtopic.php?p=2404391 log4j.logger.org.hibernate.engine.StatefulPersistenceContext.ProxyWarnLog=ERROR log4j.logger.fr.ifremer.adagio.core.service.technical.synchro=DEBUG +log4j.logger.fr.ifremer.tutti.persistence.service.CatchBatchPersistenceServiceImpl=DEBUG log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.file=${tutti.log.file} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ComputeBatchWeightsAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ComputeBatchWeightsAction.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ComputeBatchWeightsAction.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -243,6 +243,8 @@ } } +// persistenceService.recomputeCatchBatchSampleRatios(operationId); + boolean modified = model.isModify(); CatchBatch catchBatch = model.toEntity(); weightComputingService.computeCatchBatchWeights(catchBatch, Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveCruiseToReadyToSynchAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveCruiseToReadyToSynchAction.java 2014-05-23 07:57:44 UTC (rev 1817) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveCruiseToReadyToSynchAction.java 2014-05-28 15:35:16 UTC (rev 1818) @@ -23,6 +23,7 @@ */ import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.content.cruise.ValidateCruiseUI; import fr.ifremer.tutti.ui.swing.content.cruise.ValidateCruiseUIHandler; @@ -31,6 +32,7 @@ import org.apache.commons.logging.LogFactory; import javax.swing.JOptionPane; +import java.util.List; import static org.nuiton.i18n.I18n.t; @@ -60,6 +62,11 @@ JOptionPane.YES_NO_OPTION); doAction = answer == JOptionPane.YES_OPTION; } + + PersistenceService persistenceService = getContext().getPersistenceService(); + int fishingOperationCount = persistenceService.getFishingOperationCount(getModel().getCruise().getId()); + createProgressionModelIfRequired(fishingOperationCount + 1); + return doAction; } @@ -70,12 +77,31 @@ Preconditions.checkState(getContext().isCruiseFilled()); PersistenceService persistenceService = getContext().getPersistenceService(); + + ProgressionModel progressionModel = getProgressionModel(); + + List<String> allFishingOperation = persistenceService.getAllFishingOperationIds(getModel().getCruise().getId()); + + for (String fishingOperationId : allFishingOperation) { + + if (log.isInfoEnabled()) { + log.info("Recompute sample ratios for operation " + fishingOperationId); + } + persistenceService.recomputeCatchBatchSampleRatios(fishingOperationId); + + progressionModel.increments("Recalcul des poids référents pour l'opération " + fishingOperationId); + } + Integer cruiseId = getModel().getCruise().getIdAsInt(); if (log.isInfoEnabled()) { log.info("Pass synchronizationStatus to *ready to synch* for cruise: " + cruiseId); } + + progressionModel.increments("Mise en place des données synchronisables"); + persistenceService.setCruiseReadyToSynch(cruiseId); + } @Override @@ -84,7 +110,7 @@ // reload cruise in data context getDataContext().reloadCruise(); - + // reload it in our model getModel().setCruise(getDataContext().getCruise()); }