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;
   }
  
  
  

Reply via email to