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 2006/10/15 04:53:01 UTC
svn commit: r464103 - in /incubator/cayenne/main/trunk:
assembly/cayenne-generic/src/main/resources/
core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/
core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/
core/cayenne-jdk1.4/src/main/java/or...
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
+ * {@link 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());
}
}