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.
--
Sergiu Dumitriu
http://purl.org/net/sergiu/