Author: bleny Date: 2014-06-03 18:41:50 +0200 (Tue, 03 Jun 2014) New Revision: 1987 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1987 Log: fixes #4483 cache for sampling plan Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/SampleRowsFilter.java trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfig.java trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfigOption.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/SampleRowsFilter.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/SampleRowsFilter.java 2014-06-03 15:11:41 UTC (rev 1986) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/SampleRowsFilter.java 2014-06-03 16:41:50 UTC (rev 1987) @@ -229,7 +229,14 @@ @Override public int hashCode() { int hashCode = Objects.hashCode(obsProgram); + if (periodFrom != null) { + hashCode = 31 * hashCode + periodFrom.hashCode(); + } + if (periodTo != null) { + hashCode = 31 * hashCode + periodTo.hashCode(); + } hashCode = 31 * hashCode + WaoUtils.collectionHashcode(sampleRowIds); + hashCode = 31 * hashCode + WaoUtils.collectionHashcode(sampleRowIds); hashCode = 31 * hashCode + WaoUtils.collectionHashcode(fishingZoneFacadeNames); hashCode = 31 * hashCode + WaoUtils.collectionHashcode(fishingZoneSectorNames); hashCode = 31 * hashCode + WaoUtils.collectionHashcode(sampleRowCodes); Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfig.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfig.java 2014-06-03 15:11:41 UTC (rev 1986) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfig.java 2014-06-03 16:41:50 UTC (rev 1987) @@ -122,4 +122,9 @@ public String getEmailToUpdateAllegroWallets() { return applicationConfig.getOption(WaoApplicationConfigOption.EMAIL_TO_UPDATE_ALLEGRO_WALLETS.key); } + + public boolean isCachingEnabled() { + boolean isCachingEnabled = applicationConfig.getOptionAsBoolean(WaoApplicationConfigOption.CACHING_ENABLED.key); + return isCachingEnabled; + } } Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfigOption.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfigOption.java 2014-06-03 15:11:41 UTC (rev 1986) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoApplicationConfigOption.java 2014-06-03 16:41:50 UTC (rev 1987) @@ -55,6 +55,11 @@ "Mode développement, court-circuite l'envoi de mail", "true", Boolean.class), + CACHING_ENABLED( + "wao.cachingEnabled", + "Active les caches métiers", + "true", Boolean.class), + LOG_CONFIGURATION_FILE( "logConfigurationFile", "Chemin vers le fichier de configuration des journaux", Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java 2014-06-03 15:11:41 UTC (rev 1986) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java 2014-06-03 16:41:50 UTC (rev 1987) @@ -364,8 +364,28 @@ } commit(); + if (updateSampleRowCommand.isCreation()) { + invalidateCachesForAllSampleRows(); + } else { + invalidateCachesForSampleRow(sampleRow); + } + } + protected void invalidateCachesForAllSampleRows() { + serviceContext.getSamplingPlansCache().invalidateAll(); + } + + protected void invalidateCachesForSampleRow(SampleRow sampleRow) { + Set<SamplingPlanCacheKey> toInvalidate = new HashSet<>(); + Cache<SamplingPlanCacheKey, ObsMerSamplingPlan> samplingPlansCache = serviceContext.getSamplingPlansCache(); + for (Map.Entry<SamplingPlanCacheKey, ObsMerSamplingPlan> entry : samplingPlansCache.asMap().entrySet()) { + entry.getValue().getFilterValues().getSampleRowCodes().contains(sampleRow.getCode()); + toInvalidate.add(entry.getKey()); + } + samplingPlansCache.invalidateAll(); + } + public SampleRow getSampleRow(String sampleRowId) { SampleRow sampleRow = getSampleRowDao().findByTopiaId(sampleRowId); @@ -387,6 +407,8 @@ commit(); + invalidateCachesForSampleRow(sampleRow); + } public List<SampleRow> getSamplingPlanRows(SampleRowsFilter sampleRowsFilter) { @@ -550,6 +572,8 @@ commit(); + invalidateCachesForAllSampleRows(); + } protected ImportModel<SampleRow> newSamplingPlanImportModel(AuthenticatedWaoUser authenticatedWaoUser) { @@ -797,6 +821,9 @@ month.setEstimatedTidesValue(month.getEstimatedTidesValue() + 1); } } + + invalidateCachesForSampleRow(sampleRow); + } public List<SampleRow> getUnfinishedSampleRows(AuthenticatedWaoUser authenticatedWaoUser, String companyId) { Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java 2014-06-03 15:11:41 UTC (rev 1986) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java 2014-06-03 16:41:50 UTC (rev 1987) @@ -23,6 +23,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheStats; import com.opensymphony.xwork2.util.LocalizedTextUtil; import fr.ifremer.wao.WaoApplicationConfig; import fr.ifremer.wao.WaoTopiaApplicationContext; @@ -47,6 +48,7 @@ import java.util.Locale; import java.util.Random; import java.util.UUID; +import java.util.concurrent.TimeUnit; public class DefaultWaoApplicationContext implements WaoApplicationContext { @@ -109,11 +111,20 @@ @Override public Cache<SamplingPlanCacheKey, ObsMerSamplingPlan> getSamplingPlansCache() { if (samplingPlansCache == null) { - samplingPlansCache = CacheBuilder.newBuilder().build(); + samplingPlansCache = newCacheBuilder(100).expireAfterAccess(30, TimeUnit.DAYS).build(); } return samplingPlansCache; } + protected <K, V> CacheBuilder<K, V> newCacheBuilder(int expectedMaximumCacheSize) { + int maximumCacheSize = applicationConfig.isCachingEnabled() ? expectedMaximumCacheSize : 0; + CacheBuilder<K, V> cacheBuilder = (CacheBuilder<K, V>) CacheBuilder.newBuilder().maximumSize(maximumCacheSize); + if (log.isInfoEnabled()) { + cacheBuilder.recordStats(); + } + return cacheBuilder; + } + @Override public WaoTopiaPersistenceContext newPersistenceContext() { @@ -136,6 +147,11 @@ @Override public void close() { + if (log.isInfoEnabled()) { + CacheStats cacheStats = samplingPlansCache.stats(); + log.info("samplingPlansCache stats: " + cacheStats.toString()); + } + if (topiaApplicationContext != null) { topiaApplicationContext.closeContext();