package org.castor.cpa.test.test1379; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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.QueryResults; public class Test1379 extends CPATestCase { private static final Log LOG = LogFactory.getLog(Test1379.class); private static final String DBNAME = "test1379"; private static final String MAPPING = "/org/castor/cpa/test/test1379/mapping.xml"; // 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.SAPDB) || (engine == DatabaseEngineType.SQL_SERVER); } public boolean exclude(final DatabaseEngineType engine) { return (engine == DatabaseEngineType.POSTGRESQL); } public void test() throws Exception { Computer computer = null; Product product; QueryResults results; Database db = getJDOManager(DBNAME, MAPPING).getDatabase(); removeProduct(db); removeComputer(db); createComputer(db); createProduct(db); db.begin(); LOG.info("Begin transaction: one-to-one and dependent relations"); OQLQuery productOql = db.getOQLQuery( "SELECT p FROM " + Product.class.getName() + " p WHERE p.id = $1"); // If no such products with ids 5-8 exist, create new objects and persist them for (int i = 5; i < 10; ++i) { productOql.bind(i); results = productOql.execute(); if (!results.hasMore()) { Computer computerToCreate = new Computer(); computerToCreate.setId(i); computerToCreate.setCpu("cpu"); computerToCreate.setName("computer" + computerToCreate.getId()); computerToCreate.setPrice(300); LOG.debug("Creating new computer: " + computerToCreate); db.create(computerToCreate); } else { LOG.debug("Query result: " + results.next()); } } LOG.info("End transaction: one-to-one and dependent relations"); db.commit(); db.begin(); LOG.info("Begin transaction: load previously created products"); product = db.load(Product.class, new Integer(4)); assertNotNull (product); assertEquals (4, product.getId()); // assertEquals (200.0f, product.getPrice()); assertEquals ("computer4", product.getName()); for (int x = 5; x < 10; x++) { product = db.load(Product.class, new Integer(x)); assertNotNull (product); assertEquals (x, product.getId()); assertEquals ("computer" + x, product.getName()); } LOG.info("End transaction: load previously created products"); db.commit(); product.setPrice(333); LOG.info("Updated Product price: " + product); db.begin(); LOG.info("Begin transaction: long transaction"); // Don't forget to implement TimeStampable for the long transaction!!! db.update(product); LOG.info("End transaction: long transaction"); db.commit(); db.begin(); LOG.info("Begin transaction: update extends relation in long transaction"); OQLQuery computerOql = db.getOQLQuery( "SELECT c FROM " + Computer.class.getName() + " c WHERE c.id = $1"); computerOql.bind(44); results = computerOql.execute(); while (results.hasMore()) { computer = new Computer(); computer = (Computer) results.next(); LOG.debug("Found existing computer: " + computer); } LOG.info("End transaction: update extends relation in long transaction"); db.commit(); computer.setPrice(425); LOG.info("Updated Computer price: " + product); db.begin(); LOG.info("Begin transaction: update extends relation in long transaction"); // Don't forget to implement TimeStampable for the long transaction!!! db.update(computer); LOG.info("End transaction: update extends relation in long transaction"); db.commit(); db.begin(); LOG.info("Begin transaction: load previously created non-leaf product"); product = db.load(Product.class, new Integer(99)); assertNotNull (product); assertEquals (99, product.getId()); assertEquals("product99", product.getName()); LOG.info("End transaction: load previously created non-leaf product"); db.commit(); db.close(); LOG.info("Test complete"); } private void removeProduct(final Database db) throws Exception { Product product; QueryResults results; db.begin(); LOG.info("Begin transaction to remove Product objects"); // Look up the products and if found delete them from the database OQLQuery productOql = db.getOQLQuery( "SELECT p FROM " + Product.class.getName() + " p WHERE p.id = $1"); for (int i = 4; i < 10; ++i) { productOql.bind(i); results = productOql.execute(); while (results.hasMore()) { product = (Product) results.next(); LOG.debug("Deleting existing product: " + product); db.remove(product); } } productOql.bind(99); results = productOql.execute(); while (results.hasMore()) { product = (Product) results.next(); LOG.debug("Deleting existing product: " + product); db.remove(product); } LOG.info("End transaction to remove Product objects"); db.commit(); } private void removeComputer(final Database db) throws Exception { QueryResults results; db.begin(); LOG.info("Begin transaction to remove Computer object"); // Look up the computer and if found delete them from the database OQLQuery computerOql = db.getOQLQuery( "SELECT c FROM " + Computer.class.getName() + " c WHERE c.id = $1"); computerOql.bind(44); results = computerOql.execute(); while (results.hasMore()) { Computer computerToDelete = (Computer) results.next(); LOG.debug("Deleting existing computer: " + computerToDelete); db.remove(computerToDelete); } LOG.info("End transaction to remove Computer objects"); db.commit(); } private void createComputer(final Database db) throws Exception { QueryResults results; db.begin(); LOG.info("Begin transaction: one-to-one, one-to-many, and dependent relations"); // If no such product exists in the database, create a new object and persist it // Note: product uses group, so group object has to be created first, but can // be persisted later OQLQuery productOql = db.getOQLQuery( "SELECT p FROM " + Product.class.getName() + " p WHERE p.id = $1"); productOql.bind(4); results = productOql.execute(); if (!results.hasMore()) { Computer computerToCreate = new Computer(); computerToCreate.setId(4); computerToCreate.setCpu("pentium"); computerToCreate.setName("computer4"); computerToCreate.setPrice(200); LOG.debug("Creating new computer: " + computerToCreate); db.create(computerToCreate); } else { LOG.debug("Query result: " + results.next()); } // If no such computer exists in the database, create a new object and persist it // Note: computer uses group, so group object has to be created first, but can // be persisted later OQLQuery computerOql = db.getOQLQuery( "SELECT c FROM " + Computer.class.getName() + " c WHERE c.id = $1"); computerOql.bind(44); results = computerOql.execute(); if (!results.hasMore()) { Computer computerToCreate = new Computer(); computerToCreate.setId(44); computerToCreate.setCpu("Pentium"); computerToCreate.setName("MyPC"); computerToCreate.setPrice(400); LOG.debug("Creating new computer: " + computerToCreate); db.create(computerToCreate); } else { LOG.debug("Query result: " + results.next()); } LOG.info("End transaction: one-to-one, one-to-many and dependent relations"); db.commit(); } private void createProduct(final Database db) throws Exception { QueryResults results; db.begin(); LOG.info("Begin transaction: create non-leaf node"); // If no such product exists in the database, create a new object and persist it // Note: product uses group, so group object has to be created first, but can // be persisted later OQLQuery productOql = db.getOQLQuery( "SELECT p FROM " + Product.class.getName() + " p WHERE p.id = $1"); productOql.bind(99); results = productOql.execute(); if (!results.hasMore()) { Product productToCreate = new Product(); productToCreate.setId(99); productToCreate.setName("product99"); productToCreate.setPrice(900); LOG.debug("Creating new computer: " + productToCreate); db.create(productToCreate); } else { LOG.debug("Query result: " + results.next()); } LOG.info("End transaction: create non-leaf node"); db.commit(); } }