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:10:14 UTC

[26/48] Installing Maven Failsafe Plugin

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java
new file mode 100644
index 0000000..8bba81e
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainIT.java
@@ -0,0 +1,256 @@
+/*****************************************************************
+ *   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.access;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.annotation.PostAdd;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.event.DefaultEventManager;
+import org.apache.cayenne.log.JdbcEventLogger;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.testdo.testmap.Exhibit;
+import org.apache.cayenne.testdo.testmap.Gallery;
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.testdo.testmap.annotations.Tag1;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataDomainIT extends ServerCase {
+
+    @Inject
+    private ServerRuntime runtime;
+
+    @Inject
+    private JdbcEventLogger logger;
+
+    public void testName() throws Exception {
+        DataDomain domain = new DataDomain("some name");
+        assertEquals("some name", domain.getName());
+        domain.setName("tst_name");
+        assertEquals("tst_name", domain.getName());
+    }
+
+    public void testLookupDataNode() {
+
+        DataDomain domain = new DataDomain("test");
+
+        DataMap m1 = new DataMap("m1");
+        DataNode n1 = new DataNode("n1");
+        n1.addDataMap(m1);
+        domain.addNode(n1);
+
+        DataMap m2 = new DataMap("m2");
+        DataNode n2 = new DataNode("n2");
+        n2.addDataMap(m2);
+        domain.addNode(n2);
+
+        assertSame(n1, domain.lookupDataNode(m1));
+        assertSame(n2, domain.lookupDataNode(m2));
+
+        try {
+
+            domain.lookupDataNode(new DataMap("m3"));
+            fail("must have thrown on missing Map to Node maping");
+        } catch (CayenneRuntimeException e) {
+            // expected
+        }
+    }
+
+    public void testLookupDataNode_Default() {
+
+        DataDomain domain = new DataDomain("test");
+
+        DataMap m1 = new DataMap("m1");
+        DataNode n1 = new DataNode("n1");
+        n1.addDataMap(m1);
+        domain.setDefaultNode(n1);
+
+        DataMap m2 = new DataMap("m2");
+        DataNode n2 = new DataNode("n2");
+        n2.addDataMap(m2);
+        domain.addNode(n2);
+
+        assertSame(n1, domain.lookupDataNode(m1));
+        assertSame(n2, domain.lookupDataNode(m2));
+
+        // must map to default
+        assertSame(n1, domain.lookupDataNode(new DataMap("m3")));
+    }
+
+    public void testNodes() throws Exception {
+        DataDomain domain = new DataDomain("dom1");
+        assertEquals(0, domain.getDataNodes().size());
+        DataNode node = new DataNode("1");
+        node.setJdbcEventLogger(logger);
+        domain.addNode(node);
+        assertEquals(1, domain.getDataNodes().size());
+        node = new DataNode("2");
+        node.setJdbcEventLogger(logger);
+        domain.addNode(node);
+        assertEquals(2, domain.getDataNodes().size());
+    }
+
+    public void testNodeMaps() throws Exception {
+        DataDomain domain = new DataDomain("dom1");
+        assertNull(domain.getDataMap("map"));
+
+        DataNode node = new DataNode("1");
+        node.setJdbcEventLogger(logger);
+        node.addDataMap(new DataMap("map"));
+
+        domain.addNode(node);
+        assertNotNull(domain.getDataMap("map"));
+    }
+
+    public void testMaps() throws Exception {
+        DataDomain d1 = new DataDomain("dom1");
+
+        DataMap m1 = new DataMap("m1");
+        d1.addDataMap(m1);
+        assertSame(m1, d1.getDataMap(m1.getName()));
+
+        d1.removeDataMap(m1.getName());
+        assertNull(d1.getDataMap(m1.getName()));
+    }
+
+    public void testEntityResolverRefresh() throws Exception {
+        DataDomain domain = new DataDomain("dom1");
+        org.apache.cayenne.map.EntityResolver resolver = domain.getEntityResolver();
+        assertNotNull(resolver);
+
+        DataMap map = new DataMap("map");
+        ObjEntity entity = new ObjEntity("TestEntity");
+        map.addObjEntity(entity);
+
+        domain.addDataMap(map);
+
+        assertSame(entity, resolver.getObjEntity("TestEntity"));
+    }
+
+    public void testEntityResolver() {
+        assertNotNull(runtime.getDataDomain().getEntityResolver());
+
+        DataDomain domain = new DataDomain("dom1");
+        assertNotNull(domain.getEntityResolver());
+    }
+
+    public void testInitDataDomainWithSharedCache() throws Exception {
+        Map<Object, Object> properties = new HashMap<Object, Object>();
+        properties.put(DataDomain.SHARED_CACHE_ENABLED_PROPERTY, Boolean.TRUE.toString());
+
+        DataDomain domain = new DataDomain("d1", properties);
+        assertTrue(domain.isSharedCacheEnabled());
+    }
+
+    public void testInitDataDomainWithDedicatedCache() throws Exception {
+        Map<Object, Object> properties = new HashMap<Object, Object>();
+        properties.put(DataDomain.SHARED_CACHE_ENABLED_PROPERTY, Boolean.FALSE.toString());
+
+        DataDomain domain = new DataDomain("d1", properties);
+        assertFalse(domain.isSharedCacheEnabled());
+    }
+
+    public void testInitDataDomainValidation() throws Exception {
+        Map<Object, Object> properties = new HashMap<Object, Object>();
+        properties.put(DataDomain.VALIDATING_OBJECTS_ON_COMMIT_PROPERTY, Boolean.TRUE.toString());
+
+        DataDomain domain = new DataDomain("d1", properties);
+        assertTrue(domain.isValidatingObjectsOnCommit());
+    }
+
+    public void testInitDataDomainNoValidation() throws Exception {
+        Map<Object, Object> properties = new HashMap<Object, Object>();
+        properties.put(DataDomain.VALIDATING_OBJECTS_ON_COMMIT_PROPERTY, Boolean.FALSE.toString());
+
+        DataDomain domain = new DataDomain("d1", properties);
+        assertFalse(domain.isValidatingObjectsOnCommit());
+    }
+
+    public void testShutdownCache() {
+        DataDomain domain = new DataDomain("X");
+
+        final boolean[] cacheShutdown = new boolean[1];
+
+        DataRowStore cache = new DataRowStore("Y", Collections.EMPTY_MAP, new DefaultEventManager()) {
+
+            @Override
+            public void shutdown() {
+                cacheShutdown[0] = true;
+            }
+        };
+
+        domain.setSharedSnapshotCache(cache);
+        domain.shutdown();
+
+        assertTrue(cacheShutdown[0]);
+    }
+
+    public void testAddListener() {
+
+        DataDomain domain = runtime.getDataDomain();
+        PostAddListener listener = new PostAddListener();
+        domain.addListener(listener);
+
+        ObjectContext context = runtime.newContext();
+
+        context.newObject(Gallery.class);
+        assertEquals("e:Gallery;", listener.getAndReset());
+
+        context.newObject(Artist.class);
+        assertEquals("a:Artist;", listener.getAndReset());
+
+        context.newObject(Exhibit.class);
+        assertEquals("", listener.getAndReset());
+
+        context.newObject(Painting.class);
+        assertEquals("e:Painting;", listener.getAndReset());
+    }
+
+    class PostAddListener {
+
+        StringBuilder callbackBuffer = new StringBuilder();
+
+        @PostAdd({ Gallery.class, Painting.class })
+        void postAddEntities(Persistent object) {
+            callbackBuffer.append("e:" + object.getObjectId().getEntityName() + ";");
+        }
+
+        @PostAdd(entityAnnotations = Tag1.class)
+        void postAddAnnotated(Persistent object) {
+            callbackBuffer.append("a:" + object.getObjectId().getEntityName() + ";");
+        }
+
+        String getAndReset() {
+            String v = callbackBuffer.toString();
+            callbackBuffer = new StringBuilder();
+            return v;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainQueryActionIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainQueryActionIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainQueryActionIT.java
new file mode 100644
index 0000000..5e053a1
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainQueryActionIT.java
@@ -0,0 +1,109 @@
+/*****************************************************************
+ *   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.access;
+
+import org.apache.cayenne.cache.MockQueryCache;
+import org.apache.cayenne.cache.QueryCache;
+import org.apache.cayenne.cache.QueryCacheEntryFactory;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.QueryCacheStrategy;
+import org.apache.cayenne.query.QueryMetadata;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.SortOrder;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.io.Serializable;
+import java.util.List;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataDomainQueryActionIT extends ServerCase {
+
+    @Inject
+    private DataContext context;
+
+    @Inject
+    private ServerRuntime runtime;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Override
+    public void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("PAINTING_INFO");
+        dbHelper.deleteAll("PAINTING");
+        dbHelper.deleteAll("PAINTING1");
+        dbHelper.deleteAll("ARTIST_EXHIBIT");
+        dbHelper.deleteAll("ARTIST_GROUP");
+        dbHelper.deleteAll("ARTIST");
+    }
+
+    @Override
+    public void tearDownBeforeInjection() {
+        runtime.getDataDomain().resetProperties();
+    }
+
+    public void testCachedQuery() {
+
+        DataDomain domain = runtime.getDataDomain();
+
+        Painting p = context.newObject(Painting.class);
+        p.setPaintingTitle("sample");
+
+        SelectQuery query = new SelectQuery(Painting.class);
+
+        query.addPrefetch(Painting.TO_GALLERY_PROPERTY);
+        query.addPrefetch(Painting.TO_ARTIST_PROPERTY);
+        query.addOrdering(Painting.PAINTING_TITLE_PROPERTY, SortOrder.ASCENDING);
+        query.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
+        query.setPageSize(5);
+
+        QueryCache cache = domain.queryCache;
+
+        domain.queryCache = new MockQueryCache() {
+
+            @Override
+            public List<?> get(QueryMetadata metadata, QueryCacheEntryFactory factory) {
+                Object results = factory.createObject();
+                assertTrue(
+                        "Query cache is not serializable.",
+                        results instanceof Serializable);
+
+                return null;
+            }
+
+            @SuppressWarnings("all")
+            @Override
+            public void put(QueryMetadata metadata, List results) {
+                assertTrue(
+                        "Query cache is not serializable.",
+                        results instanceof Serializable);
+            }
+        };
+
+        DataDomainQueryAction action = new DataDomainQueryAction(context, domain, query);
+        action.execute();
+
+        domain.queryCache = cache;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainQueryActionTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainQueryActionTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainQueryActionTest.java
deleted file mode 100644
index 6303af0..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainQueryActionTest.java
+++ /dev/null
@@ -1,109 +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.access;
-
-import java.io.Serializable;
-import java.util.List;
-
-import org.apache.cayenne.cache.MockQueryCache;
-import org.apache.cayenne.cache.QueryCache;
-import org.apache.cayenne.cache.QueryCacheEntryFactory;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.QueryCacheStrategy;
-import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataDomainQueryActionTest extends ServerCase {
-
-    @Inject
-    private DataContext context;
-
-    @Inject
-    private ServerRuntime runtime;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Override
-    public void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("PAINTING_INFO");
-        dbHelper.deleteAll("PAINTING");
-        dbHelper.deleteAll("PAINTING1");
-        dbHelper.deleteAll("ARTIST_EXHIBIT");
-        dbHelper.deleteAll("ARTIST_GROUP");
-        dbHelper.deleteAll("ARTIST");
-    }
-
-    @Override
-    public void tearDownBeforeInjection() {
-        runtime.getDataDomain().resetProperties();
-    }
-
-    public void testCachedQuery() {
-
-        DataDomain domain = runtime.getDataDomain();
-
-        Painting p = context.newObject(Painting.class);
-        p.setPaintingTitle("sample");
-
-        SelectQuery query = new SelectQuery(Painting.class);
-
-        query.addPrefetch(Painting.TO_GALLERY_PROPERTY);
-        query.addPrefetch(Painting.TO_ARTIST_PROPERTY);
-        query.addOrdering(Painting.PAINTING_TITLE_PROPERTY, SortOrder.ASCENDING);
-        query.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-        query.setPageSize(5);
-
-        QueryCache cache = domain.queryCache;
-
-        domain.queryCache = new MockQueryCache() {
-
-            @Override
-            public List<?> get(QueryMetadata metadata, QueryCacheEntryFactory factory) {
-                Object results = factory.createObject();
-                assertTrue(
-                        "Query cache is not serializable.",
-                        results instanceof Serializable);
-
-                return null;
-            }
-
-            @SuppressWarnings("all")
-            @Override
-            public void put(QueryMetadata metadata, List results) {
-                assertTrue(
-                        "Query cache is not serializable.",
-                        results instanceof Serializable);
-            }
-        };
-
-        DataDomainQueryAction action = new DataDomainQueryAction(context, domain, query);
-        action.execute();
-
-        domain.queryCache = cache;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainTest.java
deleted file mode 100644
index 666931f..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataDomainTest.java
+++ /dev/null
@@ -1,256 +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.access;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.annotation.PostAdd;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.event.DefaultEventManager;
-import org.apache.cayenne.log.JdbcEventLogger;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Exhibit;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.testdo.testmap.annotations.Tag1;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataDomainTest extends ServerCase {
-
-    @Inject
-    private ServerRuntime runtime;
-
-    @Inject
-    private JdbcEventLogger logger;
-
-    public void testName() throws Exception {
-        DataDomain domain = new DataDomain("some name");
-        assertEquals("some name", domain.getName());
-        domain.setName("tst_name");
-        assertEquals("tst_name", domain.getName());
-    }
-
-    public void testLookupDataNode() {
-
-        DataDomain domain = new DataDomain("test");
-
-        DataMap m1 = new DataMap("m1");
-        DataNode n1 = new DataNode("n1");
-        n1.addDataMap(m1);
-        domain.addNode(n1);
-
-        DataMap m2 = new DataMap("m2");
-        DataNode n2 = new DataNode("n2");
-        n2.addDataMap(m2);
-        domain.addNode(n2);
-
-        assertSame(n1, domain.lookupDataNode(m1));
-        assertSame(n2, domain.lookupDataNode(m2));
-
-        try {
-
-            domain.lookupDataNode(new DataMap("m3"));
-            fail("must have thrown on missing Map to Node maping");
-        } catch (CayenneRuntimeException e) {
-            // expected
-        }
-    }
-
-    public void testLookupDataNode_Default() {
-
-        DataDomain domain = new DataDomain("test");
-
-        DataMap m1 = new DataMap("m1");
-        DataNode n1 = new DataNode("n1");
-        n1.addDataMap(m1);
-        domain.setDefaultNode(n1);
-
-        DataMap m2 = new DataMap("m2");
-        DataNode n2 = new DataNode("n2");
-        n2.addDataMap(m2);
-        domain.addNode(n2);
-
-        assertSame(n1, domain.lookupDataNode(m1));
-        assertSame(n2, domain.lookupDataNode(m2));
-
-        // must map to default
-        assertSame(n1, domain.lookupDataNode(new DataMap("m3")));
-    }
-
-    public void testNodes() throws Exception {
-        DataDomain domain = new DataDomain("dom1");
-        assertEquals(0, domain.getDataNodes().size());
-        DataNode node = new DataNode("1");
-        node.setJdbcEventLogger(logger);
-        domain.addNode(node);
-        assertEquals(1, domain.getDataNodes().size());
-        node = new DataNode("2");
-        node.setJdbcEventLogger(logger);
-        domain.addNode(node);
-        assertEquals(2, domain.getDataNodes().size());
-    }
-
-    public void testNodeMaps() throws Exception {
-        DataDomain domain = new DataDomain("dom1");
-        assertNull(domain.getDataMap("map"));
-
-        DataNode node = new DataNode("1");
-        node.setJdbcEventLogger(logger);
-        node.addDataMap(new DataMap("map"));
-
-        domain.addNode(node);
-        assertNotNull(domain.getDataMap("map"));
-    }
-
-    public void testMaps() throws Exception {
-        DataDomain d1 = new DataDomain("dom1");
-
-        DataMap m1 = new DataMap("m1");
-        d1.addDataMap(m1);
-        assertSame(m1, d1.getDataMap(m1.getName()));
-
-        d1.removeDataMap(m1.getName());
-        assertNull(d1.getDataMap(m1.getName()));
-    }
-
-    public void testEntityResolverRefresh() throws Exception {
-        DataDomain domain = new DataDomain("dom1");
-        org.apache.cayenne.map.EntityResolver resolver = domain.getEntityResolver();
-        assertNotNull(resolver);
-
-        DataMap map = new DataMap("map");
-        ObjEntity entity = new ObjEntity("TestEntity");
-        map.addObjEntity(entity);
-
-        domain.addDataMap(map);
-
-        assertSame(entity, resolver.getObjEntity("TestEntity"));
-    }
-
-    public void testEntityResolver() {
-        assertNotNull(runtime.getDataDomain().getEntityResolver());
-
-        DataDomain domain = new DataDomain("dom1");
-        assertNotNull(domain.getEntityResolver());
-    }
-
-    public void testInitDataDomainWithSharedCache() throws Exception {
-        Map<Object, Object> properties = new HashMap<Object, Object>();
-        properties.put(DataDomain.SHARED_CACHE_ENABLED_PROPERTY, Boolean.TRUE.toString());
-
-        DataDomain domain = new DataDomain("d1", properties);
-        assertTrue(domain.isSharedCacheEnabled());
-    }
-
-    public void testInitDataDomainWithDedicatedCache() throws Exception {
-        Map<Object, Object> properties = new HashMap<Object, Object>();
-        properties.put(DataDomain.SHARED_CACHE_ENABLED_PROPERTY, Boolean.FALSE.toString());
-
-        DataDomain domain = new DataDomain("d1", properties);
-        assertFalse(domain.isSharedCacheEnabled());
-    }
-
-    public void testInitDataDomainValidation() throws Exception {
-        Map<Object, Object> properties = new HashMap<Object, Object>();
-        properties.put(DataDomain.VALIDATING_OBJECTS_ON_COMMIT_PROPERTY, Boolean.TRUE.toString());
-
-        DataDomain domain = new DataDomain("d1", properties);
-        assertTrue(domain.isValidatingObjectsOnCommit());
-    }
-
-    public void testInitDataDomainNoValidation() throws Exception {
-        Map<Object, Object> properties = new HashMap<Object, Object>();
-        properties.put(DataDomain.VALIDATING_OBJECTS_ON_COMMIT_PROPERTY, Boolean.FALSE.toString());
-
-        DataDomain domain = new DataDomain("d1", properties);
-        assertFalse(domain.isValidatingObjectsOnCommit());
-    }
-
-    public void testShutdownCache() {
-        DataDomain domain = new DataDomain("X");
-
-        final boolean[] cacheShutdown = new boolean[1];
-
-        DataRowStore cache = new DataRowStore("Y", Collections.EMPTY_MAP, new DefaultEventManager()) {
-
-            @Override
-            public void shutdown() {
-                cacheShutdown[0] = true;
-            }
-        };
-
-        domain.setSharedSnapshotCache(cache);
-        domain.shutdown();
-
-        assertTrue(cacheShutdown[0]);
-    }
-
-    public void testAddListener() {
-
-        DataDomain domain = runtime.getDataDomain();
-        PostAddListener listener = new PostAddListener();
-        domain.addListener(listener);
-
-        ObjectContext context = runtime.newContext();
-
-        context.newObject(Gallery.class);
-        assertEquals("e:Gallery;", listener.getAndReset());
-
-        context.newObject(Artist.class);
-        assertEquals("a:Artist;", listener.getAndReset());
-
-        context.newObject(Exhibit.class);
-        assertEquals("", listener.getAndReset());
-
-        context.newObject(Painting.class);
-        assertEquals("e:Painting;", listener.getAndReset());
-    }
-
-    class PostAddListener {
-
-        StringBuilder callbackBuffer = new StringBuilder();
-
-        @PostAdd({ Gallery.class, Painting.class })
-        void postAddEntities(Persistent object) {
-            callbackBuffer.append("e:" + object.getObjectId().getEntityName() + ";");
-        }
-
-        @PostAdd(entityAnnotations = Tag1.class)
-        void postAddAnnotated(Persistent object) {
-            callbackBuffer.append("a:" + object.getObjectId().getEntityName() + ";");
-        }
-
-        String getAndReset() {
-            String v = callbackBuffer.toString();
-            callbackBuffer = new StringBuilder();
-            return v;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeIT.java
new file mode 100644
index 0000000..86b4005
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeIT.java
@@ -0,0 +1,86 @@
+/*****************************************************************
+ *   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.access;
+
+import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.di.AdhocObjectFactory;
+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 DataNodeIT extends ServerCase {
+    
+    @Inject
+    private AdhocObjectFactory objectFactory;
+
+    public void testName() throws Exception {
+        String tstName = "tst_name";
+        DataNode node = new DataNode();
+        assertNull(node.getName());
+        node.setName(tstName);
+        assertEquals(tstName, node.getName());
+    }
+
+    public void testDataSourceLocation() throws Exception {
+        String tstName = "tst_name";
+        DataNode node = new DataNode();
+        assertNull(node.getDataSourceLocation());
+        node.setDataSourceLocation(tstName);
+        assertEquals(tstName, node.getDataSourceLocation());
+    }
+
+    public void testDataSourceFactory() throws Exception {
+        String tstName = "tst_name";
+        DataNode node = new DataNode();
+        assertNull(node.getDataSourceFactory());
+        node.setDataSourceFactory(tstName);
+        assertEquals(tstName, node.getDataSourceFactory());
+    }
+
+    public void testNodeEntityResolver() {
+        DataNode node = new DataNode();
+        assertNull(node.getEntityResolver());
+
+        org.apache.cayenne.map.EntityResolver resolver = new org.apache.cayenne.map.EntityResolver();
+        node.setEntityResolver(resolver);
+        assertSame(resolver, node.getEntityResolver());
+    }
+
+    public void testAdapter() throws Exception {
+        DataNode node = new DataNode();
+
+        assertNull(node.getAdapter());
+
+        JdbcAdapter a1 = objectFactory.newInstance(
+                JdbcAdapter.class, 
+                JdbcAdapter.class.getName());
+        node.setAdapter(a1);
+
+        assertSame(a1, node.getAdapter());
+
+        JdbcAdapter a2 = objectFactory.newInstance(
+                JdbcAdapter.class, 
+                JdbcAdapter.class.getName());
+        node.setAdapter(a2);
+
+        assertSame(a2, node.getAdapter());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeQueriesIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeQueriesIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeQueriesIT.java
new file mode 100644
index 0000000..bfe476a
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeQueriesIT.java
@@ -0,0 +1,189 @@
+/*****************************************************************
+ *   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.access;
+
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.query.Query;
+import org.apache.cayenne.query.SQLTemplate;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.apache.cayenne.unit.util.SQLTemplateCustomizer;
+
+import java.sql.Date;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataNodeQueriesIT extends ServerCase {
+
+    @Inject
+    protected DataNode node;
+
+    @Inject
+    protected DBHelper dbHelper;
+
+    @Inject
+    protected SQLTemplateCustomizer sqlTemplateCustomizer;
+
+    protected TableHelper tArtist;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("PAINTING_INFO");
+        dbHelper.deleteAll("PAINTING");
+        dbHelper.deleteAll("ARTIST_EXHIBIT");
+        dbHelper.deleteAll("ARTIST_GROUP");
+        dbHelper.deleteAll("ARTIST");
+
+        tArtist = new TableHelper(dbHelper, "ARTIST");
+        tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
+    }
+
+    protected void createFourArtists() throws Exception {
+        tArtist.insert(11, "artist2");
+        tArtist.insert(101, "artist3");
+        tArtist.insert(201, "artist4");
+        tArtist.insert(3001, "artist5");
+    }
+
+    public void testCreatePkSupportForMapEntities() throws Exception {
+
+        DbEntity artistEnt = node.getEntityResolver().getDbEntity("ARTIST");
+        assertNotNull(node.getAdapter().getPkGenerator().generatePk(
+                node,
+                artistEnt.getPrimaryKeys().iterator().next()));
+
+        DbEntity exhibitEnt = node.getEntityResolver().getDbEntity("EXHIBIT");
+        assertNotNull(node.getAdapter().getPkGenerator().generatePk(
+                node,
+                exhibitEnt.getPrimaryKeys().iterator().next()));
+    }
+
+    public void testPerfomQueriesSQLTemplate() throws Exception {
+        String template = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME, DATE_OF_BIRTH) "
+                + "VALUES (#bind($id), #bind($name), #bind($dob 'DATE'))";
+        SQLTemplate query = new SQLTemplate(Object.class, template);
+
+        Map<String, Object> bindings = new HashMap<String, Object>();
+        bindings.put("id", 1l);
+        bindings.put("name", "a1");
+        bindings.put("dob", new Date(System.currentTimeMillis()));
+        query.setParameters(bindings);
+
+        MockOperationObserver observer = new MockOperationObserver();
+        node.performQueries(Collections.singletonList((Query) query), observer);
+        assertNotNull(observer.countsForQuery(query));
+        assertEquals(1, observer.countsForQuery(query)[0]);
+
+        // check the data
+
+        assertEquals(1, tArtist.getRowCount());
+        assertEquals(1l, tArtist.getLong("ARTIST_ID"));
+        assertEquals("a1", tArtist.getString("ARTIST_NAME").trim());
+    }
+
+    public void testPerfomQueriesSelectingSQLTemplate1() throws Exception {
+        createFourArtists();
+
+        String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID";
+        SQLTemplate query = new SQLTemplate(Object.class, template);
+
+        MockOperationObserver observer = new MockOperationObserver();
+        node.performQueries(Collections.singletonList((Query) query), observer);
+
+        List<DataRow> data = observer.rowsForQuery(query);
+        assertEquals(4, data.size());
+        DataRow row = data.get(2);
+        assertEquals(1, row.size());
+        assertEquals(201, row.get("ARTIST_ID"));
+    }
+
+    public void testPerfomQueriesSelectingSQLTemplate2() throws Exception {
+        createFourArtists();
+
+        String template = "SELECT * FROM ARTIST ORDER BY ARTIST_ID";
+        SQLTemplate query = new SQLTemplate(Object.class, template);
+        sqlTemplateCustomizer.updateSQLTemplate(query);
+
+        MockOperationObserver observer = new MockOperationObserver();
+        node.performQueries(Collections.singletonList((Query) query), observer);
+
+        List<DataRow> data = observer.rowsForQuery(query);
+        assertEquals(4, data.size());
+        DataRow row = data.get(2);
+        assertEquals(3, row.size());
+
+        Number id = (Number) row.get("ARTIST_ID");
+        assertNotNull(id);
+        assertEquals(201, id.intValue());
+    }
+
+    public void testPerfomQueriesSelectingSQLTemplateAlias() throws Exception {
+        createFourArtists();
+
+        String template = "SELECT #result('ARTIST_ID' 'int' 'A') FROM ARTIST ORDER BY ARTIST_ID";
+        Query query = new SQLTemplate(Object.class, template);
+
+        MockOperationObserver observer = new MockOperationObserver();
+        node.performQueries(Collections.singletonList(query), observer);
+
+        List<DataRow> data = observer.rowsForQuery(query);
+        assertEquals(4, data.size());
+        DataRow row = data.get(2);
+        assertEquals(1, row.size());
+        assertEquals(201, row.get("A"));
+    }
+
+    public void testRunMultiLineSQLTemplateUNIX() throws Exception {
+        String templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME)"
+                + "\n"
+                + "VALUES (1, 'A')";
+        Query template = new SQLTemplate(Object.class, templateString);
+        node.performQueries(
+                Collections.singletonList(template),
+                new MockOperationObserver());
+    }
+
+    public void testRunMultiLineSQLTemplateWindows() throws Exception {
+        String templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME)"
+                + "\r\n"
+                + "VALUES (1, 'A')";
+        Query template = new SQLTemplate(Object.class, templateString);
+        node.performQueries(
+                Collections.singletonList(template),
+                new MockOperationObserver());
+    }
+
+    public void testRunMultiLineSQLTemplateMac() throws Exception {
+        String templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME)"
+                + "\r"
+                + "VALUES (1, 'A')";
+        Query template = new SQLTemplate(Object.class, templateString);
+        node.performQueries(
+                Collections.singletonList(template),
+                new MockOperationObserver());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeQueriesTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeQueriesTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeQueriesTest.java
deleted file mode 100644
index ba5edd2..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeQueriesTest.java
+++ /dev/null
@@ -1,189 +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.access;
-
-import java.sql.Date;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.query.Query;
-import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.unit.util.SQLTemplateCustomizer;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataNodeQueriesTest extends ServerCase {
-
-    @Inject
-    protected DataNode node;
-
-    @Inject
-    protected DBHelper dbHelper;
-
-    @Inject
-    protected SQLTemplateCustomizer sqlTemplateCustomizer;
-
-    protected TableHelper tArtist;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("PAINTING_INFO");
-        dbHelper.deleteAll("PAINTING");
-        dbHelper.deleteAll("ARTIST_EXHIBIT");
-        dbHelper.deleteAll("ARTIST_GROUP");
-        dbHelper.deleteAll("ARTIST");
-
-        tArtist = new TableHelper(dbHelper, "ARTIST");
-        tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
-    }
-
-    protected void createFourArtists() throws Exception {
-        tArtist.insert(11, "artist2");
-        tArtist.insert(101, "artist3");
-        tArtist.insert(201, "artist4");
-        tArtist.insert(3001, "artist5");
-    }
-
-    public void testCreatePkSupportForMapEntities() throws Exception {
-
-        DbEntity artistEnt = node.getEntityResolver().getDbEntity("ARTIST");
-        assertNotNull(node.getAdapter().getPkGenerator().generatePk(
-                node,
-                artistEnt.getPrimaryKeys().iterator().next()));
-
-        DbEntity exhibitEnt = node.getEntityResolver().getDbEntity("EXHIBIT");
-        assertNotNull(node.getAdapter().getPkGenerator().generatePk(
-                node,
-                exhibitEnt.getPrimaryKeys().iterator().next()));
-    }
-
-    public void testPerfomQueriesSQLTemplate() throws Exception {
-        String template = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME, DATE_OF_BIRTH) "
-                + "VALUES (#bind($id), #bind($name), #bind($dob 'DATE'))";
-        SQLTemplate query = new SQLTemplate(Object.class, template);
-
-        Map<String, Object> bindings = new HashMap<String, Object>();
-        bindings.put("id", 1l);
-        bindings.put("name", "a1");
-        bindings.put("dob", new Date(System.currentTimeMillis()));
-        query.setParameters(bindings);
-
-        MockOperationObserver observer = new MockOperationObserver();
-        node.performQueries(Collections.singletonList((Query) query), observer);
-        assertNotNull(observer.countsForQuery(query));
-        assertEquals(1, observer.countsForQuery(query)[0]);
-
-        // check the data
-
-        assertEquals(1, tArtist.getRowCount());
-        assertEquals(1l, tArtist.getLong("ARTIST_ID"));
-        assertEquals("a1", tArtist.getString("ARTIST_NAME").trim());
-    }
-
-    public void testPerfomQueriesSelectingSQLTemplate1() throws Exception {
-        createFourArtists();
-
-        String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID";
-        SQLTemplate query = new SQLTemplate(Object.class, template);
-
-        MockOperationObserver observer = new MockOperationObserver();
-        node.performQueries(Collections.singletonList((Query) query), observer);
-
-        List<DataRow> data = observer.rowsForQuery(query);
-        assertEquals(4, data.size());
-        DataRow row = data.get(2);
-        assertEquals(1, row.size());
-        assertEquals(201, row.get("ARTIST_ID"));
-    }
-
-    public void testPerfomQueriesSelectingSQLTemplate2() throws Exception {
-        createFourArtists();
-
-        String template = "SELECT * FROM ARTIST ORDER BY ARTIST_ID";
-        SQLTemplate query = new SQLTemplate(Object.class, template);
-        sqlTemplateCustomizer.updateSQLTemplate(query);
-
-        MockOperationObserver observer = new MockOperationObserver();
-        node.performQueries(Collections.singletonList((Query) query), observer);
-
-        List<DataRow> data = observer.rowsForQuery(query);
-        assertEquals(4, data.size());
-        DataRow row = data.get(2);
-        assertEquals(3, row.size());
-
-        Number id = (Number) row.get("ARTIST_ID");
-        assertNotNull(id);
-        assertEquals(201, id.intValue());
-    }
-
-    public void testPerfomQueriesSelectingSQLTemplateAlias() throws Exception {
-        createFourArtists();
-
-        String template = "SELECT #result('ARTIST_ID' 'int' 'A') FROM ARTIST ORDER BY ARTIST_ID";
-        Query query = new SQLTemplate(Object.class, template);
-
-        MockOperationObserver observer = new MockOperationObserver();
-        node.performQueries(Collections.singletonList(query), observer);
-
-        List<DataRow> data = observer.rowsForQuery(query);
-        assertEquals(4, data.size());
-        DataRow row = data.get(2);
-        assertEquals(1, row.size());
-        assertEquals(201, row.get("A"));
-    }
-
-    public void testRunMultiLineSQLTemplateUNIX() throws Exception {
-        String templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME)"
-                + "\n"
-                + "VALUES (1, 'A')";
-        Query template = new SQLTemplate(Object.class, templateString);
-        node.performQueries(
-                Collections.singletonList(template),
-                new MockOperationObserver());
-    }
-
-    public void testRunMultiLineSQLTemplateWindows() throws Exception {
-        String templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME)"
-                + "\r\n"
-                + "VALUES (1, 'A')";
-        Query template = new SQLTemplate(Object.class, templateString);
-        node.performQueries(
-                Collections.singletonList(template),
-                new MockOperationObserver());
-    }
-
-    public void testRunMultiLineSQLTemplateMac() throws Exception {
-        String templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME)"
-                + "\r"
-                + "VALUES (1, 'A')";
-        Query template = new SQLTemplate(Object.class, templateString);
-        node.performQueries(
-                Collections.singletonList(template),
-                new MockOperationObserver());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeTest.java
deleted file mode 100644
index 315ccf3..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataNodeTest.java
+++ /dev/null
@@ -1,88 +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.access;
-
-import junit.framework.TestCase;
-
-import org.apache.cayenne.dba.JdbcAdapter;
-import org.apache.cayenne.di.AdhocObjectFactory;
-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 DataNodeTest extends ServerCase {
-    
-    @Inject
-    private AdhocObjectFactory objectFactory;
-
-    public void testName() throws Exception {
-        String tstName = "tst_name";
-        DataNode node = new DataNode();
-        assertNull(node.getName());
-        node.setName(tstName);
-        assertEquals(tstName, node.getName());
-    }
-
-    public void testDataSourceLocation() throws Exception {
-        String tstName = "tst_name";
-        DataNode node = new DataNode();
-        assertNull(node.getDataSourceLocation());
-        node.setDataSourceLocation(tstName);
-        assertEquals(tstName, node.getDataSourceLocation());
-    }
-
-    public void testDataSourceFactory() throws Exception {
-        String tstName = "tst_name";
-        DataNode node = new DataNode();
-        assertNull(node.getDataSourceFactory());
-        node.setDataSourceFactory(tstName);
-        assertEquals(tstName, node.getDataSourceFactory());
-    }
-
-    public void testNodeEntityResolver() {
-        DataNode node = new DataNode();
-        assertNull(node.getEntityResolver());
-
-        org.apache.cayenne.map.EntityResolver resolver = new org.apache.cayenne.map.EntityResolver();
-        node.setEntityResolver(resolver);
-        assertSame(resolver, node.getEntityResolver());
-    }
-
-    public void testAdapter() throws Exception {
-        DataNode node = new DataNode();
-
-        assertNull(node.getAdapter());
-
-        JdbcAdapter a1 = objectFactory.newInstance(
-                JdbcAdapter.class, 
-                JdbcAdapter.class.getName());
-        node.setAdapter(a1);
-
-        assertSame(a1, node.getAdapter());
-
-        JdbcAdapter a2 = objectFactory.newInstance(
-                JdbcAdapter.class, 
-                JdbcAdapter.class.getName());
-        node.setAdapter(a2);
-
-        assertSame(a2, node.getAdapter());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java
new file mode 100644
index 0000000..306b678
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreIT.java
@@ -0,0 +1,131 @@
+/*****************************************************************
+ *   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.access;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.event.DefaultEventManager;
+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 DataRowStoreIT extends ServerCase {
+
+    public void testDefaultConstructor() {
+        DataRowStore cache = new DataRowStore(
+                "cacheXYZ",
+                Collections.EMPTY_MAP,
+                new DefaultEventManager());
+        assertEquals("cacheXYZ", cache.getName());
+        assertNotNull(cache.getSnapshotEventSubject());
+        assertTrue(cache.getSnapshotEventSubject().getSubjectName().contains("cacheXYZ"));
+
+        assertEquals(DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
+                .isNotifyingRemoteListeners());
+    }
+
+    public void testConstructorWithProperties() {
+        Map<Object, Object> props = new HashMap<Object, Object>();
+        props.put(DataRowStore.REMOTE_NOTIFICATION_PROPERTY, String
+                .valueOf(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT));
+
+        DataRowStore cache = new DataRowStore(
+                "cacheXYZ",
+                props,
+                new DefaultEventManager());
+        assertEquals("cacheXYZ", cache.getName());
+        assertEquals(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
+                .isNotifyingRemoteListeners());
+    }
+
+    public void testNotifyingRemoteListeners() {
+        DataRowStore cache = new DataRowStore(
+                "cacheXYZ",
+                Collections.EMPTY_MAP,
+                new DefaultEventManager());
+
+        assertEquals(DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
+                .isNotifyingRemoteListeners());
+
+        cache.setNotifyingRemoteListeners(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT);
+        assertEquals(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
+                .isNotifyingRemoteListeners());
+    }
+
+    /**
+     * Tests LRU cache behavior.
+     */
+    public void testMaxSize() throws Exception {
+        Map<Object, Object> props = new HashMap<Object, Object>();
+        props.put(DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, String.valueOf(2));
+
+        DataRowStore cache = new DataRowStore(
+                "cacheXYZ",
+                props,
+                new DefaultEventManager());
+        assertEquals(2, cache.maximumSize());
+        assertEquals(0, cache.size());
+
+        ObjectId key1 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 1);
+        Map<Object, Object> diff1 = new HashMap<Object, Object>();
+        diff1.put(key1, new DataRow(1));
+
+        ObjectId key2 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 2);
+        Map<Object, Object> diff2 = new HashMap<Object, Object>();
+        diff2.put(key2, new DataRow(1));
+
+        ObjectId key3 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 3);
+        Map<Object, Object> diff3 = new HashMap<Object, Object>();
+        diff3.put(key3, new DataRow(1));
+
+        cache.processSnapshotChanges(
+                this,
+                diff1,
+                Collections.EMPTY_LIST,
+                Collections.EMPTY_LIST,
+                Collections.EMPTY_LIST);
+        assertEquals(1, cache.size());
+
+        cache.processSnapshotChanges(
+                this,
+                diff2,
+                Collections.EMPTY_LIST,
+                Collections.EMPTY_LIST,
+                Collections.EMPTY_LIST);
+        assertEquals(2, cache.size());
+
+        // this addition must overflow the cache, and throw out the first item
+        cache.processSnapshotChanges(
+                this,
+                diff3,
+                Collections.EMPTY_LIST,
+                Collections.EMPTY_LIST,
+                Collections.EMPTY_LIST);
+        assertEquals(2, cache.size());
+        assertNotNull(cache.getCachedSnapshot(key2));
+        assertNotNull(cache.getCachedSnapshot(key3));
+        assertNull(cache.getCachedSnapshot(key1));
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreTest.java
deleted file mode 100644
index 7a51657..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowStoreTest.java
+++ /dev/null
@@ -1,131 +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.access;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.event.DefaultEventManager;
-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 DataRowStoreTest extends ServerCase {
-
-    public void testDefaultConstructor() {
-        DataRowStore cache = new DataRowStore(
-                "cacheXYZ",
-                Collections.EMPTY_MAP,
-                new DefaultEventManager());
-        assertEquals("cacheXYZ", cache.getName());
-        assertNotNull(cache.getSnapshotEventSubject());
-        assertTrue(cache.getSnapshotEventSubject().getSubjectName().contains("cacheXYZ"));
-
-        assertEquals(DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
-                .isNotifyingRemoteListeners());
-    }
-
-    public void testConstructorWithProperties() {
-        Map<Object, Object> props = new HashMap<Object, Object>();
-        props.put(DataRowStore.REMOTE_NOTIFICATION_PROPERTY, String
-                .valueOf(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT));
-
-        DataRowStore cache = new DataRowStore(
-                "cacheXYZ",
-                props,
-                new DefaultEventManager());
-        assertEquals("cacheXYZ", cache.getName());
-        assertEquals(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
-                .isNotifyingRemoteListeners());
-    }
-
-    public void testNotifyingRemoteListeners() {
-        DataRowStore cache = new DataRowStore(
-                "cacheXYZ",
-                Collections.EMPTY_MAP,
-                new DefaultEventManager());
-
-        assertEquals(DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
-                .isNotifyingRemoteListeners());
-
-        cache.setNotifyingRemoteListeners(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT);
-        assertEquals(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
-                .isNotifyingRemoteListeners());
-    }
-
-    /**
-     * Tests LRU cache behavior.
-     */
-    public void testMaxSize() throws Exception {
-        Map<Object, Object> props = new HashMap<Object, Object>();
-        props.put(DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, String.valueOf(2));
-
-        DataRowStore cache = new DataRowStore(
-                "cacheXYZ",
-                props,
-                new DefaultEventManager());
-        assertEquals(2, cache.maximumSize());
-        assertEquals(0, cache.size());
-
-        ObjectId key1 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 1);
-        Map<Object, Object> diff1 = new HashMap<Object, Object>();
-        diff1.put(key1, new DataRow(1));
-
-        ObjectId key2 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 2);
-        Map<Object, Object> diff2 = new HashMap<Object, Object>();
-        diff2.put(key2, new DataRow(1));
-
-        ObjectId key3 = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 3);
-        Map<Object, Object> diff3 = new HashMap<Object, Object>();
-        diff3.put(key3, new DataRow(1));
-
-        cache.processSnapshotChanges(
-                this,
-                diff1,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST);
-        assertEquals(1, cache.size());
-
-        cache.processSnapshotChanges(
-                this,
-                diff2,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST);
-        assertEquals(2, cache.size());
-
-        // this addition must overflow the cache, and throw out the first item
-        cache.processSnapshotChanges(
-                this,
-                diff3,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST,
-                Collections.EMPTY_LIST);
-        assertEquals(2, cache.size());
-        assertNotNull(cache.getCachedSnapshot(key2));
-        assertNotNull(cache.getCachedSnapshot(key3));
-        assertNull(cache.getCachedSnapshot(key1));
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java
new file mode 100644
index 0000000..7d9c18d
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsIT.java
@@ -0,0 +1,152 @@
+/*****************************************************************
+ *   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.access;
+
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.reflect.ArcProperty;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.testdo.testmap.Gallery;
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.List;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataRowUtilsIT extends ServerCase {
+
+    @Inject
+    protected DataContext context;
+
+    @Inject
+    protected DBHelper dbHelper;
+
+    protected TableHelper tArtist;
+    protected TableHelper tPainting;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("PAINTING_INFO");
+        dbHelper.deleteAll("PAINTING");
+        dbHelper.deleteAll("ARTIST_EXHIBIT");
+        dbHelper.deleteAll("ARTIST_GROUP");
+        dbHelper.deleteAll("ARTIST");
+
+        tArtist = new TableHelper(dbHelper, "ARTIST");
+        tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
+
+        tPainting = new TableHelper(dbHelper, "PAINTING");
+        tPainting.setColumns(
+                "PAINTING_ID",
+                "PAINTING_TITLE",
+                "ARTIST_ID",
+                "ESTIMATED_PRICE");
+    }
+
+    protected void createOneArtist() throws Exception {
+        tArtist.insert(11, "artist2");
+    }
+
+    protected void createOneArtistAndOnePainting() throws Exception {
+        tArtist.insert(11, "artist2");
+        tPainting.insert(6, "p_artist2", 11, 1000);
+    }
+
+    public void testMerge() throws Exception {
+        createOneArtist();
+
+        String n1 = "changed";
+        String n2 = "changed again";
+
+        SelectQuery artistQ = new SelectQuery(Artist.class);
+        Artist a1 = (Artist) context.performQuery(artistQ).get(0);
+        a1.setArtistName(n1);
+
+        DataRow s2 = new DataRow(2);
+        s2.put("ARTIST_NAME", n2);
+        s2.put("DATE_OF_BIRTH", new java.util.Date());
+
+        ClassDescriptor d = context.getEntityResolver().getClassDescriptor("Artist");
+        DataRowUtils.mergeObjectWithSnapshot(context, d, a1, s2);
+
+        // name was modified, so it should not change during merge
+        assertEquals(n1, a1.getArtistName());
+
+        // date of birth came from database, it should be updated during merge
+        assertEquals(s2.get("DATE_OF_BIRTH"), a1.getDateOfBirth());
+    }
+
+    public void testIsToOneTargetModified() throws Exception {
+        createOneArtist();
+
+        ClassDescriptor d = context.getEntityResolver().getClassDescriptor("Painting");
+        ArcProperty toArtist = (ArcProperty) d.getProperty("toArtist");
+
+        Artist artist2 = (Artist) context
+                .performQuery(new SelectQuery(Artist.class))
+                .get(0);
+        Painting painting = context.newObject(Painting.class);
+        painting.setPaintingTitle("PX");
+        painting.setToArtist(artist2);
+
+        context.commitChanges();
+
+        tArtist.insert(119, "artist3");
+        SelectQuery query = new SelectQuery(Artist.class, ExpressionFactory.matchExp(
+                Artist.ARTIST_NAME_PROPERTY,
+                "artist3"));
+        Artist artist3 = (Artist) context.performQuery(query).get(0);
+        assertNotSame(artist3, painting.getToArtist());
+
+        ObjectDiff diff = context.getObjectStore().registerDiff(
+                painting.getObjectId(),
+                null);
+
+        assertFalse(DataRowUtils.isToOneTargetModified(toArtist, painting, diff));
+
+        painting.setToArtist(artist3);
+        assertTrue(DataRowUtils.isToOneTargetModified(toArtist, painting, diff));
+    }
+
+    public void testIsToOneTargetModifiedWithNewTarget() throws Exception {
+        createOneArtistAndOnePainting();
+
+        // add NEW gallery to painting
+        List<Painting> paintings = context.performQuery(new SelectQuery(Painting.class));
+        assertEquals(1, paintings.size());
+        Painting p1 = paintings.get(0);
+
+        ClassDescriptor d = context.getEntityResolver().getClassDescriptor("Painting");
+        ArcProperty toGallery = (ArcProperty) d.getProperty("toGallery");
+
+        ObjectDiff diff = context.getObjectStore().registerDiff(p1.getObjectId(), null);
+        assertFalse(DataRowUtils.isToOneTargetModified(toGallery, p1, diff));
+
+        Gallery g1 = (Gallery) context.newObject("Gallery");
+        g1.addToPaintingArray(p1);
+        assertTrue(DataRowUtils.isToOneTargetModified(toGallery, p1, diff));
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsTest.java
deleted file mode 100644
index 1cc2d8a..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataRowUtilsTest.java
+++ /dev/null
@@ -1,152 +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.access;
-
-import java.util.List;
-
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.reflect.ArcProperty;
-import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataRowUtilsTest extends ServerCase {
-
-    @Inject
-    protected DataContext context;
-
-    @Inject
-    protected DBHelper dbHelper;
-
-    protected TableHelper tArtist;
-    protected TableHelper tPainting;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("PAINTING_INFO");
-        dbHelper.deleteAll("PAINTING");
-        dbHelper.deleteAll("ARTIST_EXHIBIT");
-        dbHelper.deleteAll("ARTIST_GROUP");
-        dbHelper.deleteAll("ARTIST");
-
-        tArtist = new TableHelper(dbHelper, "ARTIST");
-        tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
-
-        tPainting = new TableHelper(dbHelper, "PAINTING");
-        tPainting.setColumns(
-                "PAINTING_ID",
-                "PAINTING_TITLE",
-                "ARTIST_ID",
-                "ESTIMATED_PRICE");
-    }
-
-    protected void createOneArtist() throws Exception {
-        tArtist.insert(11, "artist2");
-    }
-
-    protected void createOneArtistAndOnePainting() throws Exception {
-        tArtist.insert(11, "artist2");
-        tPainting.insert(6, "p_artist2", 11, 1000);
-    }
-
-    public void testMerge() throws Exception {
-        createOneArtist();
-
-        String n1 = "changed";
-        String n2 = "changed again";
-
-        SelectQuery artistQ = new SelectQuery(Artist.class);
-        Artist a1 = (Artist) context.performQuery(artistQ).get(0);
-        a1.setArtistName(n1);
-
-        DataRow s2 = new DataRow(2);
-        s2.put("ARTIST_NAME", n2);
-        s2.put("DATE_OF_BIRTH", new java.util.Date());
-
-        ClassDescriptor d = context.getEntityResolver().getClassDescriptor("Artist");
-        DataRowUtils.mergeObjectWithSnapshot(context, d, a1, s2);
-
-        // name was modified, so it should not change during merge
-        assertEquals(n1, a1.getArtistName());
-
-        // date of birth came from database, it should be updated during merge
-        assertEquals(s2.get("DATE_OF_BIRTH"), a1.getDateOfBirth());
-    }
-
-    public void testIsToOneTargetModified() throws Exception {
-        createOneArtist();
-
-        ClassDescriptor d = context.getEntityResolver().getClassDescriptor("Painting");
-        ArcProperty toArtist = (ArcProperty) d.getProperty("toArtist");
-
-        Artist artist2 = (Artist) context
-                .performQuery(new SelectQuery(Artist.class))
-                .get(0);
-        Painting painting = context.newObject(Painting.class);
-        painting.setPaintingTitle("PX");
-        painting.setToArtist(artist2);
-
-        context.commitChanges();
-
-        tArtist.insert(119, "artist3");
-        SelectQuery query = new SelectQuery(Artist.class, ExpressionFactory.matchExp(
-                Artist.ARTIST_NAME_PROPERTY,
-                "artist3"));
-        Artist artist3 = (Artist) context.performQuery(query).get(0);
-        assertNotSame(artist3, painting.getToArtist());
-
-        ObjectDiff diff = context.getObjectStore().registerDiff(
-                painting.getObjectId(),
-                null);
-
-        assertFalse(DataRowUtils.isToOneTargetModified(toArtist, painting, diff));
-
-        painting.setToArtist(artist3);
-        assertTrue(DataRowUtils.isToOneTargetModified(toArtist, painting, diff));
-    }
-
-    public void testIsToOneTargetModifiedWithNewTarget() throws Exception {
-        createOneArtistAndOnePainting();
-
-        // add NEW gallery to painting
-        List<Painting> paintings = context.performQuery(new SelectQuery(Painting.class));
-        assertEquals(1, paintings.size());
-        Painting p1 = paintings.get(0);
-
-        ClassDescriptor d = context.getEntityResolver().getClassDescriptor("Painting");
-        ArcProperty toGallery = (ArcProperty) d.getProperty("toGallery");
-
-        ObjectDiff diff = context.getObjectStore().registerDiff(p1.getObjectId(), null);
-        assertFalse(DataRowUtils.isToOneTargetModified(toGallery, p1, diff));
-
-        Gallery g1 = (Gallery) context.newObject("Gallery");
-        g1.addToPaintingArray(p1);
-        assertTrue(DataRowUtils.isToOneTargetModified(toGallery, p1, diff));
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DateTimeTypesIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DateTimeTypesIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DateTimeTypesIT.java
new file mode 100644
index 0000000..2e01bd1
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DateTimeTypesIT.java
@@ -0,0 +1,197 @@
+/*****************************************************************
+ *   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.access;
+
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.NamedQuery;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.testdo.testmap.CalendarEntity;
+import org.apache.cayenne.testdo.testmap.DateTestEntity;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.sql.Time;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Tests Date handling in Cayenne.
+ */
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DateTimeTypesIT extends ServerCase {
+
+    @Inject
+    private DataContext context;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("CALENDAR_TEST");
+        dbHelper.deleteAll("DATE_TEST");
+    }
+
+    public void testCalendar() throws Exception {
+
+        CalendarEntity test = context.newObject(CalendarEntity.class);
+
+        Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(2002, 1, 1);
+
+        test.setCalendarField(cal);
+        context.commitChanges();
+
+        SelectQuery q = new SelectQuery(CalendarEntity.class);
+        CalendarEntity testRead = (CalendarEntity) context.performQuery(q).get(0);
+        assertNotNull(testRead.getCalendarField());
+        assertEquals(cal, testRead.getCalendarField());
+
+        test.setCalendarField(null);
+        context.commitChanges();
+    }
+
+    public void testDate() throws Exception {
+        DateTestEntity test = context.newObject(DateTestEntity.class);
+
+        Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(2002, 1, 1);
+        Date nowDate = cal.getTime();
+        test.setDateColumn(nowDate);
+        context.commitChanges();
+
+        SelectQuery q = new SelectQuery(DateTestEntity.class);
+        DateTestEntity testRead = (DateTestEntity) context.performQuery(q).get(0);
+        assertNotNull(testRead.getDateColumn());
+        assertEquals(nowDate, testRead.getDateColumn());
+        assertEquals(Date.class, testRead.getDateColumn().getClass());
+    }
+
+    public void testTime() throws Exception {
+        DateTestEntity test = context.newObject(DateTestEntity.class);
+
+        Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(1970, 0, 1, 1, 20, 30);
+        Date nowTime = cal.getTime();
+        test.setTimeColumn(nowTime);
+        context.commitChanges();
+
+        SelectQuery q = new SelectQuery(DateTestEntity.class);
+        DateTestEntity testRead = (DateTestEntity) context.performQuery(q).get(0);
+        assertNotNull(testRead.getTimeColumn());
+        assertEquals(Date.class, testRead.getTimeColumn().getClass());
+
+        // OpenBase fails to store seconds for the time
+        // FrontBase returns time with 1 hour offset (I guess "TIME WITH TIMEZONE" may
+        // need to be used as a default FB type?)
+        // so this test is approximate...
+
+        long delta = nowTime.getTime() - testRead.getTimeColumn().getTime();
+        assertTrue("" + delta, Math.abs(delta) <= 1000 * 60 * 60);
+    }
+
+    public void testTimestamp() throws Exception {
+        DateTestEntity test = context.newObject(DateTestEntity.class);
+
+        Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(2003, 1, 1, 1, 20, 30);
+
+        // most databases fail millisecond accuracy
+        // cal.set(Calendar.MILLISECOND, 55);
+
+        Date now = cal.getTime();
+        test.setTimestampColumn(now);
+        context.commitChanges();
+
+        SelectQuery q = new SelectQuery(DateTestEntity.class);
+        DateTestEntity testRead = (DateTestEntity) context.performQuery(q).get(0);
+        assertNotNull(testRead.getTimestampColumn());
+        assertEquals(now, testRead.getTimestampColumn());
+    }
+
+    public void testSQLTemplateTimestamp() throws Exception {
+        DateTestEntity test = context.newObject(DateTestEntity.class);
+
+        Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(2003, 1, 1, 1, 20, 30);
+
+        // most databases fail millisecond accuracy
+        // cal.set(Calendar.MILLISECOND, 55);
+
+        Date now = cal.getTime();
+        test.setTimestampColumn(now);
+        context.commitChanges();
+
+        NamedQuery q = new NamedQuery("SelectDateTest");
+        DataRow testRead = (DataRow) context.performQuery(q).get(0);
+        Date columnValue = (Date) testRead.get("TIMESTAMP_COLUMN");
+        assertNotNull(columnValue);
+        assertEquals(now, columnValue);
+    }
+
+    public void testSQLTemplateDate() throws Exception {
+        DateTestEntity test = (DateTestEntity) context.newObject("DateTestEntity");
+
+        Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(2003, 1, 1, 1, 20, 30);
+
+        // most databases fail millisecond accuracy
+        // cal.set(Calendar.MILLISECOND, 55);
+
+        java.sql.Date now = new java.sql.Date(cal.getTime().getTime());
+        test.setDateColumn(now);
+        context.commitChanges();
+
+        NamedQuery q = new NamedQuery("SelectDateTest");
+        DataRow testRead = (DataRow) context.performQuery(q).get(0);
+        Date columnValue = (Date) testRead.get("DATE_COLUMN");
+        assertNotNull(columnValue);
+        assertEquals(now.toString(), new java.sql.Date(columnValue.getTime()).toString());
+    }
+
+    public void testSQLTemplateTime() throws Exception {
+        DateTestEntity test = (DateTestEntity) context.newObject("DateTestEntity");
+
+        Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(2003, 1, 1, 1, 20, 30);
+
+        // most databases fail millisecond accuracy
+        // cal.set(Calendar.MILLISECOND, 55);
+
+        Time now = new Time(cal.getTime().getTime());
+        test.setTimeColumn(now);
+        context.commitChanges();
+
+        NamedQuery q = new NamedQuery("SelectDateTest");
+        DataRow testRead = (DataRow) context.performQuery(q).get(0);
+        Date columnValue = (Date) testRead.get("TIME_COLUMN");
+        assertNotNull(columnValue);
+        assertEquals(now.toString(), new Time(columnValue.getTime()).toString());
+    }
+}