Author: aadamchik
Date: Sat Oct  7 21:18:01 2006
New Revision: 454075

URL: http://svn.apache.org/viewvc?view=rev&rev=454075
Log:
Refactoring before we will be able to fix CAY-680:
preparing the move of property control logic out of CayenneDataObject and into 
a new DataContext helper - DataContextGraphAction

Added:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java
Modified:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneDataObject.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java?view=diff&rev=454075&r1=454074&r2=454075
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java
 Sat Oct  7 21:18:01 2006
@@ -20,11 +20,11 @@
 package org.apache.cayenne;
 
 import org.apache.cayenne.property.ArcProperty;
-import org.apache.cayenne.property.ClassDescriptor;
 import org.apache.cayenne.property.CollectionProperty;
 import org.apache.cayenne.property.Property;
 import org.apache.cayenne.property.PropertyVisitor;
 import org.apache.cayenne.property.SingleObjectArcProperty;
+import org.apache.cayenne.util.ObjectContextGraphAction;
 
 /**
  * An action object that processes graph change calls from Persistent object. 
It handles
@@ -33,43 +33,16 @@
  * @since 1.2
  * @author Andrus Adamchik
  */
-class CayenneContextGraphAction {
+class CayenneContextGraphAction extends ObjectContextGraphAction {
 
-    CayenneContext context;
     ThreadLocal arcChangeInProcess;
 
-    CayenneContextGraphAction(CayenneContext context) {
-        this.context = context;
+    CayenneContextGraphAction(ObjectContext context) {
+        super(context);
         this.arcChangeInProcess = new ThreadLocal();
     }
 
-    /**
-     * Handles property change in a Peristent object.
-     */
-    void handlePropertyChange(
-            Persistent object,
-            String propertyName,
-            Object oldValue,
-            Object newValue) {
-
-        // translate ObjectContext generic property change callback to 
GraphManager terms
-        // (simple properties vs. relationships)
-
-        ClassDescriptor descriptor = 
context.getEntityResolver().getClassDescriptor(
-                object.getObjectId().getEntityName());
-        Property property = descriptor.getProperty(propertyName);
-
-        // relationship property
-        if (property instanceof ArcProperty) {
-            handleArcPropertyChange(object, (ArcProperty) property, oldValue, 
newValue);
-        }
-        // simple property
-        else {
-            handleSimplePropertyChange(object, propertyName, oldValue, 
newValue);
-        }
-    }
-
-    void handleArcPropertyChange(
+    protected void handleArcPropertyChange(
             Persistent object,
             ArcProperty property,
             Object oldValue,
@@ -108,7 +81,7 @@
         }
     }
 
-    void handleSimplePropertyChange(
+    protected void handleSimplePropertyChange(
             Persistent object,
             String propertyName,
             Object oldValue,
@@ -127,15 +100,6 @@
 
     void setArcChangeInProcess(boolean flag) {
         arcChangeInProcess.set(flag ? Boolean.TRUE : null);
-    }
-
-    /**
-     * Changes object state to MODIFIED if needed.
-     */
-    private void markAsDirty(Persistent object) {
-        if (object.getPersistenceState() == PersistenceState.COMMITTED) {
-            object.setPersistenceState(PersistenceState.MODIFIED);
-        }
     }
 
     private void setReverse(

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneDataObject.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneDataObject.java?view=diff&rev=454075&r1=454074&r2=454075
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneDataObject.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneDataObject.java
 Sat Oct  7 21:18:01 2006
@@ -318,24 +318,23 @@
      * 
      * @since 1.2
      */
-    protected void willConnect(String relationshipName, DataObject dataObject) 
{
+    protected void willConnect(String relationshipName, Persistent object) {
         // first handle most common case - both objects are in the same
-        // DataContext or target is null
-        if (dataObject == null
-                || this.getObjectContext() == dataObject.getObjectContext()) {
+        // ObjectContext or target is null
+        if (object == null || this.getObjectContext() == 
object.getObjectContext()) {
             return;
         }
-        else if (this.getObjectContext() == null && 
dataObject.getObjectContext() != null) {
-            dataObject.getObjectContext().registerNewObject(this);
+        else if (this.getObjectContext() == null && object.getObjectContext() 
!= null) {
+            object.getObjectContext().registerNewObject(this);
         }
-        else if (this.getObjectContext() != null && 
dataObject.getObjectContext() == null) {
-            this.getObjectContext().registerNewObject(dataObject);
+        else if (this.getObjectContext() != null && object.getObjectContext() 
== null) {
+            this.getObjectContext().registerNewObject(object);
         }
         else {
             throw new CayenneRuntimeException(
                     "Cannot set object as destination of relationship "
                             + relationshipName
-                            + " because it is in a different DataContext");
+                            + " because it is in a different ObjectContext");
         }
     }
 

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java?view=diff&rev=454075&r1=454074&r2=454075
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
 Sat Oct  7 21:18:01 2006
@@ -144,6 +144,8 @@
 
     protected transient DataContextMergeHandler mergeHandler;
 
+    DataContextGraphAction graphAction;
+
     /**
      * Stores user defined properties associated with this DataContext.
      * 
@@ -269,6 +271,8 @@
             this.usingSharedSnaphsotCache = domain != null
                     && objectStore.getDataRowCache() == 
domain.getSharedSnapshotCache();
         }
+
+        this.graphAction = new DataContextGraphAction(this);
     }
 
     /**
@@ -1600,8 +1604,6 @@
     }
 
     /**
-     * Retains DataObject snapshot and changes its state if needed.
-     * 
      * @since 1.2
      */
     public void propertyChanged(
@@ -1609,10 +1611,7 @@
             String property,
             Object oldValue,
             Object newValue) {
-
-        if (object.getPersistenceState() == PersistenceState.COMMITTED) {
-            getObjectStore().registerDiff(object, null);
-        }
+        graphAction.handlePropertyChange(object, property, oldValue, newValue);
     }
 
     /**

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java?view=auto&rev=454075
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java
 Sat Oct  7 21:18:01 2006
@@ -0,0 +1,102 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.access;
+
+import org.apache.cayenne.DataObject;
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.property.ArcProperty;
+import org.apache.cayenne.util.ObjectContextGraphAction;
+
+/**
+ * An action object that processes graph change calls from Persistent objects. 
It handles
+ * GraphManager notifications and bi-directional graph consistency.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class DataContextGraphAction extends ObjectContextGraphAction {
+
+    DataContextGraphAction(DataContext context) {
+        super(context);
+    }
+
+    protected void handleSimplePropertyChange(
+            Persistent object,
+            String propertyName,
+            Object oldValue,
+            Object newValue) {
+
+        // for simple properties ObjectStore requires a callback only the 
first time the
+        // object changes
+        if (markAsDirty(object)) {
+            context.getGraphManager().nodePropertyChanged(
+                    object.getObjectId(),
+                    propertyName,
+                    oldValue,
+                    newValue);
+        }
+    }
+
+    protected void handleArcPropertyChange(
+            Persistent object,
+            ArcProperty property,
+            Object oldValue,
+            Object newValue) {
+
+    }
+
+    protected boolean markAsDirty(Persistent object) {
+        if (super.markAsDirty(object)) {
+
+            // TODO: andrus 3/23/2006 DataObject kink: snapshot versions are 
obsolete, but
+            // there is no replacement yet, so we still need to handle them...
+
+            if (object instanceof DataObject) {
+
+                DataContext dataContext = (DataContext) context;
+                DataObject dataObject = (DataObject) object;
+                DataRow snapshot = 
dataContext.getObjectStore().getCachedSnapshot(
+                        object.getObjectId());
+
+                if (snapshot != null
+                        && snapshot.getVersion() != 
dataObject.getSnapshotVersion()) {
+                    DataContextDelegate delegate = 
dataContext.nonNullDelegate();
+                    if (delegate.shouldMergeChanges(dataObject, snapshot)) {
+                        ObjEntity entity = 
context.getEntityResolver().lookupObjEntity(
+                                object);
+                        DataRowUtils.forceMergeWithSnapshot(
+                                dataContext,
+                                entity,
+                                dataObject,
+                                snapshot);
+                        dataObject.setSnapshotVersion(snapshot.getVersion());
+                        delegate.finishedMergeChanges(dataObject);
+                    }
+                }
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+}

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java?view=diff&rev=454075&r1=454074&r2=454075
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java
 Sat Oct  7 21:18:01 2006
@@ -1023,7 +1023,7 @@
      * @since 1.2
      */
     public void nodeIdChanged(Object nodeId, Object newId) {
-        // noop
+        throw new UnsupportedOperationException("nodeIdChanged");
     }
 
     /**
@@ -1032,7 +1032,7 @@
      * @since 1.2
      */
     public void nodeCreated(Object nodeId) {
-        // noop
+        throw new UnsupportedOperationException("nodeCreated");
     }
 
     /**
@@ -1041,11 +1041,11 @@
      * @since 1.2
      */
     public void nodeRemoved(Object nodeId) {
-        // noop
+        throw new UnsupportedOperationException("nodeRemoved");
     }
 
     /**
-     * Does nothing.
+     * Records dirty object snapshot.
      * 
      * @since 1.2
      */
@@ -1055,7 +1055,15 @@
             Object oldValue,
             Object newValue) {
 
-        // noop
+        synchronized (this) {
+            ObjectDiff objectDiff = (ObjectDiff) changes.get(nodeId);
+            if (objectDiff == null) {
+                Persistent object = (Persistent) getNode(nodeId);
+                objectDiff = new ObjectDiff(this, object);
+                objectDiff.setDiffId(++currentDiffId);
+                changes.put(nodeId, objectDiff);
+            }
+        }
     }
 
     /**
@@ -1064,7 +1072,7 @@
      * @since 1.2
      */
     public void arcCreated(Object nodeId, Object targetNodeId, Object arcId) {
-        // noop
+        throw new UnsupportedOperationException("arcCreated");
     }
 
     /**
@@ -1073,7 +1081,7 @@
      * @since 1.2
      */
     public void arcDeleted(Object nodeId, Object targetNodeId, Object arcId) {
-        // noop
+        throw new UnsupportedOperationException("arcDeleted");
     }
 
     // an ObjectIdQuery optimized for retrieval of multiple snapshots - it can 
be reset

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java?view=auto&rev=454075
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java
 Sat Oct  7 21:18:01 2006
@@ -0,0 +1,96 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.util;
+
+import java.io.Serializable;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.property.ArcProperty;
+import org.apache.cayenne.property.ClassDescriptor;
+import org.apache.cayenne.property.Property;
+
+/**
+ * A base implementation of a helper class to handle
+ * [EMAIL PROTECTED] 
ObjectContext#propertyChanged(org.apache.cayenne.Persistent, String, Object, 
Object)}
+ * processing on behalf of an ObjectContext.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+public abstract class ObjectContextGraphAction implements Serializable {
+
+    protected ObjectContext context;
+
+    public ObjectContextGraphAction(ObjectContext context) {
+        this.context = context;
+    }
+
+    /**
+     * Handles property change in a Peristent object, routing to either
+     * [EMAIL PROTECTED] #handleArcPropertyChange(Persistent, ArcProperty, 
Object, Object)} or
+     * [EMAIL PROTECTED] #handleSimplePropertyChange(Persistent, String, 
Object, Object)}.
+     */
+    public void handlePropertyChange(
+            Persistent object,
+            String propertyName,
+            Object oldValue,
+            Object newValue) {
+
+        // translate ObjectContext generic property change callback to 
GraphManager terms
+        // (simple properties vs. relationships)
+
+        ClassDescriptor descriptor = 
context.getEntityResolver().getClassDescriptor(
+                object.getObjectId().getEntityName());
+        Property property = descriptor.getProperty(propertyName);
+
+        if (property instanceof ArcProperty) {
+            handleArcPropertyChange(object, (ArcProperty) property, oldValue, 
newValue);
+        }
+        else {
+            handleSimplePropertyChange(object, propertyName, oldValue, 
newValue);
+        }
+    }
+
+    protected abstract void handleArcPropertyChange(
+            Persistent object,
+            ArcProperty property,
+            Object oldValue,
+            Object newValue);
+
+    protected abstract void handleSimplePropertyChange(
+            Persistent object,
+            String propertyName,
+            Object oldValue,
+            Object newValue);
+
+    /**
+     * Changes object state to MODIFIED if needed, returning true if the 
change has
+     * occured, false if not.
+     */
+    protected boolean markAsDirty(Persistent object) {
+        if (object.getPersistenceState() == PersistenceState.COMMITTED) {
+            object.setPersistenceState(PersistenceState.MODIFIED);
+            return true;
+        }
+
+        return false;
+    }
+}


Reply via email to