Author: bleny Date: 2014-06-05 10:42:00 +0200 (Thu, 05 Jun 2014) New Revision: 1996 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1996 Log: add cache for synthesis Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 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/ObsMerContactsService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSynthesis.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoApplicationContext.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/CacheInvalidationTopiaEntityListener.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-06-05 07:37:37 UTC (rev 1995) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -33,6 +33,7 @@ import org.nuiton.topia.persistence.HqlAndParametersBuilder; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; +import org.nuiton.topia.persistence.TopiaQueryBuilderRunQueryStep; import org.nuiton.topia.persistence.pager.TopiaPagerBean; import org.nuiton.util.PagerBeanUtil; @@ -52,8 +53,10 @@ private static final Log log = LogFactory.getLog(ContactTopiaDao.class); - public List<Contact> findAll(ContactsFilter filter, boolean sort) { + public static final String ALIAS = "c"; + public TopiaQueryBuilderRunQueryStep<Contact> forFilter(ContactsFilter filter, boolean sort) { + HqlAndParametersBuilder<Contact> query = toContactHqlAndParametersBuilder(filter); if (sort) { @@ -64,28 +67,17 @@ } } - List<Contact> all = findAll(query.getHql(), query.getHqlParameters()); + return forHql(query.getHql(), query.getHqlParameters()); - return all; - } - public List<Contact> find(ContactsFilter filter, TopiaPagerBean pager) { + public List<String> getSampleRowsIds(ContactsFilter filter) { HqlAndParametersBuilder<Contact> query = toContactHqlAndParametersBuilder(filter); - // Note: pager alrady contains the sort - List<Contact> boats = find(query.getHql(), query.getHqlParameters(), pager); - return boats; - } + List<String> sampleRowIds = findAll("select " + ALIAS + ".sampleRow.topiaId " + query.getHql(), query.getHqlParameters()); - public long count(ContactsFilter filter) { - - HqlAndParametersBuilder<Contact> query = toContactHqlAndParametersBuilder(filter); - - long count = count("select count(topiaId) " + query.getHql(), query.getHqlParameters()); - - return count; + return sampleRowIds; } public TopiaPagerBean newPager(ContactsFilter filter, @@ -111,7 +103,7 @@ HqlAndParametersBuilder<Contact> query = newHqlAndParametersBuilder(); - query.setAlias("c"); + query.setAlias(ALIAS); if (filter.getSampleRowFilter().isFilled()) { SampleRowTopiaDao sampleRowTopiaDao = 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-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/DefaultWaoServiceContext.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -22,12 +22,14 @@ */ import com.google.common.cache.Cache; +import fr.ifremer.wao.ContactsFilter; 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.ObsMerSynthesis; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import java.lang.reflect.Constructor; @@ -130,4 +132,8 @@ return waoApplicationContext.getBoatsFilterValuesCache(); } + @Override + public Cache<ContactsFilter, ObsMerSynthesis> getSynthesesCache() { + return waoApplicationContext.getSynthesesCache(); + } } 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-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoApplicationContext.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -1,11 +1,13 @@ package fr.ifremer.wao.services; import com.google.common.cache.Cache; +import fr.ifremer.wao.ContactsFilter; 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.ObsMerSynthesis; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import java.util.Date; @@ -31,10 +33,12 @@ WaoWebApplicationContext getWebApplicationContext(); + void close(); + Cache<SamplingPlanCacheKey,ObsMerSamplingPlan> getSamplingPlansCache(); Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> getBoatsFilterValuesCache(); - void close(); + Cache<ContactsFilter, ObsMerSynthesis> getSynthesesCache(); } 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-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/WaoServiceContext.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -22,11 +22,13 @@ */ import com.google.common.cache.Cache; +import fr.ifremer.wao.ContactsFilter; 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.ObsMerSynthesis; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import java.util.Date; @@ -58,4 +60,5 @@ Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> getBoatsFilterValuesCache(); + Cache<ContactsFilter,ObsMerSynthesis> getSynthesesCache(); } 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-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -191,7 +191,7 @@ filter.getSampleRowFilter().setObsProgram(obsProgram); filter.getBoatFilter().setBoatIds(ImmutableSet.of(boatId)); filter.getSampleRowFilter().setCompanyIds(ImmutableSet.of(companyId)); - long contactsCount = getContactDao().count(filter); + long contactsCount = getContactDao().forFilter(filter, false).count(); Date now = serviceContext.getNow(); @@ -251,16 +251,16 @@ ContactTopiaDao dao = getContactDao(); - long contactsCount = dao.count(filter); + long contactsCount = dao.forFilter(filter, false).count(); filter.getSampleRowFilter().setCompanyIds(ImmutableSet.of(companyId)); - long contactsCompanyCount = dao.count(filter); + long contactsCompanyCount = dao.forFilter(filter, false).count(); filter.setContactStates(ImmutableSet.of(ContactState.OBSERVATION_DONE)); - long observationsCompanyCount = dao.count(filter); + long observationsCompanyCount = dao.forFilter(filter, false).count(); filter.getSampleRowFilter().setCompanyIds(null); - long observationsCount = dao.count(filter); + long observationsCount = dao.forFilter(filter, false).count(); Preconditions.checkState(contactsCompanyCount <= contactsCount); Preconditions.checkState(observationsCount <= contactsCount); Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java 2014-06-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -91,7 +91,7 @@ public ContactsFilterValues getContactsFilterValues(AuthenticatedWaoUser authenticatedWaoUser, ContactsFilter filter) { ContactTopiaDao dao = getContactDao(); - List<Contact> contacts = dao.findAll(filter, false); + List<Contact> contacts = dao.forFilter(filter, false).findAll(); Optional<String> optionalCompanyId = Optional.absent(); if (authenticatedWaoUser.isCoordinatorOrObserver()) { @@ -116,7 +116,7 @@ queryPager.getPageSize(), queryPager.getPageIndex()); - List<Contact> contacts = dao.find(filter, pager); + List<Contact> contacts = dao.forFilter(filter, false).find(pager); PaginationBean paginationBean = new PaginationBean(pager, 10); @@ -228,7 +228,7 @@ public InputStream exportContacts(ContactsFilter filter) { ContactTopiaDao dao = getContactDao(); - List<Contact> contacts = dao.findAll(filter, true); + List<Contact> contacts = dao.forFilter(filter, true).findAll(); ExportModel<Contact> exportModel = ObsMerContactImportExportModel.forExport(getLocale(), filter.getSampleRowFilter().getObsProgram()); 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-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -677,7 +677,7 @@ // on exclue les contacts invalidés par la société contactFilter.setCompanyAcceptations(Sets.newHashSet(true, null)); - Collection<Contact> contacts = getContactDao().findAll(contactFilter, false); + Collection<Contact> contacts = getContactDao().forFilter(contactFilter, false).findAll(); final double minutesPerDay = 24 * 60; // Pour calculer le temps passé, on prend pour chaque observation @@ -774,7 +774,7 @@ // on exclue les contacts invalidés par la société contactFilter.setCompanyAcceptations(Sets.newHashSet(true, null)); - Collection<Contact> contacts = getContactDao().findAll(contactFilter, false); + Collection<Contact> contacts = getContactDao().forFilter(contactFilter, false).findAll(); //---- // Recalcul des tides Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSynthesis.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSynthesis.java 2014-06-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSynthesis.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -4,6 +4,7 @@ import fr.ifremer.wao.services.utils.BarChartData; import java.util.Map; +import java.util.Set; public class ObsMerSynthesis { @@ -23,6 +24,8 @@ protected Map<String, Double> complianceBoardingIndicator; + protected Set<String> sampleRowIds; + public BarChartData getExpectedVsActualObservationsByMonthsBarChartData() { return expectedVsActualObservationsByMonthsBarChartData; } @@ -86,4 +89,12 @@ public Map<String, Double> getComplianceBoardingIndicator() { return complianceBoardingIndicator; } + + public void setSampleRowIds(Set<String> sampleRowIds) { + this.sampleRowIds = sampleRowIds; + } + + public Set<String> getSampleRowIds() { + return sampleRowIds; + } } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java 2014-06-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -1,5 +1,6 @@ package fr.ifremer.wao.services.service; +import com.google.common.cache.Cache; import fr.ifremer.wao.ContactsFilter; import fr.ifremer.wao.WaoUtils; import fr.ifremer.wao.entity.Boat; @@ -17,6 +18,7 @@ import java.util.Calendar; import java.util.Date; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -39,14 +41,28 @@ public ObsMerSynthesis getObsMerSynthesis(ContactsFilter filter) { - ObsMerSynthesis obsMerSynthesis = new ObsMerSynthesis(); + Cache<ContactsFilter, ObsMerSynthesis> cache = serviceContext.getSynthesesCache(); - setExpectedVsActualObservationsByMonthsBarChartData(obsMerSynthesis, filter); + ObsMerSynthesis obsMerSynthesis = cache.getIfPresent(filter); - setBoardingBoatsData(obsMerSynthesis, filter); + if (obsMerSynthesis == null) { - setComplianceBoardingIndicator(obsMerSynthesis, filter); + obsMerSynthesis = new ObsMerSynthesis(); + List<String> sampleRowsIds = getContactDao().getSampleRowsIds(filter); + + obsMerSynthesis.setSampleRowIds(new HashSet<>(sampleRowsIds)); + + setExpectedVsActualObservationsByMonthsBarChartData(obsMerSynthesis, filter); + + setBoardingBoatsData(obsMerSynthesis, filter); + + setComplianceBoardingIndicator(obsMerSynthesis, filter); + + cache.put(filter, obsMerSynthesis); + + } + return obsMerSynthesis; } Modified: trunk/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoApplicationContext.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoApplicationContext.java 2014-06-05 07:37:37 UTC (rev 1995) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/FakeWaoApplicationContext.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -3,6 +3,7 @@ import com.google.common.base.Preconditions; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import fr.ifremer.wao.ContactsFilter; import fr.ifremer.wao.WaoApplicationConfig; import fr.ifremer.wao.WaoTechnicalException; import fr.ifremer.wao.WaoTopiaApplicationContext; @@ -11,6 +12,7 @@ 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.ObsMerSynthesis; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import org.apache.commons.lang3.SystemUtils; import org.apache.commons.logging.Log; @@ -50,6 +52,8 @@ protected Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> boatsFilterValuesCache; + protected Cache<ContactsFilter, ObsMerSynthesis> synthesisCache; + public FakeWaoApplicationContext(String context, boolean initWithReferential) { this.context = context; this.initWithReferential = initWithReferential; @@ -254,4 +258,13 @@ } return boatsFilterValuesCache; } + + @Override + public Cache<ContactsFilter, ObsMerSynthesis> getSynthesesCache() { + if (synthesisCache == null) { + synthesisCache = CacheBuilder.newBuilder().build(); + } + return synthesisCache; + } + } Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/CacheInvalidationTopiaEntityListener.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/CacheInvalidationTopiaEntityListener.java 2014-06-05 07:37:37 UTC (rev 1995) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/CacheInvalidationTopiaEntityListener.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -1,6 +1,7 @@ package fr.ifremer.wao.web; import com.google.common.cache.Cache; +import fr.ifremer.wao.ContactsFilter; import fr.ifremer.wao.entity.Boat; import fr.ifremer.wao.entity.Contact; import fr.ifremer.wao.entity.ElligibleBoat; @@ -8,6 +9,7 @@ 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.ObsMerSynthesis; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; @@ -34,19 +36,27 @@ protected Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> boatsFilterValuesCache; + protected Cache<ContactsFilter, ObsMerSynthesis> synthesesCache; + protected Set<String> dirtySampleRowIds = new HashSet<>(); protected Set<String> dirtyBoatIds = new HashSet<>(); + protected Set<String> dirtyContactIds = new HashSet<>(); + protected boolean invalidateAllSampleRows = false; protected boolean invalidateAllBoats = false; + protected boolean invalidateAllContacts = false; + public CacheInvalidationTopiaEntityListener( Cache<SamplingPlanCacheKey, ObsMerSamplingPlan> samplingPlansCache, - Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> boatsFilterValuesCache) { + Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> boatsFilterValuesCache, + Cache<ContactsFilter, ObsMerSynthesis> synthesesCache) { this.samplingPlansCache = samplingPlansCache; this.boatsFilterValuesCache = boatsFilterValuesCache; + this.synthesesCache = synthesesCache; } @Override @@ -63,6 +73,7 @@ Contact contact = (Contact) entity; dirtyBoatIds.add(contact.getBoat().getTopiaId()); dirtySampleRowIds.add(contact.getSampleRow().getTopiaId()); + invalidateAllContacts = true; } } @@ -76,12 +87,16 @@ TopiaEntity entity = event.getEntity(); if (entity instanceof SampleRow) { dirtySampleRowIds.add(entity.getTopiaId()); + } else if (entity instanceof ElligibleBoat) { + ElligibleBoat elligibleBoat = (ElligibleBoat) entity; + dirtyBoatIds.add(elligibleBoat.getBoat().getTopiaId()); } else if (entity instanceof Boat) { dirtyBoatIds.add(entity.getTopiaId()); } else if (entity instanceof Contact) { Contact contact = (Contact) entity; dirtyBoatIds.add(contact.getBoat().getTopiaId()); dirtySampleRowIds.add(contact.getSampleRow().getTopiaId()); + dirtyContactIds.add(contact.getTopiaId()); } } @@ -94,6 +109,7 @@ Contact contact = (Contact) entity; dirtyBoatIds.add(contact.getBoat().getTopiaId()); dirtySampleRowIds.add(contact.getSampleRow().getTopiaId()); + dirtyContactIds.add(contact.getTopiaId()); } } @@ -104,6 +120,7 @@ } if (invalidateAllSampleRows || dirtySampleRowIds.size() > 20) { samplingPlansCache.invalidateAll(); + synthesesCache.invalidateAll(); } else { Set<SamplingPlanCacheKey> samplingPlansCacheKeysToInvalidate = new HashSet<>(); for (Map.Entry<SamplingPlanCacheKey, ObsMerSamplingPlan> entry : samplingPlansCache.asMap().entrySet()) { @@ -112,6 +129,13 @@ } } samplingPlansCache.invalidateAll(samplingPlansCacheKeysToInvalidate); + Set<ContactsFilter> synthesesCacheKeysToInvalidate = new HashSet<>(); + for (Map.Entry<ContactsFilter, ObsMerSynthesis> entry : synthesesCache.asMap().entrySet()) { + if (CollectionUtils.containsAny(entry.getValue().getSampleRowIds(), dirtySampleRowIds)) { + synthesesCacheKeysToInvalidate.add(entry.getKey()); + } + } + synthesesCache.invalidateAll(synthesesCacheKeysToInvalidate); } if (invalidateAllBoats || dirtyBoatIds.size() > 20) { boatsFilterValuesCache.invalidateAll(); @@ -135,7 +159,9 @@ protected void clear() { dirtySampleRowIds.clear(); dirtyBoatIds.clear(); + dirtyContactIds.clear(); invalidateAllSampleRows = false; invalidateAllBoats = false; + invalidateAllContacts = false; } } 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-05 07:37:37 UTC (rev 1995) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/DefaultWaoApplicationContext.java 2014-06-05 08:42:00 UTC (rev 1996) @@ -24,6 +24,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.opensymphony.xwork2.util.LocalizedTextUtil; +import fr.ifremer.wao.ContactsFilter; import fr.ifremer.wao.WaoApplicationConfig; import fr.ifremer.wao.WaoTopiaApplicationContext; import fr.ifremer.wao.WaoTopiaPersistenceContext; @@ -35,6 +36,7 @@ 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.ObsMerSynthesis; import fr.ifremer.wao.services.service.SamplingPlanCacheKey; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -69,6 +71,8 @@ protected Cache<BoatsFilterValuesCacheKey, BoatsFilterValues> boatsFilterValuesCache; + protected Cache<ContactsFilter, ObsMerSynthesis> synthesesCache; + @Override public WaoApplicationConfig getApplicationConfig() { if (applicationConfig == null) { @@ -127,6 +131,14 @@ return boatsFilterValuesCache; } + @Override + public Cache<ContactsFilter, ObsMerSynthesis> getSynthesesCache() { + if (synthesesCache == null) { + synthesesCache = newCacheBuilder(100).expireAfterAccess(30, TimeUnit.DAYS).build(); + } + return synthesesCache; + } + 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); @@ -142,7 +154,10 @@ WaoTopiaPersistenceContext persistenceContext = getTopiaApplicationContext().newPersistenceContext(); CacheInvalidationTopiaEntityListener cacheInvalidationTopiaEntityListener = - new CacheInvalidationTopiaEntityListener(getSamplingPlansCache(), getBoatsFilterValuesCache()); + new CacheInvalidationTopiaEntityListener( + getSamplingPlansCache(), + getBoatsFilterValuesCache(), + getSynthesesCache()); persistenceContext.getTopiaFiresSupport().addTopiaEntityListener(cacheInvalidationTopiaEntityListener); persistenceContext.getTopiaFiresSupport().addTopiaTransactionListener(cacheInvalidationTopiaEntityListener);