Author: bleny Date: 2014-06-03 19:06:09 +0200 (Tue, 03 Jun 2014) New Revision: 1989 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1989 Log: refs #4490 introduce cache for boats Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValuesCacheKey.java Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java 2014-06-03 17:05:18 UTC (rev 1988) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java 2014-06-03 17:06:09 UTC (rev 1989) @@ -25,6 +25,8 @@ import fr.ifremer.wao.WaoApplicationConfig; import fr.ifremer.wao.WaoTechnicalException; import fr.ifremer.wao.WaoTopiaPersistenceContext; +import fr.ifremer.wao.services.service.BoatsFilterValues; +import fr.ifremer.wao.services.service.BoatsFilterValuesCacheKey; import fr.ifremer.wao.services.service.ObsMerSamplingPlan; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; @@ -123,4 +125,9 @@ return waoApplicationContext.getSamplingPlansCache(); } + @Override + public Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> getBoatsFilterValuesCache() { + return waoApplicationContext.getBoatsFilterValuesCache(); + } + } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java 2014-06-03 17:05:18 UTC (rev 1988) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java 2014-06-03 17:06:09 UTC (rev 1989) @@ -3,6 +3,8 @@ import com.google.common.cache.Cache; import fr.ifremer.wao.WaoApplicationConfig; import fr.ifremer.wao.WaoTopiaPersistenceContext; +import fr.ifremer.wao.services.service.BoatsFilterValues; +import fr.ifremer.wao.services.service.BoatsFilterValuesCacheKey; import fr.ifremer.wao.services.service.ObsMerSamplingPlan; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; @@ -31,6 +33,8 @@ Cache<SamplingPlanCacheKey,ObsMerSamplingPlan> getSamplingPlansCache(); + Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> getBoatsFilterValuesCache(); + void close(); } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java 2014-06-03 17:05:18 UTC (rev 1988) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java 2014-06-03 17:06:09 UTC (rev 1989) @@ -24,6 +24,8 @@ import com.google.common.cache.Cache; import fr.ifremer.wao.WaoApplicationConfig; import fr.ifremer.wao.WaoTopiaPersistenceContext; +import fr.ifremer.wao.services.service.BoatsFilterValues; +import fr.ifremer.wao.services.service.BoatsFilterValuesCacheKey; import fr.ifremer.wao.services.service.ObsMerSamplingPlan; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; @@ -40,8 +42,6 @@ WaoTopiaPersistenceContext getPersistenceContext(); - Cache<SamplingPlanCacheKey, ObsMerSamplingPlan> getSamplingPlansCache(); - Date getNow(); <E extends WaoService> E newService(Class<E> serviceClass); @@ -54,4 +54,8 @@ String newUuid(); + Cache<SamplingPlanCacheKey, ObsMerSamplingPlan> getSamplingPlansCache(); + + Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> getBoatsFilterValuesCache(); + } Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValuesCacheKey.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValuesCacheKey.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValuesCacheKey.java 2014-06-03 17:06:09 UTC (rev 1989) @@ -0,0 +1,40 @@ +package fr.ifremer.wao.services.service; + +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import fr.ifremer.wao.entity.ObsProgram; + +import java.io.Serializable; +import java.util.Locale; + +public class BoatsFilterValuesCacheKey implements Serializable { + + protected final Locale locale; + + protected final ObsProgram obsProgram; + + protected final Optional<String> optionalCompanyId; + + public BoatsFilterValuesCacheKey(Locale locale, ObsProgram obsProgram, Optional<String> optionalCompanyId) { + this.locale = locale; + this.obsProgram = obsProgram; + this.optionalCompanyId = optionalCompanyId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BoatsFilterValuesCacheKey that = (BoatsFilterValuesCacheKey) o; + boolean equals = Objects.equal(locale, that.locale) + && Objects.equal(optionalCompanyId, that.optionalCompanyId) + && Objects.equal(obsProgram, that.obsProgram); + return equals; + } + + @Override + public int hashCode() { + return Objects.hashCode(locale, optionalCompanyId, obsProgram); + } + +} Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-06-03 17:05:18 UTC (rev 1988) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-06-03 17:06:09 UTC (rev 1989) @@ -24,6 +24,7 @@ import com.google.common.base.Charsets; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.cache.Cache; import com.google.common.collect.ImmutableSet; import fr.ifremer.wao.BoatsFilter; import fr.ifremer.wao.ContactsFilter; @@ -51,10 +52,8 @@ import java.io.InputStream; import java.util.Collection; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; /** * Created on 4/1/14. @@ -67,30 +66,37 @@ /** Logger. */ private static final Log log = LogFactory.getLog(ObsMerBoatsService.class); - protected static final Map<BoatsFilter, BoatsFilterValues> cache = new HashMap(); - public BoatsFilterValues getBoatsFilterValues(AuthenticatedWaoUser authenticatedWaoUser, BoatsFilter filter) { - BoatsFilterValues boatsFilterValues = cache.get(filter); + Optional<String> optionalCompanyId = Optional.absent(); + if (authenticatedWaoUser.isCoordinatorOrObserver()) { + optionalCompanyId = Optional.of(authenticatedWaoUser.getCompany().getTopiaId()); + } + BoatsFilterValuesCacheKey boatsFilterValuesCacheKey = + new BoatsFilterValuesCacheKey( + serviceContext.getLocale(), + authenticatedWaoUser.getObsProgram(), + optionalCompanyId); + + Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> cache = + serviceContext.getBoatsFilterValuesCache(); + + BoatsFilterValues boatsFilterValues = cache.getIfPresent(boatsFilterValuesCacheKey); + if (boatsFilterValues == null) { BoatTopiaDao dao = getBoatDao(); List<Boat> boats = dao.findAll(filter); - Optional<String> optionalCompanyId = Optional.absent(); - if (authenticatedWaoUser.isCoordinatorOrObserver()) { - optionalCompanyId = Optional.of(authenticatedWaoUser.getCompany().getTopiaId()); - } - boatsFilterValues = new BoatsFilterValues(serviceContext.getLocale(), authenticatedWaoUser.getObsProgram(), optionalCompanyId); for (Boat boat : boats) { boatsFilterValues.addBoat(boat); } - cache.put(filter, boatsFilterValues); + cache.put(boatsFilterValuesCacheKey, boatsFilterValues); } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java 2014-06-03 17:05:18 UTC (rev 1988) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java 2014-06-03 17:06:09 UTC (rev 1989) @@ -943,6 +943,8 @@ commit(); + serviceContext.getBoatsFilterValuesCache().invalidateAll(); + } public void importBoatGroups(InputStream input) throws ImportErrorException { @@ -995,6 +997,8 @@ commit(); + serviceContext.getBoatsFilterValuesCache().invalidateAll(); + } public List<Boat> getBoatsFromImmatriculations(String joinedImmatriculations) throws UnknownBoatImmatriculationsException { 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 17:05:18 UTC (rev 1988) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java 2014-06-03 17:06:09 UTC (rev 1989) @@ -23,7 +23,6 @@ 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; @@ -32,6 +31,8 @@ import fr.ifremer.wao.services.WaoApplicationContext; import fr.ifremer.wao.services.WaoServiceContext; import fr.ifremer.wao.services.WaoWebApplicationContext; +import fr.ifremer.wao.services.service.BoatsFilterValues; +import fr.ifremer.wao.services.service.BoatsFilterValuesCacheKey; import fr.ifremer.wao.services.service.InitWaoService; import fr.ifremer.wao.services.service.ObsMerSamplingPlan; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; @@ -66,6 +67,8 @@ protected Cache<SamplingPlanCacheKey, ObsMerSamplingPlan> samplingPlansCache; + protected Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> boatsFilterValuesCache; + @Override public WaoApplicationConfig getApplicationConfig() { if (applicationConfig == null) { @@ -116,6 +119,14 @@ return samplingPlansCache; } + @Override + public Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> getBoatsFilterValuesCache() { + if (boatsFilterValuesCache == null) { + boatsFilterValuesCache = newCacheBuilder(100).expireAfterAccess(30, TimeUnit.DAYS).build(); + } + return boatsFilterValuesCache; + } + 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); @@ -148,8 +159,8 @@ public void close() { if (log.isInfoEnabled()) { - CacheStats cacheStats = samplingPlansCache.stats(); - log.info("samplingPlansCache stats: " + cacheStats.toString()); + log.info("samplingPlansCache stats: " + samplingPlansCache.stats().toString()); + log.info("boatsFilterValuesCache stats: " + boatsFilterValuesCache.stats().toString()); } if (topiaApplicationContext != null) {