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;
+ }
+}