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 [EMAIL PROTECTED] Persistent} as an argument instead of a + * that since 3.0 this method takes Object as an argument instead of a * [EMAIL PROTECTED] 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) { + } }