You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2006/12/03 18:55:49 UTC

svn commit: r481844 - in /incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb: alt/containers/castor_cmp11/CastorCmpEngine.java core/cmp/CmpContainer.java core/cmp/CmpEngine.java

Author: dain
Date: Sun Dec  3 09:55:48 2006
New Revision: 481844

URL: http://svn.apache.org/viewvc?view=rev&rev=481844
Log:
Replace findByPrimaryKey with load

Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java?view=diff&rev=481844&r1=481843&r2=481844
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java Sun Dec  3 09:55:48 2006
@@ -34,7 +34,6 @@
 import org.exolab.castor.jdo.TransactionNotInProgressException;
 import org.exolab.castor.mapping.AccessMode;
 import org.exolab.castor.persist.spi.CallbackInterceptor;
-import org.exolab.castor.persist.spi.Complex;
 import org.exolab.castor.persist.spi.InstanceFactory;
 
 import javax.ejb.CreateException;
@@ -49,8 +48,6 @@
 import javax.transaction.TransactionManager;
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.rmi.RemoteException;
@@ -114,7 +111,6 @@
             bindTransactionManagerReference(di, transactionManagerJndiName, txReference);
 
             configureKeyGenerator(di);
-            addFindByPrimaryKeyQueries(di);
         }
 
 
@@ -180,12 +176,12 @@
         }
     }
 
