This is an automated email from the git hooks/post-receive script. New commit to branch feature/7017 in repository observe. See http://git.codelutin.com/observe.git commit 46882736c3c9c7ba4db1d2f57fe9eacd775c0f71 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed May 6 11:12:22 2015 +0200 déplacement du cache de référentiels dans le module services-api (refs #7017) --- .../ird/observe/services/ObserveServicesCache.java | 4 +- .../referential/AbstractReferentialCache.java | 42 ++++++++++-- .../main/java/fr/ird/observe/ObserveContext.java | 19 +++++- .../observe/ui/content/ContentUIInitializer.java | 75 ++++++++++------------ 4 files changed, 88 insertions(+), 52 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServicesCache.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServicesCache.java index e642827..ae59dcb 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServicesCache.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServicesCache.java @@ -59,7 +59,7 @@ public class ObserveServicesCache implements Closeable { ObserveService service = ObserveServicesCache.this.factory.newService(key.dataSource, key.serviceType); if (log.isInfoEnabled()) { - log.info("Adding service " + service + "in cache"); + log.info("Adding service " + service + " in cache"); } return service; @@ -139,7 +139,7 @@ public class ObserveServicesCache implements Closeable { for (ServiceKey<? extends ObserveService> serviceKey : keysToRemove) { ObserveService service = map.get(serviceKey); if (log.isInfoEnabled()) { - log.info("Remove service : " + service); + log.info("Removing service from cache: " + service); } } cache.invalidateAll(keysToRemove); diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/ReferentialCache.java b/observe-services-api/src/main/java/fr/ird/observe/services/referential/AbstractReferentialCache.java similarity index 67% rename from observe-swing/src/main/java/fr/ird/observe/ui/content/ReferentialCache.java rename to observe-services-api/src/main/java/fr/ird/observe/services/referential/AbstractReferentialCache.java index 92ea2cc..62a6af3 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/ReferentialCache.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/referential/AbstractReferentialCache.java @@ -1,18 +1,17 @@ -package fr.ird.observe.ui.content; +package fr.ird.observe.services.referential; import com.google.common.base.Preconditions; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import fr.ird.observe.ObserveContext; import fr.ird.observe.ObserveTechnicalException; import fr.ird.observe.entities.referentiel.ReferenceEntity; -import fr.ird.observe.services.referential.ReferentialService; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.concurrent.ExecutionException; @@ -23,19 +22,25 @@ import java.util.concurrent.ExecutionException; * Pour obtenir une liste d'un référentiel, on passe toujours dans cette classe qui gère les modifications de * référentiels. * + * FIXME Il faudrait que avoir une méthode sur ReferentialService qui donne la date de dernière modification d'une liste + * FIXME pour ensuite mettre à jour le cache si besoin (mais pour cela il faut ajouter une colonne sur tous les référentiels) + * * Created on 5/5/15. * * @author Tony Chemit - chemit@codelutin.com * @since 4.0 */ -public class ReferentialCache { +public abstract class AbstractReferentialCache { /** Logger. */ - private static final Log log = LogFactory.getLog(ReferentialCache.class); + private static final Log log = LogFactory.getLog(AbstractReferentialCache.class); protected final LoadingCache<Class<? extends ReferenceEntity>, ReferentialList<? extends ReferenceEntity>> cache; - public ReferentialCache() { + protected abstract ReferentialService getReferentialService(); + + public AbstractReferentialCache() { + this.cache = CacheBuilder.newBuilder().build(new CacheLoader<Class<? extends ReferenceEntity>, ReferentialList<? extends ReferenceEntity>>() { @SuppressWarnings("unchecked") @@ -44,7 +49,7 @@ public class ReferentialCache { Preconditions.checkNotNull(key, "key can't be null"); - ReferentialService service = ObserveContext.get().getService(ReferentialService.class); + ReferentialService service = getReferentialService(); List<? extends ReferenceEntity> list = service.getList(key); if (log.isInfoEnabled()) { @@ -59,6 +64,15 @@ public class ReferentialCache { } + public <R extends ReferenceEntity> boolean isReferentialListUpToDate(Class<R> referentialType, Date timeStamp) { + + ReferentialList<R> referentialList = getReferentialList(referentialType); + Date referentialListTimeStamp = referentialList.getTimeStamp(); + boolean uptodate = timeStamp.after(referentialListTimeStamp); + return uptodate; + + } + @SuppressWarnings("unchecked") public <R extends ReferenceEntity> ReferentialList<R> getReferentialList(Class<R> referentialType) { @@ -74,11 +88,25 @@ public class ReferentialCache { } public void clearEntry(Class<? extends ReferenceEntity> referentialType) { + + ReferentialList<? extends ReferenceEntity> referentialList = getReferentialList(referentialType); + if (log.isInfoEnabled()) { + log.info("Removing from cache: " + referentialList); + } cache.invalidate(referentialType); + } public void clear() { + + Collection<ReferentialList<? extends ReferenceEntity>> referentialLists = cache.asMap().values(); + for (ReferentialList<? extends ReferenceEntity> referentialList : referentialLists) { + if (log.isInfoEnabled()) { + log.info("Removing from cache: " + referentialList); + } + } cache.invalidateAll(); + } public static class ReferentialList<R extends ReferenceEntity> { diff --git a/observe-swing/src/main/java/fr/ird/observe/ObserveContext.java b/observe-swing/src/main/java/fr/ird/observe/ObserveContext.java index e63103e..1f3a606 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ObserveContext.java +++ b/observe-swing/src/main/java/fr/ird/observe/ObserveContext.java @@ -33,6 +33,7 @@ import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.ObserveServiceFactory; import fr.ird.observe.services.ObserveServicesCache; import fr.ird.observe.services.data.OpenableService; +import fr.ird.observe.services.referential.ReferentialService; import fr.ird.observe.ui.ObserveMainUI; import fr.ird.observe.ui.ObserveMainUIHandler; import fr.ird.observe.ui.ObserveUIMode; @@ -51,8 +52,8 @@ import fr.ird.observe.ui.actions.shared.ResetEditUIAction; import fr.ird.observe.ui.actions.shared.SaveEditUIAction; import fr.ird.observe.ui.actions.shared.SelectNodeUIAction; import fr.ird.observe.ui.actions.shared.SelectOpenNodeUIAction; +import fr.ird.observe.services.referential.AbstractReferentialCache; import fr.ird.observe.ui.content.ContentUI; -import fr.ird.observe.ui.content.ReferentialCache; import fr.ird.observe.ui.tree.ObserveTreeHelper; import jaxx.runtime.context.JAXXContextEntryDef; import jaxx.runtime.swing.CardLayout2; @@ -67,6 +68,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import java.awt.Component; import java.util.Arrays; +import java.util.Date; import java.util.List; import static org.nuiton.i18n.I18n.n; @@ -112,7 +114,14 @@ public class ObserveContext extends ObserveApplicationContext { protected final ObserveServicesCache servicesCache = new ObserveServicesCache(serviceFactory); - protected final ReferentialCache referentialCache = new ReferentialCache(); + protected final AbstractReferentialCache referentialCache = new AbstractReferentialCache() { + + @Override + protected ReferentialService getReferentialService() { + return ObserveContext.get().getService(ReferentialService.class); + } + + }; /** * Récupération du contexte applicatif. @@ -255,7 +264,11 @@ public class ObserveContext extends ObserveApplicationContext { return service; } - public static <R extends ReferenceEntity> ReferentialCache.ReferentialList<R> getReferentialList(Class<R> referentialCache) { + public static <R extends ReferenceEntity> boolean isReferentialListUpToDate(Class<R> referentialCache, Date timeStamp) { + return get().referentialCache.isReferentialListUpToDate(referentialCache, timeStamp); + } + + public static <R extends ReferenceEntity> AbstractReferentialCache.ReferentialList<R> getReferentialList(Class<R> referentialCache) { return get().referentialCache.getReferentialList(referentialCache); } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIInitializer.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIInitializer.java index bd78fdd..fb71073 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIInitializer.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIInitializer.java @@ -31,6 +31,7 @@ import fr.ird.observe.db.DataSource; import fr.ird.observe.db.DataSourceException; import fr.ird.observe.entities.referentiel.ReferenceEntities; import fr.ird.observe.entities.referentiel.ReferenceEntity; +import fr.ird.observe.services.referential.AbstractReferentialCache; import fr.ird.observe.ui.UIHelper; import fr.ird.observe.ui.actions.shared.AbstractUIAction; import fr.ird.observe.ui.util.BooleanEditor; @@ -655,7 +656,7 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte if (ReferenceEntity.class.isAssignableFrom(entityClass)) { // On charge la liste depuis le cache de référentiels - ReferentialCache.ReferentialList referentialList = ObserveContext.getReferentialList((Class) entityClass); + AbstractReferentialCache.ReferentialList referentialList = ObserveContext.getReferentialList((Class) entityClass); data = getReferentialList(list, referentialList, false); @@ -710,7 +711,7 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte if (ReferenceEntity.class.isAssignableFrom(entityClass)) { // On charge la liste depuis le cache de référentiels - ReferentialCache.ReferentialList referentialList = ObserveContext.getReferentialList((Class) entityClass); + AbstractReferentialCache.ReferentialList referentialList = ObserveContext.getReferentialList((Class) entityClass); data = getReferentialList(list, referentialList, false); @@ -772,7 +773,7 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte if (referenceEntity) { // On charge la liste depuis le cache de référentiels - ReferentialCache.ReferentialList referentialList = ObserveContext.getReferentialList((Class) entityClass); + AbstractReferentialCache.ReferentialList referentialList = ObserveContext.getReferentialList((Class) entityClass); data = getReferentialList(comboBox, referentialList, true); @@ -814,17 +815,14 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte @SuppressWarnings("unchecked") public static <EE extends ReferenceEntity> void reload(BeanListHeader<EE> list) { - Date timeStamp = (Date) list.getClientProperty(CLIENT_PROPERTY_REFERENTIAL_LIST_TIME_STAMP); - Class<EE> beanType = list.getBeanType(); - ReferentialCache.ReferentialList<EE> referentialList = ObserveContext.getReferentialList(beanType); - - Date lastUpdate = referentialList.getTimeStamp(); + boolean needToReload = needToReloadList(list, beanType); - if (lastUpdate.after(timeStamp)) { + if (needToReload) { // reload list + AbstractReferentialCache.ReferentialList<EE> referentialList = ObserveContext.getReferentialList(beanType); List<EE> data = getReferentialList(list, referentialList, false); if (log.isInfoEnabled()) { @@ -845,12 +843,6 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte } - } else { - - if (log.isInfoEnabled()) { - log.info("Up-to-date entities list: " + referentialList); - } - } } @@ -858,17 +850,14 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte @SuppressWarnings("unchecked") public static <EE extends ReferenceEntity> void reload(FilterableDoubleList<EE> list) { - Date timeStamp = (Date) list.getClientProperty(CLIENT_PROPERTY_REFERENTIAL_LIST_TIME_STAMP); - Class<EE> beanType = list.getBeanType(); - ReferentialCache.ReferentialList<EE> referentialList = ObserveContext.getReferentialList(beanType); - - Date lastUpdate = referentialList.getTimeStamp(); + boolean needToReload = needToReloadList(list, beanType); - if (lastUpdate.after(timeStamp)) { + if (needToReload) { // reload list + AbstractReferentialCache.ReferentialList<EE> referentialList = ObserveContext.getReferentialList(beanType); List<EE> data = getReferentialList(list, referentialList, false); if (log.isInfoEnabled()) { @@ -888,12 +877,6 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte // reselect it list.setSelected(selectedValues); - } else { - - if (log.isInfoEnabled()) { - log.info("Up-to-date entities list: " + referentialList); - } - } } @@ -901,17 +884,14 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte @SuppressWarnings("unchecked") public static <EE extends ReferenceEntity> void reload(BeanComboBox<EE> comboBox) { - Date timeStamp = (Date) comboBox.getClientProperty(CLIENT_PROPERTY_REFERENTIAL_LIST_TIME_STAMP); - Class<EE> beanType = comboBox.getBeanType(); - ReferentialCache.ReferentialList<EE> referentialList = ObserveContext.getReferentialList(beanType); - - Date lastUpdate = referentialList.getTimeStamp(); + boolean needToReload = needToReloadList(comboBox, beanType); - if (lastUpdate.after(timeStamp)) { + if (needToReload) { // reload list + AbstractReferentialCache.ReferentialList<EE> referentialList = ObserveContext.getReferentialList(beanType); List<EE> data = getReferentialList(comboBox, referentialList, true); if (log.isInfoEnabled()) { @@ -935,18 +915,12 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte } } - } else { - - if (log.isInfoEnabled()) { - log.info("Up-to-date entities list: " + referentialList); - } - } } @SuppressWarnings("unchecked") - public static <EE extends ReferenceEntity> List<EE> getReferentialList(JComponent component, ReferentialCache.ReferentialList<EE> referentialList, boolean removeObsolete) { + public static <EE extends ReferenceEntity> List<EE> getReferentialList(JComponent component, AbstractReferentialCache.ReferentialList<EE> referentialList, boolean removeObsolete) { List<EE> data = new ArrayList<EE>(referentialList.getData()); @@ -973,4 +947,25 @@ public class ContentUIInitializer<E extends TopiaEntity, UI extends ObserveConte } + protected static <EE extends ReferenceEntity> boolean needToReloadList(JComponent component,Class<EE> beanType ) { + + Date timeStamp = (Date) component.getClientProperty(CLIENT_PROPERTY_REFERENTIAL_LIST_TIME_STAMP); + + boolean uptodate = ObserveContext.isReferentialListUpToDate(beanType, timeStamp); + + if (uptodate) { + + if (log.isDebugEnabled()) { + + AbstractReferentialCache.ReferentialList<EE> referentialList = ObserveContext.getReferentialList(beanType); + log.debug("Up-to-date entities list: " + referentialList); + + } + + } + + return !uptodate; + + } + } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.