This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit dbdef2da4edd97ac634bc5c4d42a60ae0c63c8cb Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Apr 17 07:35:51 2016 +0200 Revue du chargement des caches de campagne --- .../fr/ifremer/tutti/service/TuttiDataContext.java | 216 +++++++++------------ .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 18 +- 2 files changed, 102 insertions(+), 132 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java index 58e748b..e35776a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java @@ -40,8 +40,8 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TaxonCache; import fr.ifremer.tutti.persistence.entities.referential.TaxonCaches; import fr.ifremer.tutti.persistence.entities.referential.Vessel; -import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; -import fr.ifremer.tutti.service.sampling.CruiseSamplingCacheLoader; +import fr.ifremer.tutti.service.sampling.CruiseCache; +import fr.ifremer.tutti.service.sampling.CruiseCacheLoader; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -51,7 +51,6 @@ import java.io.Closeable; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -131,9 +130,11 @@ public class TuttiDataContext extends AbstractBean implements Closeable { protected Cruise cruise; /** + * Le cache des données liées à la campagne sélectionnée. + * * @since 4.5 */ - protected CruiseSamplingCache cruiseSamplingCache; + protected CruiseCache cruiseCache; protected FishingOperation fishingOperation; @@ -171,29 +172,15 @@ public class TuttiDataContext extends AbstractBean implements Closeable { protected List<Caracteristic> defaultIndividualObservationCaracteristics; + protected TuttiValidationDataContextSupport validationContext = new TuttiValidationDataContext(this); + protected PersistenceService service; TuttiDataContext() { - addPropertyChangeListener(PROPERTY_PROGRAM_ID, evt -> program = null); - addPropertyChangeListener(PROPERTY_CRUISE_ID, evt -> cruise = null); - addPropertyChangeListener(PROPERTY_PROTOCOL_ID, evt -> { - resetProtocol(); - resetSpecies(); - }); - addPropertyChangeListener(PROPERTY_FISHING_OPERATION_ID, evt -> { - fishingOperation = null; - getValidationContext().resetExistingFishingOperations(); - }); - // Pour supprimer le cache d'échantillons - addPropertyChangeListener(evt -> { - String propertyName = evt.getPropertyName(); - if (PROPERTY_CRUISE_ID.equals(propertyName) || PROPERTY_PROGRAM_ID.equals(propertyName)) { - - if (getOptionalCruiseSamplingCache().isPresent()) { - closeCruiseSamplingCache(); - } - } - }); + addPropertyChangeListener(PROPERTY_PROGRAM_ID, evt -> resetProgram()); + addPropertyChangeListener(PROPERTY_CRUISE_ID, evt -> resetCruise()); + addPropertyChangeListener(PROPERTY_PROTOCOL_ID, evt -> resetProtocol()); + addPropertyChangeListener(PROPERTY_FISHING_OPERATION_ID, evt -> resetFishingOperation()); } public void setPersistenceService(PersistenceService service) { @@ -250,10 +237,7 @@ public class TuttiDataContext extends AbstractBean implements Closeable { } public void clearContext() { - program = null; - cruise = null; - fishingOperation = null; - //sampleCategoryModel = null; + resetProgram(); dirtySampleCategoryModel = true; resetProtocol(); resetVessels(); @@ -417,36 +401,60 @@ public class TuttiDataContext extends AbstractBean implements Closeable { return fishingOperationId; } + /** + * @return {@code true} si une campache est charfée. + */ public boolean isCruiseFilled() { return isProgramFilled() && cruiseId != null; } + /** + * @return {@code true} si un protocol est chargé. + */ public boolean isProtocolFilled() { return StringUtils.isNotBlank(protocolId); } + /** + * @return {@code true} si une série de campagne est chargée. + */ public boolean isProgramFilled() { return StringUtils.isNotBlank(programId); } + /** + * @return {@code true} si une opérationde pêche est chargée. + */ public boolean isFishingOperationFilled() { return fishingOperationId != null; } - public boolean isCanUseCruiseSamplingCache() { - return isProtocolFilled() - && isCruiseFilled() - && getProtocol().isUseCalcifiedPieceSampling(); + /** + * @return {@code true} si on peut utiliser le cache sur la campagne. + */ + public boolean isCanUseCruiseCache() { + return isCruiseFilled(); } - public boolean isCruiseSamplingCacheLoaded() { - return cruiseSamplingCache != null; + /** + * @return {@code true} si le cache de campagne est chargé. + */ + public boolean isCruiseCacheLoaded() { + return cruiseCache != null; } - public boolean isCruiseSamplingCacheUpToDate() { - return isCruiseSamplingCacheLoaded() - && Objects.equals(getCruiseId(), cruiseSamplingCache.getCruiseId()) - && Objects.equals(getProtocolId(), cruiseSamplingCache.getProtocolId()); + /** + * @return {@code true} si le cache de campagne est à jour. + */ + public boolean isCruiseCacheUpToDate() { + return isCruiseCacheLoaded() && cruiseCache.isCacheUpToDate(getCruiseId(), getProtocolId()); + } + + /** + * @return {@code true} si on peut utiliser le cache de prélèvement des pièces calcifiées. + */ + public boolean isCanUseCruiseSamplingCache() { + return isCanUseCruiseCache() && isProtocolFilled() && getProtocol().isUseCalcifiedPieceSampling(); } public void setProgramId(String programId) { @@ -559,45 +567,34 @@ public class TuttiDataContext extends AbstractBean implements Closeable { return service.getProtocol(); } - - public Optional<CruiseSamplingCache> getOptionalCruiseSamplingCache() { - return Optional.ofNullable(isCruiseSamplingCacheUpToDate() ? cruiseSamplingCache : null); + public Optional<CruiseCache> getOptionalCruiseCache() { + return Optional.ofNullable(isCruiseCacheUpToDate() ? cruiseCache : null); } - public void loadCruiseSamplingCache(CruiseSamplingCacheLoader cruiseSamplingCacheLoader) { + public void loadCruiseCache(CruiseCacheLoader cruiseCacheLoader) { + checkOpened(); - if (!isCanUseCruiseSamplingCache()) { + if (!isCanUseCruiseCache()) { throw new IllegalStateException("Pas autorisé à charger le cache d'échantillons"); } - if (isCruiseSamplingCacheLoaded() && !isCruiseSamplingCacheUpToDate()) { - closeCruiseSamplingCache(); + + if (isCruiseCacheLoaded() && !isCruiseCacheUpToDate()) { + closeCruiseCache(); } if (log.isInfoEnabled()) { log.info("Loading cruise sampling cache: {cruiseId:" + getCruiseId() + ", protocolId: " + getProtocolId() + "}"); } - cruiseSamplingCache = cruiseSamplingCacheLoader.loadCruiseSamplingCache(getProtocol(), getCruiseId()); + cruiseCache = cruiseCacheLoader.loadCruiseCache(); if (log.isInfoEnabled()) { - log.info("cruise sampling cache loaded: " + cruiseSamplingCache); + log.info("cruise sampling cache loaded: " + cruiseCache); } } - protected void closeCruiseSamplingCache() { - Objects.requireNonNull(cruiseSamplingCache); - - // on détruit le cache obsolète - if (log.isInfoEnabled()) { - log.info("Destroy obsolete cruise sampling cache: " + cruiseSamplingCache); - } - - cruiseSamplingCache.close(); - cruiseSamplingCache = null; - } - public List<Integer> getCruiseFishingOperationIds() { checkOpened(); if (!isCruiseFilled()) { @@ -677,61 +674,6 @@ public class TuttiDataContext extends AbstractBean implements Closeable { return maturityCaracteristics; } -// /** -// * Get the best possible first sample category for the given benthos. -// * -// * Will look inside the protocol if there is a row for the given benthos, -// * if so try then to use the first selected sample category. -// * -// * If selected category is null, then try to use the first one from the -// * given categories. -// * -// * @param categories list of possible categories -// * @param species species to use -// * @return the best first sample category to use for the given benthos -// * @since 3.0 -// */ -// public SampleCategoryModelEntry getBestFirstBenthosSampleCategory(List<SampleCategoryModelEntry> categories, -// Species species) { -// -// -// SpeciesProtocol speciesProtocol = null; -// -// if (isProtocolFilled()) { -// -// speciesProtocol = service.getBenthosProtocol(species); -// } -// -// return getBestFirstSampleCategory(categories, speciesProtocol); -// } -// -// /** -// * Get the best possible first sample category for the given species. -// * -// * Will look inside the protocol if there is a row for the given species, -// * if so try then to use the first selected sample category. -// * -// * If selected category is null, then try to use the first one from the -// * given categories. -// * -// * @param categories list of possible categories -// * @param species species to use -// * @return the best first sample category to use for the given species -// * @since 3.0 -// */ -// public SampleCategoryModelEntry getBestFirstSpeciesSampleCategory(List<SampleCategoryModelEntry> categories, -// Species species) { -// -// SpeciesProtocol speciesProtocol = null; -// -// if (isProtocolFilled()) { -// -// speciesProtocol = service.getSpeciesProtocol(species); -// } -// -// return getBestFirstSampleCategory(categories, speciesProtocol); -// } - public SampleCategoryModelEntry getBestFirstSampleCategory(List<SampleCategoryModelEntry> categories, SpeciesProtocol speciesProtocol) { @@ -964,9 +906,20 @@ public class TuttiDataContext extends AbstractBean implements Closeable { return defaultIndividualObservationCaracteristics; } + private void resetProgram() { + program = null; + resetCruise(); + } + public void resetCruise() { cruise = null; - resetCruiseSamplingCache(); + resetFishingOperation(); + closeCruiseCache(); + } + + public void resetFishingOperation() { + fishingOperation = null; + validationContext.resetExistingFishingOperations(); } public void resetProtocol() { @@ -978,11 +931,7 @@ public class TuttiDataContext extends AbstractBean implements Closeable { defaultIndividualObservationCaracteristics = null; // survey code must be refresh resetSpecies(); - resetCruiseSamplingCache(); - } - - public void resetCruiseSamplingCache() { - cruiseSamplingCache = null; + closeCruiseCache(); } public void resetGears() { @@ -1004,7 +953,6 @@ public class TuttiDataContext extends AbstractBean implements Closeable { referentSpecies = null; referentSpeciesWithSurveyCode = null; referentBenthosWithSurveyCode = null; - } public void resetCaracteristics() { @@ -1014,20 +962,14 @@ public class TuttiDataContext extends AbstractBean implements Closeable { deadOrAliveValues = null; } - protected void checkOpened() { - Preconditions.checkState(service != null, "No persistence service assigned!"); + public void resetValidationDataContext() { + validationContext.reset(); } public PersistenceService getService() { return service; } - protected TuttiValidationDataContextSupport validationContext = new TuttiValidationDataContext(this); - - public void resetValidationDataContext() { - validationContext.reset(); - } - public TuttiValidationDataContextSupport getValidationContext() { return validationContext; } @@ -1036,4 +978,20 @@ public class TuttiDataContext extends AbstractBean implements Closeable { Preconditions.checkNotNull(validationContext, "cant set a null validation context"); this.validationContext = validationContext; } + + protected void checkOpened() { + Preconditions.checkState(service != null, "No persistence service assigned!"); + } + + public void closeCruiseCache() { + if (!isCruiseCacheLoaded()) { + return; + } + if (log.isInfoEnabled()) { + log.info("Close cruise cache: " + cruiseCache); + } + + cruiseCache.close(); + cruiseCache = null; + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java index 55f1086..71e144e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java @@ -27,6 +27,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import fr.ifremer.tutti.TuttiConfiguration; import fr.ifremer.tutti.ichtyometer.feed.FeedReader; +import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.service.ClosedPersistenceService; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; @@ -56,6 +57,7 @@ import fr.ifremer.tutti.service.referential.ReferentialTemporarySpeciesService; import fr.ifremer.tutti.service.referential.ReferentialTemporaryVesselService; import fr.ifremer.tutti.service.referential.TuttiReferentialSynchronizeService; import fr.ifremer.tutti.service.report.ReportGenerationService; +import fr.ifremer.tutti.service.sampling.CruiseCacheLoader; import fr.ifremer.tutti.ui.swing.content.MainUI; import fr.ifremer.tutti.ui.swing.updater.DeleteHelper; import fr.ifremer.tutti.ui.swing.util.SoundEngine; @@ -526,7 +528,7 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage } catch (Exception eee) { log.error("Failed to load help mapping file at '" + - mappingProperties + "'", eee); + mappingProperties + "'", eee); } if (log.isInfoEnabled()) { log.info(String.format("Starts help with locale at [%s]", @@ -850,6 +852,16 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage } + public CruiseCacheLoader createCruiseCacheLoader(ProgressionModel progressionModel) { + + return CruiseCacheLoader.newCacheLoader(getPersistenceService(), + getDecoratorService(), + progressionModel, + getDataContext().getProtocol(), + getCruiseId()); + + } + //------------------------------------------------------------------------// //-- Db methods --// //------------------------------------------------------------------------// @@ -883,8 +895,8 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage protected void saveContextToConfig() { if (log.isInfoEnabled()) { log.info("Save config (programId: " + getProgramId() + ", cruiseId: " + - getCruiseId() + ", protocolId: " + getProtocolId() + ", locale: " + - getLocale() + ")"); + getCruiseId() + ", protocolId: " + getProtocolId() + ", locale: " + + getLocale() + ")"); } config.setProgramId(getProgramId()); config.setCruiseId(getCruiseId()); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.