I have been testing and analyzing my new loader for a few days now, It seems to 
be working perfectly.

I have written a comprehensive testing script available here:
http://jira.xwiki.org/jira/browse/XWIKI-2874

There is a change which must be made:
ListProperty.equals must be change to convert null values to empty ArrayList 
objects in the event that
it is asked to compare to a BaseProperty.

The change looks like this:
Index: core/xwiki-core/src/main/java/com/xpn/xwiki/objects/ListProperty.java
===================================================================
--- core/xwiki-core/src/main/java/com/xpn/xwiki/objects/ListProperty.java       
(revision 23877)
+++ core/xwiki-core/src/main/java/com/xpn/xwiki/objects/ListProperty.java       
(working copy)
@@ -145,6 +145,14 @@
             return true;
         }

+        //The save opperation triggers hibernate to compare the new property 
to the original
+        //If the property was gotten by a query like "SELECT prop FROM 
BaseProperty AS prop WHERE..."
+        //and the value stored in the db is null, hibernate thinks the 
original is a BaseProperty,
+        //thus we may end up comparing a ListProperty to a BaseProperty with 
value = null.
+        if (list2 == null && 
obj.getClass().getName().indexOf(".BaseProperty")!=-1){
+            list2 = new ArrayList<String>();
+        }
+
         if (list1.size() != list2.size()) {
             return false;
         }

Why is this necessary?
Because the new loader loads all types of properties at once with a query like
"select prop from BaseProperty prop where prop.id in (:ids)"
(ids being the list of object ids from the objects attached to the document.)
This is okay until the property is saved, then hibernate has to check that the
id of the property is the same. The id of the property is an empty property with
the same name and object id number. Because the property is loaded by a query
for BaseProperty, if the value in the database is null, Hibernate thinks the
property IS a BaseProperty and passes a BaseProperty to the equals method.

If these changes are not made, we get this exception.

java.lang.NullPointerException
        at com.xpn.xwiki.objects.ListProperty.equals(ListProperty.java:148)
        at 
org.hibernate.event.def.ProxyVisitor.isOwnerUnchanged(ProxyVisitor.java:44)
        at 
org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:45)
        at 
org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
        at 
org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
        at 
org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
        at 
org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
        at 
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
        at 
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
        at 
org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
        at 
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:564)
        at org.hibernate.impl.SessionImpl.update(SessionImpl.java:552)
        at org.hibernate.impl.SessionImpl.update(SessionImpl.java:544)
        at 
com.xpn.xwiki.store.XWikiHibernateStore.saveXWikiProperty(XWikiHibernateStore.java:1726)
        at 
com.xpn.xwiki.store.XWikiHibernateStore.saveXWikiCollection(XWikiHibernateStore.java:1072)
        at 
com.xpn.xwiki.store.XWikiHibernateStore.saveXWikiDoc(XWikiHibernateStore.java:582)
        at 
com.xpn.xwiki.store.XWikiCacheStore.saveXWikiDoc(XWikiCacheStore.java:181)
        at 
com.xpn.xwiki.store.XWikiCacheStore.saveXWikiDoc(XWikiCacheStore.java:174)
        at com.xpn.xwiki.XWiki.saveDocument(XWiki.java:1309)


I suggest we apply the patch to 2.1, but leave the functionality deactivated in 
xwiki.cfg until 2.2 so there is
time to see if there are any latent issues. I don't expect any but I don't know 
what it might do with corrupt
data in storage.

Better safe than sorry.


Caleb James DeLisle

_______________________________________________
devs mailing list
devs@xwiki.org
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to