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 2007/01/03 18:19:14 UTC

svn commit: r492226 - in /incubator/cayenne/main/trunk/core: cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/ cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/

Author: aadamchik
Date: Wed Jan  3 09:19:13 2007
New Revision: 492226

URL: http://svn.apache.org/viewvc?view=rev&rev=492226
Log:
various fixes related to JPA integration testing

Modified:
    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/DataDomainSyncBucket.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKTest.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/IdentityColumnsTest.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java

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=492226&r1=492225&r2=492226
==============================================================================
--- 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 Wed Jan  3 09:19:13 2007
@@ -793,7 +793,7 @@
     /**
      * Registers a transient object with the context, recursively registering all
      * transient persistent objects attached to this object via relationships. <p/><i>Note
-     * that since 3.0 this method takes {@link Persistent} as an argument instead of a
+     * that since 3.0 this method takes Object as an argument instead of a
      * {@link DataObject}.</i>
      * 
      * @param object new object that needs to be made persistent.

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java?view=diff&rev=492226&r1=492225&r2=492226
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java Wed Jan  3 09:19:13 2007
@@ -168,13 +168,8 @@
                 while (objects.hasNext()) {
                     Persistent object = (Persistent) objects.next();
                     ObjectId id = object.getObjectId();
-                    DataRow dataRow = parent.getContext().currentSnapshot(object);
 
-                    if (object instanceof DataObject) {
-                        DataObject dataObject = (DataObject) object;
-                        dataRow.setReplacesVersion(dataObject.getSnapshotVersion());
-                        dataObject.setSnapshotVersion(dataRow.getVersion());
-                    }
+                    ObjectId finalId;
 
                     // record id change and update attributes for generated ids
                     if (id.isReplacementIdAttached()) {
@@ -205,15 +200,28 @@
                             deletedIds.add(id);
                         }
 
-                        modifiedSnapshots.put(replacementId, dataRow);
+                        finalId = replacementId;
                     }
                     else if (id.isTemporary()) {
                         throw new CayenneRuntimeException(
                                 "Temporary ID hasn't been replaced on commit: " + object);
                     }
                     else {
-                        modifiedSnapshots.put(id, dataRow);
+                        finalId = id;
+
+                    }
+
+                    // do not take the snapshot until generated columns are processed (see
+                    // code above)
+                    DataRow dataRow = parent.getContext().currentSnapshot(object);
+
+                    if (object instanceof DataObject) {
+                        DataObject dataObject = (DataObject) object;
+                        dataRow.setReplacesVersion(dataObject.getSnapshotVersion());
+                        dataObject.setSnapshotVersion(dataRow.getVersion());
                     }
+
+                    modifiedSnapshots.put(finalId, dataRow);
                 }
             }
         }

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKTest.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKTest.java?view=diff&rev=492226&r1=492225&r2=492226
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKTest.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextEntityWithMeaningfulPKTest.java Wed Jan  3 09:19:13 2007
@@ -20,6 +20,7 @@
 package org.apache.cayenne.access;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.art.MeaningfulPKDep;
 import org.apache.art.MeaningfulPKTest1;
@@ -34,45 +35,57 @@
  */
 public class DataContextEntityWithMeaningfulPKTest extends CayenneCase {
 
-    protected DataContext ctxt;
+    protected DataContext context;
 
     protected void setUp() throws Exception {
         super.setUp();
 
         deleteTestData();
-        ctxt = getDomain().createDataContext();
+        context = getDomain().createDataContext();
     }
 
     public void testInsertWithMeaningfulPK() throws Exception {
-        MeaningfulPKTest1 obj = (MeaningfulPKTest1) ctxt.newObject("MeaningfulPKTest1");
+        MeaningfulPKTest1 obj = (MeaningfulPKTest1) context
+                .newObject("MeaningfulPKTest1");
         obj.setPkAttribute(new Integer(1000));
         obj.setDescr("aaa-aaa");
-        ctxt.commitChanges();
+        context.commitChanges();
         ObjectIdQuery q = new ObjectIdQuery(new ObjectId(
                 "MeaningfulPKTest1",
                 MeaningfulPKTest1.PK_ATTRIBUTE_PK_COLUMN,
                 1000), true, ObjectIdQuery.CACHE_REFRESH);
-        assertEquals(1, ctxt.performQuery(q).size());
+        assertEquals(1, context.performQuery(q).size());
     }
 
     public void testGeneratedKey() throws Exception {
-        MeaningfulPKTest1 obj = (MeaningfulPKTest1) ctxt.newObject("MeaningfulPKTest1");
+        MeaningfulPKTest1 obj = (MeaningfulPKTest1) context
+                .newObject("MeaningfulPKTest1");
         obj.setDescr("aaa-aaa");
-        ctxt.commitChanges();
+        context.commitChanges();
 
         assertNotNull(obj.getPkAttribute());
-        assertSame(obj, DataObjectUtils.objectForPK(ctxt, MeaningfulPKTest1.class, obj
+        assertSame(obj, DataObjectUtils.objectForPK(context, MeaningfulPKTest1.class, obj
                 .getPkAttribute()));
+
+        int id = DataObjectUtils.intPKForObject(obj);
+
+        Map snapshot = context.getObjectStore().getDataRowCache().getCachedSnapshot(
+                obj.getObjectId());
+        assertNotNull(snapshot);
+        assertTrue(snapshot.containsKey(MeaningfulPKTest1.PK_ATTRIBUTE_PK_COLUMN));
+        assertEquals(new Integer(id), snapshot
+                .get(MeaningfulPKTest1.PK_ATTRIBUTE_PK_COLUMN));
     }
 
     public void testChangeKey() throws Exception {
-        MeaningfulPKTest1 obj = (MeaningfulPKTest1) ctxt.newObject("MeaningfulPKTest1");
+        MeaningfulPKTest1 obj = (MeaningfulPKTest1) context
+                .newObject("MeaningfulPKTest1");
         obj.setPkAttribute(new Integer(1000));
         obj.setDescr("aaa-aaa");
-        ctxt.commitChanges();
+        context.commitChanges();
 
         obj.setPkAttribute(new Integer(2000));
-        ctxt.commitChanges();
+        context.commitChanges();
 
         // assert that object id got fixed
         ObjectId id = obj.getObjectId();
@@ -80,29 +93,31 @@
     }
 
     public void testToManyRelationshipWithMeaningfulPK1() throws Exception {
-        MeaningfulPKTest1 obj = (MeaningfulPKTest1) ctxt.newObject("MeaningfulPKTest1");
+        MeaningfulPKTest1 obj = (MeaningfulPKTest1) context
+                .newObject("MeaningfulPKTest1");
         obj.setPkAttribute(new Integer(1000));
         obj.setDescr("aaa-aaa");
-        ctxt.commitChanges();
+        context.commitChanges();
 
         // must be able to resolve to-many relationship
-        ctxt = createDataContext();
-        List objects = ctxt.performQuery(new SelectQuery(MeaningfulPKTest1.class));
+        context = createDataContext();
+        List objects = context.performQuery(new SelectQuery(MeaningfulPKTest1.class));
         assertEquals(1, objects.size());
         obj = (MeaningfulPKTest1) objects.get(0);
         assertEquals(0, obj.getMeaningfulPKDepArray().size());
     }
 
     public void testToManyRelationshipWithMeaningfulPK2() throws Exception {
-        MeaningfulPKTest1 obj = (MeaningfulPKTest1) ctxt.newObject("MeaningfulPKTest1");
+        MeaningfulPKTest1 obj = (MeaningfulPKTest1) context
+                .newObject("MeaningfulPKTest1");
         obj.setPkAttribute(new Integer(1000));
         obj.setDescr("aaa-aaa");
-        ctxt.commitChanges();
+        context.commitChanges();
 
         // must be able to set reverse relationship
-        MeaningfulPKDep dep = (MeaningfulPKDep) ctxt.newObject("MeaningfulPKDep");
+        MeaningfulPKDep dep = (MeaningfulPKDep) context.newObject("MeaningfulPKDep");
         dep.setToMeaningfulPK(obj);
-        ctxt.commitChanges();
+        context.commitChanges();
     }
 
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/IdentityColumnsTest.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/IdentityColumnsTest.java?view=diff&rev=492226&r1=492225&r2=492226
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/IdentityColumnsTest.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/IdentityColumnsTest.java Wed Jan  3 09:19:13 2007
@@ -296,11 +296,7 @@
 
         context.commitChanges();
         assertNotNull(o.getGeneratedColumn());
-
-        // Note - this only *appears* to work, but the following assertion will fail. For
-        // now we address the issue by giving a warning in the modeler that generated PKs
-        // can't be meaningful.
-        // assertEquals(new Integer(33333), o.getObjectId().getIdSnapshot().get(
-        // MeaningfulGeneratedColumnTest.GENERATED_COLUMN_PK_COLUMN));
+        assertEquals(new Integer(33333), o.getObjectId().getIdSnapshot().get(
+                MeaningfulGeneratedColumnTestEntity.GENERATED_COLUMN_PK_COLUMN));
     }
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java?view=diff&rev=492226&r1=492225&r2=492226
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java Wed Jan  3 09:19:13 2007
@@ -29,6 +29,7 @@
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataObjectUtils;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.access.Transaction;
 import org.apache.cayenne.jpa.JpaEntityManager;
@@ -58,18 +59,22 @@
     @Override
     protected <T> T mergeInternal(T entity) {
         checkEntityType(entity);
-        Persistent dao = (Persistent) entity;
-        return (T) context.localObject(dao.getObjectId(), dao);
+        checkNotRemoved(entity);
+        Persistent persistent = (Persistent) entity;
+        return (T) context.localObject(persistent.getObjectId(), persistent);
     }
 
     @Override
     protected void removeInternal(Object entity) {
         checkEntityType(entity);
+        checkAttached(entity);
         context.deleteObject((Persistent) entity);
     }
 
     @Override
     protected <T> T findInternal(Class<T> entityClass, Object primaryKey) {
+        checkEntityType(entityClass);
+        checkIdType(entityClass, primaryKey);
         return (T) DataObjectUtils.objectForPK(context, entityClass, primaryKey);
     }
 
@@ -130,6 +135,36 @@
         // TODO: andrus, 8/15/2006 - noop
     }
 
+    /**
+     * Checks if an entity is attached to the current EntityManager, throwing
+     * IllegalArgumentException if not.
+     */
+    protected void checkAttached(Object entity) throws IllegalArgumentException {
+        if (entity instanceof Persistent) {
+            Persistent p = (Persistent) entity;
+            if (p.getPersistenceState() == PersistenceState.TRANSIENT
+                    || p.getObjectContext() == null) {
+                throw new IllegalArgumentException("entity is detached: " + entity);
+            }
+        }
+        else {
+            throw new IllegalArgumentException("entity must be Persistent: " + entity);
+        }
+    }
+
+    /**
+     * Checks if an entity is not removed in the current EntityManager, throwing
+     * IllegalArgumentException if it is.
+     */
+    protected void checkNotRemoved(Object entity) throws IllegalArgumentException {
+        if (entity instanceof Persistent) {
+            Persistent p = (Persistent) entity;
+            if (p.getPersistenceState() == PersistenceState.DELETED) {
+                throw new IllegalArgumentException("entity is removed: " + entity);
+            }
+        }
+    }
+
     protected void checkEntityType(Class entityClass) throws IllegalArgumentException {
         if (entityClass == null) {
             throw new IllegalArgumentException("Null entity class");
@@ -150,5 +185,9 @@
             String className = (entity != null) ? entity.getClass().getName() : "<null>";
             throw new IllegalArgumentException("entity must be Persistent: " + className);
         }
+    }
+    
+    protected void checkIdType(Class entityClass, Object id) {
+        
     }
 }