r627 - in trunk: . wikitty-api wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/services wikitty-api/src/main/resources wikitty-api/src/test/java/org/nuiton/wikitty/layers wikitty-api/src/test/java/org/nuiton/wikitty/services
Author: bpoussin Date: 2010-12-19 04:21:36 +0100 (Sun, 19 Dec 2010) New Revision: 627 Url: http://nuiton.org/repositories/revision/wikitty/627 Log: - refactore cache service to permit use of different cache implementation - add new implementation Cache (use JCS) - fix small syntax error in SERVICE stat access option (SERICE) Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCacheJCS.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCacheSimple.java Modified: trunk/pom.xml trunk/wikitty-api/pom.xml trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCache.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAccessStat.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java trunk/wikitty-api/src/main/resources/wikitty-config-sample-client.properties trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties trunk/wikitty-api/src/main/resources/wikitty-config-sample-standalone.properties trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceCachedTest.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceCachedTest.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/pom.xml 2010-12-19 03:21:36 UTC (rev 627) @@ -37,6 +37,13 @@ <dependencyManagement> <dependencies> + <!-- cache implementation --> + <dependency> + <groupId>jcs</groupId> + <artifactId>jcs</artifactId> + <version>1.3</version> + </dependency> + <!-- base64 encoder/decoder used for binary type --> <dependency> <groupId>net.iharder</groupId> Modified: trunk/wikitty-api/pom.xml =================================================================== --- trunk/wikitty-api/pom.xml 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/pom.xml 2010-12-19 03:21:36 UTC (rev 627) @@ -47,6 +47,12 @@ <!-- COMPILE --> + <!-- cache implementation --> + <dependency> + <groupId>jcs</groupId> + <artifactId>jcs</artifactId> + </dependency> + <!-- base64 encoder/decoder used for binary type --> <dependency> <groupId>net.iharder</groupId> Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-19 03:21:36 UTC (rev 627) @@ -34,6 +34,8 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.ApplicationConfig; import org.nuiton.util.ArgumentsParserException; +import org.nuiton.wikitty.services.WikittyCache; +import org.nuiton.wikitty.services.WikittyCacheJCS; import org.nuiton.wikitty.services.WikittyServiceAccessStat.AccessStatStorageWikitty; /** @@ -223,7 +225,12 @@ + " or org.nuiton.wikitty.services.WikittyServiceInMemoryJdbcSolr)"), WikittyServiceInMemory.class.getName(), String.class, false, false), - WIKITTY_WIKITTYSERICEACCESSSTAT_COMPONENTS( + WIKITTY_WIKITTYSERVICECACHED_COMPONENTS( + "wikitty.WikittyServiceCached.components", + _("Indique le composant a utiliser pour le cache"), + WikittyCacheJCS.class.getName(), String.class, false, false), + + WIKITTY_WIKITTYSERVICEACCESSSTAT_COMPONENTS( "wikitty.WikittyServiceAccessStat.components", _("Indique le composant a utiliser pour le stockage des acces"), AccessStatStorageWikitty.class.getName(), String.class, false, false), @@ -314,8 +321,18 @@ WIKITTY_PROXY_TIME_TO_LOG_WARN( "wikitty.proxy.timeToLog.warn", _("maximum time before send log warn with time consumed"), - "1000", Integer.class, false, false); + "1000", Integer.class, false, false), + JCS_DEFAULT( + "jcs.default", + _("jcs auxiliares to use"), + "", String.class, false, false), + + JCS_DEFAULT_CACHEATTRIBUTES_MAXOBJECTS( + "jcs.default.cacheattributes.MaxObjects", + _("jcs maximum number of items allowed in memory"), + "1000", String.class, false, false); + public String key; public String description; public String defaultValue; Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCache.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCache.java 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCache.java 2010-12-19 03:21:36 UTC (rev 627) @@ -1,208 +1,44 @@ -/* - * #%L - * Wikitty :: api - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser 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 Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ - package org.nuiton.wikitty.services; import org.nuiton.wikitty.entities.Wikitty; -import org.nuiton.wikitty.services.WikittyEvent; -import org.nuiton.wikitty.services.WikittyListener; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import org.apache.commons.collections.map.ReferenceMap; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.util.ApplicationConfig; -import org.nuiton.wikitty.WikittyUtil; - /** - * Cette classe sert a introduire du cache dans wikitty. Elle sert a centraliser - * tous les appels au cache pour pouvoir simplement changer de librairie de - * cache si necessaire, meme si pour l'instant on s'appuie le JDK - * + * * @author poussin * @version $Revision$ * * Last update: $Date$ * by : $Author$ */ -public class WikittyCache implements WikittyListener { +public interface WikittyCache { - static private Log log = LogFactory.getLog(WikittyCache.class); - - /** keys are wikitty ids */ - protected Map<String, Wikitty> wikittyCache; - /** - * - * @param config not used currently but necessary in futur to configure the cache - * Create a soft cache. + * Clear all cache. */ - public WikittyCache(ApplicationConfig config) { - this(true); - } + void clearWikitty(); - /** - * Init cache with specific reference type. - * - * @param soft si vrai utilise un cache avec des reference Soft, sinon - * utilise des references static (utile pour les transactions) - */ - public WikittyCache(boolean soft) { - if (soft) { - wikittyCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT); - } else { - wikittyCache = new HashMap<String, Wikitty>(); - } - } + boolean existsWikitty(String id); - public boolean existsWikitty(String id) { - Object o = wikittyCache.get(id); - boolean result = (o != null); - return result; - } - /** * Return wikitty object if is in the cache, null otherwize. - * + * * @param id * @return wikitty object or null */ - public Wikitty getWikitty(String id) { - Wikitty result = wikittyCache.get(id); - return result; - } + Wikitty getWikitty(String id); /** * Only realy put wikitty in cache, if not in cache or version is newer than * one in cache * @param e */ - public void putWikitty(Wikitty e) { - if (e == null) { - return; - } - Wikitty old = getWikitty(e.getId()); - if (old == null - || WikittyUtil.versionGreaterThan(e.getVersion(), old.getVersion())) { - wikittyCache.put(e.getId(), e); + void putWikitty(Wikitty e); - if (log.isTraceEnabled()) { - log.trace("Replace cached wikitty : new version " + e.getVersion() + - " > old version " + (old == null ? null : old.getVersion())); - } - } - else { - if (log.isTraceEnabled()) { - log.trace("Ignoring putWikittyEvent : new version " + e.getVersion() + " < old version " + old.getVersion()); - } - } - } - /** - * batched put - * @param all - */ - public void putAllWikitty(Collection<Wikitty> all) { - for (Wikitty w : all) { - putWikitty(w); - } - } - - /** * Remove wikitty from cache. - * + * * @param id wikitty id to remove */ - public void removeWikitty(String id) { - wikittyCache.remove(id); - } + void removeWikitty(String id); - /** - * batched remove - * @param ids - */ - public void removeAllWikitty(Collection<String> ids) { - for (String id : ids) { - removeWikitty(id); - } - } - - /** - * Clear all cache. - */ - public void clearWikitty() { - wikittyCache.clear(); - } - - /* - * @see org.nuiton.wikitty.WikittyListener#clearWikitty() - */ - @Override - public void clearWikitty(WikittyEvent event) { - clearWikitty(); - } - - /* - * @see org.nuiton.wikitty.WikittyListener#putWikitty(org.nuiton.wikitty.Wikitty[]) - */ - @Override - public void putWikitty(WikittyEvent event) { - Collection<Wikitty> wikitties = event.getWikitties().values(); - putAllWikitty(wikitties); - } - - /* - * @see org.nuiton.wikitty.WikittyListener#removeWikitty(java.lang.String[]) - */ - @Override - public void removeWikitty(WikittyEvent event) { - for (String id : event.getRemoveDate().keySet()) { - removeWikitty(id); - } - } - - /* - * @see org.nuiton.wikitty.WikittyListener#putExtension(org.nuiton.wikitty.WikittyExtension[]) - */ - @Override - public void putExtension(WikittyEvent event) { - - } - - @Override - public void removeExtension(WikittyEvent event) { - - } - - /* - * @see org.nuiton.wikitty.WikittyListener#clearExtension() - */ - @Override - public void clearExtension(WikittyEvent event) { - - } } Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCacheJCS.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCacheJCS.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCacheJCS.java 2010-12-19 03:21:36 UTC (rev 627) @@ -0,0 +1,135 @@ +/* + * #%L + * Wikitty :: api + * + * $Id: WikittyCacheSimple.java 610 2010-12-14 21:41:35Z tchemit $ + * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/wikitty-api/src/main/java/org/nuiton... $ + * %% + * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser 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 Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +package org.nuiton.wikitty.services; + +import org.nuiton.wikitty.entities.Wikitty; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jcs.JCS; +import org.apache.jcs.access.GroupCacheAccess; +import org.apache.jcs.access.exception.CacheException; +import org.apache.jcs.engine.control.CompositeCacheManager; +import org.nuiton.util.ApplicationConfig; +import org.nuiton.wikitty.WikittyException; + +/** + * Implantation du cache base sur le projet apache JCS + * + * @author poussin + * @version $Revision: 610 $ + * + * Last update: $Date: 2010-12-14 22:41:35 +0100 (mar. 14 déc. 2010) $ + * by : $Author: tchemit $ + */ +public class WikittyCacheJCS implements WikittyCache { + + static private Log log = LogFactory.getLog(WikittyCacheJCS.class); + + protected GroupCacheAccess wikittyCache; + + /** + * + * @param config not used currently but necessary in futur to configure the cache + * Create a soft cache. + */ + public WikittyCacheJCS(ApplicationConfig config) { + try { + CompositeCacheManager cacheMgr = CompositeCacheManager.getUnconfiguredInstance(); + cacheMgr.configure(config.getFlatOptions()); + wikittyCache = new GroupCacheAccess(cacheMgr.getCache("wikitty")); + + // JCS ne permet pas de passer un Properties mais seulement un nom de fichier :( +// JCS.setConfigFilename(config.getConfigFileName()); +// wikittyCache = JCS.getInstance("wikitty"); + } catch (Exception eee) { + throw new WikittyException("Can't initialise JCS cache", eee); + } + } + + + @Override + public boolean existsWikitty(String id) { + Object o = wikittyCache.get(id); + boolean result = (o != null); + return result; + } + + /** + * Return wikitty object if is in the cache, null otherwize. + * + * @param id + * @return wikitty object or null + */ + @Override + public Wikitty getWikitty(String id) { + Wikitty result = (Wikitty)wikittyCache.get(id); + return result; + } + + /** + * Only realy put wikitty in cache, if not in cache or version is newer than + * one in cache + * @param e + */ + @Override + public void putWikitty(Wikitty e) { + if (e != null) { + try { + wikittyCache.put(e.getId(), e); + } catch (CacheException eee) { + log.error(String.format("Can't put wikitty %s in cache", e), eee); + } + } + } + + /** + * Remove wikitty from cache. + * + * @param id wikitty id to remove + */ + @Override + public void removeWikitty(String id) { + try { + wikittyCache.remove(id); + } catch (CacheException eee) { + log.error(String.format("Can't remove wikitty %s in cache", id), eee); + } + } + + /** + * Clear all cache. + */ + @Override + public void clearWikitty() { + try { + wikittyCache.clear(); + } catch (CacheException eee) { + log.error(String.format("Can't clear wikitty cache"), eee); + } + } + +} Copied: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCacheSimple.java (from rev 610, trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCache.java) =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCacheSimple.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyCacheSimple.java 2010-12-19 03:21:36 UTC (rev 627) @@ -0,0 +1,127 @@ +/* + * #%L + * Wikitty :: api + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser 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 Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +package org.nuiton.wikitty.services; + +import org.nuiton.wikitty.entities.Wikitty; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.collections.map.ReferenceMap; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.ApplicationConfig; + +/** + * Cette classe sert a introduire du cache dans wikitty. Elle sert a centraliser + * tous les appels au cache pour pouvoir simplement changer de librairie de + * cache si necessaire, meme si pour l'instant on s'appuie le JDK + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyCacheSimple implements WikittyCache { + + static private Log log = LogFactory.getLog(WikittyCacheSimple.class); + + /** keys are wikitty ids */ + protected Map<String, Wikitty> wikittyCache; + + /** + * + * @param config not used currently but necessary in futur to configure the cache + * Create a soft cache. + */ + public WikittyCacheSimple(ApplicationConfig config) { + this(true); + } + + /** + * Init cache with specific reference type. + * + * @param soft si vrai utilise un cache avec des reference Soft, sinon + * utilise des references static (utile pour les transactions) + */ + public WikittyCacheSimple(boolean soft) { + if (soft) { + wikittyCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT); + } else { + wikittyCache = new HashMap<String, Wikitty>(); + } + } + + @Override + public boolean existsWikitty(String id) { + Object o = wikittyCache.get(id); + boolean result = (o != null); + return result; + } + + /** + * Return wikitty object if is in the cache, null otherwize. + * + * @param id + * @return wikitty object or null + */ + @Override + public Wikitty getWikitty(String id) { + Wikitty result = wikittyCache.get(id); + return result; + } + + /** + * Only realy put wikitty in cache, if not in cache or version is newer than + * one in cache + * @param e + */ + @Override + public void putWikitty(Wikitty e) { + if (e != null) { + wikittyCache.put(e.getId(), e); + } + } + + /** + * Remove wikitty from cache. + * + * @param id wikitty id to remove + */ + @Override + public void removeWikitty(String id) { + wikittyCache.remove(id); + } + + /** + * Clear all cache. + */ + @Override + public void clearWikitty() { + wikittyCache.clear(); + } + +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAccessStat.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAccessStat.java 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAccessStat.java 2010-12-19 03:21:36 UTC (rev 627) @@ -84,7 +84,7 @@ if (statStorage == null) { if (log.isWarnEnabled()) { String statSto = config.getOption(WikittyConfig.WikittyOption. - WIKITTY_WIKITTYSERICEACCESSSTAT_COMPONENTS.getKey()); + WIKITTY_WIKITTYSERVICEACCESSSTAT_COMPONENTS.getKey()); log.warn(String.format( "No AccessStatStorage available, access stat can't work (%s)", statSto)); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java 2010-12-19 03:21:36 UTC (rev 627) @@ -45,6 +45,7 @@ import org.nuiton.wikitty.entities.WikittyTreeNode; import org.nuiton.wikitty.WikittyService; import org.nuiton.wikitty.WikittyTree; +import org.nuiton.wikitty.WikittyUtil; /** * Override some method of WikittyService to use cache @@ -63,6 +64,9 @@ /** Cache. */ protected WikittyCache cache = null; + /** pour recevoir les events du serveur et synchroniser le cache */ + protected RemoteWikittyListener remoteWikittyListener; + /** Delegated wikitty service implementation. */ protected WikittyService ws; @@ -89,67 +93,153 @@ * @param ws delegate service * @param props properties (can be null) */ - public WikittyServiceCached(ApplicationConfig config, WikittyService ws) { + public WikittyServiceCached(ApplicationConfig config, WikittyService ws, WikittyCache cache) { this.ws = ws; - cache = new WikittyCache(config); + this.cache = cache; + if (cache == null) { + if (log.isWarnEnabled()) { + String cacheClassName = config.getOption(WikittyConfig.WikittyOption. + WIKITTY_WIKITTYSERVICECACHED_COMPONENTS.getKey()); + log.warn(String.format( + "No cache class implementation available (%s), use simple cache", + cacheClassName)); + } + this.cache = new WikittyCacheSimple(config); + } + + // add service listener for synchronisation listener for remote event // register all time, but perhaps Notifier service don't listen for // remote event and cache can't be notified. But this is normal // behavior try { - addWikittyServiceListener(cache, ServiceListenerType.REMOTE); + remoteWikittyListener = new RemoteWikittyListener(this); + addWikittyServiceListener( + remoteWikittyListener, ServiceListenerType.REMOTE); } catch(UnsupportedOperationException eee) { - log.info("no WikittyServiceNotifier available, cache don't listen event"); + log.warn("no WikittyServiceNotifier available, cache don't listen event"); } if (config != null) { // reading configuration and set allwaysRestoreCopies accordingly allwaysRestoreCopies = - config.getOptionAsBoolean(WikittyConfig.WikittyOption.WIKITTY_CACHE_RESTORE_COPIES.getKey()); + config.getOptionAsBoolean( + WikittyConfig.WikittyOption.WIKITTY_CACHE_RESTORE_COPIES.getKey()); } } protected void statAdd(int asked, int missed) { this.asked += asked; this.missed += missed; - if(log.isDebugEnabled() || true) { +// if(log.isDebugEnabled()) { String total = StringUtil.convertMemory(Runtime.getRuntime().totalMemory()); String free = StringUtil.convertMemory(Runtime.getRuntime().freeMemory()); String msg = String.format("cache stat (missed/asked): %s/%s (memory %s/%s [total/free])", this.missed, this.asked, total, free); log.debug(msg); - } + System.out.println(msg); +// } } /** wrap the wikitty or copy it according to allwaysRestoreCopies value */ protected Wikitty wrapWikitty(Wikitty wikitty) { + Wikitty result = null; // Restored wikitty can be null - if (wikitty == null) { - return null; + if (wikitty != null) { + if (allwaysRestoreCopies) { + try { + result = wikitty.clone(); + } catch (CloneNotSupportedException eee) { + // si on arrive pas a faire un clone, on retourne null + // comme si l'objet n'etait pas dans le cache, pour que + // l'application fonctionne tout de meme mais en mode + // degrade (sans cache) + log.error(String.format( + "Cache doesn't work, unable to clone %s", wikitty), eee); + } + } else { + // normalement, on a que des WikittyImpl ici, mais on fait + // un petit check pour etre sur qu'on ne wrap pas un object wrappe + if (wikitty instanceof WikittyCopyOnWrite) { + wikitty = ((WikittyCopyOnWrite)wikitty).getTarget(); + } + result = new WikittyCopyOnWrite(wikitty); + } } + return result; + } - Wikitty result = null; - if (allwaysRestoreCopies) { - try { - result = wikitty.clone(); - } catch (CloneNotSupportedException e) { - log.error("unable to clone " + wikitty, e); + // + // seulement les methodes suivantes doivent acceder au cache pour centraliser + // son access + // + + protected void clearCache() { + cache.clearWikitty(); + } + + /** + * Only WikittyImpl can be put in real cache implementation. If argument + * is WikittyCopyOnWrite, we must take internal wikitty to put in cache + */ + protected void putInCache(Wikitty w) { + if (w != null) { + if (w instanceof WikittyCopyOnWrite) { + w = ((WikittyCopyOnWrite) w).getTarget(); } + + Wikitty old = getFromCache(w.getId()); + if (old == null + || WikittyUtil.versionGreaterThan(w.getVersion(), old.getVersion())) { + cache.putWikitty(w); + + if (log.isTraceEnabled()) { + log.trace("Replace cached wikitty : new version " + w.getVersion() + + " > old version " + (old == null ? null : old.getVersion())); + } + } else { + if (log.isTraceEnabled()) { + log.trace(String.format( + "Ignoring putWikittyEvent : new version %s < old version %s", + w.getVersion(), old.getVersion())); + } + } } - - // if allwaysRestoreCopies is false and above clone failed - if (result == null) { - result = new WikittyCopyOnWrite(wikitty); + } + + protected void putInCache(Collection<Wikitty> wikitties) { + for (Wikitty w : wikitties) { + putInCache(w); } + } + protected void removeInCache(String id) { + cache.removeWikitty(id); + } + + protected void removeInCache(Collection<String> ids) { + for (String id : ids) { + removeInCache(id); + } + } + + protected Wikitty getFromCache(String id) { + Wikitty result = cache.getWikitty(id); + + // all time wrap, inly WikittyImpl are in cache + result = wrapWikitty(result); return result; } + + // + // surcharge des methodes du WikittyService + // @Override public WikittyEvent clear(String securityToken) { WikittyEvent result = ws.clear(securityToken); - cache.clearWikitty(); + clearCache(); return result; } @@ -160,7 +250,7 @@ @Override public WikittyEvent delete(String securityToken, Collection<String> ids) { WikittyEvent result = ws.delete(securityToken, ids); - cache.removeAllWikitty(ids); + removeInCache(ids); return result; } @@ -232,7 +322,7 @@ LinkedHashMap<String, Wikitty> fromCache = new LinkedHashMap<String, Wikitty>(); for (String id : ids) { - Wikitty w = cache.getWikitty(id); + Wikitty w = getFromCache(id); fromCache.put(id, w); // put all to maintains order if (w == null) { // if not found on cache, ask the server notInCache.add(id); @@ -242,7 +332,7 @@ // retrieve missing object List<Wikitty> missingInCache = ws.restore(securityToken, notInCache); - cache.putAllWikitty(missingInCache); + putInCache(missingInCache); for (Wikitty w : missingInCache) { // add missing object @@ -343,7 +433,7 @@ Map<String, Wikitty> wikittiesToCache = result.getWikitties(); if (wikittiesToCache != null) { - cache.putAllWikitty(wikittiesToCache.values()); + putInCache(wikittiesToCache.values()); } return result; @@ -436,4 +526,64 @@ return ws.isDeleted(securityToken, wikittyId); } + + /** + * Classe permettant de recevoir les events distants et mettre a jour le cache + */ + static public class RemoteWikittyListener implements WikittyListener { + + protected WikittyServiceCached wsCached; + + public RemoteWikittyListener(WikittyServiceCached wsCached) { + this.wsCached = wsCached; + } + + /* + * @see org.nuiton.wikitty.WikittyListener#clearWikitty() + */ + @Override + public void clearWikitty(WikittyEvent event) { + wsCached.clearCache(); + } + + /* + * @see org.nuiton.wikitty.WikittyListener#putWikitty(org.nuiton.wikitty.Wikitty[]) + */ + @Override + public void putWikitty(WikittyEvent event) { + Collection<Wikitty> wikitties = event.getWikitties().values(); + wsCached.putInCache(wikitties); + } + + /* + * @see org.nuiton.wikitty.WikittyListener#removeWikitty(java.lang.String[]) + */ + @Override + public void removeWikitty(WikittyEvent event) { + if (event.getRemoveDate() != null) { + Collection<String> ids = event.getRemoveDate().keySet(); + wsCached.removeInCache(ids); + } + } + + /* + * @see org.nuiton.wikitty.WikittyListener#putExtension(org.nuiton.wikitty.WikittyExtension[]) + */ + @Override + public void putExtension(WikittyEvent event) { + } + + @Override + public void removeExtension(WikittyEvent event) { + } + + /* + * @see org.nuiton.wikitty.WikittyListener#clearExtension() + */ + @Override + public void clearExtension(WikittyEvent event) { + wsCached.clearCache(); + } + + } } Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-client.properties =================================================================== --- trunk/wikitty-api/src/main/resources/wikitty-config-sample-client.properties 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-client.properties 2010-12-19 03:21:36 UTC (rev 627) @@ -27,9 +27,12 @@ org.nuiton.wikitty.services.WikittyServiceCached,\ org.nuiton.wikitty.services.WikittyServiceSecurity wikitty.WikittyServiceNotifier.components=org.nuiton.wikitty.services.XMPPNotifierTransporter +wikitty.WikittyServiceCached.components=org.nuiton.wikitty.services.WikittyCacheJCS wikitty.service.cache.allwaysRestoreCopies=false wikitty.service.event.propagate=false wikitty.service.event.listen=true wikitty.service.event.transporter.xmpp.server=im.codelutin.com wikitty.service.event.transporter.xmpp.room=master@conference.im.codelutin.com wikitty.service.server.url=http://services.codelutin.com/wikitty +jcs.default= +jcs.default.cacheattributes.MaxObjects=1000 Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties =================================================================== --- trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties 2010-12-19 03:21:36 UTC (rev 627) @@ -44,6 +44,7 @@ org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\ org.nuiton.wikitty.storage.solr.WikittySearchEngineSolr wikitty.WikittyServiceNotifier.components=org.nuiton.wikitty.services.XMPPNotifierTransporter +wikitty.WikittyServiceCached.components=org.nuiton.wikitty.services.WikittyCacheJCS wikitty.service.server.url=http://services-slave.codelutin.com/wikitty wikitty.service.cache.allwaysRestoreCopies=false wikitty.service.event.propagate=true @@ -57,3 +58,5 @@ wikitty.addon.export.threadnumber=1 wikitty.addon.export.directory=${wikitty.data.directory}/export wikitty.addon.export.publicurl=file://${wikitty.data.directory}/export/ +jcs.default= +jcs.default.cacheattributes.MaxObjects=1000 Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties =================================================================== --- trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties 2010-12-19 03:21:36 UTC (rev 627) @@ -43,6 +43,7 @@ org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\ org.nuiton.wikitty.storage.solr.WikittySearchEngineSolr wikitty.WikittyServiceNotifier.components=org.nuiton.wikitty.services.XMPPNotifierTransporter +wikitty.WikittyServiceCached.components=org.nuiton.wikitty.services.WikittyCacheJCS wikitty.service.server.url=http://services.codelutin.com/wikitty wikitty.service.cache.listenevents=false wikitty.service.cache.allwaysRestoreCopies=false @@ -53,3 +54,5 @@ wikitty.addon.export.threadnumber=1 wikitty.addon.export.directory=${wikitty.data.directory}/export wikitty.addon.export.publicurl=file://${wikitty.data.directory}/export +jcs.default= +jcs.default.cacheattributes.MaxObjects=1000 Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-standalone.properties =================================================================== --- trunk/wikitty-api/src/main/resources/wikitty-config-sample-standalone.properties 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-standalone.properties 2010-12-19 03:21:36 UTC (rev 627) @@ -41,6 +41,7 @@ wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\ org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\ org.nuiton.wikitty.storage.solr.WikittySearchEngineSolr +wikitty.WikittyServiceCached.components=org.nuiton.wikitty.services.WikittyCacheJCS wikitty.service.cache.listenevents=false wikitty.service.cache.allwaysRestoreCopies=false wikitty.service.event.propagate=false @@ -48,3 +49,5 @@ wikitty.addon.export.threadnumber=1 wikitty.addon.export.directory=${wikitty.data.directory}/export wikitty.addon.export.publicurl=file://${wikitty.data.directory}/export/ +jcs.default= +jcs.default.cacheattributes.MaxObjects=1000 Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceCachedTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceCachedTest.java 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceCachedTest.java 2010-12-19 03:21:36 UTC (rev 627) @@ -35,6 +35,7 @@ import org.junit.Test; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.WikittyConfig; +import org.nuiton.wikitty.services.WikittyCacheJCS; import org.nuiton.wikitty.services.WikittyServiceCached; import org.nuiton.wikitty.services.WikittyServiceInMemory; @@ -44,7 +45,9 @@ @Before public void setUpWikittyServiceCachedTest() { WikittyConfig config = new WikittyConfig(); - setService(new WikittyServiceCached(config, new WikittyServiceInMemory(config))); + setService(new WikittyServiceCached(config, + new WikittyServiceInMemory(config), + new WikittyCacheJCS(config))); token = service.login(null, null); service.store(token, Collections.singletonList(getaWikitty()), false); } @@ -96,7 +99,9 @@ WikittyConfig.WikittyOption.WIKITTY_CACHE_RESTORE_COPIES.getKey(), "true"); - setService(new WikittyServiceCached(config, new WikittyServiceInMemory(config))); + setService(new WikittyServiceCached(config, + new WikittyServiceInMemory(config), + new WikittyCacheJCS(config))); token = service.login(null, null); service.store(token, Collections.singletonList(getaWikitty()), false); Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceCachedTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceCachedTest.java 2010-12-17 17:51:06 UTC (rev 626) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceCachedTest.java 2010-12-19 03:21:36 UTC (rev 627) @@ -34,10 +34,13 @@ @Test public void testCache() throws Exception { ApplicationConfig config = getConfig(); + config.setOption(WikittyConfig.WikittyOption + .JCS_DEFAULT_CACHEATTRIBUTES_MAXOBJECTS.getKey(), "10"); WikittyServiceInMemory ws = new WikittyServiceInMemory(config); - WikittyServiceCached cache = new WikittyServiceCached(config, ws); + WikittyCache cache = new WikittyCacheJCS(config); + WikittyServiceCached wscached = new WikittyServiceCached(config, ws, cache); - WikittyProxy proxy = new WikittyProxy(config, cache); + WikittyProxy proxy = new WikittyProxy(config, wscached); List<BusinessEntity> toStore = new ArrayList<BusinessEntity>(); List<String> toRestore = new ArrayList<String>();
participants (1)
-
bpoussin@users.nuiton.org