cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <and...@objectstyle.org>
Subject Re: Determining changes in a dataobject / modification diff
Date Fri, 22 Feb 2008 16:41:10 GMT
One more way of doing that, based on the internal Cayenne mechanism  
for tracking all object changes as instances of GraphDiff:

   http://cayenne.apache.org/doc20/api/cayenne/org/apache/cayenne/graph/GraphDiff.html

There is no public API to access the diffs directly, but you can  
intercept and process diffs on commit. Normally a  
DataContext.getChannel() would return a DataDomain. A user can replace  
it with a wrapper (via 'context.setChannel(..)') that delegates all  
DataChannel operations to the DataDomain:

   http://cayenne.apache.org/doc20/api/cayenne/org/apache/cayenne/DataChannel.html

In the wrapper you can override 'onSync' to analyze/capture all the  
diffs being sent to the DataDomain for commit.

Andrus




On Feb 22, 2008, at 6:09 PM, Robert Zeigler wrote:
> Hi,
>
> I had a requirement very similar to this in a recent project.
> Every change made to a set of objects had to be recorded to be able  
> to provide a history of changes to an object.
> What I did was to have those objects descend from a common super  
> class, which, in turn, descends from CayenneDataObject.
> In my superclass, I overrode writeProperty and setToOneTarget.  You  
> get the new values passed into you, and you have a chance to examine  
> the old values, as well, by calling readProperty.  It has worked out  
> quite nicely.
>
> Here's a sample snippet from writeProperty:
>
>    @Override
>    public void writeProperty(String name, Object value){
>        Object old = readProperty(name);
>        if (value == null) {
>            if (old != null) {
>                recordChange(name,name + " changed from " +  
> labelFor(readProperty(name)) + " to " + labelFor(value));
>            }
>        } else if (!value.equals(old)) {
>                recordChange(name,name + " changed from " +  
> labelFor(readProperty(name)) + " to " + labelFor(value));
>        }
>        super.writeProperty(name, value);
>    }
>
> recordChange handles recording the changes for me; labelFor takes an  
> object and converts it into a string suitable for user consumption.
>
> HTH,
>
> Robert
>
> On Feb 22, 2008, at 2/228:59 AM , Ilya Lazarev wrote:
>
>> Apologies if this has been asked before, I couldn't find anything  
>> in the
>> archives. The problem boils down to this: there is a cayenne object  
>> which is
>> updated via a form. I want to capture changes made to every single  
>> modified
>> field in a DB, the value before modification and the value after.  
>> The object
>> has a number of to-many relationships, which would also have to be  
>> checked
>> one by one. The simplest way I can envision this is by manually  
>> creating an
>> object clone before any modifications are made, and then comparing  
>> the two
>> objects and noting the differences. Is there an easier way to see a  
>> diff of
>> the fields, perhaps by accessing properties of the cayenne object  
>> itself? I
>> am using cayenne 2.
>>
>> Many thanks,
>> Ilya
>
>


Mime
View raw message