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