This is an automated email from the git hooks/post-receive script. New commit to branch feature/refactor_reference in repository observe. See http://git.codelutin.com/observe.git commit 215eb149dd1487f157b0eaa8b7409d3a637361dc Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Nov 19 11:09:48 2015 +0100 Mise en place du cache de réferentiels et intégration dans l'application swing --- .../fr/ird/observe/db/ObserveReferentialCache.java | 117 +++++++++++++++------ .../fr/ird/observe/db/ObserveSwingDataSource.java | 41 ++++++++ 2 files changed, 128 insertions(+), 30 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveReferentialCache.java b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveReferentialCache.java index 0a7c8b3..559b4c0 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveReferentialCache.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveReferentialCache.java @@ -1,9 +1,18 @@ package fr.ird.observe.db; +import com.google.common.collect.ImmutableMap; import fr.ird.observe.services.dto.ReferenceSetDto; -import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.reference.ObserveReferenceSet; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetResult; +import fr.ird.observe.services.dto.reference.ObserveReferentialReference; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestDefinition; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestDefinitions; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestKeyDefinition; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import java.io.Closeable; +import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; @@ -14,43 +23,91 @@ import java.util.Map; */ public class ObserveReferentialCache implements Closeable { - private final Map<ObserveReferentialCacheKey<?>, ReferenceSetDto> cache; + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveReferentialCache.class); + + private final Map<ObserveReferenceSetRequestKeyDefinition<?>, ReferenceSetDto<?>> cache; public ObserveReferentialCache() { this.cache = new LinkedHashMap<>(); } - public <D extends ReferentialDto> ReferenceSetDto<D> getReferenceSet(ObserveSwingDataSource dataSource, Class<D> type, String optionalContext) { + /** + * Pour récupérer les dates de dernières mises à jour des ensembles de références utiliées par la requète. + * + * @param requestName le nom de la requète + * @return le dictionnaire des dates de dernières mises à jour pour chaque ensemble de référentiels + */ + public ImmutableMap<String, Date> getLastUpdateDates(String requestName) { + + ObserveReferenceSetRequestDefinition requestDefinition = ObserveReferenceSetRequestDefinitions.get(requestName); + + ImmutableMap.Builder<String, Date> builder = ImmutableMap.builder(); + + for (ObserveReferenceSetRequestKeyDefinition requestKeyDefinition : requestDefinition.getKeys()) { + + ReferenceSetDto<?> referenceSetDto = cache.get(requestKeyDefinition); + if (referenceSetDto != null) { + Date lastUpdate = referenceSetDto.getLastUpdate(); + builder.put(requestKeyDefinition.getName(), lastUpdate); + } + + } + + return builder.build(); - ObserveReferentialCacheKey<D> referentialCacheKey = ObserveReferentialCacheKey.of(type, optionalContext); - ReferenceSetDto<D> result = getReferenceSet0(dataSource, referentialCacheKey); - return result; } - protected <D extends ReferentialDto> ReferenceSetDto<D> getReferenceSet0(ObserveSwingDataSource dataSource, ObserveReferentialCacheKey<D> key) { - - ReferenceSetDto<D> result=null; -// if (cache.containsKey(key)) { -// result = cache.get(key); -// -// Date lastUpdate = result.getLastUpdate(); -// -// ReferenceSetService referentialService = dataSource.newService(ReferenceSetService.class); -// ReferenceSetDto<D> update = referentialService.getReferentialReferenceSetIfModify(key.getType(), key.getContext().orNull(), lastUpdate); -// if (update != null) { -// result = update; -// cache.remove(key); -// cache.put(key, update); -// } -// -// } else { -// -// ReferentialService referentialService = dataSource.newService(ReferenceSetService.class); -// result = referentialService.getReferentialReferenceSet(key.getType(), key.getContext().orNull()); -// cache.put(key, result); -// -// } - return result; + /** + * Pour récupérer les ensembles de référentiels à partir du résultat d'une requète. + * + * Le cache sera mis à jour si nécessaire avec les données entrantes. + * + * @param referenceSetResult le résultat de la requète de demande d'ensemble de référentiels + * @return le dictionnaire des ensembles de référentiels complêt + */ + public ImmutableMap<String, ReferenceSetDto<?>> loadReferenceSets(ObserveReferenceSetResult<ObserveReferentialReference> referenceSetResult) { + + ObserveReferenceSetRequestDefinition requestDefinition = ObserveReferenceSetRequestDefinitions.get(referenceSetResult.getRequestName()); + + ImmutableMap.Builder<String, ReferenceSetDto<?>> builder = ImmutableMap.builder(); + + // Les référentiels mis à jour via la requète + ImmutableMap<String, ObserveReferenceSet<?, ObserveReferentialReference>> referenceSets = referenceSetResult.getReferenceSets(); + + for (ObserveReferenceSetRequestKeyDefinition requestKeyDefinition : requestDefinition.getKeys()) { + + ReferenceSetDto<?> referenceSetDto; + + String requestKeyDefinitionName = requestKeyDefinition.getName(); + ObserveReferenceSet<?, ObserveReferentialReference> referenceSet = referenceSets.get(requestKeyDefinitionName); + + if (referenceSet != null) { + + // on met à jour le cache avec les données entrantes + referenceSetDto = referenceSet.toReferenceSetDto(requestKeyDefinitionName); + cache.put(requestKeyDefinition, referenceSetDto); + + if (log.isInfoEnabled()) { + log.info("Update cache entry for " + requestKeyDefinition); + } + + } else { + + // on récupère du cache, rien n'a changé pour cette entrée + referenceSetDto = cache.get(requestKeyDefinition); + + if (log.isInfoEnabled()) { + log.info("Get cache entry for " + requestKeyDefinition); + } + + } + + builder.put(requestKeyDefinitionName, referenceSetDto); + + } + + return builder.build(); } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java index b6a486d..a5c57ed 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java @@ -2,6 +2,8 @@ package fr.ird.observe.db; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; import fr.ird.observe.ObserveSwingApplicationContext; import fr.ird.observe.configuration.ObserveSwingApplicationConfig; import fr.ird.observe.db.event.ObserveSwingDataSourceEvent; @@ -19,13 +21,19 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; +import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.services.dto.ObserveDbUserDto; +import fr.ird.observe.services.dto.ReferenceSetDto; import fr.ird.observe.services.dto.constants.ReferentialLocale; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetRequest; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetResult; +import fr.ird.observe.services.dto.reference.ObserveReferentialReference; import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; +import fr.ird.observe.services.service.ReferenceSetService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.beans.AbstractSerializableBean; @@ -35,6 +43,9 @@ import javax.swing.JOptionPane; import javax.swing.event.EventListenerList; import java.io.Closeable; import java.io.File; +import java.util.Collection; +import java.util.Date; +import java.util.LinkedHashSet; import java.util.Locale; import java.util.Set; @@ -54,11 +65,14 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements protected final ObserveDataSourceConfiguration configuration; + protected final ObserveReferentialCache referentialCache; + protected ObserveDataSourceConnection connection; public ObserveSwingDataSource(ObserveDataSourceConfiguration configuration) { this.configuration = configuration; this.listenerList = new EventListenerList(); + this.referentialCache = new ObserveReferentialCache(); } public ObserveDataSourceConfiguration getConfiguration() { @@ -160,6 +174,8 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements fireNewMessage(t("observe.storage.message.closing", getLabel())); fireClosing(); + referentialCache.close(); + DataSourceService dataSourceService = newService(DataSourceService.class); dataSourceService.close(); @@ -178,6 +194,8 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements fireNewMessage(t("observe.storage.message.destroying", getLabel())); fireClosing(); + referentialCache.close(); + DataSourceService dataSourceService = newService(DataSourceService.class); dataSourceService.destroy(); @@ -246,6 +264,29 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements } + public ImmutableMap<String, ReferenceSetDto<?>> loadReferentialReferenceSets(FormDto<?> formDto) { + + ReferenceSetService referenceSetService = newService(ReferenceSetService.class); + + String requestName = formDto.getReferentialReferenceSetRequestName(); + + ImmutableMap<String, Date> lastUpdateDates = referentialCache.getLastUpdateDates(requestName); + + ObserveReferenceSetRequest request = new ObserveReferenceSetRequest(); + request.setRequestName(requestName); + request.setLastUpdateDates(lastUpdateDates); + + ObserveReferenceSetResult<ObserveReferentialReference> referenceSetResult = referenceSetService.loadReferentialReferenceSets(request); + + ImmutableMap<String, ReferenceSetDto<?>> referenceSets = referentialCache.loadReferenceSets(referenceSetResult); + + LinkedHashSet<ReferenceSetDto<?>> values = Sets.newLinkedHashSet(referenceSets.values()); + formDto.setLabels((Collection) values); + + return referenceSets; + + } + public boolean isOpen() { return connection != null; } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.