Index: cpactf/src/test/java/org/castor/cpa/test/test2861/TestReferenceChange.java =================================================================== --- cpactf/src/test/java/org/castor/cpa/test/test2861/TestReferenceChange.java (revision 8508) +++ cpactf/src/test/java/org/castor/cpa/test/test2861/TestReferenceChange.java (working copy) @@ -11,10 +11,13 @@ import org.exolab.castor.jdo.Database; import org.exolab.castor.jdo.OQLQuery; import org.exolab.castor.jdo.QueryResults; +import org.exolab.castor.mapping.AccessMode; 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_READ_ONLY = "/org/castor/cpa/test/test2861/mappingReadOnly.xml"; + private static final String DBNAME_READ_ONLY = "test2861ReadOnly"; public static Test suite() throws Exception { TestSuite suite = new TestSuite(TestReferenceChange.class.getName()); @@ -23,6 +26,7 @@ suite.addTest(new TestReferenceChange("testCreateInvoice")); suite.addTest(new TestReferenceChange("testQuerySameInvoiceSubsequent")); suite.addTest(new TestReferenceChange("testQuerySameInvoiceMT")); + suite.addTest(new TestReferenceChange("testQuerySameInvoiceReadOnlyMT")); return suite; } @@ -52,12 +56,36 @@ 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"); @@ -70,7 +98,11 @@ 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(); @@ -78,6 +110,11 @@ } public void testCreateInvoice() throws Exception { + testCreateInvoice1(); + testCreateInvoice2(); + testCreateInvoice3(); + } + public void testCreateInvoice1() throws Exception { LegalPerson acme = null; NaturalPerson marvin = null; Motorcycle motorcycle = null; @@ -143,6 +180,138 @@ 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 vInvoiceItem = new Vector(); + 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 vInvoiceItem = new Vector(); + 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(); @@ -157,7 +326,7 @@ public void testQuerySameInvoiceMT() throws Exception { CPAThreadedTestRunnable[] tcr = new CPAThreadedTestRunnable[10]; for (int i = 0; i < tcr.length; i++) { - tcr[i] = new TestReferenceRunnable(this); + tcr[i] = new TestReferenceRunnable(this,false); } runTestRunnables(tcr); } @@ -180,7 +349,44 @@ db.commit(); db.close(); + + assertTrue(invoice != null); + } + + public void testQuerySameInvoiceReadOnlyMT() throws Exception { + //get here to avoid [Thread-12] - Configuration for database 'test2861ReadOnly' loaded twice. + Database db = getJDOManager(DBNAME_READ_ONLY, MAPPING_READ_ONLY).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_READ_ONLY, MAPPING_READ_ONLY).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(db.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); } + } Index: cpactf/src/test/java/org/castor/cpa/test/test2861/TestReferenceRunnable.java =================================================================== --- cpactf/src/test/java/org/castor/cpa/test/test2861/TestReferenceRunnable.java (revision 8510) +++ cpactf/src/test/java/org/castor/cpa/test/test2861/TestReferenceRunnable.java (working copy) @@ -9,13 +9,19 @@ @Ignore public class TestReferenceRunnable extends CPAThreadedTestRunnable { private final TestReferenceChange _test; + private boolean _readOnly; - public TestReferenceRunnable(final TestReferenceChange test) { + public TestReferenceRunnable(final TestReferenceChange test, boolean readOnly) { _test = test; + _readOnly = readOnly; } @Override public void runTest() throws Throwable { - _test.executeQuery(); + if (_readOnly) { + _test.executeQueryReadOnly(); + } else { + _test.executeQuery(); + } } } Index: cpactf/src/test/resources/org/castor/cpa/test/test2861/mappingReadOnly.xml =================================================================== --- cpactf/src/test/resources/org/castor/cpa/test/test2861/mappingReadOnly.xml (revision 0) +++ cpactf/src/test/resources/org/castor/cpa/test/test2861/mappingReadOnly.xml (revision 0) @@ -0,0 +1,145 @@ + + + + + + Person + + + + + + + + + + + + + + + NaturalPerson + + + + + + + + + + + + + LegalPerson + + + + + + + + + + + + Product + + + + + + + + + + + + Motorcycle + + + + + + + + + + + + + + + + + + Invoice + + + + + + + + + + + + + + + + + + + + + org.castor.cpa.test.test2861.InvoiceItem + + + + + + + + + + + + + + + + + + + + + + + + Invoice + + + + + + + + + + + + + + + + + + \ No newline at end of file