KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > ojb > odmg > ObjectImageTest


1 package org.apache.ojb.odmg;
2
3 /* Copyright 2002-2005 The Apache Software Foundation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */

17
18 import java.io.Serializable JavaDoc;
19 import java.util.ArrayList JavaDoc;
20 import java.util.Collection JavaDoc;
21 import java.util.Date JavaDoc;
22 import java.util.List JavaDoc;
23 import java.util.Iterator JavaDoc;
24
25 import org.apache.commons.lang.SerializationUtils;
26 import org.apache.commons.lang.SystemUtils;
27 import org.apache.commons.lang.builder.EqualsBuilder;
28 import org.apache.ojb.broker.Identity;
29 import org.apache.ojb.broker.query.Criteria;
30 import org.apache.ojb.broker.query.Query;
31 import org.apache.ojb.broker.query.QueryFactory;
32 import org.apache.ojb.broker.core.proxy.CollectionProxy;
33 import org.apache.ojb.broker.core.proxy.CollectionProxyDefaultImpl;
34 import org.apache.ojb.broker.core.proxy.CollectionProxyListener;
35 import org.apache.ojb.broker.core.proxy.IndirectionHandler;
36 import org.apache.ojb.broker.core.proxy.MaterializationListener;
37 import org.apache.ojb.broker.core.proxy.ProxyHelper;
38 import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
39 import org.apache.ojb.junit.ODMGTestCase;
40 import org.odmg.OQLQuery;
41 import org.odmg.Transaction;
42
43 /**
44  * Check the quality of object image comparison:
45  * - new referenced objects
46  * - deleted referenced objects
47  * - deleted referenced objects
48  * ...etc.
49  *
50  * Test cases for refactored odmg-api implementation. These tests asserts previously outstanding
51  * ODMG-issues and proxy object handling in the ODMG API.
52  *
53  * @author <a HREF="mailto:arminw@apache.org">Armin Waibel</a>
54  * @version $Id: ObjectImageTest.java,v 1.1.2.8 2005/12/13 18:18:25 arminw Exp $
55  */

