Re: Determining changes in a dataobject / modification diff

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Fri Feb 22 2008 - 11:41:10 EST

  • Next message: Mike Kienenberger: "Re: Determining changes in a dataobject / modification diff"

    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:
    >
    > ..verride
    > 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
    >
    >



    This archive was generated by hypermail 2.0.0 : Fri Feb 22 2008 - 11:41:53 EST