/* * Copyright 2008 Udai Gupta * * Licensed 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.castor.cpa.test.test90; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.castor.cpa.test.framework.CPATestCase; import org.castor.cpa.test.framework.xml.types.DatabaseEngineType; import org.exolab.castor.jdo.Database; import org.exolab.castor.jdo.OQLQuery; import org.exolab.castor.jdo.ObjectNotFoundException; import org.exolab.castor.jdo.QueryResults; import org.exolab.castor.mapping.AccessMode; public final class TestLazy1to1 extends CPATestCase { private static final String DBNAME = "test90"; private static final String MAPPING = "/org/castor/cpa/test/test90/mapping.xml"; private Database _db; public TestLazy1to1(final String name) { super(name); } // Test are only included/excluded for engines that have been tested with this test suite. public boolean include(final DatabaseEngineType engine) { return (engine == DatabaseEngineType.DERBY) || (engine == DatabaseEngineType.HSQL) || (engine == DatabaseEngineType.MYSQL) || (engine == DatabaseEngineType.ORACLE) || (engine == DatabaseEngineType.POSTGRESQL); } public void setUp() throws Exception { _db = getJDOManager(DBNAME, MAPPING).getDatabase(); } public void tearDown() throws Exception { if (_db.isActive()) { _db.rollback(); } _db.close(); } public void testCreateParent() throws Exception { Lazy1to1Parent parent = null; Lazy1to1Child child = null; _db.begin(); child = _db.load(Lazy1to1Child.class, new Integer(1)); parent = new Lazy1to1Parent(); parent.setId(new Integer(20000)); parent.setDescription("parent 20000"); parent.setChild(child); _db.create(parent); _db.commit(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(20000)); child = parent.getChild(); assertNotNull(child); assertEquals(1, child.getId().intValue()); _db.rollback(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(20000)); _db.remove(parent); _db.commit(); } public void testLoadChild() throws Exception { Lazy1to1Child child = null; _db.begin(); child = _db.load(Lazy1to1Child.class, new Integer(1)); assertChild(child, 1, "child 1"); _db.commit(); } public void testLoadParentWhereChildIsNull() throws Exception { Lazy1to1Parent parent = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(5)); assertParent(parent, 5, "parent 5"); assertNull(parent.getChild()); _db.commit(); _db.close(); } public void testLoadParentWithAccess() throws Exception { Lazy1to1Parent parent = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); _db.commit(); assertParent(parent, 1, "parent 1"); Lazy1to1Child nature = parent.getChild(); assertChild(nature, 1, "child 1"); _db.close(); } public void testLoadParentWithoutAccess() throws Exception { Lazy1to1Parent parent = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); _db.commit(); _db.close(); } public void testSerializeParentWithAccess() throws Exception { File file = new File("serialized.out"); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); Lazy1to1Parent parent = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); assertChild(parent.getChild(), 1, "child 1"); _db.commit(); out.writeObject(parent); out.close(); ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); Lazy1to1Parent accountDeserialized = (Lazy1to1Parent) in.readObject(); assertNotNull(accountDeserialized); assertEquals(1, accountDeserialized.getId().intValue()); assertChild(accountDeserialized.getChild(), 1, "child 1"); _db.close(); } public void testSerializeParentWithoutAccess() throws Exception { File file = new File("serialized.out"); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); Lazy1to1Parent parent = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); _db.commit(); out.writeObject(parent); out.close(); ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); parent = (Lazy1to1Parent) in.readObject(); assertNotNull(parent); assertEquals(1, parent.getId().intValue()); assertChild(parent.getChild(), 1, "child 1"); _db.close(); } public void testUpdateChild() throws Exception { Lazy1to1Child child = null; _db.begin(); child = _db.load(Lazy1to1Child.class, new Integer(2)); assertChild(child, 2, "child 2"); child.setDescription("child 22"); _db.commit(); _db.begin(); child = _db.load(Lazy1to1Child.class, new Integer(2)); assertChild(child, 2, "child 22"); _db.rollback(); _db.begin(); child = _db.load(Lazy1to1Child.class, new Integer(2)); assertChild(child, 2, "child 22"); child.setDescription("child 2"); _db.commit(); _db.begin(); child = _db.load(Lazy1to1Child.class, new Integer(2)); assertChild(child, 2, "child 2"); _db.rollback(); _db.close(); } public void testUpdateParentMemberWithAccess() throws Exception { Lazy1to1Parent parent = null; Lazy1to1Child child = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); child = parent.getChild(); assertChild(child, 1, "child 1"); parent.setDescription("parent 11"); _db.commit(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 11"); child = parent.getChild(); assertChild(child, 1, "child 1"); _db.rollback(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 11"); child = parent.getChild(); assertChild(child, 1, "child 1"); parent.setDescription("parent 1"); _db.commit(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); child = parent.getChild(); assertChild(child, 1, "child 1"); _db.rollback(); _db.close(); } public void testUpdateParentMemberWithoutAccess() throws Exception { Lazy1to1Parent parent = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); parent.setDescription("parent 11"); _db.commit(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 11"); _db.commit(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 11"); parent.setDescription("parent 1"); _db.commit(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); _db.commit(); _db.close(); } public void testUpdateParentSetChildToNullWithAccess() throws Exception { Lazy1to1Parent parent = null; Lazy1to1Child childNew = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); assertChild(parent.getChild(), 1, "child 1"); parent.setChild(null); _db.commit(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); assertNull(parent.getChild()); _db.rollback(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); childNew = _db.load(Lazy1to1Child.class, new Integer(1)); assertChild(childNew, 1, "child 1"); parent.setChild(childNew); _db.commit(); _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); assertParent(parent, 1, "parent 1"); assertChild(parent.getChild(), 1, "child 1"); _db.rollback(); _db.close(); } public void testLoadBookWithLazyAuthorProperty() throws Exception { _db.begin(); try { _db.load(Lazy1to1Author.class, new Long(1)); } catch (ObjectNotFoundException e) { fail("Database should contain an author with id=1"); } Database db2 = getJDOManager(DBNAME, MAPPING).getDatabase(); db2.begin(); OQLQuery qry = db2.getOQLQuery("SELECT o FROM " + Lazy1to1Book.class.getName() + " o"); QueryResults results = qry.execute(); assertTrue("Couldn't find the book in _db: ", results.hasMore()); Lazy1to1Book book = null; if (results.hasMore()) { book = (Lazy1to1Book) results.next(); Lazy1to1Author currentAuthor = book.getAuthor(); assertNotNull("book should have author", currentAuthor); assertNotNull("author should have a last name", currentAuthor .getLastName()); } db2.commit(); db2.close(); _db.commit(); } public void testLoadChildReadOnly() throws Exception { Lazy1to1Child child = null; _db.begin(); child = _db.load(Lazy1to1Child.class, new Integer(1), AccessMode.ReadOnly); assertChild(child, 1, "child 1"); _db.commit(); } public void testLoadParentReadOnlyWithAccessWithoutChange() throws Exception { Lazy1to1Parent parent = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1), AccessMode.ReadOnly); _db.commit(); assertParent(parent, 1, "parent 1"); Lazy1to1Child nature = parent.getChild(); assertChild(nature, 1, "child 1"); // re-load to assert that nothing has changed _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1)); _db.commit(); assertParent(parent, 1, "parent 1"); assertChild(parent.getChild(), 1, "child 1"); _db.close(); } /* public void testLoadParentReadOnlyWithAccessWithChange() throws Exception { Lazy1to1Parent parent = null; _db.begin(); parent = (Lazy1to1Parent) _db.load(Lazy1to1Parent.class, new Integer(1), AccessMode.ReadOnly); assertParent(parent, 1, "parent 1"); Lazy1to1Child nature = parent.getChild(); assertChild(nature, 1, "child 1"); parent.getChild().setDescription("child changed"); _db.commit(); // re-load to assert that nothing has changed _db.begin(); parent = (Lazy1to1Parent) _db .load(Lazy1to1Parent.class, new Integer(1)); _db.rollback(); assertParent(parent, 1, "parent 1"); assertChild(parent.getChild(), 1, "child 1"); _db.close(); }*/ public void testLoadParentReadOnlyWithoutAccess() throws Exception { Lazy1to1Parent parent = null; _db.begin(); parent = _db.load(Lazy1to1Parent.class, new Integer(1), AccessMode.ReadOnly); assertParent(parent, 1, "parent 1"); _db.commit(); _db.close(); } private void assertParent(final Lazy1to1Parent account, final int id, final String description) { assertNotNull(account); assertEquals(id, account.getId().intValue()); assertEquals(description, account.getDescription()); } private void assertChild(final Lazy1to1Child nature, final int id, final String description) { assertNotNull(nature); assertEquals(id, nature.getId().intValue()); assertEquals(description, nature.getDescription()); } }