You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2012/01/21 17:22:19 UTC
svn commit: r1234358 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access:
DataContext.java DataDomainQueryAction.java DataRowUtils.java
ObjectResolver.java
Author: aadamchik
Date: Sat Jan 21 16:22:18 2012
New Revision: 1234358
URL: http://svn.apache.org/viewvc?rev=1234358&view=rev
Log:
CAY-1616 Remove internal dependencies on deprecated ObjectContext.localObject
turns out all non-merge versions of the old localObject call are done on DataContext,
not on generic ObjectContext, and are scoped inside access package. So I just created
a package provate method for this case
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataRowUtils.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectResolver.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java?rev=1234358&r1=1234357&r2=1234358&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java Sat Jan 21 16:22:18 2012
@@ -1135,6 +1135,60 @@ public class DataContext extends BaseCon
}
/**
+ * An internal version of {@link #localObject(Object)} that operates on ObjectId
+ * instead of Persistent, and wouldn't attempt to look up an object in the parent
+ * channel.
+ *
+ * @since 3.1
+ */
+ Persistent findOrCreateObject(ObjectId id) {
+
+ if (id == null) {
+ throw new IllegalArgumentException("Null ObjectId");
+ }
+
+ // have to synchronize almost the entire method to prevent multiple threads from
+ // messing up dataobjects per CAY-845. Originally only parts of "else" were
+ // synchronized, but we had to expand the lock scope to ensure consistent
+ // behavior.
+ synchronized (getGraphManager()) {
+ Persistent cachedObject = (Persistent) getGraphManager().getNode(id);
+
+ // return an existing object
+ if (cachedObject != null) {
+
+ int state = cachedObject.getPersistenceState();
+
+ // TODO: Andrus, 1/24/2006 implement smart merge for modified objects...
+ if (state != PersistenceState.MODIFIED
+ && state != PersistenceState.DELETED) {
+
+ ClassDescriptor descriptor = getEntityResolver().getClassDescriptor(
+ id.getEntityName());
+
+ descriptor.injectValueHolders(cachedObject);
+ }
+
+ return cachedObject;
+ }
+
+ // create and register a hollow object
+ ClassDescriptor descriptor = getEntityResolver().getClassDescriptor(
+ id.getEntityName());
+ Persistent localObject = (Persistent) descriptor.createObject();
+
+ localObject.setObjectContext(this);
+ localObject.setObjectId(id);
+
+ getGraphManager().registerNode(id, localObject);
+ localObject.setPersistenceState(PersistenceState.HOLLOW);
+
+ return localObject;
+ }
+
+ }
+
+ /**
* Returns an object local to this DataContext and matching the ObjectId. If
* <code>prototype</code> is not null, local object is refreshed with the prototype
* values.
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java?rev=1234358&r1=1234357&r2=1234358&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java Sat Jan 21 16:22:18 2012
@@ -203,8 +203,9 @@ class DataDomainQueryAction implements Q
// we previously checked that "!isSourceIndependentFromTargetChange"
DbRelationship dbRelationship = relationship.getDbRelationships().get(0);
- ObjectId targetId = sourceRow.createTargetObjectId(relationship
- .getTargetEntityName(), dbRelationship);
+ ObjectId targetId = sourceRow.createTargetObjectId(
+ relationship.getTargetEntityName(),
+ dbRelationship);
// null id means that FK is null...
if (targetId == null) {
@@ -226,10 +227,9 @@ class DataDomainQueryAction implements Q
.getEntityResolver())) {
// prevent passing partial snapshots to ObjectResolver per CAY-724.
- // Create
- // a hollow object right here and skip object conversion downstream
+ // Create a hollow object right here and skip object conversion downstream
this.noObjectConversion = true;
- Object object = context.localObject(targetId, null);
+ Object object = context.findOrCreateObject(targetId);
this.response = new GenericResponse(Collections.singletonList(object));
return DONE;
@@ -568,8 +568,10 @@ class DataDomainQueryAction implements Q
// take a shortcut when no prefetches exist...
if (prefetchTree == null) {
- return new ObjectResolver(context, descriptor, metadata
- .isRefreshingObjects())
+ return new ObjectResolver(
+ context,
+ descriptor,
+ metadata.isRefreshingObjects())
.synchronizedRootResultNodeFromDataRows(normalizedRows);
}
else {
@@ -678,8 +680,10 @@ class DataDomainQueryAction implements Q
}
if (prefetchTree == null) {
- return new ObjectResolver(context, descriptor, metadata
- .isRefreshingObjects())
+ return new ObjectResolver(
+ context,
+ descriptor,
+ metadata.isRefreshingObjects())
.synchronizedRootResultNodeFromDataRows(rowsColumn);
}
else {
@@ -705,7 +709,8 @@ class DataDomainQueryAction implements Q
// no conversions needed for scalar positions; reuse Object[]'s to fill them
// with resolved objects
- List<PrefetchProcessorNode> segmentNodes = new ArrayList<PrefetchProcessorNode>(width);
+ List<PrefetchProcessorNode> segmentNodes = new ArrayList<PrefetchProcessorNode>(
+ width);
for (int i = 0; i < width; i++) {
if (rsMapping.get(i) instanceof EntityResultSegment) {
@@ -718,7 +723,7 @@ class DataDomainQueryAction implements Q
i);
segmentNodes.add(nextResult);
-
+
List<Persistent> objects = nextResult.getObjects();
for (int j = 0; j < rowsLen; j++) {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataRowUtils.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataRowUtils.java?rev=1234358&r1=1234357&r2=1234358&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataRowUtils.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataRowUtils.java Sat Jan 21 16:22:18 2012
@@ -181,8 +181,9 @@ class DataRowUtils {
// must check before creating ObjectId because of partial
// snapshots
if (hasFK(dbRelationship, snapshot)) {
- ObjectId id = snapshot.createTargetObjectId(relationship
- .getTargetEntityName(), dbRelationship);
+ ObjectId id = snapshot.createTargetObjectId(
+ relationship.getTargetEntityName(),
+ dbRelationship);
if (diff == null
|| !diff.containsArcSnapshot(relationship.getName())
@@ -202,8 +203,10 @@ class DataRowUtils {
property.invalidate(object);
}
else {
- property.writeProperty(object, null, context
- .localObject(id, null));
+ property.writeProperty(
+ object,
+ null,
+ context.findOrCreateObject(id));
}
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectResolver.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectResolver.java?rev=1234358&r1=1234357&r2=1234358&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectResolver.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectResolver.java Sat Jan 21 16:22:18 2012
@@ -148,7 +148,7 @@ class ObjectResolver {
}
// this will create a HOLLOW object if it is not registered yet
- Persistent object = context.localObject(anId, null);
+ Persistent object = context.findOrCreateObject(anId);
// deal with object state
int state = object.getPersistenceState();