On Sun, Nov 16, 2008 at 7:38 AM, Sergiu Dumitriu <sergiu(a)xwiki.com> 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
devs(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/devs
--
Thomas Mortagne