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 2014/11/02 08:09:56 UTC

[08/48] Installing Maven Failsafe Plugin

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityTest.java
deleted file mode 100644
index 6bdcda6..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityTest.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.map;
-
-import java.util.Collection;
-
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.util.Util;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DbEntityTest extends ServerCase {
-
-    @Inject
-    private ServerRuntime runtime;
-
-    public void testSerializability() throws Exception {
-        DbEntity entity = new DbEntity("entity");
-
-        DbAttribute pk = new DbAttribute("pk");
-        pk.setPrimaryKey(true);
-        entity.addAttribute(pk);
-
-        DbAttribute generated = new DbAttribute("generated");
-        generated.setGenerated(true);
-        entity.addAttribute(generated);
-
-        DbEntity d2 = Util.cloneViaSerialization(entity);
-
-        assertNotNull(d2.getPrimaryKeys());
-        assertEquals(entity.getPrimaryKeys().size(), d2.getPrimaryKeys().size());
-
-        DbAttribute pk2 = d2.getAttribute(pk.getName());
-        assertNotNull(pk2);
-        assertTrue(d2.getPrimaryKeys().contains(pk2));
-
-        assertNotNull(d2.getGeneratedAttributes());
-        assertEquals(entity.getGeneratedAttributes().size(), d2.getGeneratedAttributes().size());
-
-        DbAttribute generated2 = d2.getAttribute(generated.getName());
-        assertNotNull(generated2);
-        assertTrue(d2.getGeneratedAttributes().contains(generated2));
-    }
-
-    public void testConstructor1() {
-        DbEntity ent = new DbEntity();
-        assertNull(ent.getName());
-    }
-
-    public void testConstructor2() {
-        DbEntity ent = new DbEntity("abc");
-        assertEquals("abc", ent.getName());
-    }
-
-    public void testCatalog() {
-        String tstName = "tst_name";
-        DbEntity ent = new DbEntity("abc");
-        ent.setCatalog(tstName);
-        assertEquals(tstName, ent.getCatalog());
-    }
-
-    public void testSchema() {
-        String tstName = "tst_name";
-        DbEntity ent = new DbEntity("abc");
-        ent.setSchema(tstName);
-        assertEquals(tstName, ent.getSchema());
-    }
-
-    public void testFullyQualifiedName() {
-
-        DbEntity e1 = new DbEntity("e1");
-        assertEquals("e1", e1.getFullyQualifiedName());
-
-        DbEntity e2 = new DbEntity("e2");
-        e2.setSchema("s2");
-        assertEquals("e2", e2.getName());
-        assertEquals("s2.e2", e2.getFullyQualifiedName());
-
-        DbEntity e3 = new DbEntity("e3");
-        e3.setSchema("s3");
-        e3.setCatalog("c3");
-        assertEquals("e3", e3.getName());
-        assertEquals("c3.s3.e3", e3.getFullyQualifiedName());
-
-        DbEntity e4 = new DbEntity("e4");
-        e4.setCatalog("c4");
-        assertEquals("e4", e4.getName());
-        assertEquals("c4.e4", e4.getFullyQualifiedName());
-    }
-
-    public void testGetPrimaryKey() {
-        DbEntity ent = new DbEntity("abc");
-
-        DbAttribute a1 = new DbAttribute();
-        a1.setName("a1");
-        a1.setPrimaryKey(false);
-        ent.addAttribute(a1);
-
-        DbAttribute a2 = new DbAttribute();
-        a2.setName("a2");
-        a2.setPrimaryKey(true);
-        ent.addAttribute(a2);
-
-        Collection<DbAttribute> pk = ent.getPrimaryKeys();
-        assertNotNull(pk);
-        assertEquals(1, pk.size());
-        assertSame(a2, pk.iterator().next());
-    }
-
-    public void testAddPKAttribute() {
-        DbEntity ent = new DbEntity("abc");
-
-        DbAttribute a1 = new DbAttribute();
-        a1.setName("a1");
-        a1.setPrimaryKey(false);
-
-        assertTrue(ent.getPrimaryKeys().isEmpty());
-        ent.addAttribute(a1);
-        assertTrue(ent.getPrimaryKeys().isEmpty());
-    }
-
-    public void testChangeAttributeToPK() {
-        DbEntity ent = new DbEntity("abc");
-
-        DbAttribute a1 = new DbAttribute();
-        a1.setName("a1");
-        a1.setPrimaryKey(false);
-        ent.addAttribute(a1);
-
-        assertFalse(ent.getPrimaryKeys().contains(a1));
-        a1.setPrimaryKey(true);
-        assertTrue(ent.getPrimaryKeys().contains(a1));
-    }
-
-    public void testChangePKAttribute() {
-        DbEntity ent = new DbEntity("abc");
-
-        DbAttribute a1 = new DbAttribute();
-        a1.setName("a1");
-        a1.setPrimaryKey(true);
-        ent.addAttribute(a1);
-
-        assertTrue(ent.getPrimaryKeys().contains(a1));
-        a1.setPrimaryKey(false);
-        assertFalse(ent.getPrimaryKeys().contains(a1));
-    }
-
-    public void testRemoveAttribute() {
-        DbEntity ent = new DbEntity("abc");
-
-        DataMap map = new DataMap("map");
-        ent.setName("ent");
-        map.addDbEntity(ent);
-
-        DbAttribute a1 = new DbAttribute();
-        a1.setName("a1");
-        a1.setPrimaryKey(false);
-        ent.addAttribute(a1);
-
-        DbEntity otherEntity = new DbEntity("22ent1");
-        assertNotNull(otherEntity.getName());
-        map.addDbEntity(otherEntity);
-        DbAttribute a11 = new DbAttribute();
-        a11.setName("a11");
-        a11.setPrimaryKey(false);
-        otherEntity.addAttribute(a11);
-
-        DbRelationship rel = new DbRelationship("relfrom");
-        ent.addRelationship(rel);
-        rel.setTargetEntity(otherEntity);
-        rel.addJoin(new DbJoin(rel, "a1", "a11"));
-
-        DbRelationship rel1 = new DbRelationship("relto");
-        otherEntity.addRelationship(rel1);
-        rel1.setTargetEntity(ent);
-        rel1.addJoin(new DbJoin(rel1, "a11", "a1"));
-
-        // check that the test case is working
-        assertSame(a1, ent.getAttribute(a1.getName()));
-        assertSame(rel, ent.getRelationship(rel.getName()));
-
-        // test removal
-        ent.removeAttribute(a1.getName());
-
-        assertNull(ent.getAttribute(a1.getName()));
-        assertEquals(0, rel1.getJoins().size());
-        assertEquals(0, rel.getJoins().size());
-    }
-
-    public void testTranslateToRelatedEntityIndependentPath() {
-        DbEntity artistE = runtime.getDataDomain().getEntityResolver().getDbEntity("ARTIST");
-
-        Expression e1 = Expression.fromString("db:paintingArray");
-        Expression translated = artistE.translateToRelatedEntity(e1, "artistExhibitArray");
-        assertEquals("failure: " + translated, Expression.fromString("db:toArtist.paintingArray"), translated);
-    }
-
-    public void testTranslateToRelatedEntityTrimmedPath() {
-        DbEntity artistE = runtime.getDataDomain().getEntityResolver().getDbEntity("ARTIST");
-
-        Expression e1 = Expression.fromString("db:artistExhibitArray.toExhibit");
-        Expression translated = artistE.translateToRelatedEntity(e1, "artistExhibitArray");
-        assertEquals("failure: " + translated, Expression.fromString("db:toArtist.artistExhibitArray.toExhibit"),
-                translated);
-    }
-
-    public void testTranslateToRelatedEntitySplitHalfWay() {
-        DbEntity artistE = runtime.getDataDomain().getEntityResolver().getDbEntity("ARTIST");
-
-        Expression e1 = Expression.fromString("db:paintingArray.toPaintingInfo.TEXT_REVIEW");
-        Expression translated = artistE.translateToRelatedEntity(e1, "paintingArray.toGallery");
-        assertEquals("failure: " + translated,
-                Expression.fromString("db:paintingArray.toArtist.paintingArray.toPaintingInfo.TEXT_REVIEW"), translated);
-    }
-
-    public void testTranslateToRelatedEntityMatchingPath() {
-        DbEntity artistE = runtime.getDataDomain().getEntityResolver().getDbEntity("ARTIST");
-
-        Expression e1 = Expression.fromString("db:artistExhibitArray.toExhibit");
-        Expression translated = artistE.translateToRelatedEntity(e1, "artistExhibitArray.toExhibit");
-
-        assertEquals("failure: " + translated,
-                Expression.fromString("db:artistExhibitArray.toArtist.artistExhibitArray.toExhibit"), translated);
-    }
-
-    public void testTranslateToRelatedEntityToOne() {
-        DbEntity paintingE = runtime.getDataDomain().getEntityResolver().getDbEntity("PAINTING");
-
-        Expression e1 = Expression.fromString("db:toArtist.ARTIST_NAME = 'aa'");
-        Expression translated = paintingE.translateToRelatedEntity(e1, "toArtist");
-
-        assertEquals("failure: " + translated, Expression.fromString("db:ARTIST_NAME = 'aa'"), translated);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java
new file mode 100644
index 0000000..71a192a
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java
@@ -0,0 +1,110 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.map;
+
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DbRelationshipIT extends ServerCase {
+
+    @Inject
+    private ServerRuntime runtime;
+
+    protected DbEntity artistEnt;
+    protected DbEntity paintingEnt;
+    protected DbEntity galleryEnt;
+
+    @Override
+    public void setUpAfterInjection() throws Exception {
+        artistEnt = runtime.getDataDomain().getEntityResolver().getDbEntity("ARTIST");
+        paintingEnt = runtime.getDataDomain().getEntityResolver().getDbEntity("PAINTING");
+        galleryEnt = runtime.getDataDomain().getEntityResolver().getDbEntity("GALLERY");
+    }
+
+    public void testSrcFkSnapshotWithTargetSnapshot() throws Exception {
+        Map<String, Object> map = new HashMap<String, Object>();
+        Integer id = new Integer(44);
+        map.put("GALLERY_ID", id);
+
+        DbRelationship dbRel = galleryEnt.getRelationship("paintingArray");
+        Map<String, Object> targetMap = dbRel.getReverseRelationship().srcFkSnapshotWithTargetSnapshot(map);
+        assertEquals(id, targetMap.get("GALLERY_ID"));
+    }
+
+    public void testGetReverseRelationship1() throws Exception {
+        // start with "to many"
+        DbRelationship r1 = artistEnt.getRelationship("paintingArray");
+        DbRelationship r2 = r1.getReverseRelationship();
+
+        assertNotNull(r2);
+        assertSame(paintingEnt.getRelationship("toArtist"), r2);
+    }
+
+    public void testGetReverseRelationship2() throws Exception {
+        // start with "to one"
+        DbRelationship r1 = paintingEnt.getRelationship("toArtist");
+        DbRelationship r2 = r1.getReverseRelationship();
+
+        assertNotNull(r2);
+        assertSame(artistEnt.getRelationship("paintingArray"), r2);
+    }
+
+    public void testGetReverseRelationshipToSelf() {
+
+        // assemble mockup entity
+        DataMap namespace = new DataMap();
+        DbEntity e = new DbEntity("test");
+        namespace.addDbEntity(e);
+        DbRelationship rforward = new DbRelationship("rforward");
+        e.addRelationship(rforward);
+        rforward.setSourceEntity(e);
+        rforward.setTargetEntity(e);
+
+        assertNull(rforward.getReverseRelationship());
+
+        // add a joins
+        e.addAttribute(new DbAttribute("a1"));
+        e.addAttribute(new DbAttribute("a2"));
+        rforward.addJoin(new DbJoin(rforward, "a1", "a2"));
+
+        assertNull(rforward.getReverseRelationship());
+
+        // create reverse
+
+        DbRelationship rback = new DbRelationship("rback");
+        e.addRelationship(rback);
+        rback.setSourceEntity(e);
+        rback.setTargetEntity(e);
+
+        assertNull(rforward.getReverseRelationship());
+
+        // create reverse join
+        rback.addJoin(new DbJoin(rback, "a2", "a1"));
+
+        assertSame(rback, rforward.getReverseRelationship());
+        assertSame(rforward, rback.getReverseRelationship());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipTest.java
deleted file mode 100644
index 6109725..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.map;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DbRelationshipTest extends ServerCase {
-
-    @Inject
-    private ServerRuntime runtime;
-
-    protected DbEntity artistEnt;
-    protected DbEntity paintingEnt;
-    protected DbEntity galleryEnt;
-
-    @Override
-    public void setUpAfterInjection() throws Exception {
-        artistEnt = runtime.getDataDomain().getEntityResolver().getDbEntity("ARTIST");
-        paintingEnt = runtime.getDataDomain().getEntityResolver().getDbEntity("PAINTING");
-        galleryEnt = runtime.getDataDomain().getEntityResolver().getDbEntity("GALLERY");
-    }
-
-    public void testSrcFkSnapshotWithTargetSnapshot() throws Exception {
-        Map<String, Object> map = new HashMap<String, Object>();
-        Integer id = new Integer(44);
-        map.put("GALLERY_ID", id);
-
-        DbRelationship dbRel = galleryEnt.getRelationship("paintingArray");
-        Map<String, Object> targetMap = dbRel.getReverseRelationship().srcFkSnapshotWithTargetSnapshot(map);
-        assertEquals(id, targetMap.get("GALLERY_ID"));
-    }
-
-    public void testGetReverseRelationship1() throws Exception {
-        // start with "to many"
-        DbRelationship r1 = artistEnt.getRelationship("paintingArray");
-        DbRelationship r2 = r1.getReverseRelationship();
-
-        assertNotNull(r2);
-        assertSame(paintingEnt.getRelationship("toArtist"), r2);
-    }
-
-    public void testGetReverseRelationship2() throws Exception {
-        // start with "to one"
-        DbRelationship r1 = paintingEnt.getRelationship("toArtist");
-        DbRelationship r2 = r1.getReverseRelationship();
-
-        assertNotNull(r2);
-        assertSame(artistEnt.getRelationship("paintingArray"), r2);
-    }
-
-    public void testGetReverseRelationshipToSelf() {
-
-        // assemble mockup entity
-        DataMap namespace = new DataMap();
-        DbEntity e = new DbEntity("test");
-        namespace.addDbEntity(e);
-        DbRelationship rforward = new DbRelationship("rforward");
-        e.addRelationship(rforward);
-        rforward.setSourceEntity(e);
-        rforward.setTargetEntity(e);
-
-        assertNull(rforward.getReverseRelationship());
-
-        // add a joins
-        e.addAttribute(new DbAttribute("a1"));
-        e.addAttribute(new DbAttribute("a2"));
-        rforward.addJoin(new DbJoin(rforward, "a1", "a2"));
-
-        assertNull(rforward.getReverseRelationship());
-
-        // create reverse
-
-        DbRelationship rback = new DbRelationship("rback");
-        e.addRelationship(rback);
-        rback.setSourceEntity(e);
-        rback.setTargetEntity(e);
-
-        assertNull(rforward.getReverseRelationship());
-
-        // create reverse join
-        rback.addJoin(new DbJoin(rback, "a2", "a1"));
-
-        assertSame(rback, rforward.getReverseRelationship());
-        assertSame(rforward, rback.getReverseRelationship());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityIT.java
new file mode 100644
index 0000000..b235267
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityIT.java
@@ -0,0 +1,204 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.map;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.apache.cayenne.util.CayenneMapEntry;
+import org.apache.cayenne.util.Util;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class EntityIT extends ServerCase {
+
+    @Inject
+    private ServerRuntime runtime;
+
+    public void testSerializability() throws Exception {
+        Entity entity = new MockEntity("entity");
+
+        Entity d1 = Util.cloneViaSerialization(entity);
+        assertEquals(entity.getName(), d1.getName());
+
+        entity.addAttribute(new MockAttribute("abc"));
+        entity.addRelationship(new MockRelationship("xyz"));
+        Entity d2 = Util.cloneViaSerialization(entity);
+        assertNotNull(d2.getAttribute("abc"));
+
+        // test that ref collection wrappers are still working
+        assertNotNull(d2.getAttributes());
+        assertEquals(entity.getAttributes().size(), d2.getAttributes().size());
+        assertTrue(d2.getAttributes().contains(d2.getAttribute("abc")));
+
+        assertNotNull(d2.getRelationships());
+        assertEquals(entity.getRelationships().size(), d2.getRelationships().size());
+        assertTrue(d2.getRelationships().contains(d2.getRelationship("xyz")));
+
+        assertNotNull(d2.getAttributeMap());
+        assertEquals(entity.getAttributes().size(), d2.getAttributeMap().size());
+        assertSame(d2.getAttribute("abc"), d2.getAttributeMap().get("abc"));
+
+        assertNotNull(d2.getRelationshipMap());
+        assertEquals(entity.getRelationships().size(), d2.getRelationshipMap().size());
+        assertSame(d2.getRelationship("xyz"), d2.getRelationshipMap().get("xyz"));
+    }
+
+    public void testName() {
+        Entity entity = new MockEntity();
+        String tstName = "tst_name";
+        entity.setName(tstName);
+        assertEquals(tstName, entity.getName());
+    }
+
+    public void testAttribute() {
+        Entity entity = new MockEntity();
+        Attribute attribute = new MockAttribute("tst_name");
+
+        entity.addAttribute(attribute);
+        assertSame(attribute, entity.getAttribute(attribute.getName()));
+
+        // attribute must have its entity switched to our entity.
+        assertSame(entity, attribute.getEntity());
+
+        // remove attribute
+        entity.removeAttribute(attribute.getName());
+        assertNull(entity.getAttribute(attribute.getName()));
+    }
+
+    public void testRelationship() {
+        Entity entity = new MockEntity();
+        Relationship rel = new MockRelationship("tst_name");
+
+        entity.addRelationship(rel);
+        assertSame(rel, entity.getRelationship(rel.getName()));
+
+        // attribute must have its entity switched to our entity.
+        assertSame(entity, rel.getSourceEntity());
+
+        // remove attribute
+        entity.removeRelationship(rel.getName());
+        assertNull(entity.getRelationship(rel.getName()));
+    }
+
+    public void testAttributeClashWithRelationship() {
+        Entity entity = new MockEntity();
+        Relationship rel = new MockRelationship("tst_name");
+
+        entity.addRelationship(rel);
+
+        try {
+            Attribute attribute = new MockAttribute("tst_name");
+            entity.addAttribute(attribute);
+
+            fail("Exception should have been thrown due to clashing attribute and relationship names.");
+        } catch (Exception e) {
+            // Exception expected.
+        }
+    }
+
+    public void testRelationshipClashWithAttribute() {
+        Entity entity = new MockEntity();
+        Attribute attribute = new MockAttribute("tst_name");
+
+        entity.addAttribute(attribute);
+
+        try {
+            Relationship rel = new MockRelationship("tst_name");
+            entity.addRelationship(rel);
+
+            fail("Exception should have been thrown due to clashing attribute and relationship names.");
+        } catch (Exception e) {
+            // Exception expected.
+        }
+    }
+
+    public void testResolveBadObjPath1() {
+        // test invalid expression path
+        Expression pathExpr = ExpressionFactory.expressionOfType(Expression.OBJ_PATH);
+        pathExpr.setOperand(0, "invalid.invalid");
+
+        // itertator should be returned, but when trying to read 1st component,
+        // it should throw an exception....
+        ObjEntity galleryEnt = runtime.getDataDomain().getEntityResolver().getObjEntity("Gallery");
+        Iterator<CayenneMapEntry> it = galleryEnt.resolvePathComponents(pathExpr);
+        assertTrue(it.hasNext());
+
+        try {
+            it.next();
+            fail();
+        } catch (Exception ex) {
+            // exception expected
+        }
+    }
+
+    public void testResolveBadObjPath2() {
+        // test invalid expression type
+        Expression badPathExpr = ExpressionFactory.expressionOfType(Expression.IN);
+        badPathExpr.setOperand(0, "a.b.c");
+        ObjEntity galleryEnt = runtime.getDataDomain().getEntityResolver().getObjEntity("Gallery");
+
+        try {
+            galleryEnt.resolvePathComponents(badPathExpr);
+            fail();
+        } catch (Exception ex) {
+            // exception expected
+        }
+    }
+
+    public void testResolveObjPath1() {
+        Expression pathExpr = ExpressionFactory.expressionOfType(Expression.OBJ_PATH);
+        pathExpr.setOperand(0, "galleryName");
+
+        ObjEntity galleryEnt = runtime.getDataDomain().getEntityResolver().getObjEntity("Gallery");
+        Iterator<CayenneMapEntry> it = galleryEnt.resolvePathComponents(pathExpr);
+
+        // iterator must contain a single ObjAttribute
+        assertNotNull(it);
+        assertTrue(it.hasNext());
+        ObjAttribute next = (ObjAttribute) it.next();
+        assertNotNull(next);
+        assertFalse(it.hasNext());
+        assertSame(galleryEnt.getAttribute("galleryName"), next);
+    }
+
+    public void testRemoveAttribute() {
+        Entity entity = new MockEntity();
+
+        entity.setName("test");
+        ObjAttribute attribute1 = new ObjAttribute("a1");
+        ObjAttribute attribute2 = new ObjAttribute("a2");
+
+        entity.addAttribute(attribute1);
+        entity.addAttribute(attribute2);
+
+        Collection<? extends Attribute> attributes = entity.getAttributes();
+        assertEquals(2, attributes.size());
+
+        entity.removeAttribute("a1");
+        attributes = entity.getAttributes();
+        assertEquals(1, attributes.size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverClassDescriptorIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverClassDescriptorIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverClassDescriptorIT.java
new file mode 100644
index 0000000..6cb3bcb
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverClassDescriptorIT.java
@@ -0,0 +1,95 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.map;
+
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.reflect.ArcProperty;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.reflect.ClassDescriptorFactory;
+import org.apache.cayenne.reflect.LazyClassDescriptorDecorator;
+import org.apache.cayenne.reflect.PropertyDescriptor;
+import org.apache.cayenne.testdo.mt.MtTable1;
+import org.apache.cayenne.testdo.mt.MtTable2;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@UseServerRuntime(ServerCase.MULTI_TIER_PROJECT)
+public class EntityResolverClassDescriptorIT extends ServerCase {
+
+    @Inject
+    private ServerRuntime runtime;
+
+    public void testServerDescriptorCaching() {
+        EntityResolver resolver = runtime.getDataDomain().getEntityResolver();
+        resolver.getClassDescriptorMap().clearDescriptors();
+
+        ClassDescriptor descriptor = resolver.getClassDescriptor("MtTable1");
+        assertNotNull(descriptor);
+        assertSame(descriptor, resolver.getClassDescriptor("MtTable1"));
+        resolver.getClassDescriptorMap().clearDescriptors();
+
+        ClassDescriptor descriptor1 = resolver.getClassDescriptor("MtTable1");
+        assertNotNull(descriptor1);
+        assertNotSame(descriptor, descriptor1);
+    }
+
+    public void testServerDescriptorFactory() {
+        EntityResolver resolver = runtime.getDataDomain().getEntityResolver();
+        resolver.getClassDescriptorMap().clearDescriptors();
+
+        ClassDescriptor descriptor = mock(ClassDescriptor.class);
+        ClassDescriptorFactory factory = mock(ClassDescriptorFactory.class);
+        when(factory.getDescriptor("MtTable1")).thenReturn(descriptor);
+        
+        resolver.getClassDescriptorMap().addFactory(factory);
+        try {
+            ClassDescriptor resolved = resolver.getClassDescriptor("MtTable1");
+            assertNotNull(resolved);
+            resolved = ((LazyClassDescriptorDecorator) resolved).getDescriptor();
+            assertSame(descriptor, resolved);
+        }
+        finally {
+            resolver.getClassDescriptorMap().removeFactory(factory);
+        }
+    }
+
+    public void testArcProperties() {
+        EntityResolver resolver = runtime.getDataDomain().getEntityResolver();
+        resolver.getClassDescriptorMap().clearDescriptors();
+
+        ClassDescriptor descriptor = resolver.getClassDescriptor("MtTable1");
+        assertNotNull(descriptor);
+
+        PropertyDescriptor p = descriptor.getProperty(MtTable1.TABLE2ARRAY_PROPERTY);
+        assertTrue(p instanceof ArcProperty);
+
+        ClassDescriptor target = ((ArcProperty) p).getTargetDescriptor();
+        assertNotNull(target);
+        assertSame(resolver.getClassDescriptor("MtTable2"), target);
+        assertNotNull(((ArcProperty) p).getComplimentaryReverseArc());
+        assertEquals(MtTable2.TABLE1_PROPERTY, ((ArcProperty) p)
+                .getComplimentaryReverseArc()
+                .getName());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverClassDescriptorTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverClassDescriptorTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverClassDescriptorTest.java
deleted file mode 100644
index 798a5d7..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverClassDescriptorTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.map;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.reflect.ArcProperty;
-import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.cayenne.reflect.ClassDescriptorFactory;
-import org.apache.cayenne.reflect.LazyClassDescriptorDecorator;
-import org.apache.cayenne.reflect.PropertyDescriptor;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.testdo.mt.MtTable2;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.MULTI_TIER_PROJECT)
-public class EntityResolverClassDescriptorTest extends ServerCase {
-
-    @Inject
-    private ServerRuntime runtime;
-
-    public void testServerDescriptorCaching() {
-        EntityResolver resolver = runtime.getDataDomain().getEntityResolver();
-        resolver.getClassDescriptorMap().clearDescriptors();
-
-        ClassDescriptor descriptor = resolver.getClassDescriptor("MtTable1");
-        assertNotNull(descriptor);
-        assertSame(descriptor, resolver.getClassDescriptor("MtTable1"));
-        resolver.getClassDescriptorMap().clearDescriptors();
-
-        ClassDescriptor descriptor1 = resolver.getClassDescriptor("MtTable1");
-        assertNotNull(descriptor1);
-        assertNotSame(descriptor, descriptor1);
-    }
-
-    public void testServerDescriptorFactory() {
-        EntityResolver resolver = runtime.getDataDomain().getEntityResolver();
-        resolver.getClassDescriptorMap().clearDescriptors();
-
-        ClassDescriptor descriptor = mock(ClassDescriptor.class);
-        ClassDescriptorFactory factory = mock(ClassDescriptorFactory.class);
-        when(factory.getDescriptor("MtTable1")).thenReturn(descriptor);
-        
-        resolver.getClassDescriptorMap().addFactory(factory);
-        try {
-            ClassDescriptor resolved = resolver.getClassDescriptor("MtTable1");
-            assertNotNull(resolved);
-            resolved = ((LazyClassDescriptorDecorator) resolved).getDescriptor();
-            assertSame(descriptor, resolved);
-        }
-        finally {
-            resolver.getClassDescriptorMap().removeFactory(factory);
-        }
-    }
-
-    public void testArcProperties() {
-        EntityResolver resolver = runtime.getDataDomain().getEntityResolver();
-        resolver.getClassDescriptorMap().clearDescriptors();
-
-        ClassDescriptor descriptor = resolver.getClassDescriptor("MtTable1");
-        assertNotNull(descriptor);
-
-        PropertyDescriptor p = descriptor.getProperty(MtTable1.TABLE2ARRAY_PROPERTY);
-        assertTrue(p instanceof ArcProperty);
-
-        ClassDescriptor target = ((ArcProperty) p).getTargetDescriptor();
-        assertNotNull(target);
-        assertSame(resolver.getClassDescriptor("MtTable2"), target);
-        assertNotNull(((ArcProperty) p).getComplimentaryReverseArc());
-        assertEquals(MtTable2.TABLE1_PROPERTY, ((ArcProperty) p)
-                .getComplimentaryReverseArc()
-                .getName());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverGenericStackIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverGenericStackIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverGenericStackIT.java
new file mode 100644
index 0000000..3497f47
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverGenericStackIT.java
@@ -0,0 +1,57 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.map;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.Collections;
+
+@UseServerRuntime(ServerCase.DEFAULT_PROJECT)
+public class EntityResolverGenericStackIT extends ServerCase {
+
+    @Inject
+    private EntityResolver resolver;
+
+    public void testObjEntityLookupDuplicates() {
+
+        DataMap generic = resolver.getDataMap("generic");
+        EntityResolver resolver = new EntityResolver(Collections.singleton(generic));
+
+        ObjEntity g1 = resolver.getObjEntity("Generic1");
+        assertNotNull(g1);
+
+        ObjEntity g2 = resolver.getObjEntity("Generic2");
+        assertNotNull(g2);
+
+        assertNotSame(g1, g2);
+        assertNull(resolver.getObjEntity(Object.class));
+
+        try {
+            resolver.getObjEntity(CayenneDataObject.class);
+            fail("two entities mapped to the same class... resolver must have thrown.");
+        }
+        catch (CayenneRuntimeException e) {
+            // expected
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverGenericStackTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverGenericStackTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverGenericStackTest.java
deleted file mode 100644
index b6f223b..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverGenericStackTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.map;
-
-import java.util.Collections;
-
-import org.apache.cayenne.CayenneDataObject;
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.DEFAULT_PROJECT)
-public class EntityResolverGenericStackTest extends ServerCase {
-
-    @Inject
-    private EntityResolver resolver;
-
-    public void testObjEntityLookupDuplicates() {
-
-        DataMap generic = resolver.getDataMap("generic");
-        EntityResolver resolver = new EntityResolver(Collections.singleton(generic));
-
-        ObjEntity g1 = resolver.getObjEntity("Generic1");
-        assertNotNull(g1);
-
-        ObjEntity g2 = resolver.getObjEntity("Generic2");
-        assertNotNull(g2);
-
-        assertNotSame(g1, g2);
-        assertNull(resolver.getObjEntity(Object.class));
-
-        try {
-            resolver.getObjEntity(CayenneDataObject.class);
-            fail("two entities mapped to the same class... resolver must have thrown.");
-        }
-        catch (CayenneRuntimeException e) {
-            // expected
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverIT.java
new file mode 100644
index 0000000..910c10f
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverIT.java
@@ -0,0 +1,171 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.map;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.MockQuery;
+import org.apache.cayenne.query.Query;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class EntityResolverIT extends ServerCase {
+
+    @Inject
+    private ServerRuntime runtime;
+
+    @Inject
+    private DataContext context;
+
+    public void testGetObjEntity() {
+        EntityResolver resolver = new EntityResolver(runtime.getDataDomain().getDataMaps());
+        assertIsArtistObjEntity(resolver.getObjEntity("Artist"));
+    }
+
+    public void testLookupObjEntityByClass() {
+        EntityResolver resolver = new EntityResolver(runtime.getDataDomain().getDataMaps());
+        assertIsArtistObjEntity(resolver.getObjEntity(Artist.class));
+    }
+
+    public void testLookupObjEntityByInstance() {
+        EntityResolver resolver = new EntityResolver(runtime.getDataDomain().getDataMaps());
+        assertIsArtistObjEntity(resolver.getObjEntity(new Artist()));
+    }
+
+    public void testLookupObjEntityByDataobject() {
+        EntityResolver resolver = new EntityResolver(runtime.getDataDomain().getDataMaps());
+        Artist artist = (Artist) context.newObject("Artist");
+        assertIsArtistObjEntity(resolver.getObjEntity(artist));
+    }
+
+    public void testGetDataMapList() {
+        DataMap m1 = new DataMap();
+        DataMap m2 = new DataMap();
+        List list = new ArrayList();
+        list.add(m1);
+        list.add(m2);
+
+        EntityResolver resolver = new EntityResolver(list);
+        Collection<?> maps = resolver.getDataMaps();
+        assertNotNull(maps);
+        assertEquals(2, maps.size());
+        assertTrue(maps.containsAll(list));
+    }
+
+    public void testAddDataMap() {
+
+        // create empty resolver
+        EntityResolver resolver = new EntityResolver();
+        assertEquals(0, resolver.getDataMaps().size());
+        assertNull(resolver.getObjEntity(Object.class));
+
+        DataMap m1 = new DataMap();
+        ObjEntity oe1 = new ObjEntity("test");
+        oe1.setClassName(Object.class.getName());
+        m1.addObjEntity(oe1);
+
+        resolver.addDataMap(m1);
+
+        assertEquals(1, resolver.getDataMaps().size());
+        assertSame(oe1, resolver.getObjEntity(Object.class));
+        assertEquals(resolver, m1.getNamespace());
+    }
+
+    public void testRemoveDataMap() {
+        // create a resolver with a single map
+        DataMap m1 = new DataMap();
+        ObjEntity oe1 = new ObjEntity("test");
+        oe1.setClassName(Object.class.getName());
+        m1.addObjEntity(oe1);
+        List list = new ArrayList();
+        list.add(m1);
+        EntityResolver resolver = new EntityResolver(list);
+
+        assertEquals(1, resolver.getDataMaps().size());
+        assertSame(oe1, resolver.getObjEntity(Object.class));
+
+        resolver.removeDataMap(m1);
+
+        assertEquals(0, resolver.getDataMaps().size());
+        assertNull(resolver.getObjEntity(Object.class));
+    }
+
+    public void testAddObjEntity() {
+        // create a resolver with a single map
+        DataMap m1 = new DataMap();
+        ObjEntity oe1 = new ObjEntity("test1");
+        oe1.setClassName(Object.class.getName());
+        m1.addObjEntity(oe1);
+        List list = new ArrayList();
+        list.add(m1);
+        EntityResolver resolver = new EntityResolver(list);
+
+        assertSame(oe1, resolver.getObjEntity(Object.class));
+
+        ObjEntity oe2 = new ObjEntity("test2");
+        oe2.setClassName(String.class.getName());
+        m1.addObjEntity(oe2);
+
+        assertSame(oe2, resolver.getObjEntity(String.class));
+    }
+
+    public void testGetQuery() {
+        // create a resolver with a single map
+        DataMap m1 = new DataMap();
+        Query q = new MockQuery("query1");
+        m1.addQuery(q);
+
+        EntityResolver resolver = new EntityResolver(Collections.singleton(m1));
+        assertSame(q, resolver.getQuery("query1"));
+
+        // check that the query added on-the-fly will be recognized
+        assertNull(resolver.getQuery("query2"));
+
+        Query q2 = new MockQuery("query2");
+        m1.addQuery(q2);
+        assertSame(q2, resolver.getQuery("query2"));
+    }
+
+    private void assertIsArtistObjEntity(ObjEntity ae) {
+        assertNotNull(ae);
+        assertEquals(ae, getObjEntity("Artist"));
+    }
+
+    private ObjEntity getObjEntity(String objEntityName) {
+        for (DataMap map : runtime.getDataDomain().getDataMaps()) {
+            for (ObjEntity e : map.getObjEntities()) {
+                if (objEntityName.equals(e.getName())) {
+                    return e;
+                }
+            }
+        }
+
+        throw new CayenneRuntimeException("No ObjEntity found: " + objEntityName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverInheritanceIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverInheritanceIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverInheritanceIT.java
new file mode 100644
index 0000000..15c81e8
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverInheritanceIT.java
@@ -0,0 +1,78 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.map;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ServerCase.PEOPLE_PROJECT)
+public class EntityResolverInheritanceIT extends ServerCase {
+
+    @Inject
+    private EntityResolver resolver;
+
+    public void testGetAbstractPersonTree() throws Exception {
+        EntityInheritanceTree tree = resolver.getInheritanceTree("AbstractPerson");
+        assertNotNull(tree);
+        assertEquals(2, tree.getChildrenCount());
+        assertSame(resolver.getObjEntity("AbstractPerson"), tree.getEntity());
+    }
+
+    public void testGetEmployeeTree() throws Exception {
+        EntityInheritanceTree tree = resolver.getInheritanceTree("Employee");
+        assertNotNull(tree);
+        assertEquals(1, tree.getChildrenCount());
+        assertSame(resolver.getObjEntity("Employee"), tree.getEntity());
+    }
+
+    public void testGetManagerTree() throws Exception {
+        EntityInheritanceTree tree = resolver.getInheritanceTree("Manager");
+        assertNotNull(tree);
+        assertEquals(0, tree.getChildrenCount());
+    }
+
+    public void testLookupTreeRefresh() throws Exception {
+        ObjEntity super1 = new ObjEntity("super1");
+        ObjEntity sub1 = new ObjEntity("sub1");
+        ObjEntity sub2 = new ObjEntity("sub2");
+
+        super1.setClassName("java.lang.Float");
+
+        sub1.setSuperEntityName("super1");
+        sub1.setClassName("java.lang.Object");
+
+        sub2.setSuperEntityName("super1");
+        sub2.setClassName("java.lang.Integer");
+
+        DataMap map = new DataMap("test");
+        map.addObjEntity(super1);
+        map.addObjEntity(sub1);
+        map.addObjEntity(sub2);
+
+        assertNull(resolver.getInheritanceTree("super1"));
+
+        resolver.addDataMap(map);
+        EntityInheritanceTree tree = resolver.getInheritanceTree("super1");
+        assertNotNull(tree);
+        assertEquals(2, tree.getChildrenCount());
+        assertSame(super1, tree.getEntity());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverInheritanceTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverInheritanceTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverInheritanceTest.java
deleted file mode 100644
index 5f5239f..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverInheritanceTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.map;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.PEOPLE_PROJECT)
-public class EntityResolverInheritanceTest extends ServerCase {
-
-    @Inject
-    private EntityResolver resolver;
-
-    public void testGetAbstractPersonTree() throws Exception {
-        EntityInheritanceTree tree = resolver.getInheritanceTree("AbstractPerson");
-        assertNotNull(tree);
-        assertEquals(2, tree.getChildrenCount());
-        assertSame(resolver.getObjEntity("AbstractPerson"), tree.getEntity());
-    }
-
-    public void testGetEmployeeTree() throws Exception {
-        EntityInheritanceTree tree = resolver.getInheritanceTree("Employee");
-        assertNotNull(tree);
-        assertEquals(1, tree.getChildrenCount());
-        assertSame(resolver.getObjEntity("Employee"), tree.getEntity());
-    }
-
-    public void testGetManagerTree() throws Exception {
-        EntityInheritanceTree tree = resolver.getInheritanceTree("Manager");
-        assertNotNull(tree);
-        assertEquals(0, tree.getChildrenCount());
-    }
-
-    public void testLookupTreeRefresh() throws Exception {
-        ObjEntity super1 = new ObjEntity("super1");
-        ObjEntity sub1 = new ObjEntity("sub1");
-        ObjEntity sub2 = new ObjEntity("sub2");
-
-        super1.setClassName("java.lang.Float");
-
-        sub1.setSuperEntityName("super1");
-        sub1.setClassName("java.lang.Object");
-
-        sub2.setSuperEntityName("super1");
-        sub2.setClassName("java.lang.Integer");
-
-        DataMap map = new DataMap("test");
-        map.addObjEntity(super1);
-        map.addObjEntity(sub1);
-        map.addObjEntity(sub2);
-
-        assertNull(resolver.getInheritanceTree("super1"));
-
-        resolver.addDataMap(map);
-        EntityInheritanceTree tree = resolver.getInheritanceTree("super1");
-        assertNotNull(tree);
-        assertEquals(2, tree.getChildrenCount());
-        assertSame(super1, tree.getEntity());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverTest.java
deleted file mode 100644
index 2156751..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityResolverTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.map;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.MockQuery;
-import org.apache.cayenne.query.Query;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class EntityResolverTest extends ServerCase {
-
-    @Inject
-    private ServerRuntime runtime;
-
-    @Inject
-    private DataContext context;
-
-    public void testGetObjEntity() {
-        EntityResolver resolver = new EntityResolver(runtime.getDataDomain().getDataMaps());
-        assertIsArtistObjEntity(resolver.getObjEntity("Artist"));
-    }
-
-    public void testLookupObjEntityByClass() {
-        EntityResolver resolver = new EntityResolver(runtime.getDataDomain().getDataMaps());
-        assertIsArtistObjEntity(resolver.getObjEntity(Artist.class));
-    }
-
-    public void testLookupObjEntityByInstance() {
-        EntityResolver resolver = new EntityResolver(runtime.getDataDomain().getDataMaps());
-        assertIsArtistObjEntity(resolver.getObjEntity(new Artist()));
-    }
-
-    public void testLookupObjEntityByDataobject() {
-        EntityResolver resolver = new EntityResolver(runtime.getDataDomain().getDataMaps());
-        Artist artist = (Artist) context.newObject("Artist");
-        assertIsArtistObjEntity(resolver.getObjEntity(artist));
-    }
-
-    public void testGetDataMapList() {
-        DataMap m1 = new DataMap();
-        DataMap m2 = new DataMap();
-        List list = new ArrayList();
-        list.add(m1);
-        list.add(m2);
-
-        EntityResolver resolver = new EntityResolver(list);
-        Collection<?> maps = resolver.getDataMaps();
-        assertNotNull(maps);
-        assertEquals(2, maps.size());
-        assertTrue(maps.containsAll(list));
-    }
-
-    public void testAddDataMap() {
-
-        // create empty resolver
-        EntityResolver resolver = new EntityResolver();
-        assertEquals(0, resolver.getDataMaps().size());
-        assertNull(resolver.getObjEntity(Object.class));
-
-        DataMap m1 = new DataMap();
-        ObjEntity oe1 = new ObjEntity("test");
-        oe1.setClassName(Object.class.getName());
-        m1.addObjEntity(oe1);
-
-        resolver.addDataMap(m1);
-
-        assertEquals(1, resolver.getDataMaps().size());
-        assertSame(oe1, resolver.getObjEntity(Object.class));
-        assertEquals(resolver, m1.getNamespace());
-    }
-
-    public void testRemoveDataMap() {
-        // create a resolver with a single map
-        DataMap m1 = new DataMap();
-        ObjEntity oe1 = new ObjEntity("test");
-        oe1.setClassName(Object.class.getName());
-        m1.addObjEntity(oe1);
-        List list = new ArrayList();
-        list.add(m1);
-        EntityResolver resolver = new EntityResolver(list);
-
-        assertEquals(1, resolver.getDataMaps().size());
-        assertSame(oe1, resolver.getObjEntity(Object.class));
-
-        resolver.removeDataMap(m1);
-
-        assertEquals(0, resolver.getDataMaps().size());
-        assertNull(resolver.getObjEntity(Object.class));
-    }
-
-    public void testAddObjEntity() {
-        // create a resolver with a single map
-        DataMap m1 = new DataMap();
-        ObjEntity oe1 = new ObjEntity("test1");
-        oe1.setClassName(Object.class.getName());
-        m1.addObjEntity(oe1);
-        List list = new ArrayList();
-        list.add(m1);
-        EntityResolver resolver = new EntityResolver(list);
-
-        assertSame(oe1, resolver.getObjEntity(Object.class));
-
-        ObjEntity oe2 = new ObjEntity("test2");
-        oe2.setClassName(String.class.getName());
-        m1.addObjEntity(oe2);
-
-        assertSame(oe2, resolver.getObjEntity(String.class));
-    }
-
-    public void testGetQuery() {
-        // create a resolver with a single map
-        DataMap m1 = new DataMap();
-        Query q = new MockQuery("query1");
-        m1.addQuery(q);
-
-        EntityResolver resolver = new EntityResolver(Collections.singleton(m1));
-        assertSame(q, resolver.getQuery("query1"));
-
-        // check that the query added on-the-fly will be recognized
-        assertNull(resolver.getQuery("query2"));
-
-        Query q2 = new MockQuery("query2");
-        m1.addQuery(q2);
-        assertSame(q2, resolver.getQuery("query2"));
-    }
-
-    private void assertIsArtistObjEntity(ObjEntity ae) {
-        assertNotNull(ae);
-        assertEquals(ae, getObjEntity("Artist"));
-    }
-
-    private ObjEntity getObjEntity(String objEntityName) {
-        for (DataMap map : runtime.getDataDomain().getDataMaps()) {
-            for (ObjEntity e : map.getObjEntities()) {
-                if (objEntityName.equals(e.getName())) {
-                    return e;
-                }
-            }
-        }
-
-        throw new CayenneRuntimeException("No ObjEntity found: " + objEntityName);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/EntityTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/EntityTest.java
deleted file mode 100644
index 7b404b8..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/EntityTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.map;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.util.CayenneMapEntry;
-import org.apache.cayenne.util.Util;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class EntityTest extends ServerCase {
-
-    @Inject
-    private ServerRuntime runtime;
-
-    public void testSerializability() throws Exception {
-        Entity entity = new MockEntity("entity");
-
-        Entity d1 = Util.cloneViaSerialization(entity);
-        assertEquals(entity.getName(), d1.getName());
-
-        entity.addAttribute(new MockAttribute("abc"));
-        entity.addRelationship(new MockRelationship("xyz"));
-        Entity d2 = Util.cloneViaSerialization(entity);
-        assertNotNull(d2.getAttribute("abc"));
-
-        // test that ref collection wrappers are still working
-        assertNotNull(d2.getAttributes());
-        assertEquals(entity.getAttributes().size(), d2.getAttributes().size());
-        assertTrue(d2.getAttributes().contains(d2.getAttribute("abc")));
-
-        assertNotNull(d2.getRelationships());
-        assertEquals(entity.getRelationships().size(), d2.getRelationships().size());
-        assertTrue(d2.getRelationships().contains(d2.getRelationship("xyz")));
-
-        assertNotNull(d2.getAttributeMap());
-        assertEquals(entity.getAttributes().size(), d2.getAttributeMap().size());
-        assertSame(d2.getAttribute("abc"), d2.getAttributeMap().get("abc"));
-
-        assertNotNull(d2.getRelationshipMap());
-        assertEquals(entity.getRelationships().size(), d2.getRelationshipMap().size());
-        assertSame(d2.getRelationship("xyz"), d2.getRelationshipMap().get("xyz"));
-    }
-
-    public void testName() {
-        Entity entity = new MockEntity();
-        String tstName = "tst_name";
-        entity.setName(tstName);
-        assertEquals(tstName, entity.getName());
-    }
-
-    public void testAttribute() {
-        Entity entity = new MockEntity();
-        Attribute attribute = new MockAttribute("tst_name");
-
-        entity.addAttribute(attribute);
-        assertSame(attribute, entity.getAttribute(attribute.getName()));
-
-        // attribute must have its entity switched to our entity.
-        assertSame(entity, attribute.getEntity());
-
-        // remove attribute
-        entity.removeAttribute(attribute.getName());
-        assertNull(entity.getAttribute(attribute.getName()));
-    }
-
-    public void testRelationship() {
-        Entity entity = new MockEntity();
-        Relationship rel = new MockRelationship("tst_name");
-
-        entity.addRelationship(rel);
-        assertSame(rel, entity.getRelationship(rel.getName()));
-
-        // attribute must have its entity switched to our entity.
-        assertSame(entity, rel.getSourceEntity());
-
-        // remove attribute
-        entity.removeRelationship(rel.getName());
-        assertNull(entity.getRelationship(rel.getName()));
-    }
-
-    public void testAttributeClashWithRelationship() {
-        Entity entity = new MockEntity();
-        Relationship rel = new MockRelationship("tst_name");
-
-        entity.addRelationship(rel);
-
-        try {
-            Attribute attribute = new MockAttribute("tst_name");
-            entity.addAttribute(attribute);
-
-            fail("Exception should have been thrown due to clashing attribute and relationship names.");
-        } catch (Exception e) {
-            // Exception expected.
-        }
-    }
-
-    public void testRelationshipClashWithAttribute() {
-        Entity entity = new MockEntity();
-        Attribute attribute = new MockAttribute("tst_name");
-
-        entity.addAttribute(attribute);
-
-        try {
-            Relationship rel = new MockRelationship("tst_name");
-            entity.addRelationship(rel);
-
-            fail("Exception should have been thrown due to clashing attribute and relationship names.");
-        } catch (Exception e) {
-            // Exception expected.
-        }
-    }
-
-    public void testResolveBadObjPath1() {
-        // test invalid expression path
-        Expression pathExpr = ExpressionFactory.expressionOfType(Expression.OBJ_PATH);
-        pathExpr.setOperand(0, "invalid.invalid");
-
-        // itertator should be returned, but when trying to read 1st component,
-        // it should throw an exception....
-        ObjEntity galleryEnt = runtime.getDataDomain().getEntityResolver().getObjEntity("Gallery");
-        Iterator<CayenneMapEntry> it = galleryEnt.resolvePathComponents(pathExpr);
-        assertTrue(it.hasNext());
-
-        try {
-            it.next();
-            fail();
-        } catch (Exception ex) {
-            // exception expected
-        }
-    }
-
-    public void testResolveBadObjPath2() {
-        // test invalid expression type
-        Expression badPathExpr = ExpressionFactory.expressionOfType(Expression.IN);
-        badPathExpr.setOperand(0, "a.b.c");
-        ObjEntity galleryEnt = runtime.getDataDomain().getEntityResolver().getObjEntity("Gallery");
-
-        try {
-            galleryEnt.resolvePathComponents(badPathExpr);
-            fail();
-        } catch (Exception ex) {
-            // exception expected
-        }
-    }
-
-    public void testResolveObjPath1() {
-        Expression pathExpr = ExpressionFactory.expressionOfType(Expression.OBJ_PATH);
-        pathExpr.setOperand(0, "galleryName");
-
-        ObjEntity galleryEnt = runtime.getDataDomain().getEntityResolver().getObjEntity("Gallery");
-        Iterator<CayenneMapEntry> it = galleryEnt.resolvePathComponents(pathExpr);
-
-        // iterator must contain a single ObjAttribute
-        assertNotNull(it);
-        assertTrue(it.hasNext());
-        ObjAttribute next = (ObjAttribute) it.next();
-        assertNotNull(next);
-        assertFalse(it.hasNext());
-        assertSame(galleryEnt.getAttribute("galleryName"), next);
-    }
-
-    public void testRemoveAttribute() {
-        Entity entity = new MockEntity();
-
-        entity.setName("test");
-        ObjAttribute attribute1 = new ObjAttribute("a1");
-        ObjAttribute attribute2 = new ObjAttribute("a2");
-
-        entity.addAttribute(attribute1);
-        entity.addAttribute(attribute2);
-
-        Collection<? extends Attribute> attributes = entity.getAttributes();
-        assertEquals(2, attributes.size());
-
-        entity.removeAttribute("a1");
-        attributes = entity.getAttributes();
-        assertEquals(1, attributes.size());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityIT.java
new file mode 100644
index 0000000..e7d8847
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityIT.java
@@ -0,0 +1,431 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.map;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.exp.parser.ASTObjPath;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.apache.cayenne.util.Util;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class ObjEntityIT extends ServerCase {
+
+    @Inject
+    private ObjectContext context;
+
+    @Inject
+    private ServerRuntime runtime;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("PAINTING_INFO");
+        dbHelper.deleteAll("PAINTING");
+        dbHelper.deleteAll("ARTIST_EXHIBIT");
+        dbHelper.deleteAll("ARTIST_GROUP");
+        dbHelper.deleteAll("ARTIST");
+    }
+
+    public void testGetAttributeWithOverrides() {
+
+        DataMap map = new DataMap("dm");
+
+        ObjEntity superEntity = new ObjEntity("super");
+        superEntity.addAttribute(new ObjAttribute("a1", "int", superEntity));
+        superEntity.addAttribute(new ObjAttribute("a2", "int", superEntity));
+
+        map.addObjEntity(superEntity);
+
+        ObjEntity subEntity = new ObjEntity("sub");
+        subEntity.setSuperEntityName(superEntity.getName());
+        subEntity.addAttributeOverride("a1", "overridden.path");
+        subEntity.addAttribute(new ObjAttribute("a3", "int", subEntity));
+
+        map.addObjEntity(subEntity);
+
+        ObjAttribute a1 = subEntity.getAttribute("a1");
+        assertNotNull(a1);
+        assertSame(subEntity, a1.getEntity());
+        assertEquals("overridden.path", a1.getDbAttributePath());
+        assertEquals("int", a1.getType());
+
+        ObjAttribute a2 = subEntity.getAttribute("a2");
+        assertNotNull(a2);
+        assertSame(subEntity, a2.getEntity());
+        assertNull(a2.getDbAttributePath());
+
+        ObjAttribute a3 = subEntity.getAttribute("a3");
+        assertNotNull(a3);
+        assertSame(subEntity, a3.getEntity());
+    }
+
+    public void testGetPrimaryKeys() {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity("Artist");
+        Collection<ObjAttribute> pks = artistE.getPrimaryKeys();
+        assertEquals(1, pks.size());
+
+        ObjAttribute pk = pks.iterator().next();
+        assertEquals("java.lang.Long", pk.getType());
+        assertEquals("ARTIST_ID", pk.getDbAttributePath());
+        assertEquals("artistId", pk.getName());
+        assertNull(pk.getEntity());
+        assertFalse(artistE.getAttributes().contains(pk));
+
+        ObjEntity clientArtistE = artistE.getClientEntity();
+        Collection<ObjAttribute> clientpks = clientArtistE.getPrimaryKeys();
+        assertEquals(1, clientpks.size());
+        ObjAttribute clientPk = clientpks.iterator().next();
+        assertEquals("java.lang.Long", clientPk.getType());
+        assertEquals("ARTIST_ID", clientPk.getDbAttributePath());
+        assertEquals("artistId", clientPk.getName());
+        assertNull(clientPk.getEntity());
+        assertFalse(clientArtistE.getAttributes().contains(pk));
+
+        ObjEntity meaningfulPKE = runtime.getDataDomain().getEntityResolver().getObjEntity("MeaningfulPKTest1");
+        Collection<ObjAttribute> mpks = meaningfulPKE.getPrimaryKeys();
+        assertEquals(1, mpks.size());
+
+        ObjAttribute mpk = mpks.iterator().next();
+        assertTrue(meaningfulPKE.getAttributes().contains(mpk));
+
+        ObjEntity clientMeaningfulPKE = meaningfulPKE.getClientEntity();
+        Collection<ObjAttribute> clientmpks = clientMeaningfulPKE.getPrimaryKeys();
+        assertEquals(1, clientmpks.size());
+
+        ObjAttribute clientmpk = clientmpks.iterator().next();
+        assertEquals("java.lang.Integer", clientmpk.getType());
+        assertTrue(clientMeaningfulPKE.getAttributes().contains(clientmpk));
+    }
+
+    public void testAttributes() {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity("Artist");
+        ObjAttribute attr = artistE.getAttribute("artistName");
+
+        assertEquals(attr.getMaxLength(), attr.getDbAttribute().getMaxLength());
+        assertEquals(attr.isMandatory(), attr.getDbAttribute().isMandatory());
+    }
+
+    public void testLastPathComponent() {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity("Artist");
+
+        Map<String, String> aliases = new HashMap<String, String>();
+        aliases.put("a", "paintingArray.toGallery");
+
+        PathComponent<ObjAttribute, ObjRelationship> lastAttribute = artistE.lastPathComponent(
+                Expression.fromString("paintingArray.paintingTitle"), aliases);
+        assertTrue(lastAttribute.getAttribute() != null);
+        assertEquals("paintingTitle", lastAttribute.getAttribute().getName());
+
+        PathComponent<ObjAttribute, ObjRelationship> lastRelationship = artistE.lastPathComponent(
+                Expression.fromString("paintingArray.toGallery"), aliases);
+        assertTrue(lastRelationship.getRelationship() != null);
+        assertEquals("toGallery", lastRelationship.getRelationship().getName());
+
+        PathComponent<ObjAttribute, ObjRelationship> lastLeftJoinRelationship = artistE.lastPathComponent(
+                new ASTObjPath("paintingArray+.toGallery+"), aliases);
+        assertTrue(lastLeftJoinRelationship.getRelationship() != null);
+        assertEquals("toGallery", lastLeftJoinRelationship.getRelationship().getName());
+
+        PathComponent<ObjAttribute, ObjRelationship> lastAliasedRelationship = artistE.lastPathComponent(
+                new ASTObjPath("a"), aliases);
+        assertTrue(lastAliasedRelationship.getRelationship() != null);
+        assertEquals("toGallery", lastAliasedRelationship.getRelationship().getName());
+    }
+
+    public void testGeneric() {
+        ObjEntity e1 = new ObjEntity("e1");
+        assertTrue(e1.isGeneric());
+
+        e1.setClassName("SomeClass");
+        assertFalse(e1.isGeneric());
+
+        DataMap m = new DataMap("X");
+        m.setDefaultSuperclass("SomeClass");
+        m.addObjEntity(e1);
+
+        assertTrue(e1.isGeneric());
+
+        e1.setClassName("SomeOtherClass");
+        assertFalse(e1.isGeneric());
+
+        e1.setClassName(CayenneDataObject.class.getName());
+        assertTrue(e1.isGeneric());
+    }
+
+    public void testServerOnly() {
+        ObjEntity e1 = new ObjEntity("e1");
+
+        assertFalse(e1.isServerOnly());
+        e1.setServerOnly(true);
+        assertTrue(e1.isServerOnly());
+    }
+
+    public void testClientAllowed() {
+        ObjEntity e1 = new ObjEntity("e1");
+
+        assertFalse("No parent DataMap should have automatically disabled client.", e1.isClientAllowed());
+
+        DataMap map = new DataMap("m1");
+        e1.setDataMap(map);
+
+        assertFalse(e1.isClientAllowed());
+
+        map.setClientSupported(true);
+        assertTrue(e1.isClientAllowed());
+
+        e1.setServerOnly(true);
+        assertFalse(e1.isClientAllowed());
+    }
+
+    public void testGetPrimaryKeyNames() {
+        ObjEntity entity = new ObjEntity("entity");
+        DbEntity dbentity = new DbEntity("dbe");
+
+        // need a container
+        DataMap dataMap = new DataMap();
+        dataMap.addObjEntity(entity);
+        dataMap.addDbEntity(dbentity);
+        entity.setDbEntity(dbentity);
+
+        // Test correctness with no mapped PK.
+        assertEquals(0, entity.getPrimaryKeyNames().size());
+
+        // Add a single column PK to the DB entity.
+        DbAttribute pk = new DbAttribute();
+        pk.setName("id");
+        pk.setPrimaryKey(true);
+        dbentity.addAttribute(pk);
+
+        // Test correctness with a single column PK.
+        assertEquals(1, entity.getPrimaryKeyNames().size());
+        assertTrue(entity.getPrimaryKeyNames().contains(pk.getName()));
+
+        // Add a multi-column PK to the DB entity.
+        DbAttribute pk2 = new DbAttribute();
+        pk2.setName("id2");
+        pk2.setPrimaryKey(true);
+        dbentity.addAttribute(pk2);
+
+        // Test correctness with a multi-column PK.
+        assertEquals(2, entity.getPrimaryKeyNames().size());
+        assertTrue(entity.getPrimaryKeyNames().contains(pk.getName()));
+        assertTrue(entity.getPrimaryKeyNames().contains(pk2.getName()));
+    }
+
+    public void testGetClientEntity() {
+
+        DataMap map = new DataMap();
+        map.setClientSupported(true);
+
+        final ObjEntity target = new ObjEntity("te1");
+        map.addObjEntity(target);
+
+        ObjEntity e1 = new ObjEntity("entity");
+        e1.setClassName("x.y.z");
+        e1.setClientClassName("a.b.c");
+        e1.addAttribute(new ObjAttribute("A1"));
+        e1.addAttribute(new ObjAttribute("A2"));
+        map.addObjEntity(e1);
+
+        DbEntity dbentity = new DbEntity("dbe");
+        map.addDbEntity(dbentity);
+        e1.setDbEntity(dbentity);
+
+        ObjRelationship r1 = new ObjRelationship("r1") {
+
+            @Override
+            public ObjEntity getTargetEntity() {
+                return target;
+            }
+        };
+
+        e1.addRelationship(r1);
+
+        ObjEntity e2 = e1.getClientEntity();
+        assertNotNull(e2);
+        assertEquals(e1.getName(), e2.getName());
+        assertEquals(e1.getClientClassName(), e2.getClassName());
+        assertEquals(e1.getAttributes().size(), e2.getAttributes().size());
+        assertEquals(e1.getRelationships().size(), e2.getRelationships().size());
+    }
+
+    public void testSerializability() throws Exception {
+        ObjEntity entity = new ObjEntity("entity");
+
+        ObjEntity d1 = Util.cloneViaSerialization(entity);
+        assertEquals(entity.getName(), d1.getName());
+    }
+
+    public void testDbEntityName() {
+        ObjEntity entity = new ObjEntity("entity");
+        assertNull(entity.getDbEntityName());
+
+        entity.setDbEntityName("dbe");
+        assertEquals("dbe", entity.getDbEntityName());
+
+        entity.setDbEntityName(null);
+        assertNull(entity.getDbEntityName());
+    }
+
+    public void testDbEntity() {
+        ObjEntity entity = new ObjEntity("entity");
+        DbEntity dbentity = new DbEntity("dbe");
+
+        // need a container
+        DataMap dataMap = new DataMap();
+        dataMap.addObjEntity(entity);
+        dataMap.addDbEntity(dbentity);
+
+        assertNull(entity.getDbEntity());
+
+        entity.setDbEntity(dbentity);
+        assertSame(dbentity, entity.getDbEntity());
+
+        entity.setDbEntity(null);
+        assertNull(entity.getDbEntity());
+
+        entity.setDbEntityName("dbe");
+        assertSame(dbentity, entity.getDbEntity());
+    }
+
+    public void testDbEntityNoContainer() {
+        ObjEntity entity = new ObjEntity("entity");
+        entity.setDbEntityName("dbe");
+
+        try {
+            entity.getDbEntity();
+            fail("Without a container ObjENtity shouldn't resolve DbEntity");
+        } catch (CayenneRuntimeException ex) {
+            // expected
+        }
+    }
+
+    public void testClassName() {
+        ObjEntity entity = new ObjEntity("entity");
+        String tstName = "tst_name";
+        entity.setClassName(tstName);
+        assertEquals(tstName, entity.getClassName());
+    }
+
+    public void testSuperClassName() {
+        ObjEntity entity = new ObjEntity("entity");
+        String tstName = "super_tst_name";
+        entity.setSuperClassName(tstName);
+        assertEquals(tstName, entity.getSuperClassName());
+    }
+
+    public void testAttributeForDbAttribute() throws Exception {
+        ObjEntity ae = runtime.getDataDomain().getEntityResolver().getObjEntity("Artist");
+        DbEntity dae = ae.getDbEntity();
+
+        assertNull(ae.getAttributeForDbAttribute(dae.getAttribute("ARTIST_ID")));
+        assertNotNull(ae.getAttributeForDbAttribute(dae.getAttribute("ARTIST_NAME")));
+    }
+
+    public void testRelationshipForDbRelationship() throws Exception {
+        ObjEntity ae = runtime.getDataDomain().getEntityResolver().getObjEntity("Artist");
+        DbEntity dae = ae.getDbEntity();
+
+        assertNull(ae.getRelationshipForDbRelationship(new DbRelationship()));
+        assertNotNull(ae.getRelationshipForDbRelationship(dae.getRelationship("paintingArray")));
+    }
+
+    public void testReadOnly() throws Exception {
+        ObjEntity entity = new ObjEntity("entity");
+        assertFalse(entity.isReadOnly());
+        entity.setReadOnly(true);
+        assertTrue(entity.isReadOnly());
+    }
+
+    public void testTranslateToRelatedEntityIndependentPath() throws Exception {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity(Artist.class);
+
+        Expression e1 = Expression.fromString("paintingArray");
+        Expression translated = artistE.translateToRelatedEntity(e1, "artistExhibitArray");
+        assertEquals("failure: " + translated, Expression.fromString("db:toArtist.paintingArray"), translated);
+    }
+
+    public void testTranslateToRelatedEntityTrimmedPath() throws Exception {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity(Artist.class);
+
+        Expression e1 = Expression.fromString("artistExhibitArray.toExhibit");
+        Expression translated = artistE.translateToRelatedEntity(e1, "artistExhibitArray");
+        assertEquals("failure: " + translated, Expression.fromString("db:toArtist.artistExhibitArray.toExhibit"),
+                translated);
+    }
+
+    public void testTranslateToRelatedEntitySplitHalfWay() throws Exception {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity(Artist.class);
+
+        Expression e1 = Expression.fromString("paintingArray.toPaintingInfo.textReview");
+        Expression translated = artistE.translateToRelatedEntity(e1, "paintingArray.toGallery");
+        assertEquals("failure: " + translated,
+                Expression.fromString("db:paintingArray.toArtist.paintingArray.toPaintingInfo.TEXT_REVIEW"), translated);
+    }
+
+    public void testTranslateToRelatedEntityMatchingPath() throws Exception {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity(Artist.class);
+        Expression e1 = Expression.fromString("artistExhibitArray.toExhibit");
+        Expression translated = artistE.translateToRelatedEntity(e1, "artistExhibitArray.toExhibit");
+        assertEquals("failure: " + translated,
+                Expression.fromString("db:artistExhibitArray.toArtist.artistExhibitArray.toExhibit"), translated);
+    }
+
+    public void testTranslateToRelatedEntityMultiplePaths() throws Exception {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity(Artist.class);
+
+        Expression e1 = Expression.fromString("paintingArray = $p and artistExhibitArray.toExhibit.closingDate = $d");
+        Expression translated = artistE.translateToRelatedEntity(e1, "artistExhibitArray");
+        assertEquals("failure: " + translated, Expression.fromString("db:toArtist.paintingArray = $p "
+                + "and db:toArtist.artistExhibitArray.toExhibit.CLOSING_DATE = $d"), translated);
+    }
+    
+    public void testTranslateToRelatedEntityOuterJoin_Flattened() throws Exception {
+        ObjEntity artistE = runtime.getDataDomain().getEntityResolver().getObjEntity(Artist.class);
+
+        Expression e1 = Expression.fromString("groupArray+.name");
+        Expression translated = artistE.translateToRelatedEntity(e1, "artistExhibitArray");
+        assertEquals("failure: " + translated, Expression.fromString("db:toArtist.artistGroupArray+.toGroup+.NAME"), translated);
+    }
+
+    public void testTranslateNullArg() {
+        ObjEntity entity = context.getEntityResolver().getObjEntity("Artist");
+
+        Expression exp = ExpressionFactory.noMatchExp("dateOfBirth", null);
+        Expression translated = entity.translateToDbPath(exp);
+
+        assertFalse(translated.match(new Artist()));
+    }
+}