-    public Object loadBean(ThreadContext callContext) {
+    public Object loadBean(ThreadContext callContext, Object primaryKey) {
         try {
             Database db = getDatabase(callContext);
 
-            Object primaryKey = getPrimaryKey(callContext);
-            Object bean = db.load(callContext.getDeploymentInfo().getBeanClass(), primaryKey);
+            Object castorPrimaryKey = getCastorPrimaryKey(callContext, primaryKey);
+            Object bean = db.load(callContext.getDeploymentInfo().getBeanClass(), castorPrimaryKey);
             return bean;
         } catch (org.exolab.castor.jdo.PersistenceException e) {
             throw new EJBException("Unable to load ejb (DeploymentID=\"" + callContext.getDeploymentInfo().getDeploymentID() + "\")", e);
@@ -198,7 +194,7 @@
 
             if (!db.isActive()) db.begin();
 
-            Object primaryKey = getPrimaryKey(callContext);
+            Object primaryKey = getCastorPrimaryKey(callContext, callContext.getPrimaryKey());
             Object bean = db.load(callContext.getDeploymentInfo().getBeanClass(), primaryKey);
             db.remove(bean);
         } catch (org.exolab.castor.jdo.PersistenceException e) {
@@ -206,7 +202,7 @@
         }
     }
 
-    public List<Object> queryBeans(ThreadContext callContext, String queryString, Method callMethod, Object[] args) throws FinderException {
+    public List<Object> queryBeans(ThreadContext callContext, String queryString, Object[] args) throws FinderException {
         try {
             Database db = getDatabase(callContext);
 
@@ -225,21 +221,6 @@
             } else {
                 queryArgs = args.clone();
             }
-            if (callMethod.getName().equals("findByPrimaryKey")) {
-
-                KeyGenerator kg = callContext.getDeploymentInfo().getKeyGenerator();
-
-                if (kg.isKeyComplex()) {
-                    /*
-                    * This code moves the fields of the primary key into a JDO Complex object
-                    * which can then be used in the database.bind operation
-                    */
-                    Complex c = kg.getJdoComplex(queryArgs[0]);
-                    queryArgs = new Object[c.size()];
-                    for (int i = 0; i < queryArgs.length; i++)
-                        queryArgs[i] = c.get(i);
-                }
-            }
 
             for (int i = 0; i < queryArgs.length; i++) {
                 if (queryArgs[i] instanceof EJBObject) {
@@ -303,13 +284,13 @@
         }
     }
 
-    private Object getPrimaryKey(ThreadContext callContext) {
-        Object primaryKey = callContext.getPrimaryKey();
+    private Object getCastorPrimaryKey(ThreadContext callContext, Object primaryKey) {
         KeyGenerator kg = callContext.getDeploymentInfo().getKeyGenerator();
         if (kg.isKeyComplex()) {
-            primaryKey = kg.getJdoComplex(callContext.getPrimaryKey());
+            return kg.getJdoComplex(primaryKey);
+        } else {
+            return primaryKey;
         }
-        return primaryKey;
     }
 
     private Database getDatabase(ThreadContext callContext) throws PersistenceException {
@@ -385,35 +366,6 @@
         } catch (Exception e) {
             logger.error("Unable to create KeyGenerator for deployment id = " + di.getDeploymentID(), e);
             throw new SystemException("Unable to create KeyGenerator for deployment id = " + di.getDeploymentID(), e);
-        }
-    }
-
-    private void addFindByPrimaryKeyQueries(CoreDeploymentInfo di) throws SystemException {
-        try {
-            StringBuffer findByPrimarKeyQuery = new StringBuffer("SELECT e FROM " + di.getBeanClass().getName() + " e WHERE ");
-
-            Field primaryKeyField = di.getPrimaryKeyField();
-            if (primaryKeyField != null) {
-                findByPrimarKeyQuery.append("e.").append(primaryKeyField.getName()).append(" = $1");
-            } else {
-                Field[] pkFields = di.getPrimaryKeyClass().getFields();
-                for (int i = 1; i <= pkFields.length; i++) {
-                    findByPrimarKeyQuery.append("e.").append(pkFields[i - 1].getName()).append(" = $").append(i);
-                    if ((i + 1) <= pkFields.length) findByPrimarKeyQuery.append(" AND ");
-                }
-
-            }
-
-            if (di.getHomeInterface() != null) {
-                Method findByPrimaryKeyMethod = di.getHomeInterface().getMethod("findByPrimaryKey", di.getPrimaryKeyClass());
-                di.addQuery(findByPrimaryKeyMethod, findByPrimarKeyQuery.toString());
-            }
-            if (di.getLocalHomeInterface() != null) {
-                Method findByPrimaryKeyMethod = di.getLocalHomeInterface().getMethod("findByPrimaryKey", di.getPrimaryKeyClass());
-                di.addQuery(findByPrimaryKeyMethod, findByPrimarKeyQuery.toString());
-            }
-        } catch (Exception e) {
-            throw new SystemException("Could not generate a query statement for the findByPrimaryKey method of the deployment = " + di.getDeploymentID(), e);
         }
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java?view=diff&rev=481844&r1=481843&r2=481844
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java Sun Dec  3 09:55:48 2006
@@ -158,6 +158,8 @@
                 if (declaringClass != EJBHome.class && declaringClass != EJBLocalHome.class) {
                     if (methodName.equals("create")) {
                         return createEJBObject(callMethod, args, callContext);
+                    } else if (methodName.equals("findByPrimaryKey")) {
+                        return findByPrimaryKey(callMethod, args, callContext);
                     } else if (methodName.startsWith("find")) {
                         return findEJBObject(callMethod, args, callContext);
                     } else {
@@ -357,7 +359,7 @@
         EntityBean bean = null;
         Object returnValue = null;
         try {
-            bean = (EntityBean) cmpEngine.loadBean(callContext);
+            bean = (EntityBean) cmpEngine.loadBean(callContext, callContext.getPrimaryKey());
 
             returnValue = runMethod.invoke(bean, args);
 
@@ -476,6 +478,35 @@
         return new ProxyInfo(deploymentInfo, primaryKey, objectInterface, this);
     }
 
+    private Object findByPrimaryKey(Method callMethod, Object[] args, ThreadContext callContext) throws OpenEJBException {
+        CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+
+        // Get the transaction policy assigned to this method
+        TransactionPolicy txPolicy = callContext.getDeploymentInfo().getTransactionPolicy(callMethod);
+        TransactionContext txContext = new TransactionContext(callContext, transactionManager);
+
+        txPolicy.beforeInvoke(null, txContext);
+        try {
+            EntityBean bean = (EntityBean) cmpEngine.loadBean(callContext, args[0]);
+
+            // rebuild the primary key
+            KeyGenerator kg = deploymentInfo.getKeyGenerator();
+            Object primaryKey = kg.getPrimaryKey(bean);
+
+            // Determine the proxy type
+            Class<?> callingClass = callMethod.getDeclaringClass();
+            Class objectInterface = deploymentInfo.getObjectInterface(callingClass);
+
+            // create a new ProxyInfo based on the deployment info and primary key
+            return new ProxyInfo(deploymentInfo, primaryKey, objectInterface, this);
+        } catch (Throwable e) {// handle reflection exception
+            txPolicy.handleSystemException(e, null, txContext);
+        } finally {
+            txPolicy.afterInvoke(null, txContext);
+        }
+        throw new AssertionError("Should not get here");
+    }
+
     private Object findEJBObject(Method callMethod, Object[] args, ThreadContext callContext) throws OpenEJBException {
         CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
 
@@ -488,7 +519,7 @@
 
         txPolicy.beforeInvoke(null, txContext);
         try {
-            List<Object> results = cmpEngine.queryBeans(callContext, queryString, callMethod, args);
+            List<Object> results = cmpEngine.queryBeans(callContext, queryString, args);
 
             KeyGenerator kg = deploymentInfo.getKeyGenerator();
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java?view=diff&rev=481844&r1=481843&r2=481844
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java Sun Dec  3 09:55:48 2006
@@ -31,9 +31,9 @@
 
     Object createBean(EntityBean entity, ThreadContext callContext) throws CreateException;
 
-    Object loadBean(ThreadContext callContext);
+    Object loadBean(ThreadContext callContext, Object primaryKey);
 
     void removeBean(ThreadContext callContext);
 
-    List<Object> queryBeans(ThreadContext callContext, String queryString, Method callMethod, Object[] args) throws FinderException;
+    List<Object> queryBeans(ThreadContext callContext, String queryString, Object[] args) throws FinderException;
 }