package org.castor.cpa.test.test2861; import java.util.Vector; import junit.framework.Test; import junit.framework.TestSuite; import org.castor.cpa.test.framework.CPAThreadedTestCase; import org.castor.cpa.test.framework.CPAThreadedTestRunnable; 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 final class TestReferenceChange extends CPAThreadedTestCase { private static final String DBNAME = "test2861"; private static final String MAPPING = "/org/castor/cpa/test/test2861/mapping.xml"; private static final String MAPPING_RO = "/org/castor/cpa/test/test2861/mappingReadOnly.xml"; private static final String DBNAME_RO = "test2861ReadOnly"; public static Test suite() throws Exception { TestSuite suite = new TestSuite(TestReferenceChange.class.getName()); suite.addTest(new TestReferenceChange("createObjects")); suite.addTest(new TestReferenceChange("testCreateInvoice")); suite.addTest(new TestReferenceChange("testQuerySameInvoiceSubsequent")); suite.addTest(new TestReferenceChange("testQuerySameInvoiceMT")); suite.addTest(new TestReferenceChange("testQuerySameInvoiceReadOnlyMT")); return suite; } public TestReferenceChange(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.MYSQL) || (engine == DatabaseEngineType.POSTGRESQL) || (engine == DatabaseEngineType.SAPDB); } public void createObjects() throws Exception { LegalPerson acme = new LegalPerson(); acme.setOid("AAAAacme"); acme.setName("ACME INC."); acme.setFederalTaxNumber("1"); NaturalPerson marvin = new NaturalPerson(); marvin.setOid("AAmarvin"); marvin.setName("MARVIN ACME"); marvin.setSocialSecurityNumber("2"); marvin.setCreator(acme); NaturalPerson baby = new NaturalPerson(); baby.setOid("AAAAbaby"); baby.setName("BABY HERMAN"); baby.setSocialSecurityNumber("3"); baby.setCreator(acme); NaturalPerson judge = new NaturalPerson(); judge.setOid("AAAjudge"); judge.setName("JUDGE DOOM"); judge.setSocialSecurityNumber("4"); judge.setCreator(acme); Motorcycle motorcycle = new Motorcycle(); motorcycle.setOid("AAAAMT01"); motorcycle.setChassisNumber("CHASSIS00001"); motorcycle.setHolder(marvin); motorcycle.setReseller(acme); Motorcycle motorcycle2 = new Motorcycle(); motorcycle2.setOid("AAAAMT02"); motorcycle2.setChassisNumber("CHASSIS00002"); motorcycle2.setHolder(acme); motorcycle2.setReseller(acme); Motorcycle motorcycle3 = new Motorcycle(); motorcycle3.setOid("AAAAMT03"); motorcycle3.setChassisNumber("CHASSIS00003"); motorcycle3.setHolder(acme); motorcycle3.setReseller(acme); Parameter invoiceSeq = new Parameter(); invoiceSeq.setOid("AAAINVSQ"); invoiceSeq.setIdSys("INVSEQ"); invoiceSeq.setIntValue(new Integer(0)); invoiceSeq.setPerson(acme); Database db = getJDOManager(DBNAME, MAPPING).getDatabase(); db.setAutoStore(false); db.begin(); db.create(acme); db.create(marvin); db.create(baby); db.create(judge); db.create(motorcycle); db.create(motorcycle2); db.create(motorcycle3); db.create(invoiceSeq); db.commit(); db.close(); } public void testCreateInvoice() throws Exception { testCreateInvoice1(); testCreateInvoice2(); testCreateInvoice3(); } public void testCreateInvoice1() throws Exception { LegalPerson acme = null; NaturalPerson marvin = null; Motorcycle motorcycle = null; Database db = getJDOManager(DBNAME, MAPPING).getDatabase(); db.setAutoStore(false); db.begin(); acme = db.load(LegalPerson.class, "AAAAacme"); marvin = db.load(NaturalPerson.class, "AAmarvin"); motorcycle = db.load(Motorcycle.class, "AAAAMT01"); db.commit(); Vector<InvoiceItem> vInvoiceItem = new Vector<InvoiceItem>(); Invoice invoice = new Invoice(); invoice.setOid("AAAINV01"); invoice.setEmitter(marvin); invoice.setBillTo(acme); invoice.setInvoiceItem(vInvoiceItem); InvoiceItem invoiceItem = new InvoiceItem(); invoiceItem.setOid("AINVIT01"); invoiceItem.setInvoice(invoice); invoiceItem.setProduct(motorcycle); invoiceItem.setQuantity(new Integer(1)); invoiceItem.setPrice(new Double(12000)); invoiceItem.setTotal(new Double(12000)); vInvoiceItem.add(invoiceItem); motorcycle.setHolder(acme); db.setAutoStore(false); db.begin(); OQLQuery oql = db.getOQLQuery( "SELECT obj FROM " + Parameter.class.getName() + " obj " + "WHERE person.oid = $1 AND idSys = $2"); oql.bind(acme.getOid()); oql.bind("INVSEQ"); QueryResults results = oql.execute(); Parameter invoiceSeq = null; if (results.hasMore()) { invoiceSeq = (Parameter) results.nextElement(); } int newInvoiceSeq = invoiceSeq.getIntValue().intValue() + 1; invoiceSeq.setIntValue(new Integer(newInvoiceSeq)); invoice.setNumber(invoiceSeq.getIntValue()); oql.close(); results.close(); db.update(motorcycle); db.create(invoice); db.commit(); db.begin(); motorcycle = db.load(Motorcycle.class, "AAAAMT01"); db.commit(); assertEquals(motorcycle.getHolder().getName(), acme.getName()); db.close(); } public void testCreateInvoice2() throws Exception { LegalPerson acme = null; NaturalPerson baby = null; Motorcycle motorcycle = null; Database db = getJDOManager(DBNAME, MAPPING).getDatabase(); db.setAutoStore(false); db.begin(); acme = db.load(LegalPerson.class, "AAAAacme"); baby = db.load(NaturalPerson.class, "AAAAbaby"); motorcycle = db.load(Motorcycle.class, "AAAAMT02"); db.commit(); Vector<InvoiceItem> vInvoiceItem = new Vector<InvoiceItem>(); Invoice invoice = new Invoice(); invoice.setOid("AAAINV02"); invoice.setEmitter(acme); invoice.setBillTo(baby); invoice.setInvoiceItem(vInvoiceItem); InvoiceItem invoiceItem = new InvoiceItem(); invoiceItem.setOid("AINVIT02"); invoiceItem.setInvoice(invoice); invoiceItem.setProduct(motorcycle); invoiceItem.setQuantity(new Integer(1)); invoiceItem.setPrice(new Double(13000)); invoiceItem.setTotal(new Double(13000)); vInvoiceItem.add(invoiceItem); motorcycle.setHolder(baby); db.setAutoStore(false); db.begin(); OQLQuery oql = db.getOQLQuery( "SELECT obj FROM " + Parameter.class.getName() + " obj " + "WHERE person.oid = $1 AND idSys = $2"); oql.bind(acme.getOid()); oql.bind("INVSEQ"); QueryResults results = oql.execute(); Parameter invoiceSeq = null; if (results.hasMore()) { invoiceSeq = (Parameter) results.nextElement(); } int newInvoiceSeq = invoiceSeq.getIntValue().intValue() + 1; invoiceSeq.setIntValue(new Integer(newInvoiceSeq)); invoice.setNumber(invoiceSeq.getIntValue()); oql.close(); results.close(); db.update(motorcycle); db.create(invoice); db.commit(); db.begin(); motorcycle = db.load(Motorcycle.class, "AAAAMT02"); db.commit(); assertEquals(motorcycle.getHolder().getName(), baby.getName()); db.close(); } public void testCreateInvoice3() throws Exception { LegalPerson acme = null; NaturalPerson judge = null; Motorcycle motorcycle = null; Database db = getJDOManager(DBNAME, MAPPING).getDatabase(); db.setAutoStore(false); db.begin(); acme = db.load(LegalPerson.class, "AAAAacme"); judge = db.load(NaturalPerson.class, "AAAjudge"); motorcycle = db.load(Motorcycle.class, "AAAAMT03"); db.commit(); Vector<InvoiceItem> vInvoiceItem = new Vector<InvoiceItem>(); Invoice invoice = new Invoice(); invoice.setOid("AAAINV03"); invoice.setEmitter(acme); invoice.setBillTo(judge); invoice.setInvoiceItem(vInvoiceItem); InvoiceItem invoiceItem = new InvoiceItem(); invoiceItem.setOid("AINVIT03"); invoiceItem.setInvoice(invoice); invoiceItem.setProduct(motorcycle); invoiceItem.setQuantity(new Integer(1)); invoiceItem.setPrice(new Double(23000)); invoiceItem.setTotal(new Double(23000)); vInvoiceItem.add(invoiceItem); motorcycle.setHolder(judge); db.setAutoStore(false); db.begin(); OQLQuery oql = db.getOQLQuery( "SELECT obj FROM " + Parameter.class.getName() + " obj " + "WHERE person.oid = $1 AND idSys = $2"); oql.bind(acme.getOid()); oql.bind("INVSEQ"); QueryResults results = oql.execute(); Parameter invoiceSeq = null; if (results.hasMore()) { invoiceSeq = (Parameter) results.nextElement(); } int newInvoiceSeq = invoiceSeq.getIntValue().intValue() + 1; invoiceSeq.setIntValue(new Integer(newInvoiceSeq)); invoice.setNumber(invoiceSeq.getIntValue()); oql.close(); results.close(); db.update(motorcycle); db.create(invoice); db.commit(); db.begin(); motorcycle = db.load(Motorcycle.class, "AAAAMT03"); db.commit(); assertEquals(motorcycle.getHolder().getName(), judge.getName()); db.close(); } public void testQuerySameInvoiceSubsequent() throws Exception { // first try executeQuery(); // second try executeQuery(); // third try executeQuery(); } public void testQuerySameInvoiceMT() throws Exception { // initialize JDOManager once before starting threads. getJDOManager(DBNAME, MAPPING).getDatabase(); CPAThreadedTestRunnable[] tcr = new CPAThreadedTestRunnable[10]; for (int i = 0; i < tcr.length; i++) { tcr[i] = new TestReferenceRunnable(this, false); } runTestRunnables(tcr); } protected void executeQuery() throws Exception { Invoice invoice = null; Database db = getJDOManager(DBNAME, MAPPING).getDatabase(); db.begin(); String oql = "SELECT obj FROM " + Invoice.class.getName() + " obj WHERE oid = $1 "; OQLQuery query = db.getOQLQuery(oql); query.bind("AAAINV01"); QueryResults results = query.execute(); if (results.hasMore()) { invoice = (Invoice) results.nextElement(); } results.close(); query.close(); db.commit(); db.close(); assertTrue(invoice != null); } public void testQuerySameInvoiceReadOnlyMT() throws Exception { // initialize JDOManager once before starting threads. getJDOManager(DBNAME_RO, MAPPING_RO).getDatabase(); CPAThreadedTestRunnable[] tcr = new CPAThreadedTestRunnable[10]; for (int i = 0; i < tcr.length; i++) { tcr[i] = new TestReferenceRunnable(this, true); } runTestRunnables(tcr); } protected void executeQueryReadOnly() throws Exception { Invoice invoice = null; Database db = getJDOManager(DBNAME_RO, MAPPING_RO).getDatabase(); db.begin(); String oql = "SELECT obj FROM " + Invoice.class.getName() + " obj " + "WHERE emitter = $1 and invoiceItem.quantity > $2"; OQLQuery query = db.getOQLQuery(oql); query.bind("AAAAacme"); query.bind(new Integer(0)); QueryResults results = query.execute(Database.READONLY); int invoiceCount = 0; while (results.hasMore()) { invoice = (Invoice) results.nextElement(); invoiceCount++; } results.close(); query.close(); db.commit(); db.close(); assertTrue(invoice != null); assertTrue(invoiceCount == 2); } }