PageRenderTime 27ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/projects/cayenne-3.0.1/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextExtrasTest.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 372 lines | 262 code | 75 blank | 35 comment | 0 complexity | 8a0ce1a5afeb57b5c8f3646d5c5cfa95 MD5 | raw file
  1. /*****************************************************************
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. ****************************************************************/
  19. package org.apache.cayenne.access;
  20. import java.util.Collections;
  21. import java.util.Date;
  22. import java.util.List;
  23. import org.apache.art.Artist;
  24. import org.apache.art.Painting;
  25. import org.apache.cayenne.CayenneRuntimeException;
  26. import org.apache.cayenne.DataObject;
  27. import org.apache.cayenne.DataObjectUtils;
  28. import org.apache.cayenne.DataRow;
  29. import org.apache.cayenne.ObjectId;
  30. import org.apache.cayenne.PersistenceState;
  31. import org.apache.cayenne.Persistent;
  32. import org.apache.cayenne.dba.JdbcAdapter;
  33. import org.apache.cayenne.dba.JdbcPkGenerator;
  34. import org.apache.cayenne.dba.PkGenerator;
  35. import org.apache.cayenne.map.DbAttribute;
  36. import org.apache.cayenne.map.DbEntity;
  37. import org.apache.cayenne.query.SQLTemplate;
  38. import org.apache.cayenne.query.SelectQuery;
  39. import org.apache.cayenne.unit.CayenneCase;
  40. /**
  41. * "Lightweight" test cases for DataContext. These tests do not require any additional
  42. * database setup.
  43. *
  44. */
  45. public class DataContextExtrasTest extends CayenneCase {
  46. public void testManualIdProcessingOnCommit() throws Exception {
  47. deleteTestData();
  48. DataContext context = createDataContext();
  49. Artist object = context.newObject(Artist.class);
  50. object.setArtistName("ABC");
  51. assertEquals(PersistenceState.NEW, object.getPersistenceState());
  52. // do a manual ID substitution
  53. ObjectId manualId = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 77777);
  54. object.setObjectId(manualId);
  55. context.commitChanges();
  56. assertEquals(PersistenceState.COMMITTED, object.getPersistenceState());
  57. assertSame(object, context.getGraphManager().getNode(manualId));
  58. assertEquals(manualId, object.getObjectId());
  59. }
  60. public void testResolveFault() {
  61. DataContext context = createDataContext();
  62. Artist o1 = context.newObject(Artist.class);
  63. o1.setArtistName("a");
  64. context.commitChanges();
  65. context.invalidateObjects(Collections.singleton(o1));
  66. assertEquals(PersistenceState.HOLLOW, o1.getPersistenceState());
  67. assertNull(o1.readPropertyDirectly("artistName"));
  68. context.prepareForAccess(o1, null, false);
  69. assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
  70. assertEquals("a", o1.readPropertyDirectly("artistName"));
  71. }
  72. public void testResolveFaultFailure() {
  73. DataContext context = createDataContext();
  74. Persistent o1 = context.localObject(new ObjectId(
  75. "Artist",
  76. Artist.ARTIST_ID_PK_COLUMN,
  77. new Integer(234)), null);
  78. try {
  79. context.prepareForAccess(o1, null, false);
  80. fail("Must blow on non-existing fault.");
  81. }
  82. catch (CayenneRuntimeException ex) {
  83. }
  84. }
  85. public void testUserProperties() {
  86. DataContext context = createDataContext();
  87. assertNull(context.getUserProperty("ABC"));
  88. Object object = new Object();
  89. context.setUserProperty("ABC", object);
  90. assertSame(object, context.getUserProperty("ABC"));
  91. }
  92. public void testHasChangesNew() {
  93. DataContext context = createDataContext();
  94. assertTrue("No changes expected in context", !context.hasChanges());
  95. context.newObject("Artist");
  96. assertTrue("Object added to context, expected to report changes", context
  97. .hasChanges());
  98. }
  99. public void testNewObject() {
  100. DataContext context = createDataContext();
  101. Artist a1 = (Artist) context.newObject("Artist");
  102. assertTrue(context.getGraphManager().registeredNodes().contains(a1));
  103. assertTrue(context.newObjects().contains(a1));
  104. }
  105. public void testNewObjectWithClass() {
  106. DataContext context = createDataContext();
  107. Artist a1 = context.newObject(Artist.class);
  108. assertTrue(context.getGraphManager().registeredNodes().contains(a1));
  109. assertTrue(context.newObjects().contains(a1));
  110. }
  111. public void testIdObjectFromDataRow() {
  112. DataContext context = createDataContext();
  113. DataRow row = new DataRow(10);
  114. row.put("ARTIST_ID", new Integer(100000));
  115. DataObject obj = context.objectFromDataRow(Artist.class, row, false);
  116. assertNotNull(obj);
  117. assertTrue(context.getGraphManager().registeredNodes().contains(obj));
  118. assertEquals(PersistenceState.HOLLOW, obj.getPersistenceState());
  119. assertNull(context.getObjectStore().getCachedSnapshot(obj.getObjectId()));
  120. }
  121. public void testPartialObjectFromDataRow() {
  122. DataContext context = createDataContext();
  123. DataRow row = new DataRow(10);
  124. row.put("ARTIST_ID", new Integer(100001));
  125. row.put("ARTIST_NAME", "ArtistXYZ");
  126. DataObject obj = context.objectFromDataRow(Artist.class, row, false);
  127. assertNotNull(obj);
  128. assertTrue(context.getGraphManager().registeredNodes().contains(obj));
  129. assertEquals(PersistenceState.HOLLOW, obj.getPersistenceState());
  130. assertNull(context.getObjectStore().getCachedSnapshot(obj.getObjectId()));
  131. }
  132. public void testFullObjectFromDataRow() {
  133. DataContext context = createDataContext();
  134. DataRow row = new DataRow(10);
  135. row.put("ARTIST_ID", new Integer(123456));
  136. row.put("ARTIST_NAME", "ArtistXYZ");
  137. row.put("DATE_OF_BIRTH", new Date());
  138. Artist obj = context.objectFromDataRow(Artist.class, row, false);
  139. assertTrue(context.getGraphManager().registeredNodes().contains(obj));
  140. assertEquals(PersistenceState.COMMITTED, obj.getPersistenceState());
  141. assertNotNull(context.getObjectStore().getCachedSnapshot(obj.getObjectId()));
  142. assertEquals("ArtistXYZ", obj.getArtistName());
  143. }
  144. public void testCommitChangesError() {
  145. DataContext context = createDataContext();
  146. // setup mockup PK generator that will blow on PK request
  147. // to emulate an exception
  148. PkGenerator newGenerator = new JdbcPkGenerator() {
  149. @Override
  150. public Object generatePkForDbEntity(DataNode node, DbEntity ent)
  151. throws Exception {
  152. throw new CayenneRuntimeException("Synthetic error....");
  153. }
  154. @Override
  155. public Object generatePk(DataNode node, DbAttribute pk)
  156. throws Exception {
  157. throw new CayenneRuntimeException("Synthetic error....");
  158. }
  159. };
  160. PkGenerator oldGenerator = getNode().getAdapter().getPkGenerator();
  161. JdbcAdapter adapter = (JdbcAdapter) getNode().getAdapter();
  162. adapter.setPkGenerator(newGenerator);
  163. try {
  164. Artist newArtist = context.newObject(Artist.class);
  165. newArtist.setArtistName("aaa");
  166. context.commitChanges();
  167. fail("Exception expected but not thrown due to missing PK generation routine.");
  168. }
  169. catch (CayenneRuntimeException ex) {
  170. // exception expected
  171. }
  172. finally {
  173. adapter.setPkGenerator(oldGenerator);
  174. }
  175. }
  176. /**
  177. * Testing behavior of Cayenne when a database exception is thrown in SELECT query.
  178. */
  179. public void testSelectException() {
  180. DataContext context = createDataContext();
  181. SQLTemplate q = new SQLTemplate(Artist.class, "SELECT * FROM NON_EXISTENT_TABLE");
  182. try {
  183. context.performGenericQuery(q);
  184. fail("Query was invalid and was supposed to fail.");
  185. }
  186. catch (RuntimeException ex) {
  187. // exception expected
  188. }
  189. }
  190. public void testEntityResolver() {
  191. DataContext context = createDataContext();
  192. assertNotNull(context.getEntityResolver());
  193. }
  194. public void testPhantomModificationsValidate() throws Exception {
  195. deleteTestData();
  196. createTestData("testPhantomModification");
  197. DataContext context = createDataContext();
  198. List objects = context.performQuery(new SelectQuery(Artist.class));
  199. Artist a1 = (Artist) objects.get(0);
  200. Artist a2 = (Artist) objects.get(1);
  201. a1.setArtistName(a1.getArtistName());
  202. a1.resetValidationFlags();
  203. a2.resetValidationFlags();
  204. context.commitChanges();
  205. assertFalse(a1.isValidateForSaveCalled());
  206. assertFalse(a2.isValidateForSaveCalled());
  207. // "phantom" modification - the property is really unchanged
  208. a1.setArtistName(a1.getArtistName());
  209. // some other unrelated object modification caused phantom modification to be
  210. // committed as well...
  211. // (see CAY-355)
  212. a2.setArtistName(a2.getArtistName() + "_x");
  213. a1.resetValidationFlags();
  214. a2.resetValidationFlags();
  215. context.commitChanges();
  216. assertTrue(a2.isValidateForSaveCalled());
  217. assertFalse(a1.isValidateForSaveCalled());
  218. }
  219. public void testPhantomModificationsValidateToOne() throws Exception {
  220. deleteTestData();
  221. createTestData("testPhantomModificationsValidateToOne");
  222. DataContext context = createDataContext();
  223. List objects = context.performQuery(new SelectQuery(Painting.class));
  224. Painting p1 = (Painting) objects.get(0);
  225. p1.setPaintingTitle(p1.getPaintingTitle());
  226. p1.resetValidationFlags();
  227. context.commitChanges();
  228. assertFalse("To-one relationship presence caused incorrect validation call.", p1
  229. .isValidateForSaveCalled());
  230. }
  231. public void testValidateOnToManyChange() throws Exception {
  232. deleteTestData();
  233. createTestData("testValidateOnToManyChange");
  234. DataContext context = createDataContext();
  235. List objects = context.performQuery(new SelectQuery(Artist.class));
  236. Artist a1 = (Artist) objects.get(0);
  237. Painting p1 = context.newObject(Painting.class);
  238. p1.setPaintingTitle("XXX");
  239. a1.addToPaintingArray(p1);
  240. a1.resetValidationFlags();
  241. context.commitChanges();
  242. assertFalse(a1.isValidateForSaveCalled());
  243. }
  244. public void testPhantomAttributeModificationCommit() throws Exception {
  245. deleteTestData();
  246. createTestData("testPhantomModification");
  247. DataContext context = createDataContext();
  248. List objects = context.performQuery(new SelectQuery(Artist.class));
  249. Artist a1 = (Artist) objects.get(0);
  250. String oldName = a1.getArtistName();
  251. a1.setArtistName(oldName + ".mod");
  252. a1.setArtistName(oldName);
  253. context.commitChanges();
  254. assertEquals(PersistenceState.COMMITTED, a1.getPersistenceState());
  255. }
  256. public void testPhantomRelationshipModificationCommit() throws Exception {
  257. deleteTestData();
  258. createTestData("testPhantomRelationshipModificationCommit");
  259. DataContext context = createDataContext();
  260. SelectQuery query = new SelectQuery(Painting.class);
  261. List objects = context.performQuery(query);
  262. assertEquals(1, objects.size());
  263. Painting p1 = (Painting) objects.get(0);
  264. Artist oldArtist = p1.getToArtist();
  265. Artist newArtist = DataObjectUtils.objectForPK(
  266. context,
  267. Artist.class,
  268. 33002);
  269. assertNotSame(oldArtist, newArtist);
  270. p1.setToArtist(newArtist);
  271. p1.setToArtist(oldArtist);
  272. context.commitChanges();
  273. assertEquals(PersistenceState.COMMITTED, p1.getPersistenceState());
  274. assertEquals(PersistenceState.COMMITTED, oldArtist.getPersistenceState());
  275. assertEquals(PersistenceState.COMMITTED, newArtist.getPersistenceState());
  276. }
  277. public void testPhantomRelationshipModificationValidate() throws Exception {
  278. deleteTestData();
  279. createTestData("testPhantomRelationshipModificationCommit");
  280. DataContext context = createDataContext();
  281. SelectQuery query = new SelectQuery(Painting.class);
  282. List objects = context.performQuery(query);
  283. assertEquals(1, objects.size());
  284. Painting p1 = (Painting) objects.get(0);
  285. Artist oldArtist = p1.getToArtist();
  286. Artist newArtist = DataObjectUtils.objectForPK(
  287. context,
  288. Artist.class,
  289. 33002);
  290. assertNotSame(oldArtist, newArtist);
  291. p1.setToArtist(newArtist);
  292. p1.setToArtist(oldArtist);
  293. p1.resetValidationFlags();
  294. context.commitChanges();
  295. assertFalse(p1.isValidateForSaveCalled());
  296. }
  297. }