Author: aadamchik
Date: Sat Oct 14 19:53:00 2006
New Revision: 464103
URL: http://svn.apache.org/viewvc?view=rev&rev=464103
Log:
CAY-693: DataContext should not return HOLLOW objects in response to
ObjectIdQuery()
(moving prepareForAccess in context superclass. Note that DataContextDelegate
is no longer called on FaultFailures)
Modified:
incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.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/DataContextQueryAction.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java
Modified:
incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
---
incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt
(original)
+++
incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt
Sat Oct 14 19:53:00 2006
@@ -6,10 +6,10 @@
Date:
----------------------------------
-UPGRADING FROM 2.0 AND OTHER OBJECTSTYLE RELEASES
-
-....
+UPGRADING FROM 2.0 AND OTHER APACHE RELEASES
+* DataContextDelegate.shouldProcessDelete/finishedProcessDelete methods are no
longer
+called on fault resolution failures. A FaultFailreException is thrown, as
before.
UPGRADING FROM 1.2 AND OTHER OBJECTSTYLE RELEASES
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java
Sat Oct 14 19:53:00 2006
@@ -23,6 +23,8 @@
import org.apache.cayenne.graph.GraphManager;
import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.property.Property;
+import org.apache.cayenne.query.ObjectIdQuery;
import org.apache.cayenne.query.Query;
/**
@@ -75,10 +77,50 @@
prepareForAccess(object, property, false);
}
- public abstract void prepareForAccess(
- Persistent object,
- String property,
- boolean lazyFaulting);
+ public void prepareForAccess(Persistent object, String property, boolean
lazyFaulting) {
+ if (object.getPersistenceState() == PersistenceState.HOLLOW) {
+
+ ObjectId oid = object.getObjectId();
+ List objects = performQuery(new ObjectIdQuery(oid, false,
ObjectIdQuery.CACHE));
+
+ if (objects.size() == 0) {
+ throw new FaultFailureException(
+ "Error resolving fault, no matching row exists in the
database for ObjectId: "
+ + oid);
+ }
+ else if (objects.size() > 1) {
+ throw new FaultFailureException(
+ "Error resolving fault, more than one row exists in
the database for ObjectId: "
+ + oid);
+ }
+
+ // sanity check...
+ if (object.getPersistenceState() != PersistenceState.COMMITTED) {
+
+ String state = PersistenceState.persistenceStateName(object
+ .getPersistenceState());
+
+ // TODO: andrus 4/13/2006, modified and deleted states are
possible due to
+ // a race condition, should we handle them here?
+
+ throw new FaultFailureException(
+ "Error resolving fault for ObjectId: "
+ + oid
+ + " and state ("
+ + state
+ + "). Possible cause - matching row is missing
from the database.");
+ }
+ }
+
+ // resolve relationship fault
+ if (lazyFaulting && property != null) {
+ Property propertyDescriptor =
getEntityResolver().getClassDescriptor(
+
object.getObjectId().getEntityName()).getProperty(property);
+
+ // this should trigger fault resolving
+ propertyDescriptor.readProperty(object);
+ }
+ }
public abstract void propertyChanged(
Persistent object,
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java
Sat Oct 14 19:53:00 2006
@@ -32,8 +32,6 @@
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.property.ClassDescriptor;
-import org.apache.cayenne.property.Property;
-import org.apache.cayenne.query.ObjectIdQuery;
import org.apache.cayenne.query.Query;
import org.apache.cayenne.util.EventUtil;
import org.apache.cayenne.validation.ValidationException;
@@ -426,39 +424,6 @@
}
// ****** Copied from DataContext - end *******
- }
-
- /**
- * Resolves an object if it is HOLLOW.
- *
- * @since 3.0
- */
- public void prepareForAccess(Persistent object, String property, boolean
lazyFaulting) {
- if (object.getPersistenceState() == PersistenceState.HOLLOW) {
-
- ObjectId gid = object.getObjectId();
- List objects = performQuery(new ObjectIdQuery(gid));
-
- if (objects.size() == 0) {
- throw new FaultFailureException(
- "Error resolving fault, no matching row exists in the
database for GlobalID: "
- + gid);
- }
- else if (objects.size() > 1) {
- throw new FaultFailureException(
- "Error resolving fault, more than one row exists in
the database for GlobalID: "
- + gid);
- }
- }
-
- // resolve relationship fault
- if (lazyFaulting && property != null) {
- Property propertyDescriptor =
getEntityResolver().getClassDescriptor(
-
object.getObjectId().getEntityName()).getProperty(property);
-
- // this should trigger fault resolving
- propertyDescriptor.readProperty(object);
- }
}
public void propertyChanged(
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=464103&r1=464102&r2=464103
==============================================================================
---
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 14 19:53:00 2006
@@ -39,7 +39,6 @@
import org.apache.cayenne.DataRow;
import org.apache.cayenne.DeleteDenyException;
import org.apache.cayenne.Fault;
-import org.apache.cayenne.FaultFailureException;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.ObjectId;
import org.apache.cayenne.PersistenceState;
@@ -1585,43 +1584,6 @@
// call a setter to ensure EntityResolver is extracted from channel
setChannel(Configuration.getSharedConfiguration().getDomain(
lazyInitParentDomainName));
- }
- }
-
- /**
- * Resolves object fault if needed.
- *
- * @since 3.0
- */
- public void prepareForAccess(Persistent object, String property, boolean
lazyFaulting) {
-
- if (object.getPersistenceState() == PersistenceState.HOLLOW) {
-
- getObjectStore().resolveHollow(object);
- if (object.getPersistenceState() != PersistenceState.COMMITTED) {
-
- String state = PersistenceState.persistenceStateName(object
- .getPersistenceState());
-
- // TODO: andrus 4/13/2006, modified and deleted states are
possible due to
- // a race condition, should we handle them here?
-
- throw new FaultFailureException(
- "Error resolving fault for ObjectId: "
- + object.getObjectId()
- + " and state ("
- + state
- + "). Possible cause - matching row is missing
from the database.");
- }
- }
-
- // resolve relationship fault
- if (lazyFaulting && property != null) {
- Property propertyDescriptor =
getEntityResolver().getClassDescriptor(
-
object.getObjectId().getEntityName()).getProperty(property);
-
- // this should trigger fault resolving
- propertyDescriptor.readProperty(object);
}
}
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
Sat Oct 14 19:53:00 2006
@@ -80,6 +80,11 @@
oidQuery.getObjectId());
if (object != null) {
+ // TODO: andrus, 10/14/2006 - obtaining a row from an
object is the
+ // only piece that makes this method different from the
super
+ // implementation. This is used in NEW objects sorting on
insert. It
+ // would be nice to implement an alternative algorithm
that wouldn't
+ // require this hack.
if (oidQuery.isFetchingDataRows()) {
object = ((DataContext) actingContext)
.currentSnapshot((DataObject) object);
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=464103&r1=464102&r2=464103
==============================================================================
---
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 14 19:53:00 2006
@@ -651,24 +651,11 @@
* fully resolved.
*
* @since 1.1
+ * @deprecated since 3.0 use
+ * [EMAIL PROTECTED]
ObjectContext#prepareForAccess(Persistent, String, boolean)}.
*/
public void resolveHollow(Persistent object) {
- if (object.getPersistenceState() != PersistenceState.HOLLOW) {
- return;
- }
-
- synchronized (this) {
- ObjectIdQuery query = new ObjectIdQuery(
- object.getObjectId(),
- false,
- ObjectIdQuery.CACHE);
- List results = context.getChannel().onQuery(context,
query).firstList();
-
- // handle deleted object
- if (results.size() == 0) {
- processDeletedID(object.getObjectId());
- }
- }
+ context.prepareForAccess(object, null, false);
}
void processIdChange(Object nodeId, Object newId) {
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java
Sat Oct 14 19:53:00 2006
@@ -25,10 +25,11 @@
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.PersistenceState;
import org.apache.cayenne.Persistent;
import org.apache.cayenne.QueryResponse;
-import org.apache.cayenne.cache.QueryCacheEntryFactory;
import org.apache.cayenne.cache.QueryCache;
+import org.apache.cayenne.cache.QueryCacheEntryFactory;
import org.apache.cayenne.property.ArcProperty;
import org.apache.cayenne.property.ClassDescriptor;
import org.apache.cayenne.query.ObjectIdQuery;
@@ -142,6 +143,12 @@
Object object = actingContext.getGraphManager().getNode(
oidQuery.getObjectId());
if (object != null) {
+
+ // do not return hollow objects
+ if (((Persistent) object).getPersistenceState() ==
PersistenceState.HOLLOW) {
+ return !DONE;
+ }
+
this.response = new ListResponse(object);
return DONE;
}
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java
Sat Oct 14 19:53:00 2006
@@ -22,10 +22,8 @@
import java.util.Date;
import org.apache.art.Artist;
-import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.DataObject;
import org.apache.cayenne.DataRow;
-import org.apache.cayenne.ObjectId;
import org.apache.cayenne.PersistenceState;
import org.apache.cayenne.unit.MultiContextTestCase;
import org.apache.cayenne.unit.util.ThreadedTestHelper;
@@ -217,40 +215,5 @@
helper.assertWithTimeout(3000);
assertEquals(PersistenceState.COMMITTED,
altArtist.getPersistenceState());
assertNotNull(altArtist.getObjectContext());
- }
-
- /**
- * Test case to prove that delegate method is invoked on an unsuccessful
fault
- * resolution.
- */
- public void testShouldProcessDeleteOnResolveFault() throws Exception {
-
- final boolean[] methodInvoked = new boolean[1];
- DataContextDelegate delegate = new MockDataContextDelegate() {
-
- public boolean shouldProcessDelete(DataObject object) {
- methodInvoked[0] = true;
- return true;
- }
- };
- context.setDelegate(delegate);
-
- // create a fault for artist with a non-existing id
- ObjectId fakeID = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN,
new Integer(
- -10));
- Artist noSuchArtist = (Artist) context.localObject(fakeID, null);
- assertEquals(PersistenceState.HOLLOW,
noSuchArtist.getPersistenceState());
-
- // attempt to resolve
-
- try {
- context.prepareForAccess(noSuchArtist, null, false);
- }
- catch (CayenneRuntimeException ex) {
- // expected, as fault resolving failed...
- }
-
- assertTrue("Delegate was not consulted", methodInvoked[0]);
- assertEquals(PersistenceState.TRANSIENT,
noSuchArtist.getPersistenceState());
}
}