Author: bpoussin Date: 2010-12-10 05:45:01 +0100 (Fri, 10 Dec 2010) New Revision: 591 Url: http://nuiton.org/repositories/revision/wikitty/591 Log: Evolution #1140: Add WikittyServiceAccessStat to make stat on wikitty restored Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAccessStat.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java trunk/wikitty-api/src/main/xmi/wikitty.properties trunk/wikitty-api/src/main/xmi/wikitty.zargo 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-10 04:42:19 UTC (rev 590) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-10 04:45:01 UTC (rev 591) @@ -250,6 +250,11 @@ _("Indique si le cache retourne des copies des objets ou des proxies"), "false", Boolean.class, false, false), + WIKITTY_ACCESSSTAT_EXTENSIONS( + "wikitty.service.accessstat.extensions", + _("Indique la liste d'extension dont il faut monitorer l'acces"), + "WikittyPubText,WikittyPubData", String.class, false, false), + WIKITTY_EVENT_PROPAGATE( "wikitty.service.event.propagate", _("Indique si le service d'event propage sur le reseau les evenements"), Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAccessStat.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAccessStat.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAccessStat.java 2010-12-10 04:45:01 UTC (rev 591) @@ -0,0 +1,187 @@ +package org.nuiton.wikitty.services; + + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.StringTokenizer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.ApplicationConfig; +import org.nuiton.wikitty.WikittyConfig; +import org.nuiton.wikitty.WikittyService; +import org.nuiton.wikitty.WikittyTree; +import org.nuiton.wikitty.entities.BusinessEntity; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyAccessStatImpl; +import org.nuiton.wikitty.entities.WikittyTokenHelper; +import org.nuiton.wikitty.entities.WikittyTreeNode; +import org.nuiton.wikitty.search.Criteria; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyServiceAccessStat extends WikittyServiceDelegator { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyServiceAccessStat.class); + + Set<String> extensions = new HashSet<String>(); + + public WikittyServiceAccessStat(ApplicationConfig config, WikittyService service) { + super(service); + List<String> exts = config.getOptionAsList(WikittyConfig.WikittyOption. + WIKITTY_ACCESSSTAT_EXTENSIONS.getKey()).getOption(); + if (log.isInfoEnabled()) { + log.info(String.format("Monitor access to extensions %s", exts)); + } + extensions.addAll(exts); + } + + /** + * retourne l'id du user associe au token + * @param securityToken + * @return null si l'id du user n'a pas pu etre recuperer + */ + protected String getUserId(String securityToken) { + String result = null; + // recuperation de l'utilisateur associe au securityToken + // le securityToken est aussi l'id de l'objet + if (securityToken != null) { + Wikitty securityTokenWikitty = WikittyServiceEnhanced.restore( + getDelegate(), securityToken, securityToken); + if (securityTokenWikitty == null) { + // no exception, this service must never faild + log.warn("bad (obsolete ?) token"); + } else { + result = WikittyTokenHelper.getUser(securityTokenWikitty); + } + } + return result; + } + + /** + * Indique si dans la liste des extensions passees en parametre il y en + * a au moins une a surveiller + * + * @param exts + * @return vrai s'il y a au moins une extension a surveiller + */ + protected boolean isMonitored(Collection<String> exts) { + boolean result = false; + for (String ext : exts) { + result = extensions.contains(ext); + if (result) { + break; + } + } + return result; + } + + /** + * Add WikittyAccessStat in storage if necessary, one for each object + * + * @param securityToken + * @param wikitties + */ + protected void addStat(String securityToken, Collection wikitties) { + boolean userLoaded = false; + String user = null; + + List<Wikitty> stats = new ArrayList<Wikitty>(wikitties.size()); + for (Object o : wikitties) { + String id = null; + Collection<String> exts = null; + if (o instanceof Wikitty) { + Wikitty w = ((Wikitty)o); + id = w.getId(); + exts = w.getExtensionNames(); + } else if (o instanceof BusinessEntity) { + BusinessEntity e = ((BusinessEntity) o); + id = e.getWikittyId(); + exts = e.getExtensionNames(); + } + + if (exts != null && isMonitored(exts)) { + // on recupere le user que maintenant car potentiellement il n'y a + // rien a creer si aucun objet n'est dans la liste des extensions + // a surveiller + if (!userLoaded) { + user = getUserId(securityToken); + userLoaded = true; + } + + WikittyAccessStatImpl stat = new WikittyAccessStatImpl(); + stat.setToken(securityToken); + stat.setUser(user); + stat.setRestored(id); + + stats.add(stat.getWikitty()); + } + } + + getDelegate().store(securityToken, stats, false); + } + + @Override + public List<Wikitty> restore(String securityToken, List<String> id) { + List<Wikitty> result = super.restore(securityToken, id); + addStat(securityToken, result); + return result; + } + + @Override + public Map<WikittyTreeNode, Integer> restoreChildren(String securityToken, String wikittyId, Criteria filter) { + Map<WikittyTreeNode, Integer> result = + super.restoreChildren(securityToken, wikittyId, filter); + addStat(securityToken, result.keySet()); + return result; + } + + @Override + public Entry<WikittyTreeNode, Integer> restoreNode(String securityToken, String wikittyId, Criteria filter) { + Entry<WikittyTreeNode, Integer> result = + super.restoreNode(securityToken, wikittyId, filter); + addStat(securityToken, Collections.singleton(result.getKey())); + return result; + } + + @Override + public WikittyTree restoreTree(String securityToken, String wikittyId) { + WikittyTree result = super.restoreTree(securityToken, wikittyId); + + // before do some work, check if necessary + if (isMonitored(Collections.singleton(WikittyTreeNode.EXT_WIKITTYTREENODE))) { + List<WikittyTreeNode> nodes = new LinkedList<WikittyTreeNode>(); + List<WikittyTree> toVisit = new LinkedList<WikittyTree>(); + toVisit.add(result); + while (!toVisit.isEmpty()) { + WikittyTree tree = toVisit.get(0); + nodes.add(tree.getNode()); + toVisit.addAll(tree.getChildren()); + } + addStat(securityToken, nodes); + } + + return result; + } + + @Override + public Wikitty restoreVersion(String securityToken, String wikittyId, String version) { + Wikitty result = super.restoreVersion(securityToken, wikittyId, version); + addStat(securityToken, Collections.singleton(result)); + return result; + } + +} Modified: trunk/wikitty-api/src/main/xmi/wikitty.properties =================================================================== --- trunk/wikitty-api/src/main/xmi/wikitty.properties 2010-12-10 04:42:19 UTC (rev 590) +++ trunk/wikitty-api/src/main/xmi/wikitty.properties 2010-12-10 04:45:01 UTC (rev 591) @@ -29,3 +29,4 @@ org.nuiton.wikitty.entities.WikittyTreeNode.class.tagvalue.version=2.0 org.nuiton.wikitty.entities.WikittyUser.class.tagvalue.version=1.0 org.nuiton.wikitty.entities.WikittyI18n.class.tagvalue.version=1.0 +org.nuiton.wikitty.entities.WikittyAccessStat.class.tagvalue.version=1.0 Modified: trunk/wikitty-api/src/main/xmi/wikitty.zargo =================================================================== (Binary files differ)