Repository: cayenne
Updated Branches:
  refs/heads/master 5fdb08035 -> dd009c6d9


http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListTest.java
deleted file mode 100644
index 2351f9c..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListTest.java
+++ /dev/null
@@ -1,266 +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.remote;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.apache.cayenne.CayenneContext;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class RemoteIncrementalFaultListTest extends ClientCase {
-
-    private static final int COUNT = 25;
-
-    @Inject
-    private CayenneContext clientContext;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMTTable;
-
-    private RemoteIncrementalFaultList list;
-    private SelectQuery query;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-
-        tMTTable = new TableHelper(dbHelper, "MT_TABLE1");
-        tMTTable.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
-    }
-
-    protected void createObjectsDataSet() throws Exception {
-        tMTTable.insert(1, "g1", "s1");
-        tMTTable.insert(2, "g2", "s2");
-        tMTTable.insert(3, "g3", "s3");
-        tMTTable.insert(4, "g4", "s4");
-        tMTTable.insert(5, "g5", "s5");
-        tMTTable.insert(6, "g6", "s6");
-        tMTTable.insert(7, "g7", "s7");
-        tMTTable.insert(8, "g8", "s8");
-        tMTTable.insert(9, "g9", "s9");
-        tMTTable.insert(10, "g10", "s10");
-        tMTTable.insert(11, "g11", "s11");
-        tMTTable.insert(12, "g12", "s12");
-        tMTTable.insert(13, "g13", "s13");
-        tMTTable.insert(14, "g14", "s14");
-        tMTTable.insert(15, "g15", "s15");
-        tMTTable.insert(16, "g16", "s16");
-        tMTTable.insert(17, "g17", "s17");
-        tMTTable.insert(18, "g18", "s18");
-        tMTTable.insert(19, "g19", "s19");
-        tMTTable.insert(20, "g20", "s20");
-        tMTTable.insert(21, "g21", "s21");
-        tMTTable.insert(22, "g22", "s22");
-        tMTTable.insert(23, "g23", "s23");
-        tMTTable.insert(24, "g24", "s24");
-        tMTTable.insert(25, "g25", "s25");
-    }
-
-    private void prepareList(int pageSize) throws Exception {
-
-        createObjectsDataSet();
-
-        query = new SelectQuery(ClientMtTable1.class);
-
-        // make sure total number of objects is not divisable
-        // by the page size, to test the last smaller page
-        query.setPageSize(pageSize);
-        query.addOrdering("db:" + MtTable1.TABLE1_ID_PK_COLUMN, 
SortOrder.ASCENDING);
-
-        list = new RemoteIncrementalFaultList(clientContext, query);
-    }
-
-    public void testSize() throws Exception {
-        prepareList(6);
-        assertEquals(COUNT, list.size());
-    }
-
-    public void testIteratorPageSize1() throws Exception {
-        doTestIterator(1);
-    }
-
-    public void testIteratorPageSize5() throws Exception {
-        // size divisiable by page size
-        doTestIterator(5);
-    }
-
-    public void testIteratorPageSize6() throws Exception {
-        // size not divisable by page size
-        doTestIterator(6);
-    }
-
-    public void testIteratorPageSize25() throws Exception {
-        // size equals to page size
-        doTestIterator(COUNT);
-    }
-
-    public void testIteratorPageSize26() throws Exception {
-        // size exceeding page size
-        doTestIterator(COUNT + 1);
-    }
-
-    public void testListIterator() throws Exception {
-        prepareList(6);
-        ListIterator<?> it = list.listIterator();
-
-        assertTrue(it.hasNext());
-
-        int counter = 0;
-        while (it.hasNext()) {
-            Object obj = it.next();
-            assertNotNull(obj);
-            assertTrue(obj instanceof Persistent);
-
-            // iterator must be resolved page by page
-            int expectedResolved = list.pageIndex(counter)
-                    * list.getPageSize()
-                    + list.getPageSize();
-            if (expectedResolved > list.size()) {
-                expectedResolved = list.size();
-            }
-
-            assertEquals(list.size() - expectedResolved, 
list.getUnfetchedObjects());
-
-            counter++;
-        }
-    }
-
-    public void testUnfetchedObjects() throws Exception {
-        prepareList(6);
-        assertEquals(COUNT - 6, list.getUnfetchedObjects());
-        list.get(7);
-        assertEquals(COUNT - 12, list.getUnfetchedObjects());
-        list.resolveAll();
-        assertEquals(0, list.getUnfetchedObjects());
-    }
-
-    public void testPageIndex() throws Exception {
-        prepareList(6);
-        assertEquals(0, list.pageIndex(0));
-        assertEquals(0, list.pageIndex(1));
-        assertEquals(1, list.pageIndex(6));
-
-        try {
-            assertEquals(13, list.pageIndex(82));
-            fail("Element index beyound array size must throw an 
IndexOutOfBoundsException.");
-        }
-        catch (IndexOutOfBoundsException ex) {
-            // exception expercted
-        }
-    }
-
-    public void testPagesRead1() throws Exception {
-        prepareList(6);
-        assertTrue(list.elements.get(0) instanceof ClientMtTable1);
-        assertSame(RemoteIncrementalFaultList.PLACEHOLDER, 
list.elements.get(8));
-
-        list.resolveInterval(5, 10);
-        assertTrue(list.elements.get(7) instanceof ClientMtTable1);
-
-        list.resolveAll();
-        assertTrue((list.elements.get(list.size() - 1)) instanceof 
ClientMtTable1);
-    }
-
-    public void testGet1() throws Exception {
-        prepareList(6);
-        assertTrue(list.elements.get(0) instanceof ClientMtTable1);
-        assertSame(RemoteIncrementalFaultList.PLACEHOLDER, 
list.elements.get(8));
-
-        Object a = list.get(8);
-
-        assertNotNull(a);
-        assertTrue(a instanceof ClientMtTable1);
-        assertTrue(list.elements.get(8) instanceof ClientMtTable1);
-    }
-
-    public void testIndexOf() throws Exception {
-        prepareList(6);
-
-        Expression qual = ExpressionFactory.matchExp(
-                ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY,
-                "g20");
-        SelectQuery query = new SelectQuery(ClientMtTable1.class, qual);
-        List<?> artists = list.context.performQuery(query);
-
-        assertEquals(1, artists.size());
-
-        ClientMtTable1 row = (ClientMtTable1) artists.get(0);
-        assertEquals(19, list.indexOf(row));
-        assertEquals(-1, 
list.indexOf(list.context.newObject(ClientMtTable1.class)));
-    }
-
-    public void testLastIndexOf() throws Exception {
-        prepareList(6);
-        Expression qual = ExpressionFactory.matchExp(
-                ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY,
-                "g20");
-        SelectQuery query = new SelectQuery(ClientMtTable1.class, qual);
-        List<?> objects = list.context.performQuery(query);
-
-        assertEquals(1, objects.size());
-
-        ClientMtTable1 row = (ClientMtTable1) objects.get(0);
-        assertEquals(19, list.lastIndexOf(row));
-        assertEquals(-1, 
list.lastIndexOf(list.context.newObject(ClientMtTable1.class)));
-    }
-
-    private void doTestIterator(int size) throws Exception {
-        prepareList(size);
-        Iterator<?> it = list.iterator();
-
-        assertTrue(it.hasNext());
-
-        int counter = 0;
-        while (it.hasNext()) {
-            Object obj = it.next();
-            assertNotNull(obj);
-            assertTrue(obj instanceof Persistent);
-
-            // iterator must be resolved page by page
-            int expectedResolved = list.pageIndex(counter)
-                    * list.getPageSize()
-                    + list.getPageSize();
-            if (expectedResolved > list.size()) {
-                expectedResolved = list.size();
-            }
-
-            assertEquals(list.size() - expectedResolved, 
list.getUnfetchedObjects());
-
-            counter++;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackIT.java 
b/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackIT.java
new file mode 100644
index 0000000..ceeadcd
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackIT.java
@@ -0,0 +1,147 @@
+/*****************************************************************
+ *   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.remote;
+
+import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+/**
+ * This is a test primarily for CAY-1103
+ */
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class RemoteRollbackIT extends RemoteCayenneCase {
+    
+    public void testRollbackNew() {
+        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1("a");
+
+        ClientMtTable2 p1 = clientContext.newObject(ClientMtTable2.class);
+        p1.setGlobalAttribute("p1");
+        p1.setTable1(o1);
+
+        ClientMtTable2 p2 = clientContext.newObject(ClientMtTable2.class);
+        p2.setGlobalAttribute("p2");
+        p2.setTable1(o1);
+
+        ClientMtTable2 p3 = clientContext.newObject(ClientMtTable2.class);
+        p3.setGlobalAttribute("p3");
+        p3.setTable1(o1);
+
+        // before:
+        assertEquals(o1, p1.getTable1());
+        assertEquals(3, o1.getTable2Array().size());
+
+        clientContext.rollbackChanges();
+
+        // after:
+        assertEquals(PersistenceState.TRANSIENT, o1.getPersistenceState());
+
+        // TODO: should we expect relationships to be unset?
+        // assertNull(p1.getToClientMtTable1());
+        // assertEquals(0, o1.getClientMtTable2Array().size());
+    }
+
+    public void testRollbackNewObject() {
+        String o1Name = "revertTestClientMtTable1";
+        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1(o1Name);
+
+        clientContext.rollbackChanges();
+
+        assertEquals(PersistenceState.TRANSIENT, o1.getPersistenceState());
+        clientContext.commitChanges();
+    }
+
+    // Catches a bug where new objects were unregistered within an object 
iterator, thus
+    // modifying the
+    // collection the iterator was iterating over 
(ConcurrentModificationException)
+    public void testRollbackWithMultipleNewObjects() {
+        String o1Name = "rollbackTestClientMtTable1";
+        String o2Title = "rollbackTestClientMtTable2";
+        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1(o1Name);
+
+        ClientMtTable2 o2 = clientContext.newObject(ClientMtTable2.class);
+        o2.setGlobalAttribute(o2Title);
+        o2.setTable1(o1);
+
+        try {
+            clientContext.rollbackChanges();
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            fail("rollbackChanges should not have caused the exception " + 
e.getMessage());
+        }
+
+        assertEquals(PersistenceState.TRANSIENT, o1.getPersistenceState());
+    }
+
+    public void testRollbackRelationshipModification() {
+        String o1Name = "relationshipModClientMtTable1";
+        String o2Title = "relationshipTestClientMtTable2";
+        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1(o1Name);
+        ClientMtTable2 o2 = clientContext.newObject(ClientMtTable2.class);
+        o2.setGlobalAttribute(o2Title);
+        o2.setTable1(o1);
+        
+        assertEquals(1, o1.getTable2Array().size());
+        clientContext.commitChanges();
+
+        assertEquals(1, o1.getTable2Array().size());
+        o2.setTable1(null);
+        assertEquals(0, o1.getTable2Array().size());
+        clientContext.rollbackChanges();
+
+        assertEquals(1, o1.getTable2Array().size());
+        assertEquals(o1, o2.getTable1());
+    }
+
+    public void testRollbackDeletedObject() {
+        String o1Name = "deleteTestClientMtTable1";
+        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1(o1Name);
+        clientContext.commitChanges();
+        // Save... cayenne doesn't yet handle deleting objects that are 
uncommitted
+        clientContext.deleteObjects(o1);
+        clientContext.rollbackChanges();
+
+        //TODO: The state is committed for Cayenne context, but Hollow for 
DataContext?!
+        // Now check everything is as it should be
+        assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
+    }
+
+    public void testRollbackModifiedObject() {
+        String o1Name = "initialTestClientMtTable1";
+        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1(o1Name);
+        clientContext.commitChanges();
+
+        o1.setGlobalAttribute1("a new value");
+
+        clientContext.rollbackChanges();
+
+        // Make sure the inmemory changes have been rolled back
+        assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
+        assertEquals(o1Name, o1.getGlobalAttribute1());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackTest.java
deleted file mode 100644
index 7bb4ba8..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackTest.java
+++ /dev/null
@@ -1,147 +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.remote;
-
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-/**
- * This is a test primarily for CAY-1103
- */
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class RemoteRollbackTest extends RemoteCayenneCase {
-    
-    public void testRollbackNew() {
-        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1("a");
-
-        ClientMtTable2 p1 = clientContext.newObject(ClientMtTable2.class);
-        p1.setGlobalAttribute("p1");
-        p1.setTable1(o1);
-
-        ClientMtTable2 p2 = clientContext.newObject(ClientMtTable2.class);
-        p2.setGlobalAttribute("p2");
-        p2.setTable1(o1);
-
-        ClientMtTable2 p3 = clientContext.newObject(ClientMtTable2.class);
-        p3.setGlobalAttribute("p3");
-        p3.setTable1(o1);
-
-        // before:
-        assertEquals(o1, p1.getTable1());
-        assertEquals(3, o1.getTable2Array().size());
-
-        clientContext.rollbackChanges();
-
-        // after:
-        assertEquals(PersistenceState.TRANSIENT, o1.getPersistenceState());
-
-        // TODO: should we expect relationships to be unset?
-        // assertNull(p1.getToClientMtTable1());
-        // assertEquals(0, o1.getClientMtTable2Array().size());
-    }
-
-    public void testRollbackNewObject() {
-        String o1Name = "revertTestClientMtTable1";
-        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1(o1Name);
-
-        clientContext.rollbackChanges();
-
-        assertEquals(PersistenceState.TRANSIENT, o1.getPersistenceState());
-        clientContext.commitChanges();
-    }
-
-    // Catches a bug where new objects were unregistered within an object 
iterator, thus
-    // modifying the
-    // collection the iterator was iterating over 
(ConcurrentModificationException)
-    public void testRollbackWithMultipleNewObjects() {
-        String o1Name = "rollbackTestClientMtTable1";
-        String o2Title = "rollbackTestClientMtTable2";
-        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1(o1Name);
-
-        ClientMtTable2 o2 = clientContext.newObject(ClientMtTable2.class);
-        o2.setGlobalAttribute(o2Title);
-        o2.setTable1(o1);
-
-        try {
-            clientContext.rollbackChanges();
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-            fail("rollbackChanges should not have caused the exception " + 
e.getMessage());
-        }
-
-        assertEquals(PersistenceState.TRANSIENT, o1.getPersistenceState());
-    }
-
-    public void testRollbackRelationshipModification() {
-        String o1Name = "relationshipModClientMtTable1";
-        String o2Title = "relationshipTestClientMtTable2";
-        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1(o1Name);
-        ClientMtTable2 o2 = clientContext.newObject(ClientMtTable2.class);
-        o2.setGlobalAttribute(o2Title);
-        o2.setTable1(o1);
-        
-        assertEquals(1, o1.getTable2Array().size());
-        clientContext.commitChanges();
-
-        assertEquals(1, o1.getTable2Array().size());
-        o2.setTable1(null);
-        assertEquals(0, o1.getTable2Array().size());
-        clientContext.rollbackChanges();
-
-        assertEquals(1, o1.getTable2Array().size());
-        assertEquals(o1, o2.getTable1());
-    }
-
-    public void testRollbackDeletedObject() {
-        String o1Name = "deleteTestClientMtTable1";
-        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1(o1Name);
-        clientContext.commitChanges();
-        // Save... cayenne doesn't yet handle deleting objects that are 
uncommitted
-        clientContext.deleteObjects(o1);
-        clientContext.rollbackChanges();
-
-        //TODO: The state is committed for Cayenne context, but Hollow for 
DataContext?!
-        // Now check everything is as it should be
-        assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-    }
-
-    public void testRollbackModifiedObject() {
-        String o1Name = "initialTestClientMtTable1";
-        ClientMtTable1 o1 = clientContext.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1(o1Name);
-        clientContext.commitChanges();
-
-        o1.setGlobalAttribute1("a new value");
-
-        clientContext.rollbackChanges();
-
-        // Make sure the inmemory changes have been rolled back
-        assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-        assertEquals(o1Name, o1.getGlobalAttribute1());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java 
b/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java
new file mode 100644
index 0000000..de09b70
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java
@@ -0,0 +1,73 @@
+/*****************************************************************
+ *   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.remote;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.testdo.mt.ClientMtTable1Subclass1;
+import org.apache.cayenne.testdo.mt.MtTable1Subclass1;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class ValueInjectorIT extends RemoteCayenneCase {
+
+    @Inject
+    protected DataContext serverContext;
+
+    public void testServer() {
+        ObjEntity entity = 
serverContext.getEntityResolver().getObjEntity(MtTable1Subclass1.class);
+        Expression qualifier = entity.getDeclaredQualifier();
+
+        try {
+            MtTable1Subclass1 ee = 
serverContext.newObject(MtTable1Subclass1.class);
+            assertEquals(ee.getGlobalAttribute1(), "sub1");
+
+            // check AND
+            
entity.setDeclaredQualifier(qualifier.andExp(Expression.fromString("serverAttribute1
 = 'sa'")));
+            ee = serverContext.newObject(MtTable1Subclass1.class);
+            assertEquals(ee.getGlobalAttribute1(), "sub1");
+            assertEquals(ee.getServerAttribute1(), "sa");
+        } finally {
+            entity.setDeclaredQualifier(qualifier);
+        }
+    }
+
+    public void testClient() {
+        ObjectContext context = createROPContext();
+        ObjEntity entity = 
context.getEntityResolver().getObjEntity(ClientMtTable1Subclass1.class);
+        Expression qualifier = entity.getDeclaredQualifier();
+
+        try {
+            ClientMtTable1Subclass1 ee = 
context.newObject(ClientMtTable1Subclass1.class);
+            assertEquals(ee.getGlobalAttribute1(), "sub1");
+
+            // check AND
+            
entity.setDeclaredQualifier(qualifier.andExp(Expression.fromString("serverAttribute1
 = 'sa'")));
+            ee = context.newObject(ClientMtTable1Subclass1.class);
+            assertEquals(ee.getGlobalAttribute1(), "sub1");
+            assertEquals(ee.getServerAttribute1(), "sa");
+        } finally {
+            entity.setDeclaredQualifier(qualifier);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorTest.java 
b/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorTest.java
deleted file mode 100644
index 0f08768..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorTest.java
+++ /dev/null
@@ -1,73 +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.remote;
-
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.testdo.mt.ClientMtTable1Subclass1;
-import org.apache.cayenne.testdo.mt.MtTable1Subclass1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class ValueInjectorTest extends RemoteCayenneCase {
-
-    @Inject
-    protected DataContext serverContext;
-
-    public void testServer() {
-        ObjEntity entity = 
serverContext.getEntityResolver().getObjEntity(MtTable1Subclass1.class);
-        Expression qualifier = entity.getDeclaredQualifier();
-
-        try {
-            MtTable1Subclass1 ee = 
serverContext.newObject(MtTable1Subclass1.class);
-            assertEquals(ee.getGlobalAttribute1(), "sub1");
-
-            // check AND
-            
entity.setDeclaredQualifier(qualifier.andExp(Expression.fromString("serverAttribute1
 = 'sa'")));
-            ee = serverContext.newObject(MtTable1Subclass1.class);
-            assertEquals(ee.getGlobalAttribute1(), "sub1");
-            assertEquals(ee.getServerAttribute1(), "sa");
-        } finally {
-            entity.setDeclaredQualifier(qualifier);
-        }
-    }
-
-    public void testClient() {
-        ObjectContext context = createROPContext();
-        ObjEntity entity = 
context.getEntityResolver().getObjEntity(ClientMtTable1Subclass1.class);
-        Expression qualifier = entity.getDeclaredQualifier();
-
-        try {
-            ClientMtTable1Subclass1 ee = 
context.newObject(ClientMtTable1Subclass1.class);
-            assertEquals(ee.getGlobalAttribute1(), "sub1");
-
-            // check AND
-            
entity.setDeclaredQualifier(qualifier.andExp(Expression.fromString("serverAttribute1
 = 'sa'")));
-            ee = context.newObject(ClientMtTable1Subclass1.class);
-            assertEquals(ee.getGlobalAttribute1(), "sub1");
-            assertEquals(ee.getServerAttribute1(), "sa");
-        } finally {
-            entity.setDeclaredQualifier(qualifier);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfIT.java
new file mode 100644
index 0000000..1db7f61
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfIT.java
@@ -0,0 +1,46 @@
+/*****************************************************************
+ *   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.unit.di.client;
+
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Provider;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class ClientCaseSelfIT extends ClientCase {
+
+    @Inject
+    protected ServerRuntime runtime;
+
+    @Inject
+    protected Provider<ServerRuntime> runtimeProvider;
+
+    public void testServerSetup_TearDown_Runtime() throws Exception {
+
+        ServerRuntime local = this.runtime;
+        assertNotNull(local);
+        assertSame(local, runtimeProvider.get());
+
+        tearDown();
+
+        setUp();
+        assertNotSame(local, this.runtime);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfTest.java
deleted file mode 100644
index 36fc9c8..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfTest.java
+++ /dev/null
@@ -1,46 +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.unit.di.client;
-
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class ClientCaseSelfTest extends ClientCase {
-
-    @Inject
-    protected ServerRuntime runtime;
-
-    @Inject
-    protected Provider<ServerRuntime> runtimeProvider;
-
-    public void testServerSetup_TearDown_Runtime() throws Exception {
-
-        ServerRuntime local = this.runtime;
-        assertNotNull(local);
-        assertSame(local, runtimeProvider.get());
-
-        tearDown();
-
-        setUp();
-        assertNotSame(local, this.runtime);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationIT.java
new file mode 100644
index 0000000..813e64b
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationIT.java
@@ -0,0 +1,112 @@
+/*****************************************************************
+ *   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.util;
+
+import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.MtTable1;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class ObjectDetachOperationIT extends ClientCase {
+
+    @Inject
+    private DataContext serverContext;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    private TableHelper tMtTable1;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+
+        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
+        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
+    }
+
+    public void testDetachCommitted() {
+
+        EntityResolver serverResover = serverContext.getEntityResolver();
+        EntityResolver clientResolver = 
serverResover.getClientEntityResolver();
+        ObjectDetachOperation op = new ObjectDetachOperation(clientResolver);
+
+        ObjectId oid = new ObjectId("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 
456);
+        MtTable1 so = new MtTable1();
+        so.setObjectId(oid);
+        so.setGlobalAttribute1("gx");
+        so.setPersistenceState(PersistenceState.COMMITTED);
+        so.setObjectContext(serverContext);
+        serverContext.getGraphManager().registerNode(oid, so);
+
+        Object detached = op.detach(
+                so,
+                serverResover.getClassDescriptor("MtTable1"),
+                null);
+        assertNotNull(detached);
+        assertNotSame(so, detached);
+        assertTrue(detached instanceof ClientMtTable1);
+
+        ClientMtTable1 co = (ClientMtTable1) detached;
+        assertEquals(oid, co.getObjectId());
+        assertEquals("gx", co.getGlobalAttribute1());
+        assertEquals(PersistenceState.TRANSIENT, co.getPersistenceState());
+        assertNull(co.getObjectContext());
+    }
+
+    public void testDetachHollow() throws Exception {
+
+        tMtTable1.insert(4, "g1", "s1");
+
+        EntityResolver serverResover = serverContext.getEntityResolver();
+        EntityResolver clientResolver = 
serverResover.getClientEntityResolver();
+        ObjectDetachOperation op = new ObjectDetachOperation(clientResolver);
+
+        ObjectId oid = new ObjectId("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 
4);
+        MtTable1 so = new MtTable1();
+        so.setObjectId(oid);
+        so.setPersistenceState(PersistenceState.HOLLOW);
+        so.setObjectContext(serverContext);
+        serverContext.getGraphManager().registerNode(oid, so);
+
+        Object detached = op.detach(
+                so,
+                serverResover.getClassDescriptor("MtTable1"),
+                null);
+        assertNotNull(detached);
+        assertNotSame(so, detached);
+        assertTrue(detached instanceof ClientMtTable1);
+
+        ClientMtTable1 co = (ClientMtTable1) detached;
+        assertEquals(oid, co.getObjectId());
+        assertEquals("g1", co.getGlobalAttribute1());
+        assertEquals(PersistenceState.TRANSIENT, co.getPersistenceState());
+        assertNull(co.getObjectContext());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationTest.java
deleted file mode 100644
index 985333f..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationTest.java
+++ /dev/null
@@ -1,112 +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.util;
-
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class ObjectDetachOperationTest extends ClientCase {
-
-    @Inject
-    private DataContext serverContext;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMtTable1;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
-    }
-
-    public void testDetachCommitted() {
-
-        EntityResolver serverResover = serverContext.getEntityResolver();
-        EntityResolver clientResolver = 
serverResover.getClientEntityResolver();
-        ObjectDetachOperation op = new ObjectDetachOperation(clientResolver);
-
-        ObjectId oid = new ObjectId("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 
456);
-        MtTable1 so = new MtTable1();
-        so.setObjectId(oid);
-        so.setGlobalAttribute1("gx");
-        so.setPersistenceState(PersistenceState.COMMITTED);
-        so.setObjectContext(serverContext);
-        serverContext.getGraphManager().registerNode(oid, so);
-
-        Object detached = op.detach(
-                so,
-                serverResover.getClassDescriptor("MtTable1"),
-                null);
-        assertNotNull(detached);
-        assertNotSame(so, detached);
-        assertTrue(detached instanceof ClientMtTable1);
-
-        ClientMtTable1 co = (ClientMtTable1) detached;
-        assertEquals(oid, co.getObjectId());
-        assertEquals("gx", co.getGlobalAttribute1());
-        assertEquals(PersistenceState.TRANSIENT, co.getPersistenceState());
-        assertNull(co.getObjectContext());
-    }
-
-    public void testDetachHollow() throws Exception {
-
-        tMtTable1.insert(4, "g1", "s1");
-
-        EntityResolver serverResover = serverContext.getEntityResolver();
-        EntityResolver clientResolver = 
serverResover.getClientEntityResolver();
-        ObjectDetachOperation op = new ObjectDetachOperation(clientResolver);
-
-        ObjectId oid = new ObjectId("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 
4);
-        MtTable1 so = new MtTable1();
-        so.setObjectId(oid);
-        so.setPersistenceState(PersistenceState.HOLLOW);
-        so.setObjectContext(serverContext);
-        serverContext.getGraphManager().registerNode(oid, so);
-
-        Object detached = op.detach(
-                so,
-                serverResover.getClassDescriptor("MtTable1"),
-                null);
-        assertNotNull(detached);
-        assertNotSame(so, detached);
-        assertTrue(detached instanceof ClientMtTable1);
-
-        ClientMtTable1 co = (ClientMtTable1) detached;
-        assertEquals(oid, co.getObjectId());
-        assertEquals("g1", co.getGlobalAttribute1());
-        assertEquals(PersistenceState.TRANSIENT, co.getPersistenceState());
-        assertNull(co.getObjectContext());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientIT.java
new file mode 100644
index 0000000..ec8bbdb
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientIT.java
@@ -0,0 +1,210 @@
+/*****************************************************************
+ *   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.util;
+
+import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.CayenneContext;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.configuration.rop.client.ClientRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.ObjectIdQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
+import org.apache.cayenne.unit.di.DataChannelInterceptor;
+import org.apache.cayenne.unit.di.UnitTestClosure;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class ShallowMergeOperation_ClientIT extends ClientCase {
+
+    @Inject
+    private ClientRuntime runtime;
+
+    @Inject
+    private CayenneContext context;
+
+    @Inject
+    private DataChannelInterceptor queryInterceptor;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    private TableHelper tMtTable1;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+        dbHelper.deleteAll("MT_JOIN45");
+        dbHelper.deleteAll("MT_TABLE4");
+        dbHelper.deleteAll("MT_TABLE5");
+
+        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
+        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
+    }
+
+    private void createMtTable1DataSet() throws Exception {
+        tMtTable1.insert(33001, "g1", "s1");
+        tMtTable1.insert(33002, "g2", "s2");
+        tMtTable1.insert(33003, "g3", "s3");
+        tMtTable1.insert(33004, "g4", "s4");
+    }
+
+    public void testMerge_Relationship() throws Exception {
+
+        ObjectContext childContext = runtime.newContext(context);
+        final ShallowMergeOperation op = new 
ShallowMergeOperation(childContext);
+
+        ClientMtTable1 _new = context.newObject(ClientMtTable1.class);
+        final ClientMtTable2 _new2 = context.newObject(ClientMtTable2.class);
+        _new.addToTable2Array(_new2);
+
+        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                ClientMtTable2 child2 = op.merge(_new2);
+                assertEquals(PersistenceState.COMMITTED, 
child2.getPersistenceState());
+                assertNotNull(child2.getTable1());
+                assertEquals(PersistenceState.COMMITTED, child2
+                        .getTable1()
+                        .getPersistenceState());
+            }
+        });
+    }
+
+    public void testMerge_NoOverride() throws Exception {
+
+        ObjectContext childContext = runtime.newContext(context);
+        final ShallowMergeOperation op = new 
ShallowMergeOperation(childContext);
+
+        final ClientMtTable1 modified = 
context.newObject(ClientMtTable1.class);
+        context.commitChanges();
+
+        final ClientMtTable1 peerModified = (ClientMtTable1) 
Cayenne.objectForQuery(
+                childContext,
+                new ObjectIdQuery(modified.getObjectId()));
+
+        modified.setGlobalAttribute1("M1");
+        peerModified.setGlobalAttribute1("M2");
+
+        assertEquals(PersistenceState.MODIFIED, 
modified.getPersistenceState());
+        assertEquals(PersistenceState.MODIFIED, 
peerModified.getPersistenceState());
+
+        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                Persistent peerModified2 = op.merge(modified);
+                assertSame(peerModified, peerModified2);
+                assertEquals(
+                        PersistenceState.MODIFIED,
+                        peerModified2.getPersistenceState());
+                assertEquals("M2", peerModified.getGlobalAttribute1());
+                assertEquals("M1", modified.getGlobalAttribute1());
+            }
+        });
+    }
+
+    public void testMerge_PersistenceStates() throws Exception {
+
+        createMtTable1DataSet();
+
+        final ObjectContext childContext = runtime.newContext(context);
+        final ShallowMergeOperation op = new 
ShallowMergeOperation(childContext);
+
+        final ClientMtTable1 _new = context.newObject(ClientMtTable1.class);
+
+        final ClientMtTable1 hollow = Cayenne.objectForPK(
+                context,
+                ClientMtTable1.class,
+                33001);
+        context.invalidateObjects(hollow);
+
+        final ClientMtTable1 committed = Cayenne.objectForPK(
+                context,
+                ClientMtTable1.class,
+                33002);
+
+        final ClientMtTable1 modified = Cayenne.objectForPK(
+                context,
+                ClientMtTable1.class,
+                33003);
+        modified.setGlobalAttribute1("XXX");
+
+        final ClientMtTable1 deleted = Cayenne.objectForPK(
+                context,
+                ClientMtTable1.class,
+                33004);
+        context.deleteObjects(deleted);
+
+        assertEquals(PersistenceState.HOLLOW, hollow.getPersistenceState());
+        assertEquals(PersistenceState.COMMITTED, 
committed.getPersistenceState());
+        assertEquals(PersistenceState.MODIFIED, 
modified.getPersistenceState());
+        assertEquals(PersistenceState.DELETED, deleted.getPersistenceState());
+        assertEquals(PersistenceState.NEW, _new.getPersistenceState());
+
+        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                Persistent newPeer = op.merge(_new);
+
+                assertEquals(_new.getObjectId(), newPeer.getObjectId());
+                assertEquals(PersistenceState.COMMITTED, 
newPeer.getPersistenceState());
+
+                assertSame(childContext, newPeer.getObjectContext());
+                assertSame(context, _new.getObjectContext());
+
+                Persistent hollowPeer = op.merge(hollow);
+                assertEquals(PersistenceState.HOLLOW, 
hollowPeer.getPersistenceState());
+                assertEquals(hollow.getObjectId(), hollowPeer.getObjectId());
+                assertSame(childContext, hollowPeer.getObjectContext());
+                assertSame(context, hollow.getObjectContext());
+
+                Persistent committedPeer = op.merge(committed);
+                assertEquals(
+                        PersistenceState.COMMITTED,
+                        committedPeer.getPersistenceState());
+                assertEquals(committed.getObjectId(), 
committedPeer.getObjectId());
+                assertSame(childContext, committedPeer.getObjectContext());
+                assertSame(context, committed.getObjectContext());
+
+                ClientMtTable1 modifiedPeer = op.merge(modified);
+                assertEquals(
+                        PersistenceState.COMMITTED,
+                        modifiedPeer.getPersistenceState());
+                assertEquals(modified.getObjectId(), 
modifiedPeer.getObjectId());
+                assertEquals("XXX", modifiedPeer.getGlobalAttribute1());
+                assertSame(childContext, modifiedPeer.getObjectContext());
+                assertSame(context, modified.getObjectContext());
+
+                Persistent deletedPeer = op.merge(deleted);
+                assertEquals(
+                        PersistenceState.COMMITTED,
+                        deletedPeer.getPersistenceState());
+                assertEquals(deleted.getObjectId(), deletedPeer.getObjectId());
+                assertSame(childContext, deletedPeer.getObjectContext());
+                assertSame(context, deleted.getObjectContext());
+            }
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientTest.java
deleted file mode 100644
index cedbf4f..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientTest.java
+++ /dev/null
@@ -1,210 +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.util;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.CayenneContext;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.configuration.rop.client.ClientRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.ObjectIdQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.UnitTestClosure;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class ShallowMergeOperation_ClientTest extends ClientCase {
-
-    @Inject
-    private ClientRuntime runtime;
-
-    @Inject
-    private CayenneContext context;
-
-    @Inject
-    private DataChannelInterceptor queryInterceptor;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMtTable1;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-        dbHelper.deleteAll("MT_JOIN45");
-        dbHelper.deleteAll("MT_TABLE4");
-        dbHelper.deleteAll("MT_TABLE5");
-
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
-    }
-
-    private void createMtTable1DataSet() throws Exception {
-        tMtTable1.insert(33001, "g1", "s1");
-        tMtTable1.insert(33002, "g2", "s2");
-        tMtTable1.insert(33003, "g3", "s3");
-        tMtTable1.insert(33004, "g4", "s4");
-    }
-
-    public void testMerge_Relationship() throws Exception {
-
-        ObjectContext childContext = runtime.newContext(context);
-        final ShallowMergeOperation op = new 
ShallowMergeOperation(childContext);
-
-        ClientMtTable1 _new = context.newObject(ClientMtTable1.class);
-        final ClientMtTable2 _new2 = context.newObject(ClientMtTable2.class);
-        _new.addToTable2Array(_new2);
-
-        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                ClientMtTable2 child2 = op.merge(_new2);
-                assertEquals(PersistenceState.COMMITTED, 
child2.getPersistenceState());
-                assertNotNull(child2.getTable1());
-                assertEquals(PersistenceState.COMMITTED, child2
-                        .getTable1()
-                        .getPersistenceState());
-            }
-        });
-    }
-
-    public void testMerge_NoOverride() throws Exception {
-
-        ObjectContext childContext = runtime.newContext(context);
-        final ShallowMergeOperation op = new 
ShallowMergeOperation(childContext);
-
-        final ClientMtTable1 modified = 
context.newObject(ClientMtTable1.class);
-        context.commitChanges();
-
-        final ClientMtTable1 peerModified = (ClientMtTable1) 
Cayenne.objectForQuery(
-                childContext,
-                new ObjectIdQuery(modified.getObjectId()));
-
-        modified.setGlobalAttribute1("M1");
-        peerModified.setGlobalAttribute1("M2");
-
-        assertEquals(PersistenceState.MODIFIED, 
modified.getPersistenceState());
-        assertEquals(PersistenceState.MODIFIED, 
peerModified.getPersistenceState());
-
-        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                Persistent peerModified2 = op.merge(modified);
-                assertSame(peerModified, peerModified2);
-                assertEquals(
-                        PersistenceState.MODIFIED,
-                        peerModified2.getPersistenceState());
-                assertEquals("M2", peerModified.getGlobalAttribute1());
-                assertEquals("M1", modified.getGlobalAttribute1());
-            }
-        });
-    }
-
-    public void testMerge_PersistenceStates() throws Exception {
-
-        createMtTable1DataSet();
-
-        final ObjectContext childContext = runtime.newContext(context);
-        final ShallowMergeOperation op = new 
ShallowMergeOperation(childContext);
-
-        final ClientMtTable1 _new = context.newObject(ClientMtTable1.class);
-
-        final ClientMtTable1 hollow = Cayenne.objectForPK(
-                context,
-                ClientMtTable1.class,
-                33001);
-        context.invalidateObjects(hollow);
-
-        final ClientMtTable1 committed = Cayenne.objectForPK(
-                context,
-                ClientMtTable1.class,
-                33002);
-
-        final ClientMtTable1 modified = Cayenne.objectForPK(
-                context,
-                ClientMtTable1.class,
-                33003);
-        modified.setGlobalAttribute1("XXX");
-
-        final ClientMtTable1 deleted = Cayenne.objectForPK(
-                context,
-                ClientMtTable1.class,
-                33004);
-        context.deleteObjects(deleted);
-
-        assertEquals(PersistenceState.HOLLOW, hollow.getPersistenceState());
-        assertEquals(PersistenceState.COMMITTED, 
committed.getPersistenceState());
-        assertEquals(PersistenceState.MODIFIED, 
modified.getPersistenceState());
-        assertEquals(PersistenceState.DELETED, deleted.getPersistenceState());
-        assertEquals(PersistenceState.NEW, _new.getPersistenceState());
-
-        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                Persistent newPeer = op.merge(_new);
-
-                assertEquals(_new.getObjectId(), newPeer.getObjectId());
-                assertEquals(PersistenceState.COMMITTED, 
newPeer.getPersistenceState());
-
-                assertSame(childContext, newPeer.getObjectContext());
-                assertSame(context, _new.getObjectContext());
-
-                Persistent hollowPeer = op.merge(hollow);
-                assertEquals(PersistenceState.HOLLOW, 
hollowPeer.getPersistenceState());
-                assertEquals(hollow.getObjectId(), hollowPeer.getObjectId());
-                assertSame(childContext, hollowPeer.getObjectContext());
-                assertSame(context, hollow.getObjectContext());
-
-                Persistent committedPeer = op.merge(committed);
-                assertEquals(
-                        PersistenceState.COMMITTED,
-                        committedPeer.getPersistenceState());
-                assertEquals(committed.getObjectId(), 
committedPeer.getObjectId());
-                assertSame(childContext, committedPeer.getObjectContext());
-                assertSame(context, committed.getObjectContext());
-
-                ClientMtTable1 modifiedPeer = op.merge(modified);
-                assertEquals(
-                        PersistenceState.COMMITTED,
-                        modifiedPeer.getPersistenceState());
-                assertEquals(modified.getObjectId(), 
modifiedPeer.getObjectId());
-                assertEquals("XXX", modifiedPeer.getGlobalAttribute1());
-                assertSame(childContext, modifiedPeer.getObjectContext());
-                assertSame(context, modified.getObjectContext());
-
-                Persistent deletedPeer = op.merge(deleted);
-                assertEquals(
-                        PersistenceState.COMMITTED,
-                        deletedPeer.getPersistenceState());
-                assertEquals(deleted.getObjectId(), deletedPeer.getObjectId());
-                assertSame(childContext, deletedPeer.getObjectContext());
-                assertSame(context, deleted.getObjectContext());
-            }
-        });
-    }
-}

Reply via email to