Author: bleny Date: 2014-08-13 14:27:30 +0200 (Wed, 13 Aug 2014) New Revision: 2213 Url: http://forge.codelutin.com/projects/wao/repository/revisions/2213 Log: Ajout d'un cache pour les contactsFilterValues Added: branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValuesCacheKey.java Modified: branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java branches/wao-4.0.x/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoApplicationContext.java branches/wao-4.0.x/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java Modified: branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java =================================================================== --- branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java 2014-08-13 12:07:39 UTC (rev 2212) +++ branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java 2014-08-13 12:27:30 UTC (rev 2213) @@ -28,6 +28,8 @@ 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.ContactsFilterValues; +import fr.ifremer.wao.services.service.ContactsFilterValuesCacheKey; import fr.ifremer.wao.services.service.SamplingPlan; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import fr.ifremer.wao.services.service.Synthesis; @@ -128,4 +130,9 @@ public Cache<ContactsFilter, Synthesis> getSynthesesCache() { return waoApplicationContext.getSynthesesCache(); } + + @Override + public Cache<ContactsFilterValuesCacheKey, ContactsFilterValues> getContactsFilterValuesCache() { + return waoApplicationContext.getContactsFilterValuesCache(); + } } Modified: branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java =================================================================== --- branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java 2014-08-13 12:07:39 UTC (rev 2212) +++ branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java 2014-08-13 12:27:30 UTC (rev 2213) @@ -27,6 +27,8 @@ 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.ContactsFilterValues; +import fr.ifremer.wao.services.service.ContactsFilterValuesCacheKey; import fr.ifremer.wao.services.service.SamplingPlan; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import fr.ifremer.wao.services.service.Synthesis; @@ -60,6 +62,8 @@ Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> getBoatsFilterValuesCache(); + Cache<ContactsFilterValuesCacheKey, ContactsFilterValues> getContactsFilterValuesCache(); + Cache<ContactsFilter, Synthesis> getSynthesesCache(); } Modified: branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java =================================================================== --- branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java 2014-08-13 12:07:39 UTC (rev 2212) +++ branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java 2014-08-13 12:27:30 UTC (rev 2213) @@ -27,6 +27,8 @@ 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.ContactsFilterValues; +import fr.ifremer.wao.services.service.ContactsFilterValuesCacheKey; import fr.ifremer.wao.services.service.SamplingPlan; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import fr.ifremer.wao.services.service.Synthesis; @@ -60,5 +62,7 @@ Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> getBoatsFilterValuesCache(); + Cache<ContactsFilterValuesCacheKey, ContactsFilterValues> getContactsFilterValuesCache(); + Cache<ContactsFilter,Synthesis> getSynthesesCache(); } Copied: branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValuesCacheKey.java (from rev 2208, branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValuesCacheKey.java) =================================================================== --- branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValuesCacheKey.java (rev 0) +++ branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValuesCacheKey.java 2014-08-13 12:27:30 UTC (rev 2213) @@ -0,0 +1,66 @@ +package fr.ifremer.wao.services.service; + +/* + * #%L + * Wao :: Services + * %% + * Copyright (C) 2009 - 2014 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import fr.ifremer.wao.ContactsFilter; +import fr.ifremer.wao.entity.ObsProgram; + +import java.io.Serializable; +import java.util.Locale; + +public class ContactsFilterValuesCacheKey implements Serializable { + + protected Locale locale; + + protected ObsProgram obsProgram; + + protected Optional<String> optionalCompanyId; + + protected ContactsFilter contactsFilter; + + public ContactsFilterValuesCacheKey(Locale locale, ObsProgram obsProgram, Optional<String> optionalCompanyId, ContactsFilter contactsFilter) { + this.locale = locale; + this.obsProgram = obsProgram; + this.optionalCompanyId = optionalCompanyId; + this.contactsFilter = contactsFilter; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ContactsFilterValuesCacheKey that = (ContactsFilterValuesCacheKey) o; + boolean equals = Objects.equal(locale, that.locale) + && Objects.equal(optionalCompanyId, that.optionalCompanyId) + && Objects.equal(obsProgram, that.obsProgram) + && Objects.equal(contactsFilter, that.contactsFilter); + return equals; + } + + @Override + public int hashCode() { + return Objects.hashCode(locale, optionalCompanyId, obsProgram, contactsFilter); + } + +} Modified: branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java =================================================================== --- branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java 2014-08-13 12:07:39 UTC (rev 2212) +++ branches/wao-4.0.x/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java 2014-08-13 12:27:30 UTC (rev 2213) @@ -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.ContactsFilter; import fr.ifremer.wao.WaoTechnicalException; @@ -135,17 +136,33 @@ public ContactsFilterValues getContactsFilterValues(AuthenticatedWaoUser authenticatedWaoUser, ContactsFilter filter) { - ContactTopiaDao dao = getContactDao(); - List<Contact> contacts = dao.findAllForFilterValues(filter); + Locale locale = serviceContext.getLocale(); + ObsProgram obsProgram = authenticatedWaoUser.getObsProgram(); Optional<String> optionalCompanyId = Optional.absent(); if (authenticatedWaoUser.isCoordinatorOrObserver()) { optionalCompanyId = Optional.of(authenticatedWaoUser.getCompany().getTopiaId()); } - ContactsFilterValues contactsFilterValues = new ContactsFilterValues(serviceContext.getLocale(), authenticatedWaoUser.getObsProgram(), optionalCompanyId); - for (Contact contact : contacts) { - contactsFilterValues.addContact(contact); + ContactsFilterValuesCacheKey cacheKey = + new ContactsFilterValuesCacheKey(locale, obsProgram, optionalCompanyId, filter); + + Cache<ContactsFilterValuesCacheKey, ContactsFilterValues> cache = + serviceContext.getContactsFilterValuesCache(); + + ContactsFilterValues contactsFilterValues = cache.getIfPresent(cacheKey); + + if (contactsFilterValues == null) { + + ContactTopiaDao dao = getContactDao(); + List<Contact> contacts = dao.findAllForFilterValues(filter); + + contactsFilterValues = new ContactsFilterValues(locale, obsProgram, optionalCompanyId); + for (Contact contact : contacts) { + contactsFilterValues.addContact(contact); + } + + cache.put(cacheKey, contactsFilterValues); } return contactsFilterValues; Modified: branches/wao-4.0.x/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoApplicationContext.java =================================================================== --- branches/wao-4.0.x/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoApplicationContext.java 2014-08-13 12:07:39 UTC (rev 2212) +++ branches/wao-4.0.x/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoApplicationContext.java 2014-08-13 12:27:30 UTC (rev 2213) @@ -31,6 +31,8 @@ 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.ContactsFilterValues; +import fr.ifremer.wao.services.service.ContactsFilterValuesCacheKey; import fr.ifremer.wao.services.service.InitWaoService; import fr.ifremer.wao.services.service.SamplingPlan; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; @@ -73,6 +75,8 @@ protected Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> boatsFilterValuesCache; + protected Cache<ContactsFilterValuesCacheKey, ContactsFilterValues> contactsFilterValuesCache; + protected Cache<ContactsFilter, Synthesis> synthesisCache; public FakeWaoApplicationContext(String context, boolean initWithReferential) { @@ -283,6 +287,14 @@ } @Override + public Cache<ContactsFilterValuesCacheKey, ContactsFilterValues> getContactsFilterValuesCache() { + if (contactsFilterValuesCache == null) { + contactsFilterValuesCache = CacheBuilder.newBuilder().build(); + } + return contactsFilterValuesCache; + } + + @Override public Cache<ContactsFilter, Synthesis> getSynthesesCache() { if (synthesisCache == null) { synthesisCache = CacheBuilder.newBuilder().build(); Modified: branches/wao-4.0.x/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java =================================================================== --- branches/wao-4.0.x/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java 2014-08-13 12:07:39 UTC (rev 2212) +++ branches/wao-4.0.x/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java 2014-08-13 12:27:30 UTC (rev 2213) @@ -34,11 +34,12 @@ 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.ContactsFilterValues; +import fr.ifremer.wao.services.service.ContactsFilterValuesCacheKey; import fr.ifremer.wao.services.service.InitWaoService; -import fr.ifremer.wao.services.service.ObsMerSamplingPlan; import fr.ifremer.wao.services.service.SamplingPlan; +import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import fr.ifremer.wao.services.service.Synthesis; -import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.LogManager; @@ -74,6 +75,8 @@ protected Cache<ContactsFilter, Synthesis> synthesesCache; + protected Cache<ContactsFilterValuesCacheKey, ContactsFilterValues> contactsFilterValuesCache; + @Override public WaoApplicationConfig getApplicationConfig() { if (applicationConfig == null) { @@ -140,6 +143,14 @@ return synthesesCache; } + @Override + public Cache<ContactsFilterValuesCacheKey, ContactsFilterValues> getContactsFilterValuesCache() { + if (contactsFilterValuesCache == null) { + contactsFilterValuesCache = newCacheBuilder(100).expireAfterWrite(18, TimeUnit.HOURS).build(); + } + return contactsFilterValuesCache; + } + 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);
participants (1)
-
bleny@users.forge.codelutin.com