On Thu, Dec 6, 2012 at 3:37 PM, David Delbecq <david.delb...@meteo.be> wrote: > Hello, > > i did a step by step analysis of the problem using eclipse debugger and i > found the culprit. Before i submit a bugreport, can someone confirm me this > is unexpected behaviour? > > Inside > com.xpn.xwiki.internal.cache.rendering.DefaultRenderingCache.getRenderedContent(DocumentReference > documentReference, String source, XWikiContext context), there is a call to > > this.cache.get(documentReference, source, getAction(context), > context.getLanguage(), > getRequestParameters(context)); > which uses this information to generate a cache Key that is then looked up in > cache. > > However, getRequestParameters(context) in my case is returning >
> {menu=[Ljava.lang.String;@3e5da853, xpage=[Ljava.lang.String;@76d60121} This is the expected output of calling toString() on a Map<String, String[]>. The bug is that the code in DefaultRenderingCache wrongly assumes that the request parameters are stored in a Map<String, String>. > where it should return something like > {menu={SysAdminRmi.Menu}, xpage={plain}} > As a result, my cache key change at each reaquest because values are not > properly used and so even if my page is cache, it's never rendered from cache. > > Reason, behind this is this code in getRequestParameters: > > Map<String, String> parameters = context.getRequest().getParameterMap(); > ... > return parameters.toString(); > > This map is generated by > com.xpn.xwiki.web.XWikiServletRequest.getParameterMap, and is > Map<String,Object> and not a Map<String,String>! Here is the proving code See http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameterMap%28%29 . The return value is clear, Map<String, String[]>. DefaultRenderingCache#getRequestParameters() needs to be fixed to serialize the map correctly, and the best way is to serialize it as a query string. > public Map getParameterMap() > { > Map newMap = new HashMap(); > Map map = this.request.getParameterMap(); > Iterator it = map.keySet().iterator(); > while (it.hasNext()) { > String key = (String) it.next(); > Object value = map.get(key); > if (value instanceof String) { > newMap.put(key, filterString((String) value)); > } else if (value instanceof String[]) { > newMap.put(key, filterStringArray((String[]) value)); > } else { > newMap.put(key, value); > } > } > return map; > } > > Clearly, > In my case, catalina request facade does decode so that ParameterMap return > Map<String,String[1 ]> instead of Map<String,String>. > > > Consequences? Cache only works when there are no request parameters. > > > Is there some way for me to replace DefaultRenderingCache with another > implementation i write that does not have this issue, as a temporary solution? Yes, because DefaultRenderingCache is a component implementation. See http://extensions.xwiki.org/xwiki/bin/view/Extension/Component+Module#HOverrides . Hope this helps, Marius > > > > > ----- Mail original ----- > > De: "Thomas Mortagne" <thomas.morta...@xwiki.com> > À: "XWiki Users" <users@xwiki.org> > Envoyé: Mercredi 5 Décembre 2012 18:05:59 > Objet: Re: [xwiki-users] xwiki render cache not working? > > On Wed, Dec 5, 2012 at 3:29 PM, David Delbecq <david.delb...@meteo.be>wrote: > >> Hello, >> >> i have a specific wiki page that is quite slow to render because some >> groovy code and macros in there are quite slow. Fortunately, content does >> not change often, si i tried to make it faster for user by using cache >> rendering. >> >> Here is what is inside my xwiki.cfg: >> >> >> xwiki.rendering.defaultCacheDuration=3600 >> >> And here is my xwiki.properties >> >> >> core.renderingcache.enabled=true >> core.renderingcache.documents=wiki:.* >> core.renderingcache.size=200 >> # Default value is 300 (5 min). >> # core.renderingcache.duration=300 >> >> I have also this inside my page: >> >> >> {{velocity}} >> $context.setCacheDuration(60) >> //complex content here that has a custom groovy macro and a velocity >> include >> {{/velocity}} >> >> >> {{groovy}} >> System.out.println("***************************************phone menu not >> in cache") >> {{/groovy}} >> >> >> And i see in my log that, everytime, the System.out is executed, meaning >> the render cache is not used. What's my configuration problem? What did i >> miss? >> >> Note: using xwiki 4.1.2 and the url i try is >> http://server/xwiki/bin/view/MySpace/MyPage?menu=Test.Menu&xpage=plain >> >> > Thank you. >> >> David Delbecq >> >> _______________________________________________ >> users mailing list >> users@xwiki.org >> http://lists.xwiki.org/mailman/listinfo/users >> > > Rendering cache works well for me. > > First of all, not that your are mixing two different features here: what > you find in xwiki.cfg and $context.setCacheDuration() are old caching > system which is maintained for retro-compatibility reasons only in > xwiki/1.0 syntax. > > Now about the more generic rendering cache located in xwiki.properties, is > your wiki name really "wiki" ? Because here you indicated that you wanted > to cache all the pages in the wiki which has "wiki" as identifier. If you > are in a single wiki mode (XWiki Enterprise for example) you can simply > remove the wiki part as in > > core.renderingcache.documents=Space.Page > > -- > Thomas Mortagne > _______________________________________________ > users mailing list > users@xwiki.org > http://lists.xwiki.org/mailman/listinfo/users > > _______________________________________________ > users mailing list > users@xwiki.org > http://lists.xwiki.org/mailman/listinfo/users _______________________________________________ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users