Details
-
Improvement
-
Status: Open
-
Major
-
Resolution: Unresolved
-
Undefined future
-
None
Description
Here is the code. I've tested isChanged() and it appears robust for both normal properties and foreign key relationships.
package org.objectstyle.cayenne.access;
import org.objectstyle.cayenne.DataObject;
import org.objectstyle.cayenne.ObjectId;
public class CayenneUtils
{
/** this version of isChanged can only be used for foreign key relationship properties */
private static boolean isChangedArc(DataObject o, String propName)
{
ObjectDiff diff = (ObjectDiff) o.getDataContext().getObjectStore().getChangesByObjectId().get(o.getObjectId());
Object oldValue = diff.getArcSnapshotValue(propName);
ObjectId newId=((DataObject) o.readProperty(propName)).getObjectId();
/* ick! old or new value can be null which .equals() does not support */
if (newId==oldValue)
{ return true; } else
{ return !oldValue.equals(newId); }
}
/**
* this version of isChanged can only be used for normal properties and not
* relationships.
*/
private static boolean isChangedProperty(DataObject o, String propName)
{
ObjectDiff diff = (ObjectDiff) o.getDataContext().getObjectStore().getChangesByObjectId().get(o.getObjectId());
Object oldValue = diff.getSnapshotValue(propName);
Object newValue= o.readProperty(propName);
if (newValue==oldValue)
{ return false; }
else if ((newValue==null) || (oldValue==null))
else
{ return !oldValue.equals(newValue); }}
/** checks if a property or foreign key relationship changed */
public static boolean isChanged(DataObject o, String propName)
{
ObjectDiff diff = (ObjectDiff) o.getDataContext().getObjectStore().getChangesByObjectId().get(o.getObjectId());
if (diff.containsArcSnapshot(propName))
else
{ return isChangedProperty(o, propName); } }
}