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