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 2016/08/12 15:05:55 UTC

cayenne git commit: DataContext.currentSnapshot() doesn't set snapshot entity name

Repository: cayenne
Updated Branches:
  refs/heads/master c61469106 -> c94690352


DataContext.currentSnapshot() doesn't set snapshot entity name

* unit tests
* integration tests
* the fix


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/c9469035
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/c9469035
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/c9469035

Branch: refs/heads/master
Commit: c94690352cbbf4f97b73d0b6bd2c698d5b1c73ca
Parents: c614691
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Aug 12 17:15:56 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Aug 12 18:05:34 2016 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/access/DataContext.java  |  1 +
 .../apache/cayenne/access/ObjectResolver.java   | 29 ++++++---
 .../apache/cayenne/access/DataContextIT.java    | 50 ++++++++-------
 .../DataContextObjectIdQuery_PolymorphicIT.java | 41 ++++++++++--
 ...aContextRelationshipQuery_PolymorphicIT.java | 67 ++++++++++++++++++++
 5 files changed, 152 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/c9469035/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
index 209d78e..05186ab 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
@@ -312,6 +312,7 @@ public class DataContext extends BaseContext {
         ObjEntity entity = getEntityResolver().getObjEntity(object);
         final ClassDescriptor descriptor = getEntityResolver().getClassDescriptor(entity.getName());
         final DataRow snapshot = new DataRow(10);
+        snapshot.setEntityName(entity.getName());
 
         descriptor.visitProperties(new PropertyVisitor() {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c9469035/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
index 1090e4a..e3c0fe4 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
@@ -19,12 +19,6 @@
 
 package org.apache.cayenne.access;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataObject;
 import org.apache.cayenne.DataRow;
@@ -37,6 +31,14 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * DataRows-to-objects converter for a specific ObjEntity.
@@ -45,6 +47,8 @@ import org.apache.cayenne.reflect.ClassDescriptor;
  */
 class ObjectResolver {
 
+	private static final Log LOGGER = LogFactory.getLog(ObjectResolver.class);
+
 	DataContext context;
 	ClassDescriptor descriptor;
 	Collection<DbAttribute> primaryKey;
@@ -255,8 +259,17 @@ class ObjectResolver {
 		public final ClassDescriptor descriptorForRow(DataRow row) {
 			String entityName = row.getEntityName();
 
-			// null probably means that inheritance qualifiers are messed up
-			return (entityName != null) ? context.getEntityResolver().getClassDescriptor(entityName) : descriptor;
+			// null either means a bug in Cayenne (e.g. CAY-2101) or the inheritance qualifiers are messed up
+			if(entityName == null) {
+
+				if(LOGGER.isWarnEnabled()) {
+					LOGGER.warn("** Null entity name for DataRow, can't resolve sub descriptor for "
+							+ descriptor.getEntity().getName());
+					return descriptor;
+				}
+			}
+
+			return context.getEntityResolver().getClassDescriptor(entityName);
 		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c9469035/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java
index a146d4a..2df2234 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextIT.java
@@ -19,29 +19,6 @@
 
 package org.apache.cayenne.access;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.math.BigDecimal;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.DataObject;
 import org.apache.cayenne.DataRow;
@@ -81,6 +58,29 @@ import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class DataContextIT extends ServerCase {
 
@@ -183,6 +183,7 @@ public class DataContextIT extends ServerCase {
 		DataRow snapshot = context.currentSnapshot(artist);
 		assertEquals(artist.getArtistName(), snapshot.get("ARTIST_NAME"));
 		assertEquals(artist.getDateOfBirth(), snapshot.get("DATE_OF_BIRTH"));
+		assertEquals("Artist", snapshot.getEntityName());
 	}
 
 	@Test
@@ -198,6 +199,8 @@ public class DataContextIT extends ServerCase {
 		artist.setDateOfBirth(null);
 
 		DataRow snapshot = context.currentSnapshot(artist);
+		assertEquals("Artist", snapshot.getEntityName());
+
 		assertTrue(snapshot.containsKey("ARTIST_NAME"));
 		assertNull(snapshot.get("ARTIST_NAME"));
 
@@ -220,6 +223,7 @@ public class DataContextIT extends ServerCase {
 		p1.setToArtist(artist);
 
 		DataRow s1 = context.currentSnapshot(p1);
+		assertEquals("Painting", s1.getEntityName());
 		Map<String, Object> idMap = artist.getObjectId().getIdSnapshot();
 		assertEquals(idMap.get("ARTIST_ID"), s1.get("ARTIST_ID"));
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c9469035/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextObjectIdQuery_PolymorphicIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextObjectIdQuery_PolymorphicIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextObjectIdQuery_PolymorphicIT.java
index f2c703c..dca7dd5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextObjectIdQuery_PolymorphicIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextObjectIdQuery_PolymorphicIT.java
@@ -1,16 +1,12 @@
 package org.apache.cayenne.access;
 
-import static org.junit.Assert.assertTrue;
-
-import java.sql.SQLException;
-import java.sql.Types;
-
 import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.query.ObjectIdQuery;
 import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.inheritance_people.AbstractPerson;
+import org.apache.cayenne.testdo.inheritance_people.Employee;
 import org.apache.cayenne.testdo.inheritance_people.Manager;
 import org.apache.cayenne.unit.di.DataChannelInterceptor;
 import org.apache.cayenne.unit.di.UnitTestClosure;
@@ -18,6 +14,11 @@ import org.apache.cayenne.unit.di.server.PeopleProjectCase;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.sql.SQLException;
+import java.sql.Types;
+
+import static org.junit.Assert.assertTrue;
+
 public class DataContextObjectIdQuery_PolymorphicIT extends PeopleProjectCase {
 
 	@Inject
@@ -60,6 +61,36 @@ public class DataContextObjectIdQuery_PolymorphicIT extends PeopleProjectCase {
 	}
 
 	@Test
+	public void testPolymorphicSharedCache_AfterCayenneInsert() throws SQLException {
+
+
+		// see CAY-2101... we are trying to get a snapshot from a new object in the shared cache, and then read this
+		// object via a relationship, so that shared cache is consulted
+		Employee e = context1.newObject(Employee.class);
+		e.setName("E1");
+		e.setSalary(1234.01f);
+
+		context1.commitChanges();
+
+
+		final ObjectIdQuery q1 = new ObjectIdQuery(
+				new ObjectId("AbstractPerson", "PERSON_ID", Cayenne.intPKForObject(e)),
+				false,
+				ObjectIdQuery.CACHE);
+
+
+		queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+			@Override
+			public void execute() {
+				// use different context to ensure we hit shared cache
+				AbstractPerson ap1 = (AbstractPerson) Cayenne.objectForQuery(context2, q1);
+				assertTrue(ap1 instanceof Employee);
+			}
+		});
+	}
+
+	@Test
 	public void testPolymorphicLocalCache() throws SQLException {
 
 		tPerson.insert(1, "P1", "EM");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c9469035/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQuery_PolymorphicIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQuery_PolymorphicIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQuery_PolymorphicIT.java
new file mode 100644
index 0000000..0e667fd
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQuery_PolymorphicIT.java
@@ -0,0 +1,67 @@
+package org.apache.cayenne.access;
+
+import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.inheritance_people.Employee;
+import org.apache.cayenne.testdo.inheritance_people.PersonNotes;
+import org.apache.cayenne.unit.di.DataChannelInterceptor;
+import org.apache.cayenne.unit.di.UnitTestClosure;
+import org.apache.cayenne.unit.di.server.PeopleProjectCase;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.SQLException;
+import java.sql.Types;
+
+import static org.junit.Assert.assertTrue;
+
+public class DataContextRelationshipQuery_PolymorphicIT extends PeopleProjectCase {
+
+    @Inject
+    private DataContext context1;
+
+    @Inject
+    private DataContext context2;
+
+    @Inject
+    private DataChannelInterceptor queryInterceptor;
+
+    private TableHelper tPerson;
+    private TableHelper tPersonNotes;
+
+    @Before
+    public void before() {
+        tPerson = new TableHelper(dbHelper, "PERSON").setColumns("PERSON_ID", "NAME", "PERSON_TYPE")
+                .setColumnTypes(Types.INTEGER, Types.VARCHAR, Types.CHAR);
+
+        tPersonNotes = new TableHelper(dbHelper, "PERSON_NOTES").setColumns("ID", "PERSON_ID", "NOTES");
+    }
+
+    @Test
+    public void testPolymorphicSharedCache() throws SQLException {
+
+
+        // see CAY-2101... we are trying to get a snapshot from a new object in the shared cache, and then read this
+        // object via a relationship, so that shared cache is consulted
+        Employee e = context1.newObject(Employee.class);
+        e.setName("E1");
+        e.setSalary(1234.01f);
+        PersonNotes n = context1.newObject(PersonNotes.class);
+        n.setNotes("N1");
+        n.setPerson(e);
+
+        context1.commitChanges();
+
+        // use different context to ensure we hit shared cache for relationship resolving
+        final PersonNotes nPeer = Cayenne.objectForPK(context2, PersonNotes.class, Cayenne.intPKForObject(n));
+
+        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            @Override
+            public void execute() {
+                assertTrue(nPeer.getPerson() instanceof Employee);
+            }
+        });
+    }
+}