gdamour 2005/07/03 06:08:38
Modified: modules/itests/src/java/org/openejb/test/entity/cmp2/prefetch
PrefetchFacadeBean.java PrefetchFacadeObject.java
Log:
GERONIMO 665 - CMR pre-fetching.
Pre-fetching works for CMP, CMP fields, CMR fields, finders and selects.
Revision Changes Path
1.2 +188 -61
openejb/modules/itests/src/java/org/openejb/test/entity/cmp2/prefetch/PrefetchFacadeBean.java
Index: PrefetchFacadeBean.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/itests/src/java/org/openejb/test/entity/cmp2/prefetch/PrefetchFacadeBean.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PrefetchFacadeBean.java 22 Jun 2005 11:27:20 -0000 1.1
+++ PrefetchFacadeBean.java 3 Jul 2005 10:08:38 -0000 1.2
@@ -49,8 +49,9 @@
import java.rmi.RemoteException;
import java.sql.Connection;
-import java.sql.PreparedStatement;
+import java.sql.SQLException;
import java.sql.Statement;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
@@ -83,69 +84,124 @@
public class PrefetchFacadeBean implements javax.ejb.SessionBean {
private InitialContext jndiContext;
private SessionContext ctx;
-
- public void invokeOrderLocalHomeFindPrefetchAll() throws
TestFailureException {
- UserTransaction userTransaction = ctx.getUserTransaction();
- try {
- userTransaction.begin();
- setUp();
- userTransaction.commit();
- } catch (Exception e) {
- Assert.fail("Received Exception " + e.getClass() + " : " +
e.getMessage());
- }
+
+ public void testDoesNotOverwriteUpdates() throws TestFailureException {
+ TestAction action = new TestAction() {
+ public void executeTest(UserTransaction userTransaction) throws
Exception {
+ userTransaction.begin();
+ try {
+ OrderLocalHome home = (OrderLocalHome)
javax.rmi.PortableRemoteObject.narrow(jndiContext.lookup("java:comp/env/ejb/Order"),
OrderLocalHome.class);
+ Integer orderId = new Integer(1);
+ OrderLocal order = home.findByPrimaryKey(orderId);
+ order.setReference("new Reference");
+ order.setBillingAddress(null);
+ order.setShippingAddress(null);
+ order.setLineItems(new HashSet());
+
+ order = home.findPrefetchAll(orderId);
+ Assert.assertEquals("new Reference",
order.getReference());
+ Assert.assertNull(order.getBillingAddress());
+ Assert.assertNull(order.getShippingAddress());
+ Assert.assertEquals(0, order.getLineItems().size());
+ } finally {
+ userTransaction.commit();
+ }
+ }
+ };
- try {
- userTransaction.begin();
+ TestTemplate template = new TestTemplate(action);
+ template.execute();
+ }
- OrderLocalHome home = (OrderLocalHome)
javax.rmi.PortableRemoteObject.narrow(jndiContext.lookup("java:comp/env/ejb/Order"),
OrderLocalHome.class);
- Integer orderId = new Integer(1);
- OrderLocal order = home.findPrefetchAll(orderId);
-
- DataSource ds = (DataSource)
jndiContext.lookup("java:comp/env/jdbc/CMPDatasource");
- Connection con = ds.getConnection();
- Statement statement = con.createStatement();
- int nbUpdates = statement.executeUpdate("UPDATE order_table SET
reference = ''");
- Assert.assertEquals(1, nbUpdates);
- nbUpdates = statement.executeUpdate("UPDATE address SET street =
''");
- Assert.assertEquals(2, nbUpdates);
- nbUpdates = statement.executeUpdate("UPDATE line_item SET
quantity = 0");
- Assert.assertEquals(2, nbUpdates);
- nbUpdates = statement.executeUpdate("UPDATE product SET name =
''");
- Assert.assertEquals(1, nbUpdates);
-
- Assert.assertEquals("order1", order.getReference());
- AddressLocal address = order.getBillingAddress();
- Assert.assertEquals("street1", address.getStreet());
- Assert.assertEquals("city1", address.getCity());
- address = order.getShippingAddress();
- Assert.assertEquals("street2", address.getStreet());
- Assert.assertEquals("city2", address.getCity());
- int cpt = 0;
- Set lineItems = order.getLineItems();
- for (Iterator iter = lineItems.iterator(); iter.hasNext();) {
- LineItemLocal lineItem = (LineItemLocal) iter.next();
- int quantity = lineItem.getQuantity();
- Assert.assertTrue(10 == lineItem.getQuantity() || 20 ==
lineItem.getQuantity());
- ProductLocal product = lineItem.getProduct();
- Assert.assertEquals("product_name1", product.getName());
- Assert.assertEquals("product_type1",
product.getProductType());
- cpt++;
- }
-
- userTransaction.commit();
- } catch (AssertionFailedError e) {
- throw new TestFailureException(e);
- } catch (Exception e) {
- Assert.fail("Received Exception " + e.getClass() + " : " +
e.getMessage());
- } finally {
- try {
+ public void testFinderPrefetch() throws TestFailureException {
+ TestAction action = new TestAction() {
+ public void executeTest(UserTransaction userTransaction) throws
Exception {
userTransaction.begin();
- cleanUp();
- userTransaction.commit();
- } catch (Exception e) {
- Assert.fail("Received Exception " + e.getClass() + " : " +
e.getMessage());
+ try {
+ OrderLocalHome home = (OrderLocalHome)
javax.rmi.PortableRemoteObject.narrow(jndiContext.lookup("java:comp/env/ejb/Order"),
OrderLocalHome.class);
+ Integer orderId = new Integer(1);
+ OrderLocal order = home.findPrefetchAll(orderId);
+
+ validatePrefetch(order);
+ } finally {
+ userTransaction.commit();
+ }
}
- }
+ };
+
+ TestTemplate template = new TestTemplate(action);
+ template.execute();
+ }
+
+ public void testEJBPrefetch() throws TestFailureException {
+ TestAction action = new TestAction() {
+ public void executeTest(UserTransaction userTransaction) throws
Exception {
+ userTransaction.begin();
+ try {
+ LineItemLocalHome home = (LineItemLocalHome)
javax.rmi.PortableRemoteObject.narrow(jndiContext.lookup("java:comp/env/ejb/LineItem"),
LineItemLocalHome.class);
+ Integer orderId = new Integer(1);
+ LineItemLocal lineItem = home.findByPrimaryKey(orderId);
+ Assert.assertEquals(10, lineItem.getQuantity());
+
+ DataSource ds = (DataSource)
jndiContext.lookup("java:comp/env/jdbc/CMPDatasource");
+ Connection con = ds.getConnection();
+ Statement statement = con.createStatement();
+ int nbUpdates = statement.executeUpdate("UPDATE product
SET name = ''");
+ Assert.assertEquals(1, nbUpdates);
+
+ ProductLocal product = lineItem.getProduct();
+ Assert.assertEquals("product_name1", product.getName());
+ Assert.assertEquals("product_type1",
product.getProductType());
+ } finally {
+ userTransaction.commit();
+ }
+ }
+ };
+
+ TestTemplate template = new TestTemplate(action);
+ template.execute();
+ }
+
+ public void testCMPPrefetch() throws TestFailureException {
+ TestAction action = new TestAction() {
+ public void executeTest(UserTransaction userTransaction) throws
Exception {
+ userTransaction.begin();
+ try {
+ OrderLocalHome home = (OrderLocalHome)
javax.rmi.PortableRemoteObject.narrow(jndiContext.lookup("java:comp/env/ejb/Order"),
OrderLocalHome.class);
+ Integer orderId = new Integer(1);
+ OrderLocal order = home.findByPrimaryKey(orderId);
+ Assert.assertEquals("order1", order.getReference());
+
+ validatePrefetch(order);
+ } finally {
+ userTransaction.commit();
+ }
+ }
+ };
+
+ TestTemplate template = new TestTemplate(action);
+ template.execute();
+ }
+
+ public void testCMRPrefetch() throws TestFailureException {
+ TestAction action = new TestAction() {
+ public void executeTest(UserTransaction userTransaction) throws
Exception {
+ userTransaction.begin();
+ try {
+ OrderLocalHome home = (OrderLocalHome)
javax.rmi.PortableRemoteObject.narrow(jndiContext.lookup("java:comp/env/ejb/Order"),
OrderLocalHome.class);
+ Integer orderId = new Integer(1);
+ OrderLocal order = home.findByPrimaryKey(orderId);
+ order.getBillingAddress();
+
+ validatePrefetch(order);
+ } finally {
+ userTransaction.commit();
+ }
+ }
+ };
+
+ TestTemplate template = new TestTemplate(action);
+ template.execute();
}
public void ejbCreate() throws javax.ejb.CreateException{
@@ -221,6 +277,77 @@
throw (AssertionFailedError) new
AssertionFailedError(e.getMessage()).initCause(e);
} catch (RemoveException e) {
throw (AssertionFailedError) new
AssertionFailedError(e.getMessage()).initCause(e);
+ }
+ }
+
+ private void validatePrefetch(OrderLocal order) throws NamingException,
SQLException {
+ DataSource ds = (DataSource)
jndiContext.lookup("java:comp/env/jdbc/CMPDatasource");
+ Connection con = ds.getConnection();
+ Statement statement = con.createStatement();
+ int nbUpdates = statement.executeUpdate("UPDATE order_table SET
reference = ''");
+ Assert.assertEquals(1, nbUpdates);
+ nbUpdates = statement.executeUpdate("UPDATE address SET street =
''");
+ Assert.assertEquals(2, nbUpdates);
+ nbUpdates = statement.executeUpdate("UPDATE line_item SET quantity =
0");
+ Assert.assertEquals(2, nbUpdates);
+ nbUpdates = statement.executeUpdate("UPDATE product SET name = ''");
+ Assert.assertEquals(1, nbUpdates);
+
+ Assert.assertEquals("order1", order.getReference());
+ AddressLocal address = order.getBillingAddress();
+ Assert.assertEquals("street1", address.getStreet());
+ Assert.assertEquals("city1", address.getCity());
+ address = order.getShippingAddress();
+ Assert.assertEquals("street2", address.getStreet());
+ Assert.assertEquals("city2", address.getCity());
+ int cpt = 0;
+ Set lineItems = order.getLineItems();
+ for (Iterator iter = lineItems.iterator(); iter.hasNext();) {
+ LineItemLocal lineItem = (LineItemLocal) iter.next();
+ int quantity = lineItem.getQuantity();
+ Assert.assertTrue(10 == lineItem.getQuantity() || 20 ==
lineItem.getQuantity());
+ ProductLocal product = lineItem.getProduct();
+ Assert.assertEquals("product_name1", product.getName());
+ Assert.assertEquals("product_type1", product.getProductType());
+ cpt++;
+ }
+ Assert.assertEquals(2, cpt);
+ }
+
+ private interface TestAction {
+ public void executeTest(UserTransaction userTransaction) throws
Exception;
+ }
+
+ private class TestTemplate {
+ private final TestAction action;
+ private TestTemplate(TestAction action) {
+ this.action = action;
+ }
+ public void execute() throws TestFailureException {
+ UserTransaction userTransaction = ctx.getUserTransaction();
+ try {
+ userTransaction.begin();
+ setUp();
+ userTransaction.commit();
+ } catch (Exception e) {
+ Assert.fail("Received Exception " + e.getClass() + " : " +
e.getMessage());
+ }
+
+ try {
+ action.executeTest(userTransaction);
+ } catch (AssertionFailedError e) {
+ throw new TestFailureException(e);
+ } catch (Throwable e) {
+ Assert.fail("Received Exception " + e.getClass() + " : " +
e.getMessage());
+ } finally {
+ try {
+ userTransaction.begin();
+ cleanUp();
+ userTransaction.commit();
+ } catch (Exception e) {
+ Assert.fail("Received Exception " + e.getClass() + " : "
+ e.getMessage());
+ }
+ }
}
}
}
1.2 +8 -2
openejb/modules/itests/src/java/org/openejb/test/entity/cmp2/prefetch/PrefetchFacadeObject.java
Index: PrefetchFacadeObject.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/itests/src/java/org/openejb/test/entity/cmp2/prefetch/PrefetchFacadeObject.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PrefetchFacadeObject.java 22 Jun 2005 11:27:20 -0000 1.1
+++ PrefetchFacadeObject.java 3 Jul 2005 10:08:38 -0000 1.2
@@ -56,7 +56,13 @@
* @version $Revision$ $Date$
*/
public interface PrefetchFacadeObject extends javax.ejb.EJBObject {
+ public void testDoesNotOverwriteUpdates() throws RemoteException,
TestFailureException;
- public void invokeOrderLocalHomeFindPrefetchAll() throws
RemoteException, TestFailureException;
+ public void testFinderPrefetch() throws RemoteException,
TestFailureException;
+ public void testEJBPrefetch() throws RemoteException,
TestFailureException;
+
+ public void testCMPPrefetch() throws RemoteException,
TestFailureException;
+
+ public void testCMRPrefetch() throws RemoteException,
TestFailureException;
}