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);
+ }
+ });
+ }
+}