This is an automated email from the git hooks/post-receive script. New commit to branch feature/8256 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit abb60a40e675965c84686ccbb512bd9d1328e61b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Apr 17 07:36:09 2016 +0200 Utilisation des caches de campagnes --- .../ifremer/tutti/service/PersistenceService.java | 129 +++++++------ .../cps/CalcifiedPiecesSamplingExportService.java | 39 ++-- .../content/actions/EditCatchesSupportAction.java | 24 +-- .../content/cruise/actions/SaveCruiseAction.java | 7 +- .../CalcifiedPiecesSamplingReportAction.java | 30 +-- .../SamplingCodeCellEditor.java | 20 +- .../IndividualObservationBatchTableHandler.java | 38 +++- .../frequency/IndividualObservationUICache.java | 205 ++++++++++++--------- .../protocol/actions/SaveProtocolAction.java | 6 +- 9 files changed, 292 insertions(+), 206 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java index 7abb271..d72bfa5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java @@ -49,10 +49,7 @@ 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.MaturityCaracteristic; -import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; -import fr.ifremer.tutti.persistence.entities.protocol.Zone; import fr.ifremer.tutti.persistence.entities.protocol.Zones; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -69,8 +66,9 @@ import fr.ifremer.tutti.persistence.entities.referential.Vessels; import fr.ifremer.tutti.persistence.model.ProgramDataModel; import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator; import fr.ifremer.tutti.persistence.service.UpdateSchemaContextSupport; +import fr.ifremer.tutti.service.sampling.CruiseCache; +import fr.ifremer.tutti.service.sampling.CruiseCacheLoader; import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; -import fr.ifremer.tutti.service.sampling.CruiseSamplingCacheLoader; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; @@ -568,27 +566,27 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer return result; } - /** - * Return the speciesProtocol corresponding to the species of the given protocol. - * - * @param species the species to filter - * @return the speciesProtocol corresponding to the species of the given protocol. - * @since 2.6 - */ - public SpeciesProtocol getSpeciesProtocol(Species species) { - return TuttiProtocols.getSpeciesProtocol(species, getProtocol().getSpecies()); - } - - /** - * Return the benthosProtocol corresponding to the species of the given protocol. - * - * @param species the species to filter - * @return the benthosProtocol corresponding to the species of the given protocol. - * @since 2.6 - */ - public SpeciesProtocol getBenthosProtocol(Species species) { - return TuttiProtocols.getSpeciesProtocol(species, getProtocol().getBenthos()); - } +// /** +// * Return the speciesProtocol corresponding to the species of the given protocol. +// * +// * @param species the species to filter +// * @return the speciesProtocol corresponding to the species of the given protocol. +// * @since 2.6 +// */ +// public SpeciesProtocol getSpeciesProtocol(Species species) { +// return TuttiProtocols.getSpeciesProtocol(species, getProtocol().getSpecies()); +// } + +// /** +// * Return the benthosProtocol corresponding to the species of the given protocol. +// * +// * @param species the species to filter +// * @return the benthosProtocol corresponding to the species of the given protocol. +// * @since 2.6 +// */ +// public SpeciesProtocol getBenthosProtocol(Species species) { +// return TuttiProtocols.getSpeciesProtocol(species, getProtocol().getBenthos()); +// } public static final TimeLog TIME_LOG = new TimeLog(PersistenceService.class); @@ -1356,65 +1354,78 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer if (Objects.equals(bean.getGearShootingStartDate(), bean.getGearShootingEndDate())) { bean.setGearShootingEndDate(null); } - Optional<CruiseSamplingCache> optionalCruiseSamplingCache = getOptionalCruiseSamplingCache(); + + Optional<CruiseCache> optionalCruiseCache = getOptionalCruiseCache(); boolean reloadSamplingCache = false; - if (optionalCruiseSamplingCache.isPresent()) { + CruiseCache cruiseCache = optionalCruiseCache.orElseGet(null); - FishingOperation oldFishingOperation = getFishingOperation(bean.getIdAsInt()); + if (optionalCruiseCache.isPresent()) { - CruiseSamplingCache cruiseSamplingCache = optionalCruiseSamplingCache.get(); + Optional<CruiseSamplingCache> optionalSamplingCruiseCache = cruiseCache.getSamplingCruiseCache(); - Optional<Zone> oldOptionalZone = cruiseSamplingCache.tryFindZone(oldFishingOperation); - Optional<Zone> newOptionalZone = cruiseSamplingCache.tryFindZone(bean); + if (optionalSamplingCruiseCache.isPresent()) { - if (!Objects.equals(oldOptionalZone, newOptionalZone)) { + // on doit vérifier si l'opération n'a pas changée de zone + CruiseSamplingCache cruiseSamplingCache = optionalSamplingCruiseCache.get(); + + FishingOperation oldFishingOperation = getFishingOperation(bean.getIdAsInt()); + + boolean zoneChanged = cruiseSamplingCache.isZoneChanged(oldFishingOperation, bean); + + if (zoneChanged) { + + // les strates ou sous-strates ont changées, il faut recalculer le cache des échantillons + if (log.isInfoEnabled()) { + log.info("Zone has changed for fishingOperation: " + bean + ", remove fishing operation from cruise cache."); + } + reloadSamplingCache = true; + + List<IndividualObservationBatch> individualObservations = getAllIndividualObservationBatchsForFishingOperation(bean.getIdAsInt()); + cruiseCache.removeFishingOperation(oldFishingOperation, individualObservations); - if (log.isInfoEnabled()) { - log.info("Zone has changed for fishingOperation: " + bean.getId() + ", remove fishing operation from cruiseSamplingCache."); } - // les strates ou sous-strates ont changées, il faut recalculer le cache des échantillons - reloadSamplingCache = true; - cruiseSamplingCache.removeFishingOperation(oldFishingOperation); } } + FishingOperation fishingOperation = driver.saveFishingOperation(bean); if (reloadSamplingCache) { if (log.isInfoEnabled()) { - log.info("Zone has changed for fishingOperation: " + bean.getId() + ", recompute fishing operation from cruiseSamplingCache."); + log.info("Zone has changed for fishingOperation: " + bean + ", recompute fishing operation from cruise cache."); } - CruiseSamplingCache cruiseSamplingCache = optionalCruiseSamplingCache.get(); - CruiseSamplingCacheLoader cruiseSamplingCacheLoader = new CruiseSamplingCacheLoader(this, context.getService(DecoratorService.class), null); - cruiseSamplingCacheLoader.loadCruiseSamplingCacheForFishingOperation(cruiseSamplingCache, fishingOperation); + CruiseCacheLoader cruiseCacheLoader = CruiseCacheLoader.newCacheLoader(this, context.getService(DecoratorService.class), null, cruiseCache); + cruiseCacheLoader.loadCruiseCacheForFishingOperation(fishingOperation); } return fishingOperation; } + //FIXME Remove this ? can't find where it is used... @Override public Collection<FishingOperation> saveFishingOperations(Collection<FishingOperation> beans) { - Collection<FishingOperation> fishingOperations = driver.saveFishingOperations(beans); - //FIXME Update samplingCache - return fishingOperations; + return driver.saveFishingOperations(beans); } @Override public void deleteFishingOperation(Integer id) { - Optional<CruiseSamplingCache> optionalCruiseSamplingCache = getOptionalCruiseSamplingCache(); - if (optionalCruiseSamplingCache.isPresent()) { + Optional<CruiseCache> optionalCruiseCache = getOptionalCruiseCache(); + if (optionalCruiseCache.isPresent()) { - CruiseSamplingCache cruiseSamplingCache = optionalCruiseSamplingCache.get(); + CruiseCache cruiseCache = optionalCruiseCache.get(); if (log.isInfoEnabled()) { - log.info("Remove fishing operation: " + id + " from cruiseSamplingCache: " + cruiseSamplingCache); + log.info("Remove fishing operation: " + id + " from cruiseSamplingCache: " + cruiseCache); } FishingOperation fishingOperation = getFishingOperation(id); - optionalCruiseSamplingCache.get().removeFishingOperation(fishingOperation); + + List<IndividualObservationBatch> individualObservations = getAllIndividualObservationBatchsForFishingOperation(id); + + optionalCruiseCache.get().removeFishingOperation(fishingOperation, individualObservations); } driver.deleteFishingOperation(id); } @@ -1691,14 +1702,12 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer protected void beforeDeleteBatch(Integer id, boolean addBatchId) { - Optional<CruiseSamplingCache> optionalCruiseSamplingCache = getOptionalCruiseSamplingCache(); - if (optionalCruiseSamplingCache.isPresent()) { + Optional<CruiseCache> optionalCruiseCache = getOptionalCruiseCache(); + if (optionalCruiseCache.isPresent()) { - CruiseSamplingCache cruiseSamplingCache = optionalCruiseSamplingCache.get(); + CruiseCache cruiseCache = optionalCruiseCache.get(); FishingOperation fishingOperation = context.getDataContext().getFishingOperation(); - Integer fishingOperationId = fishingOperation.getIdAsInt(); - Zone optionalZone = cruiseSamplingCache.tryFindZone(fishingOperation).orElse(null); Set<Integer> batchIds = new LinkedHashSet<>(); if (addBatchId) { @@ -1708,15 +1717,15 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer batchIds.forEach(speciesBatchId -> { - List<IndividualObservationBatch> allIndividualObservationBatchsForBatch = getAllIndividualObservationBatchsForBatch(speciesBatchId); + List<IndividualObservationBatch> individualObservations = getAllIndividualObservationBatchsForBatch(speciesBatchId); - if (!allIndividualObservationBatchsForBatch.isEmpty()) { + if (!individualObservations.isEmpty()) { if (log.isInfoEnabled()) { - log.info("Remove for species or benthos batch: " + speciesBatchId + " - " + allIndividualObservationBatchsForBatch.size() + " individual observations from cruiseSamplingCache: " + cruiseSamplingCache); + log.info("Remove for species or benthos batch: " + speciesBatchId + " - " + individualObservations.size() + " individual observations from cruiseSamplingCache: " + cruiseCache); } - cruiseSamplingCache.removeIndividualObservations(fishingOperationId, optionalZone, allIndividualObservationBatchsForBatch); + cruiseCache.removeIndividualObservations(fishingOperation, individualObservations); } @@ -1726,8 +1735,8 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer } - private Optional<CruiseSamplingCache> getOptionalCruiseSamplingCache() { - return context.getDataContext().getOptionalCruiseSamplingCache(); + private Optional<CruiseCache> getOptionalCruiseCache() { + return context.getDataContext().getOptionalCruiseCache(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java index c4b9b92..58d2dac 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java @@ -24,9 +24,7 @@ package fr.ifremer.tutti.service.export.cps; * #L% */ -import com.google.common.base.Charsets; import com.google.common.base.Preconditions; -import com.google.common.io.Files; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Speciess; @@ -36,7 +34,8 @@ import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.TuttiServiceContext; import fr.ifremer.tutti.service.sampling.CacheExtractedKey; -import org.apache.commons.io.IOUtils; +import fr.ifremer.tutti.service.sampling.CruiseCache; +import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Export; @@ -45,8 +44,11 @@ import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.BufferedWriter; import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.List; import java.util.Map; +import java.util.Optional; import static org.nuiton.i18n.I18n.t; @@ -71,39 +73,48 @@ public class CalcifiedPiecesSamplingExportService extends AbstractTuttiService { /** * Export selected cruise with the csv sumatra format. * - * @param file where to generate report + * @param file where to generate report * @since 2.0 */ - public void exportCruiseCalcifiedPiecesSamplingsReport(File file, - ProgressionModel progressionModel) { + public void exportCruiseCalcifiedPiecesSamplingsReport(File file, ProgressionModel progressionModel) { Preconditions.checkNotNull(file, "Cannot export to a null file"); TuttiDataContext dataContext = context.getDataContext(); - Preconditions.checkState(dataContext.isCruiseSamplingCacheLoaded()); + Preconditions.checkState(dataContext.isCanUseCruiseSamplingCache() && dataContext.isCruiseCacheLoaded() && dataContext.isCruiseCacheUpToDate()); Decorator<Species> decorator = decoratorService.getDecoratorByType(Species.class, DecoratorService.WITH_SURVEY_CODE_NO_NAME); SamplingNumberRowModel csvModel = new SamplingNumberRowModel(context.getConfig().getCsvSeparator(), decorator); Map<String, Species> referenceSpeciesByReferenceTaxonId = Speciess.splitReferenceSpeciesByReferenceTaxonId(dataContext.getReferentSpecies()); - List<CacheExtractedKey> rows = context.getDataContext().getOptionalCruiseSamplingCache().get().getSamplingNumbers(referenceSpeciesByReferenceTaxonId); + Optional<CruiseCache> optionalCruiseCache = context.getDataContext().getOptionalCruiseCache(); + if (!optionalCruiseCache.isPresent()) { + throw new IllegalStateException("No cruise cache found"); + } + CruiseCache cruiseCache = optionalCruiseCache.get(); + + Optional<CruiseSamplingCache> optionalSamplingCruiseCache = cruiseCache.getSamplingCruiseCache(); + if (!optionalSamplingCruiseCache.isPresent()) { + throw new IllegalStateException("No sampling cruise cache found"); + } - BufferedWriter writer = null; - try { + List<CacheExtractedKey> rows = optionalSamplingCruiseCache.get().getSamplingNumbers(referenceSpeciesByReferenceTaxonId); + + if (log.isInfoEnabled()) { + log.info("Loaded " + rows.size() + " keys to export to " + file); + } + try (BufferedWriter writer = Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8)) { progressionModel.increments(t("tutti.service.cpsExport.step.toFile", file.getName())); - writer = Files.newWriter(file, Charsets.UTF_8); Export export = Export.newExport(csvModel, rows); export.write(writer); - writer.close(); } catch (Exception e) { throw new ApplicationTechnicalException(t("tutti.service.cpsExport.error", file), e); - } finally { - IOUtils.closeQuietly(writer); } + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/EditCatchesSupportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/EditCatchesSupportAction.java index ff4a976..494a8c1 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/EditCatchesSupportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/EditCatchesSupportAction.java @@ -27,8 +27,9 @@ import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.ValidationService; -import fr.ifremer.tutti.service.sampling.CruiseSamplingCacheLoader; +import fr.ifremer.tutti.service.sampling.CruiseCacheLoader; import fr.ifremer.tutti.ui.swing.TuttiScreen; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; @@ -57,7 +58,7 @@ public abstract class EditCatchesSupportAction extends AbstractChangeScreenActio protected abstract boolean isLoadReferential(); protected boolean loadReferential; - protected boolean loadSamplingCache; + protected boolean loadCruiseCache; @Override public boolean prepareAction() throws Exception { @@ -67,8 +68,7 @@ public abstract class EditCatchesSupportAction extends AbstractChangeScreenActio if (doAction) { loadReferential = isLoadReferential(); - loadSamplingCache = dataContext.isCanUseCruiseSamplingCache() && - !(dataContext.isCruiseSamplingCacheLoaded() && dataContext.isCruiseSamplingCacheUpToDate()); + loadCruiseCache = !(dataContext.isCruiseCacheLoaded() && dataContext.isCruiseCacheUpToDate()); int totalSteps = 1; @@ -76,7 +76,7 @@ public abstract class EditCatchesSupportAction extends AbstractChangeScreenActio totalSteps += 5; } - if (loadSamplingCache) { + if (loadCruiseCache) { // Calcul des étapes (nb de traits dans la campagne) long cruiseFishingOperationIds = getDataContext().getCruiseFishingOperationIds().stream().count(); @@ -99,22 +99,24 @@ public abstract class EditCatchesSupportAction extends AbstractChangeScreenActio @Override public void doAction() throws Exception { - Preconditions.checkState(getContext().isCruiseFilled()); + TuttiUIContext context = getContext(); + Preconditions.checkState(context.isCruiseFilled()); + Integer cruiseId = context.getCruiseId(); if (log.isInfoEnabled()) { - log.info("Edit operations of cruise: " + getContext().getCruiseId()); + log.info("Edit operations of cruise: " + cruiseId); } - getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_EDIT); + context.setValidationContext(ValidationService.VALIDATION_CONTEXT_EDIT); if (loadReferential) { loadReferantials(false); } - if (loadSamplingCache) { + if (loadCruiseCache) { ProgressionModel progressionModel = getProgressionModel(); - CruiseSamplingCacheLoader cruiseSamplingCacheLoader = new CruiseSamplingCacheLoader(getContext().getPersistenceService(), getContext().getDecoratorService(), progressionModel); - getDataContext().loadCruiseSamplingCache(cruiseSamplingCacheLoader); + CruiseCacheLoader cruiseCacheLoader = context.createCruiseCacheLoader(progressionModel); + getDataContext().loadCruiseCache(cruiseCacheLoader); progressionModel.increments("Chargement de l'interface graphique"); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/actions/SaveCruiseAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/actions/SaveCruiseAction.java index 0a38c73..c0d52b6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/actions/SaveCruiseAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/actions/SaveCruiseAction.java @@ -30,12 +30,12 @@ import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrd import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; -import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import fr.ifremer.tutti.ui.swing.content.cruise.EditCruiseUI; import fr.ifremer.tutti.ui.swing.content.cruise.EditCruiseUIHandler; import fr.ifremer.tutti.ui.swing.content.cruise.EditCruiseUIModel; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import org.apache.commons.lang3.ObjectUtils; import javax.swing.ImageIcon; @@ -173,6 +173,8 @@ public class SaveCruiseAction extends LongActionSupport<EditCruiseUIModel, EditC getDataContext().reloadCruise(); } + getDataContext().closeCruiseCache(); + // update originalRankOrder for all gears of the cruise for (GearWithOriginalRankOrder gear : model.getGear()) { gear.setOriginalRankOrder(gear.getRankOrder()); @@ -185,8 +187,7 @@ public class SaveCruiseAction extends LongActionSupport<EditCruiseUIModel, EditC @Override public void postSuccessAction() { - getContext().getMainUI().getHandler().setBodyTitle( - EditCruiseUIHandler.getTitle(true)); + getContext().getMainUI().getHandler().setBodyTitle(EditCruiseUIHandler.getTitle(true)); ImageIcon icon = TuttiUIUtil.getCruiseIcon(getModel()); getContext().getMainUI().getBody().setLeftDecoration(new JLabel(icon)); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/CalcifiedPiecesSamplingReportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/CalcifiedPiecesSamplingReportAction.java index 28b80f7..41148e7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/CalcifiedPiecesSamplingReportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/CalcifiedPiecesSamplingReportAction.java @@ -27,8 +27,10 @@ package fr.ifremer.tutti.ui.swing.content.home.actions; import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.export.cps.CalcifiedPiecesSamplingExportService; -import fr.ifremer.tutti.service.sampling.CruiseSamplingCacheLoader; +import fr.ifremer.tutti.service.sampling.CruiseCacheLoader; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; import fr.ifremer.tutti.ui.swing.content.actions.AbstractMainUITuttiAction; import org.apache.commons.logging.Log; @@ -47,13 +49,10 @@ import static org.nuiton.i18n.I18n.t; public class CalcifiedPiecesSamplingReportAction extends AbstractMainUITuttiAction { /** Logger. */ - private static final Log log = - LogFactory.getLog(CalcifiedPiecesSamplingReportAction.class); + private static final Log log = LogFactory.getLog(CalcifiedPiecesSamplingReportAction.class); protected File file; -// protected SumatraExportResult sumatraExportResult; - public CalcifiedPiecesSamplingReportAction(MainUIHandler handler) { super(handler, false); } @@ -99,30 +98,33 @@ public class CalcifiedPiecesSamplingReportAction extends AbstractMainUITuttiActi @Override public void doAction() throws Exception { - Cruise cruise = getDataContext().getCruise(); + + TuttiDataContext dataContext = getDataContext(); + Cruise cruise = dataContext.getCruise(); Preconditions.checkNotNull(cruise); Preconditions.checkNotNull(file); if (log.isInfoEnabled()) { - log.info("Will export cps for cruise " + cruise.getId() + - " to file: " + file); + log.info("Will export cps for cruise " + cruise.getId() + " to file: " + file); } ProgressionModel pm = new ProgressionModel(); setProgressionModel(pm); - long cruiseFishingOperationIds = getDataContext().getCruiseFishingOperationIds().stream().count(); + long cruiseFishingOperationIds = dataContext.getCruiseFishingOperationIds().size(); pm.setTotal((int) (1 + cruiseFishingOperationIds)); - if (!getDataContext().isCruiseSamplingCacheLoaded()) { - CruiseSamplingCacheLoader cruiseSamplingCacheLoader = new CruiseSamplingCacheLoader(getContext().getPersistenceService(), - getContext().getDecoratorService(), getProgressionModel()); - getDataContext().loadCruiseSamplingCache(cruiseSamplingCacheLoader); + TuttiUIContext context = getContext(); + if (!dataContext.isCruiseCacheLoaded() || !dataContext.isCruiseCacheUpToDate()) { + + // load (or reload) cache + CruiseCacheLoader cruiseCacheLoader = context.createCruiseCacheLoader(getProgressionModel()); + dataContext.loadCruiseCache(cruiseCacheLoader); } // export sampling report - CalcifiedPiecesSamplingExportService service = getContext().getCalcifiedPiecesSamplingExportService(); + CalcifiedPiecesSamplingExportService service = context.getCalcifiedPiecesSamplingExportService(); service.exportCruiseCalcifiedPiecesSamplingsReport(file, pm); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/SamplingCodeCellEditor.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/SamplingCodeCellEditor.java index 69e228f..3fdba0f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/SamplingCodeCellEditor.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/SamplingCodeCellEditor.java @@ -23,7 +23,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservatio */ import com.google.common.base.Preconditions; -import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; +import fr.ifremer.tutti.service.sampling.CruiseCache; +import fr.ifremer.tutti.service.sampling.SamplingCodeCache; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; @@ -146,13 +147,22 @@ public class SamplingCodeCellEditor extends AbstractCellEditor implements TableC } protected void generateCode() { - Optional<CruiseSamplingCache> optionalCruiseSamplingCache = context.getDataContext().getOptionalCruiseSamplingCache(); - if (optionalCruiseSamplingCache.isPresent()) { - int i = optionalCruiseSamplingCache.get().getNextSamplingCodeId(getRow().getSpecies().getReferenceTaxonId()); - row.setSamplingCode(row.getSamplingCodePrefix().toSamplingCode(i)); + + Optional<CruiseCache> optionalCruiseCache = context.getDataContext().getOptionalCruiseCache(); + if (!optionalCruiseCache.isPresent()) { + throw new IllegalStateException("No cruise cache found!"); + } + SamplingCodeCache samplingCodeCache = optionalCruiseCache.get().getSamplingCodeCache(); + int i = samplingCodeCache.getNextSamplingCodeId(getRow().getSpecies().getReferenceTaxonId()); + String samplingCode = row.getSamplingCodePrefix().toSamplingCode(i); + if (log.isInfoEnabled()) { + log.info("Generated sampling code: " + samplingCode); } + row.setSamplingCode(samplingCode); + stopCellEditing(); } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java index 1c1c7f4..7a563e3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java @@ -12,6 +12,8 @@ import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.TuttiDataContext; +import fr.ifremer.tutti.service.sampling.CruiseCache; import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SamplingCodeCellEditor; @@ -95,12 +97,18 @@ public class IndividualObservationBatchTableHandler implements Closeable { this.model = ui.getModel(); this.model2 = ui.getModel().getIndividualObservationModel(); this.uiHandler = ui.getHandler(); - this.individualObservationUICache = new IndividualObservationUICache(uiHandler.getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); + TuttiDataContext dataContext = uiHandler.getDataContext(); + + Optional<CruiseCache> optionalCruiseCache = dataContext.getOptionalCruiseCache(); + if (!optionalCruiseCache.isPresent()) { + throw new IllegalStateException("Can't find cruise cache"); + } + this.individualObservationUICache = new IndividualObservationUICache(optionalCruiseCache.get(), model); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model2.getIndividualObservationWeightUnit()); - List<Caracteristic> maturityCaracteristics = new ArrayList<>(uiHandler.getDataContext().getMaturityCaracteristics()); + List<Caracteristic> maturityCaracteristics = new ArrayList<>(dataContext.getMaturityCaracteristics()); this.maturityCaracteristics = TuttiEntities.splitById(maturityCaracteristics); @@ -264,19 +272,31 @@ public class IndividualObservationBatchTableHandler implements Closeable { break; case IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE: + + String oldValue = (String) evt.getOldValue(); + String newValue = (String) evt.getNewValue(); + + boolean withOldSamplingCode = StringUtils.isNotBlank(oldValue); + boolean withNewSamplingCode = StringUtils.isNotBlank(newValue); + + if (withOldSamplingCode) { + individualObservationUICache.decrementsSamplingCode(oldValue); + } + if (withNewSamplingCode) { + individualObservationUICache.incrementsSamplingCode(newValue); + } + if (row.withSize()) { float size = row.getSize(); - String oldValue = (String) evt.getOldValue(); - String newValue = (String) evt.getNewValue(); - - if (StringUtils.isNotBlank(oldValue)) { - individualObservationUICache.decrementsSamplingNb(gender, maturity, size, oldValue); + if (withOldSamplingCode) { + individualObservationUICache.decrementsSamplingNb(gender, maturity, size); } - if (StringUtils.isNotBlank(newValue)) { - individualObservationUICache.incrementsSamplingNb(gender, maturity, size, newValue); + if (withNewSamplingCode) { + individualObservationUICache.incrementsSamplingNb(gender, maturity, size); } + } break; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java index ab01a3b..5a0bf0a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java @@ -30,7 +30,9 @@ import fr.ifremer.tutti.persistence.entities.protocol.Zone; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.sampling.CruiseCache; import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; +import fr.ifremer.tutti.service.sampling.SamplingCodeCache; import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; import fr.ifremer.tutti.service.sampling.SamplingEvent; import fr.ifremer.tutti.service.sampling.SamplingListener; @@ -65,13 +67,17 @@ public class IndividualObservationUICache implements Closeable { private static final Log log = LogFactory.getLog(IndividualObservationUICache.class); private final SamplingListener samplingListener; - private final CruiseSamplingCache samplingCache; + private final CruiseCache cruiseCache; + private final SamplingCodeCache samplingCodeCache; private final SpeciesFrequencyUIModel uiModel; private final IndividualObservationBatchUIModel individualObservationModel; + private final boolean withSamplingCache; + private final CruiseSamplingCache cruiseSamplingCache; private SpeciesBatchRowModel speciesEditRow; private FishingOperation fishingOperation; private Species species; + private SpeciesFrequencyUI ui; /** @@ -87,15 +93,16 @@ public class IndividualObservationUICache implements Closeable { * Dès qu'un code de prélèvement est ajouté ou modifié dans l'écran, on l'ajoute ici. */ private final Set<Integer> samplingCodesAvailable = new TreeSet<>(); - /** * Est-ce que le cache est actif ? */ private boolean on; - public IndividualObservationUICache(CruiseSamplingCache samplingCache, SpeciesFrequencyUIModel uiModel) { - - this.samplingCache = samplingCache; + public IndividualObservationUICache(CruiseCache cruiseCache, SpeciesFrequencyUIModel uiModel) { + this.cruiseCache = cruiseCache; + this.withSamplingCache = cruiseCache.useSamplingCache(); + this.cruiseSamplingCache = cruiseCache.getSamplingCruiseCache().orElse(null); + this.samplingCodeCache = cruiseCache.getSamplingCodeCache(); this.uiModel = uiModel; this.individualObservationModel = uiModel.getIndividualObservationModel(); @@ -115,7 +122,7 @@ public class IndividualObservationUICache implements Closeable { } else { // model no more loading, cache is on if data cache is present - on = withSamplingCache(); + on = true; if (log.isInfoEnabled()) { if (on) { log.info("Cache is on : ui model loading is done and sampling cache is present"); @@ -180,9 +187,10 @@ public class IndividualObservationUICache implements Closeable { this.speciesEditRow = speciesEditRow; this.species = speciesEditRow.getSpecies(); this.fishingOperation = fishingOperation; - if (withSamplingCache()) { - samplingCache.addSamplingListener(samplingListener); + if (withSamplingCache) { + cruiseSamplingCache.addSamplingListener(samplingListener); } + this.samplingCodesAvailable.clear(); this.samplingCodesNotAvailable.clear(); @@ -191,9 +199,6 @@ public class IndividualObservationUICache implements Closeable { .forEach(individualObservationRow -> addSamplingCodeNotAvailable(individualObservationRow.getSamplingCode())); } - protected boolean withSamplingCache() { - return samplingCache != null; - } @Override public void close() { @@ -201,8 +206,8 @@ public class IndividualObservationUICache implements Closeable { this.speciesEditRow = null; this.species = null; this.fishingOperation = null; - if (withSamplingCache()) { - samplingCache.removeSamplingListener(samplingListener); + if (withSamplingCache) { + cruiseSamplingCache.removeSamplingListener(samplingListener); } } @@ -233,6 +238,11 @@ public class IndividualObservationUICache implements Closeable { float lengthStep, String samplingCode) { + boolean withSamplingCode = samplingCode != null; + if (withSamplingCode) { + incrementsSamplingCode(samplingCode); + } + if (!on) { if (log.isDebugEnabled()) { log.debug("Cache is off, skip increments individual observations in cache."); @@ -240,15 +250,19 @@ public class IndividualObservationUICache implements Closeable { return; } - Boolean maturity = samplingCache.getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); - samplingCache.addIndividualObservation(fishingOperation, - species, - gender, - maturity, - uiModel.getLengthStepInMm(lengthStep)); + if (withSamplingCache) { + + Boolean maturity = cruiseSamplingCache.getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); + cruiseSamplingCache.addIndividualObservation(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStepInMm(lengthStep)); - if (samplingCode != null) { - incrementsSamplingNb(gender, maturityQualitativeValue, lengthStep, samplingCode); + } + + if (withSamplingCode) { + incrementsSamplingNb(gender, maturityQualitativeValue, lengthStep); } } @@ -258,12 +272,10 @@ public class IndividualObservationUICache implements Closeable { * @param gender le sexe * @param maturityQualitativeValue l'état de maturité * @param lengthStep la classe de taille - * @param samplingCode le code de prélèvement ajouté */ public void incrementsSamplingNb(CaracteristicQualitativeValue gender, CaracteristicQualitativeValue maturityQualitativeValue, - float lengthStep, - String samplingCode) { + float lengthStep) { if (!on) { if (log.isDebugEnabled()) { @@ -272,17 +284,18 @@ public class IndividualObservationUICache implements Closeable { return; } - Boolean maturity = samplingCache.getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); - int lengthStepInMm = uiModel.getLengthStepInMm(lengthStep); - samplingCache.addSampling(fishingOperation, - species, - gender, - maturity, - lengthStepInMm, - samplingCode); + if (withSamplingCache) { + + Boolean maturity = cruiseSamplingCache.getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); + int lengthStepInMm = uiModel.getLengthStepInMm(lengthStep); + cruiseSamplingCache.addSampling(fishingOperation, + species, + gender, + maturity, + lengthStepInMm); + + } - // Le code n'est plus utilisable - addSamplingCodeNotAvailable(samplingCode); } @@ -332,30 +345,31 @@ public class IndividualObservationUICache implements Closeable { return; } - Boolean maturity = samplingCache.getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); - samplingCache.removeIndividualObservation(fishingOperation, - species, - gender, - maturity, - uiModel.getLengthStepInMm(lengthStep)); + boolean withSamplingCode = samplingCode != null; + + if (withSamplingCode) { + decrementsSamplingCode(samplingCode); + } + + if (withSamplingCache) { + + Boolean maturity = cruiseSamplingCache.getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); + cruiseSamplingCache.removeIndividualObservation(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStepInMm(lengthStep)); - if (samplingCode != null) { - decrementsSamplingNb(gender, maturityQualitativeValue, lengthStep, samplingCode); + if (withSamplingCode) { + decrementsSamplingNb(gender, maturityQualitativeValue, lengthStep); + } } + } - /** - * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. - * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - * @param samplingCode le code de prélèvement supprimé - */ public void decrementsSamplingNb(CaracteristicQualitativeValue gender, CaracteristicQualitativeValue maturityQualitativeValue, - Float lengthStep, - String samplingCode) { + Float lengthStep) { if (!on) { if (log.isDebugEnabled()) { @@ -364,16 +378,16 @@ public class IndividualObservationUICache implements Closeable { return; } - Boolean maturity = samplingCache.getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); - samplingCache.removeSampling(fishingOperation, - species, - gender, - maturity, - uiModel.getLengthStepInMm(lengthStep), - samplingCode); + if (withSamplingCache) { - addSamplingCodeAvailable(samplingCode); + Boolean maturity = cruiseSamplingCache.getMaturity(uiModel.getBatch().getSpecies().getReferenceTaxonId(), maturityQualitativeValue); + cruiseSamplingCache.removeSampling(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStepInMm(lengthStep)); + } } /** @@ -431,41 +445,20 @@ public class IndividualObservationUICache implements Closeable { return samplingCodesAvailable.contains(samplingCode); } - public void addSamplingCodeAvailable(String samplingCode) { - - int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); - if (log.isDebugEnabled()) { - log.debug(String.format("Make samplingCode: %s (%d) available", samplingCode, samplingCodeNumber)); - } - samplingCodesNotAvailable.remove(samplingCodeNumber); - samplingCodesAvailable.add(samplingCodeNumber); - - } - - public void addSamplingCodeNotAvailable(String samplingCode) { - - int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); - if (log.isDebugEnabled()) { - log.debug(String.format("Make samplingCode: %s (%d) not available", samplingCode, samplingCodeNumber)); - } - samplingCodesNotAvailable.add(samplingCodeNumber); - samplingCodesAvailable.remove(samplingCodeNumber); - - } - public void updateSelectedRow(IndividualObservationBatchRowModel selectedRow) { SamplingEvent event = null; - if (withSamplingCache() && selectedRow != null && selectedRow.withSize()) { + if (withSamplingCache && selectedRow != null && selectedRow.withSize()) { CaracteristicQualitativeValue maturityQualitativeValue = individualObservationModel.getMaturityValue(selectedRow); - Boolean maturity = samplingCache.getMaturity(selectedRow.getSpecies().getReferenceTaxonId(), maturityQualitativeValue); + Boolean maturity = cruiseSamplingCache.getMaturity(selectedRow.getSpecies().getReferenceTaxonId(), maturityQualitativeValue); int lengthstep = uiModel.getLengthStepInMm(selectedRow.getSize()); - event = samplingCache.getEventForSummary(fishingOperation, species, maturity, individualObservationModel.getGender(selectedRow), lengthstep).orElse(null); + event = cruiseSamplingCache.getEventForSummary(fishingOperation, species, maturity, individualObservationModel.getGender(selectedRow), lengthstep).orElse(null); } + displaySummary(event); } @@ -523,9 +516,49 @@ public class IndividualObservationUICache implements Closeable { return ui != null; } - protected String getLabelForSamplingNumber(int value, Integer max) { + private String getLabelForSamplingNumber(int value, Integer max) { Decorator<Integer> valueDecorator = ui.getHandler().getDecorator(Integer.class, DecoratorService.NULL_INFINITE); return "<strong>" + valueDecorator.toString(value) + "</strong> (" + valueDecorator.toString(max) + ")"; } + public void decrementsSamplingCode(String samplingCode) { + + samplingCodeCache.removeSamplingCode(uiModel.getBatch().getSpecies().getReferenceTaxonId(), samplingCode); + + // Le code est utilisable + addSamplingCodeAvailable(samplingCode); + + } + + public void incrementsSamplingCode(String samplingCode) { + + samplingCodeCache.addSamplingCode(uiModel.getBatch().getSpecies().getReferenceTaxonId(), samplingCode); + + // Le code n'est plus utilisable + addSamplingCodeNotAvailable(samplingCode); + + } + + private void addSamplingCodeNotAvailable(String samplingCode) { + + int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); + if (log.isDebugEnabled()) { + log.debug(String.format("Make samplingCode: %s (%d) not available", samplingCode, samplingCodeNumber)); + } + samplingCodesNotAvailable.add(samplingCodeNumber); + samplingCodesAvailable.remove(samplingCodeNumber); + + } + + private void addSamplingCodeAvailable(String samplingCode) { + + int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); + if (log.isDebugEnabled()) { + log.debug(String.format("Make samplingCode: %s (%d) available", samplingCode, samplingCodeNumber)); + } + samplingCodesNotAvailable.remove(samplingCodeNumber); + samplingCodesAvailable.add(samplingCodeNumber); + + } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/actions/SaveProtocolAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/actions/SaveProtocolAction.java index 5329a11..fa18d0f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/actions/SaveProtocolAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/actions/SaveProtocolAction.java @@ -65,7 +65,6 @@ public class SaveProtocolAction extends LongActionSupport<EditProtocolUIModel, E if (log.isInfoEnabled()) { log.info("bean zones " + bean.getZone()); - log.info("bean zones " + bean.getZone()); } if (log.isDebugEnabled()) { @@ -86,15 +85,14 @@ public class SaveProtocolAction extends LongActionSupport<EditProtocolUIModel, E context.setProtocolId(saved.getId()); - getDataContext().resetCruiseSamplingCache(); + getDataContext().closeCruiseCache(); model.setModify(false); } @Override public void postSuccessAction() { - getContext().getMainUI().getHandler().setBodyTitle( - EditProtocolUIHandler.getTitle(true)); + getContext().getMainUI().getHandler().setBodyTitle(EditProtocolUIHandler.getTitle(true)); getUI().getSaveWarningContainer().setVisible(false); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.