On Sun, Nov 16, 2008 at 7:38 AM, Sergiu Dumitriu <[email protected]> wrote:
tmortagne (SVN) wrote:
Author: tmortagne Date: 2008-11-14 15:41:52 +0100 (Fri, 14 Nov 2008) New Revision: 14215
Added: platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/XWikiContextTest.java Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWikiContext.java Log: XWIKI-2837: Class Cache in context is not database aware Applied patch from Denis Gervalle (just added the base class's wiki if exists)
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWikiContext.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWikiContext.java 2008-11-14 14:41:34 UTC (rev 14214) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWikiContext.java 2008-11-14 14:41:52 UTC (rev 14215) @@ -407,16 +407,47 @@ put("mainxwiki", str); }
- // Used to avoid recursive loading of documents if there are recursives usage of classes + /** + * Used to avoid recurrent loading of documents if there are recurrent usage of classes. + * + * @param bclass the class to cache. + */ public void addBaseClass(BaseClass bclass) { - this.classCache.put(bclass.getName(), bclass); + String className = bclass.getName(); + if (bclass.getWiki() != null) { + StringBuffer sb = new StringBuffer(bclass.getWiki()); + sb.append(":"); + sb.append(className); + className = sb.toString(); + } else if (getDatabase() != null) { + StringBuffer sb = new StringBuffer(getDatabase()); + sb.append(":"); + sb.append(className); + className = sb.toString(); + } + + this.classCache.put(className, bclass); }
- // Used to avoid recursive loading of documents if there are recursives usage of classes + /** + * Used to avoid recurrent loading of documents if there are recurrent usage of classes. + * + * @param name the local name (without the wiki identifier) of the xclass. The wiki identifier is taken from + * {@link #getDatabase()}. + * @return the cached xclass or null if the cache does not contains any xclass. + */ public BaseClass getBaseClass(String name) { - return this.classCache.get(name); + String classname = name; + if (getDatabase() != null) { + StringBuffer sb = new StringBuffer(getDatabase()); + sb.append(":"); + sb.append(name); + classname = sb.toString(); + } + + return this.classCache.get(classname); }
// Used to avoid recursive loading of documents if there are recursives usage of classes
Unfortunately this has a bad side effect:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.xpn.xwiki.doc.XWikiDocument#-34276813]
Lots of errors were displayed when starting the server, caused by http://jira.xwiki.org/jira/browse/XWIKI-2842 and the fact that although the class cache sees XWiki.Tags and xwiki:XWiki.Tags as different entities, in Hibernate they represent the same entity.
There should not be any XWiki.Tags in the class cache, the only way for this is to have context.database to null which should not append in runtime... But I'm thinking now that there can be another problem of this kind in multiwiki where multiples wikis names can goes to the same database behind the scene if you use xwiki.db property.
-- Sergiu Dumitriu http://purl.org/net/sergiu/ _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs
-- Thomas Mortagne