56 public class ObjectImageTest extends ODMGTestCase
57 {
58     static final int NONE = ObjectReferenceDescriptor.CASCADE_NONE;
59     static final int LINK = ObjectReferenceDescriptor.CASCADE_LINK;
60     static final int OBJECT = ObjectReferenceDescriptor.CASCADE_OBJECT;
61     static final String JavaDoc EOL = SystemUtils.LINE_SEPARATOR;
62
63     public static void main(String JavaDoc[] args)
64     {
65         junit.textui.TestRunner.main(new String JavaDoc[]{ObjectImageTest.class.getName()});
66     }
67
68     public void testReplaceOneToOneReference() throws Exception JavaDoc
69     {
70         String JavaDoc prefix = "testReplaceOneToOneReference_" + System.currentTimeMillis();
71         ojbChangeReferenceSetting(Book.class, "reviews", true, NONE, NONE, false);
72
73         TransactionExt tx = (TransactionExt) odmg.newTransaction();
74         tx.begin();
75         Book book = new Book(prefix, null, null);
76         Publisher p_1 = new PublisherImpl(prefix);
77         Publisher p_2 = new PublisherImpl(prefix + "_replaced");
78         book.setPublisher(p_1);
79         database.makePersistent(book);
80         database.makePersistent(p_1);
81         database.makePersistent(p_2);
82         tx.commit();
83
84         Integer JavaDoc book_version = book.getVersion();
85         Integer JavaDoc p1_version = p_1.getVersion();
86         Integer JavaDoc p2_version = p_2.getVersion();
87
88         tx.begin();
89         tx.lock(book, Transaction.WRITE);
90         tx.lock(book.getPublisher(), Transaction.READ);
91         tx.lock(p_2, Transaction.READ);
92         book.setPublisher(p_2);
93         tx.commit();
94
95         assertEquals(book_version.intValue() + 1, book.getVersion().intValue());
96         assertEquals(p1_version, p_1.getVersion());
97         assertEquals(p2_version, p_2.getVersion());
98     }
99
100     public void testAddCollectionObjectToExistingObject() throws Exception JavaDoc
101     {
102         String JavaDoc prefix = "testAddCollectionObjectToExistingObject_" + System.currentTimeMillis();
103         ojbChangeReferenceSetting(Book.class, "reviews", true, NONE, NONE, false);
104
105         TransactionExt tx = (TransactionExt) odmg.newTransaction();
106         tx.begin();
107         Book book = new Book(prefix, null, null);
108         Review r1 = new Review(prefix + "_1");
109         database.makePersistent(book);
110         database.makePersistent(r1);
111         tx.commit();
112
113         Integer JavaDoc book_version = book.getVersion();
114         Integer JavaDoc r_1_version = r1.getVersion();
115
116         Review r2 = new Review(prefix + "_2");
117         tx.begin();
118         tx.lock(r1, Transaction.WRITE);
119         tx.lock(book, Transaction.READ);
120         book.addReview(r1);
121         book.addReview(r2);
122         database.makePersistent(r2);
123         tx.commit();
124
125         assertEquals(book_version, book.getVersion());
126         assertTrue(book.getId() != null);
127
128         Integer JavaDoc r_2_version = r2.getVersion();
129
130         tx.begin();
131         tx.getBroker().clearCache();
132         Book loadedCopy = (Book) tx.getBroker().getObjectByIdentity(
133                 tx.getBroker().serviceIdentity().buildIdentity(Book.class, book.getId()));
134         assertNotNull(loadedCopy);
135         assertNotNull(loadedCopy.getReviews());
136         assertEquals(2, loadedCopy.getReviews().size());
137         assertEquals(book_version, loadedCopy.getVersion());
138         Review new_r1 = (Review) loadedCopy.getReviews().get(0);
139         Review new_r2 = (Review) loadedCopy.getReviews().get(1);
140         assertEquals(r_1_version.intValue() + 1, new_r1.getVersion().intValue());
141         assertEquals(r_2_version, new_r2.getVersion());
142
143         tx.getBroker().clearCache();
144         Criteria criteria = new Criteria();
145         criteria.addLike("title", prefix);
146         Query q = QueryFactory.newQuery(Book.class, criteria);
147         Collection JavaDoc books = tx.getBroker().getCollectionByQuery(q);
148         assertNotNull(books);
149         assertEquals(1, books.size());
150         Book new_book = (Book) books.iterator().next();
151         tx.commit();
152         assertEquals(book_version, new_book.getVersion());
153
154         tx.begin();
155         tx.lock(loadedCopy, Transaction.WRITE);
156         Review removed = (Review) loadedCopy.getReviews().remove(0);
157         Review stayed = (Review) loadedCopy.getReviews().get(0);
158         tx.commit();
159         // expect same version, nothing should be changed
160
assertEquals(r_2_version, stayed.getVersion());
161         //
162
//assertEquals(r_1_version, removed.getVersion());
163

164         tx.begin();
165         OQLQuery query = odmg.newOQLQuery();
166         query.create("select books from " + Book.class.getName() + " where title like $1");
167         query.bind(prefix);
168         Collection JavaDoc result = (Collection JavaDoc) query.execute();
169         assertEquals(1, result.size());
170         Book b = (Book) result.iterator().next();
171         tx.commit();
172
173         assertEquals(1, b.getReviews().size());
174         Review r = (Review) b.getReviews().get(0);
175         if(!r.equals(r1) && !r.equals(r2))
176         {
177             fail("Wrong object or wrong object version returned. Returned obj was "
178                     + EOL + r + " expected object was " + EOL + r1 + " or " + EOL + r2);
179         }
180     }
181
182     /**
183      * test persistence by reachability of collection reference objects
184      */

185     public void testPersistenceByReachability_1() throws Exception JavaDoc
186     {
187         String JavaDoc name = "testPersistenceByReachability_1_" + System.currentTimeMillis();
188         ojbChangeReferenceSetting(Book.class, "reviews", true, NONE, NONE, true);
189
190         Date JavaDoc date = new Date JavaDoc();
191         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
192         Book book = new Book(name, date, cover);
193         Review r1 = new Review(name);
194         Review r2 = new Review(name);
195         Review r3 = new Review(name + "_not_persistent");
196         ArrayList JavaDoc reviews = new ArrayList JavaDoc();
197         reviews.add(r1);
198         reviews.add(r2);
199         reviews.add(r3);
200         book.setReviews(reviews);
201
202         TransactionExt tx = (TransactionExt) odmg.newTransaction();
203         tx.begin();
204         database.makePersistent(book);
205         Review r4 = new Review(name + "_new_added");
206         // add a new review after make persistent main object
207
book.addReview(r4);
208         tx.setCascadingDelete(Book.class, true);
209         // remove object after make persistent main object
210
book.removeReview(r3);
211         tx.commit();
212         // System.err.println("## Insert main object with 3 referecnes");
213

214         tx.begin();
215         tx.getBroker().clearCache();
216
217         OQLQuery query = odmg.newOQLQuery();
218         query.create("select books from " + Book.class.getName() + " where title like $1");
219         query.bind(name);
220         Collection JavaDoc result = (Collection JavaDoc) query.execute();
221         assertEquals(1, result.size());
222         Book b = (Book) result.iterator().next();
223         assertNotNull(b.getReviews());
224         assertEquals(3, b.getReviews().size());
225
226         query = odmg.newOQLQuery();
227         query.create("select reviews from " + Review.class.getName() + " where summary like $1");
228         query.bind(name + "_new_added");
229         result = (Collection JavaDoc) query.execute();
230         // we expect the delayed added Review object
231
assertEquals(1, result.size());
232
233         query = odmg.newOQLQuery();
234         query.create("select reviews from " + Review.class.getName() + " where summary like $1");
235         query.bind(name + "_not_persistent");
236         result = (Collection JavaDoc) query.execute();
237         // we expect the removed Review object wasn't persistet
238
assertEquals(0, result.size());
239         tx.commit();
240     }
241
242     /**
243      * test persistence by reachability of collection reference objects
244      */

245     public void testPersistenceByReachability_2() throws Exception JavaDoc
246     {
247         String JavaDoc name = "testPersistenceByReachability_2_" + System.currentTimeMillis();
248         ojbChangeReferenceSetting(Book.class, "reviews", true, NONE, NONE, true);
249
250         Date JavaDoc date = new Date JavaDoc();
251         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
252         Book book = new Book(name, date, cover);
253         Review r1 = new Review(name);
254         Review r2 = new Review(name);
255         Review r3 = new Review(name + "_not_persistent");
256         ArrayList JavaDoc reviews = new ArrayList JavaDoc();
257         reviews.add(r1);
258         reviews.add(r2);
259         reviews.add(r3);
260         book.setReviews(reviews);
261
262         TransactionExt tx = (TransactionExt) odmg.newTransaction();
263         tx.begin();
264         database.makePersistent(book);
265         Review r4 = new Review(name + "_new_added");
266         // add a new review after make persistent main object
267
book.addReview(r4);
268         tx.setCascadingDelete(Book.class, true);
269         // remove object after make persistent main object
270
book.removeReview(r3);
271         tx.checkpoint();
272
273         //tx.begin();
274
tx.getBroker().clearCache();
275
276         OQLQuery query = odmg.newOQLQuery();
277         query.create("select books from " + Book.class.getName() + " where title like $1");
278         query.bind(name);
279         Collection JavaDoc result = (Collection JavaDoc) query.execute();
280         assertEquals(1, result.size());
281         Book b = (Book) result.iterator().next();
282         assertNotNull(b.getReviews());
283         assertEquals(3, b.getReviews().size());
284
285         query = odmg.newOQLQuery();
286         query.create("select reviews from " + Review.class.getName() + " where summary like $1");
287         query.bind(name + "_new_added%");
288         result = (Collection JavaDoc) query.execute();
289         // we expect the delayed added Review object
290
assertEquals(1, result.size());
291
292         query = odmg.newOQLQuery();
293         query.create("select reviews from " + Review.class.getName() + " where summary like $1");
294         query.bind(name + "_not_persistent");
295         result = (Collection JavaDoc) query.execute();
296         // we expect the removed Review object wasn't persistet
297
assertEquals(0, result.size());
298
299         b.setTitle(name + "_updated");
300         tx.commit();
301
302         query = odmg.newOQLQuery();
303         query.create("select books from " + Book.class.getName() + " where title like $1");
304         query.bind(name + "_updated");
305         result = (Collection JavaDoc) query.execute();
306         assertEquals(1, result.size());
307         Book b_updated = (Book) result.iterator().next();
308         assertNotNull(b_updated.getReviews());
309         assertEquals(3, b_updated.getReviews().size());
310         assertEquals(name+"_updated", b_updated.getTitle());
311     }
312
313     public void testAddPersistentObjectTo1toN() throws Exception JavaDoc
314     {
315         String JavaDoc name = "testAddPersistentObjectTo1toN_" + System.currentTimeMillis();
316         Review review = new Review(name);
317         TransactionExt tx = (TransactionExt) odmg.newTransaction();
318         tx.begin();
319         database.makePersistent(review);
320         tx.commit();
321
322         Integer JavaDoc versionReview = review.getVersion();
323
324         Date JavaDoc date = new Date JavaDoc();
325         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
326         Book book = new Book(name, date, cover);
327         tx = (TransactionExt) odmg.newTransaction();
328         tx.begin();
329         // tx.lock(review, Transaction.WRITE);
330
database.makePersistent(book);
331         book.addReview(review);
332         tx.commit();
333
334         // the Review object has to be linked
335
assertEquals("expect that this object was updated", versionReview.intValue() + 1, review.getVersion().intValue());
336
337         tx.begin();
338         tx.getBroker().clearCache();
339         OQLQuery query = odmg.newOQLQuery();
340         query.create("select books from " + Book.class.getName() + " where title like $1");
341         query.bind(name);
342         Collection JavaDoc result = (Collection JavaDoc) query.execute();
343         assertEquals(1, result.size());
344         Book b = (Book) result.iterator().next();
345         assertNotNull(b.getReviews());
346         assertEquals(1, b.getReviews().size());
347         tx.commit();
348     }
349
350     public void testAddPersistentObjectToMtoN() throws Exception JavaDoc
351     {
352         String JavaDoc name = "testAddPersistentObjectToMtoN_" + System.currentTimeMillis();
353         Author author = new Author(name, null);
354         TransactionExt tx = (TransactionExt) odmg.newTransaction();
355         tx.begin();
356         database.makePersistent(author);
357         tx.commit();
358
359         Integer JavaDoc versionReview = author.getVersion();
360
361         Date JavaDoc date = new Date JavaDoc();
362         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
363         Book book = new Book(name, date, cover);
364         tx = (TransactionExt) odmg.newTransaction();
365         tx.begin();
366         database.makePersistent(book);
367         book.addAuthor(author);
368         author.addBook(book);
369         tx.commit();
370
371         // the Review object has to be linked
372
assertEquals("expect that this object wasn't updated", versionReview.intValue(), author.getVersion().intValue());
373
374         tx.begin();
375         tx.getBroker().clearCache();
376         OQLQuery query = odmg.newOQLQuery();
377         query.create("select books from " + Book.class.getName() + " where title like $1");
378         query.bind(name);
379         Collection JavaDoc result = (Collection JavaDoc) query.execute();
380         assertEquals(1, result.size());
381         Book b = (Book) result.iterator().next();
382         assertNotNull(b.getAuthors());
383         assertEquals(1, b.getAuthors().size());
384         tx.commit();
385     }
386
387     /**
388      * only lock object, no changes made
389      */

390     public void testChangeMainFields() throws Exception JavaDoc
391     {
392         String JavaDoc name = "testChangeMainFields_" + System.currentTimeMillis();
393         Date JavaDoc date = new Date JavaDoc();
394         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
395         Book book = new Book(name, date, cover);
396
397         TransactionExt tx = (TransactionExt) odmg.newTransaction();
398         tx.begin();
399         database.makePersistent(book);
400         tx.commit();
401
402         Integer JavaDoc version = book.getVersion();
403         // System.err.println("### 1. commit, insert new object");
404

405         tx.begin();
406         tx.lock(book, Transaction.WRITE);
407         tx.commit();
408
409         // System.err.println("### 2. commit, no changes");
410
assertEquals(version, book.getVersion());
411
412         tx.begin();
413         tx.lock(book, Transaction.WRITE);
414         // we set the same date, so no reason to update
415
book.setPublicationDate(new Date JavaDoc(date.getTime()));
416         tx.commit();
417
418         // System.err.println("### 3. commit, replace with same date");
419
assertEquals(version, book.getVersion());
420
421         tx.begin();
422         tx.lock(book, Transaction.WRITE);
423         // now we change the date
424
Date JavaDoc d = new Date JavaDoc(1111);
425         book.setPublicationDate(d);
426         tx.commit();
427         // System.err.println("### 4. commit, changed date");
428
assertFalse(date.equals(book.getPublicationDate()));
429         assertFalse(version.equals(book.getVersion()));
430     }
431
432     /**
433      * modify field of main object
434      */

435     public void testChangeMainFields_2() throws Exception JavaDoc
436     {
437         String JavaDoc name = "testChangeMainFields_2_" + System.currentTimeMillis();
438         Date JavaDoc date = new Date JavaDoc();
439         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
440         Book book = new Book(name, date, cover);
441
442         TransactionExt tx = (TransactionExt) odmg.newTransaction();
443         tx.begin();
444         database.makePersistent(book);
445         tx.commit();
446
447         Integer JavaDoc version = book.getVersion();
448
449         tx.begin();
450         tx.lock(book, Transaction.WRITE);
451         book.setCover(new byte[]{2,3,4,5,6,7,8,8});
452         tx.commit();
453
454         assertFalse(version.equals(book.getVersion()));
455         tx.begin();
456         tx.getBroker().clearCache();
457         OQLQuery query = odmg.newOQLQuery();
458         query.create("select books from " + Book.class.getName() + " where title like $1");
459         query.bind(name);
460         Collection JavaDoc result = (Collection JavaDoc) query.execute();
461         assertEquals(1, result.size());
462         Book b = (Book) result.iterator().next();
463         assertFalse(version.equals(b.getVersion()));
464         tx.commit();
465     }
466
467     /**
468      * lock object and lock serialized unmodified version again
469      */

470     public void testChangeMainFields_3() throws Exception JavaDoc
471     {
472         String JavaDoc name = "testChangeMainFields_3_" + System.currentTimeMillis();
473         Date JavaDoc date = new Date JavaDoc();
474         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
475         Book book = new Book(name, date, cover);
476
477         TransactionExt tx = (TransactionExt) odmg.newTransaction();
478         tx.begin();
479         database.makePersistent(book);
480         tx.commit();
481
482         Integer JavaDoc version = book.getVersion();
483
484         tx.begin();
485         tx.lock(book, Transaction.WRITE);
486         book = (Book) SerializationUtils.clone(book);
487         tx.lock(book, Transaction.WRITE);
488         tx.commit();
489
490         assertEquals(version, book.getVersion());
491     }
492
493     /**
494      * Double lock object with reference
495      */

496     public void testChangeOneToOneReference_1() throws Exception JavaDoc
497     {
498         String JavaDoc name = "testChangeOneToOneReference_1_" + System.currentTimeMillis();
499         Date JavaDoc date = new Date JavaDoc();
500         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
501         Book book = new Book(name, date, cover);
502         Publisher publisher = new PublisherImpl(name);
503         book.setPublisher(publisher);
504
505         TransactionExt tx = (TransactionExt) odmg.newTransaction();
506         tx.begin();
507         database.makePersistent(book);
508         tx.commit();
509         // System.err.println("### 1. commit, insert new object");
510

511         Integer JavaDoc versionBook = book.getVersion();
512         Integer JavaDoc versionPublisher = book.getPublisher().getVersion();
513
514         tx.begin();
515         tx.lock(book, Transaction.WRITE);
516         tx.lock(book, Transaction.WRITE);
517         tx.commit();
518         // System.err.println("### 2. commit, double lock call, no changes");
519

520         assertEquals(versionBook, book.getVersion());
521         assertEquals(versionPublisher, book.getVersion());
522     }
523
524     /**
525      * Double lock object with reference and proxy reference
526      */

527     public void testChangeOneToOneReference_1b() throws Exception JavaDoc
528     {
529         String JavaDoc name = "testChangeOneToOneReference_1b_" + System.currentTimeMillis();
530         ojbChangeReferenceSetting(Book.class, "publisher", true, NONE, NONE, true);
531
532         Date JavaDoc date = new Date JavaDoc();
533         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
534         Book book = new Book(name, date, cover);
535         Publisher publisher = new PublisherImpl(name);
536         book.setPublisher(publisher);
537
538         TransactionExt tx = (TransactionExt) odmg.newTransaction();
539         tx.begin();
540         database.makePersistent(book);
541         tx.commit();
542         // System.err.println("### 1. commit, insert new object");
543

544         Integer JavaDoc versionBook = book.getVersion();
545         Integer JavaDoc versionPublisher = book.getPublisher().getVersion();
546
547         tx.begin();
548         tx.lock(book, Transaction.WRITE);
549         tx.lock(book, Transaction.WRITE);
550         tx.commit();
551         // System.err.println("### 2. commit, double lock call, no changes");
552

553         assertEquals(versionBook, book.getVersion());
554         assertEquals(versionPublisher, book.getVersion());
555     }
556
557     /**
558      * lock object with reference and lock serialized version again
559      */

560     public void testChangeOneToOneReference_2() throws Exception JavaDoc
561     {
562         String JavaDoc name = "testChangeOneToOneReference_2_" + System.currentTimeMillis();
563         Date JavaDoc date = new Date JavaDoc();
564         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
565         Book book = new Book(name, date, cover);
566         Publisher publisher = new PublisherImpl(name);
567         book.setPublisher(publisher);
568
569         TransactionExt tx = (TransactionExt) odmg.newTransaction();
570         tx.begin();
571         database.makePersistent(book);
572         tx.commit();
573         // System.err.println("### 1. commit, insert new object");
574

575         Integer JavaDoc versionBook = book.getVersion();
576         Integer JavaDoc versionPublisher = book.getPublisher().getVersion();
577
578         tx.begin();
579         tx.lock(book, Transaction.WRITE);
580         // nothing changed, so no need to update objects
581
book = (Book) SerializationUtils.clone(book);
582         tx.lock(book, Transaction.WRITE);
583         tx.commit();
584
585         assertEquals(versionBook, book.getVersion());
586         assertEquals(versionPublisher, book.getVersion());
587     }
588
589     /**
590      * lock object with reference, change reference only
591      */

592     public void testChangeOneToOneReference_3() throws Exception JavaDoc
593     {
594         String JavaDoc name = "testChangeOneToOneReference_2_" + System.currentTimeMillis();
595         Date JavaDoc date = new Date JavaDoc();
596         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
597         Book book = new Book(name, date, cover);
598         Publisher publisher = new PublisherImpl(name);
599         book.setPublisher(publisher);
600
601         TransactionExt tx = (TransactionExt) odmg.newTransaction();
602         tx.begin();
603         database.makePersistent(book);
604         tx.commit();
605         // System.err.println("### 1. commit, insert new object");
606

607         Integer JavaDoc versionBook = book.getVersion();
608         Integer JavaDoc versionPublisher = book.getPublisher().getVersion();
609
610         tx.begin();
611         tx.lock(book, Transaction.WRITE);
612         // nothing changed, so no need to update objects
613
book = (Book) SerializationUtils.clone(book);
614         Publisher p = book.getPublisher();
615         p.setName(name + "_updated");
616         // not needed to re-lock, because nothing changed, but
617
// if we lock Book no update should be done, because nothing changed
618
tx.lock(book, Transaction.WRITE);
619         // we have to re-lock the changed objects, because it was serialized
620
tx.lock(p, Transaction.WRITE);
621         tx.commit();
622
623         // no changes made in Book
624
assertEquals(versionBook, book.getVersion());
625         // publisher should be updated
626
assertEquals(new Integer JavaDoc(versionPublisher.intValue() + 1), p.getVersion());
627     }
628
629     /**
630      * lock object with reference, replace reference only
631      */

632     public void testReplaceOneToOneReference_1() throws Exception JavaDoc
633     {
634         String JavaDoc name = "testChangeOneToOneReference_2_" + System.currentTimeMillis();
635         Date JavaDoc date = new Date JavaDoc();
636         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
637         Book book = new Book(name, date, cover);
638         Publisher publisher = new PublisherImpl(name);
639         book.setPublisher(publisher);
640
641         TransactionExt tx = (TransactionExt) odmg.newTransaction();
642         tx.begin();
643         database.makePersistent(book);
644         tx.commit();
645         // System.err.println("### 1. commit, insert new object");
646

647         Integer JavaDoc versionBook = book.getVersion();
648         Integer JavaDoc versionPublisher = book.getPublisher().getVersion();
649
650         tx.begin();
651         tx.lock(book, Transaction.WRITE);
652         Publisher p = new PublisherImpl(name + "_new");
653         // set new Publisher instance
654
book.setPublisher(p);
655         tx.lock(p, Transaction.WRITE);
656         tx.commit();
657
658         // changes made in Book
659
assertEquals(new Integer JavaDoc(versionBook.intValue() + 1), book.getVersion());
660         // publisher should not be updated, because it was replaced
661
assertEquals(versionPublisher, p.getVersion());
662     }
663
664     /**
665      * lock object with reference, replace reference only
666      */

667     public void testReplaceOneToOneReference_2() throws Exception JavaDoc
668     {
669         String JavaDoc name = "testChangeOneToOneReference_2_" + System.currentTimeMillis();
670         Date JavaDoc date = new Date JavaDoc();
671         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
672         Book book = new Book(name, date, cover);
673         Publisher publisher = new PublisherImpl(name);
674         book.setPublisher(publisher);
675
676         TransactionExt tx = (TransactionExt) odmg.newTransaction();
677         tx.begin();
678         database.makePersistent(book);
679         tx.commit();
680         // System.err.println("### 1. commit, insert new object");
681

682         Integer JavaDoc versionBook = book.getVersion();
683         Integer JavaDoc versionPublisher = book.getPublisher().getVersion();
684
685         tx.begin();
686         tx.lock(book, Transaction.WRITE);
687         book = (Book) SerializationUtils.clone(book);
688         Publisher p = new PublisherImpl(name + "_new");
689         // set new Publisher instance
690
book.setPublisher(p);
691         // not needed to re-lock, because nothing changed, but
692
// if we lock Book no update should be done, because nothing changed
693
tx.lock(book, Transaction.WRITE);
694         // we have to re-lock the changed objects, because it was serialized
695
tx.lock(p, Transaction.WRITE);
696         tx.commit();
697
698         // changes made in Book
699
assertEquals(new Integer JavaDoc(versionBook.intValue() + 1), book.getVersion());
700         // publisher should not be updated, because it was replaced
701
assertEquals(versionPublisher, p.getVersion());
702     }
703
704     /**
705      * check materialization of proxy object
706      */

707     public void testChangeOneToOneReference_4() throws Exception JavaDoc
708     {
709         ojbChangeReferenceSetting(Book.class, "publisher", true, NONE, NONE, true);
710         String JavaDoc name = "testChangeOneToOneReference_4_" + System.currentTimeMillis();
711         Date JavaDoc date = new Date JavaDoc();
712         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
713         Book book = new Book(name, date, cover);
714         Publisher publisher = new PublisherImpl(name);
715         book.setPublisher(publisher);
716
717         TransactionExt tx = (TransactionExt) odmg.newTransaction();
718         tx.begin();
719         database.makePersistent(book);
720         tx.commit();
721
722         Integer JavaDoc versionBook = book.getVersion();
723
724         tx.begin();
725         tx.getBroker().clearCache();
726         OQLQuery query = odmg.newOQLQuery();
727         query.create("select books from " + Book.class.getName() + " where title like $1");
728         query.bind(name);
729         Collection JavaDoc result = (Collection JavaDoc) query.execute();
730         assertEquals(1, result.size());
731         Book b = (Book) result.iterator().next();
732         IndirectionHandler handler = ProxyHelper.getIndirectionHandler(b.getPublisher());
733         assertNotNull(handler);
734         assertFalse(handler.alreadyMaterialized());
735         handler.addListener(
736                 new MaterializationListener()
737                 {
738                     public void beforeMaterialization(IndirectionHandler handler, Identity oid)
739                     {
740                         fail("Reference shall not materialize while locking");
741                     }
742
743                     public void afterMaterialization(IndirectionHandler handler, Object JavaDoc materializedObject)
744                     {
745                     }
746                 }
747         );
748         tx.lock(b, Transaction.WRITE);
749         tx.commit();
750
751         assertEquals(versionBook, b.getVersion());
752     }
753
754     /**
755      * replace proxy reference by new reference object
756      */

757     public void testChangeOneToOneReference_5() throws Exception JavaDoc
758     {
759         ojbChangeReferenceSetting(Book.class, "publisher", true, NONE, NONE, true);
760         String JavaDoc name = "testChangeOneToOneReference_5_" + System.currentTimeMillis();
761         Date JavaDoc date = new Date JavaDoc();
762         byte[] cover = new byte[]{2,3,4,5,6,7,8,9};
763         Book book = new Book(name, date, cover);
764         Publisher publisher = new PublisherImpl(name);
765         book.setPublisher(publisher);
766
767         TransactionExt tx = (TransactionExt) odmg.newTransaction();
768         tx.begin();
769         database.makePersistent(book);
770         tx.commit();
771         // System.err.println("### 1. commit, insert new object");
772

773
774         Integer