gdamour 2004/12/09 19:40:31
Modified: modules/openejb-builder/src/java/org/openejb/deployment
CMPContainerBuilder.java CMPEntityBuilder.java
Log:
Intermediate commit for EJB QL support.
Finders have been hooked in. Basic EJB QL queries work properly.
Revision Changes Path
1.6 +65 -54
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java
Index: CMPContainerBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- CMPContainerBuilder.java 6 Dec 2004 06:32:33 -0000 1.5
+++ CMPContainerBuilder.java 10 Dec 2004 00:40:31 -0000 1.6
@@ -48,11 +48,13 @@
package org.openejb.deployment;
import java.lang.reflect.Method;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+
import javax.ejb.TimedObject;
import javax.ejb.Timer;
import javax.management.ObjectName;
@@ -100,10 +102,11 @@
import org.tranql.ejb.CMPFieldTransform;
import org.tranql.ejb.CMRField;
import org.tranql.ejb.EJB;
+import org.tranql.ejb.EJBLocalObjectAsIdTransform;
+import org.tranql.ejb.EJBObjectAsIdTransform;
import org.tranql.ejb.EJBQueryBuilder;
import org.tranql.ejb.EJBSchema;
-import org.tranql.ejb.IdAsEJBLocalObjectTransform;
-import org.tranql.ejb.IdAsEJBObjectTransform;
+import org.tranql.ejb.FinderEJBQLQuery;
import org.tranql.ejb.LocalProxyTransform;
import org.tranql.ejb.ManyToManyCMR;
import org.tranql.ejb.ManyToOneCMR;
@@ -115,6 +118,7 @@
import org.tranql.ejb.SingleValuedCMRAccessor;
import org.tranql.ejb.SingleValuedCMRFaultHandler;
import org.tranql.ejb.TransactionManagerDelegate;
+import org.tranql.field.DomainIdentityAccessor;
import org.tranql.field.FieldAccessor;
import org.tranql.field.FieldTransform;
import org.tranql.field.ReferenceAccessor;
@@ -125,6 +129,7 @@
import org.tranql.identity.UndefinedIdentityException;
import org.tranql.identity.UserDefinedIdentity;
import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
+import org.tranql.ql.Query;
import org.tranql.ql.QueryBinding;
import org.tranql.ql.QueryBindingImpl;
import org.tranql.ql.QueryException;
@@ -136,6 +141,8 @@
import org.tranql.schema.Association;
import org.tranql.schema.Attribute;
import org.tranql.schema.Schema;
+import org.tranql.sql.SQLSchema;
+import org.tranql.sql.sql92.EJBQLToPhysicalQuery;
/**
* @version $Revision$ $Date$
@@ -143,10 +150,9 @@
public class CMPContainerBuilder extends AbstractContainerBuilder {
private boolean cmp2 = true;
private EJBSchema ejbSchema;
- private Schema sqlSchema;
+ private SQLSchema sqlSchema;
private GlobalSchema globalSchema;
private EJB ejb;
- private Map queries;
private TransactionManagerDelegate tm;
public boolean isCMP2() {
@@ -161,14 +167,6 @@
return EJBComponentType.CMP_ENTITY;
}
- public Map getQueries() {
- return queries;
- }
-
- public void setQueries(Map queries) {
- this.queries = queries;
- }
-
public EJBSchema getEJBSchema() {
return ejbSchema;
}
@@ -181,7 +179,7 @@
return sqlSchema;
}
- public void setSQLSchema(Schema sqlSchema) {
+ public void setSQLSchema(SQLSchema sqlSchema) {
this.sqlSchema = sqlSchema;
}
@@ -242,46 +240,9 @@
loadCommand = mapper.transform(loadCommand);
FaultHandler faultHandler = new QueryFaultHandler(loadCommand,
identityDefiner, slotLoaders);
- // queries
- LinkedHashMap queryCommands = new LinkedHashMap();
- for (Iterator iterator = queries.entrySet().iterator();
iterator.hasNext();) {
- Map.Entry entry = (Map.Entry) iterator.next();
- MethodSignature signature = (MethodSignature) entry.getKey();
-
- // The SQL
- String sql = (String) entry.getValue();
-
- // Parameters
- String[] parameterTypes = signature.getParameterTypes();
- QueryBinding[] parameterTransforms = new
QueryBinding[parameterTypes.length];
- for (int i = 0; i < parameterTransforms.length; i++) {
- parameterTransforms[i] = new QueryBindingImpl(i,
ClassLoading.loadClass(parameterTypes[i], classLoader));
- }
-
- // Local Proxy Results
- FieldTransform localResultsTransform;
- localResultsTransform = new FieldAccessor(0,
proxyFactory.getLocalInterfaceClass());
- localResultsTransform = new
IdAsEJBLocalObjectTransform(localResultsTransform, proxyFactory,
ejb.getPrimaryKeyClass());
-
- QueryCommand localProxyLoad =
sqlSchema.getCommandFactory().createQuery(sql,
- parameterTransforms,
- new QueryBinding[]{new
QueryBindingImpl(localResultsTransform)});
- QueryCommandView localProxyLoadView = new
QueryCommandView(localProxyLoad, new FieldTransform[] {new FieldAccessor(0,
null)});
-
- // Remote Proxy Results
- FieldTransform remoteResultsTransform;
- remoteResultsTransform = new FieldAccessor(0,
proxyFactory.getRemoteInterfaceClass());
- remoteResultsTransform = new
IdAsEJBObjectTransform(remoteResultsTransform, proxyFactory,
ejb.getPrimaryKeyClass());
-
- QueryCommand remoteProxyLoad =
sqlSchema.getCommandFactory().createQuery(sql,
- parameterTransforms,
- new QueryBinding[]{new
QueryBindingImpl(remoteResultsTransform)});
- QueryCommandView remoteProxyLoadView = new
QueryCommandView(remoteProxyLoad, new FieldTransform[] {new FieldAccessor(0,
null)});
-
- queryCommands.put(new InterfaceMethodSignature(signature, true),
- new QueryCommandView[]{localProxyLoadView,
remoteProxyLoadView});
- }
-
+ // EJB QL queries
+ LinkedHashMap queryCommands = createEJBQLQueries(ejb);
+
// findByPrimaryKey
QueryCommandView localProxyLoadView =
queryBuilder.buildFindByPrimaryKey(getEJBName(), true);
QueryCommand localProxyLoad =
mapper.transform(localProxyLoadView.getQueryCommand());
@@ -338,6 +299,56 @@
}
}
+ private LinkedHashMap createEJBQLQueries(EJB ejb) throws Exception {
+ IdentityDefinerBuilder identityDefinerBuilder = new
IdentityDefinerBuilder(globalSchema);
+ IdentityDefiner identityDefiner =
identityDefinerBuilder.getIdentityDefiner(ejb, 0);
+ IdentityTransform identityTransform =
identityDefinerBuilder.getPrimaryKeyTransform(ejb);
+
+ EJBProxyFactory proxyFactory = (EJBProxyFactory)
ejb.getProxyFactory();
+
+ ClassLoader classLoader = getClassLoader();
+
+ LinkedHashMap queryCommands = new LinkedHashMap();
+
+ EJBQLToPhysicalQuery toPhysicalQuery = new
EJBQLToPhysicalQuery(ejbSchema, sqlSchema);
+
+ Collection finders = ejb.getFinderEJBQLQueries();
+ for (Iterator iter = finders.iterator(); iter.hasNext();) {
+ FinderEJBQLQuery finder = (FinderEJBQLQuery) iter.next();
+
+ String[] parameterTypes = finder.getParameterTypes();
+ QueryBinding[] parameterTransforms = new
QueryBinding[parameterTypes.length];
+ for (int i = 0; i < parameterTransforms.length; i++) {
+ parameterTransforms[i] = new QueryBindingImpl(i,
ClassLoading.loadClass(parameterTypes[i], classLoader));
+ }
+
+ List pkFields = ejb.getPrimaryKeyFields();
+ QueryBinding[] resultTransforms = new
QueryBinding[pkFields.size()];
+ for (int i = 0; i < resultTransforms.length; i++) {
+ Attribute attribute = (Attribute) pkFields.get(i);
+ resultTransforms[i] = new QueryBindingImpl(i, ejb,
attribute);
+ }
+
+ Query query = toPhysicalQuery.transform(finder.getEjbQL(),
parameterTransforms, resultTransforms);
+
+ // Local Proxy Results
+ FieldTransform baseView = new ReferenceAccessor(identityDefiner);
+ baseView = new DomainIdentityAccessor(baseView,
identityTransform);
+
+ FieldTransform localView = new
EJBLocalObjectAsIdTransform(baseView, proxyFactory, ejb.getPrimaryKeyClass());
+ QueryCommand queryCommand =
sqlSchema.getCommandFactory().createQuery(query);
+ QueryCommandView localProxyLoadView = new
QueryCommandView(queryCommand, new FieldTransform[] {localView});
+
+ FieldTransform remoteView = new EJBObjectAsIdTransform(baseView,
proxyFactory, ejb.getPrimaryKeyClass());
+ QueryCommandView remoteProxyLoadView = new
QueryCommandView(queryCommand, new FieldTransform[] {remoteView});
+
+ MethodSignature signature = new
MethodSignature(finder.getMethodName(), finder.getParameterTypes());
+ queryCommands.put(new InterfaceMethodSignature(signature, true),
+ new QueryCommandView[]{localProxyLoadView,
remoteProxyLoadView});
+ }
+ return queryCommands;
+ }
+
private LinkedHashMap createCMPFieldAccessors(FaultHandler faultHandler)
{
List attributes = ejb.getAttributes();
List virtualAttributes = ejb.getVirtualCMPFields();
1.10 +43 -36
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java
Index: CMPEntityBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- CMPEntityBuilder.java 6 Dec 2004 06:32:33 -0000 1.9
+++ CMPEntityBuilder.java 10 Dec 2004 00:40:31 -0000 1.10
@@ -74,7 +74,8 @@
import org.apache.geronimo.xbeans.j2ee.EjbRelationshipRoleType;
import org.apache.geronimo.xbeans.j2ee.EnterpriseBeansType;
import org.apache.geronimo.xbeans.j2ee.EntityBeanType;
-import org.openejb.dispatch.MethodSignature;
+import org.apache.geronimo.xbeans.j2ee.JavaTypeType;
+import org.apache.geronimo.xbeans.j2ee.QueryType;
import org.openejb.proxy.EJBProxyFactory;
import org.openejb.transaction.TransactionPolicySource;
import org.openejb.xbeans.ejbjar.OpenejbEjbRelationType;
@@ -83,7 +84,6 @@
import
org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.AutomaticKeyGeneration;
import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.CmpFieldMapping;
import org.openejb.xbeans.ejbjar.OpenejbOpenejbJarType;
-import org.openejb.xbeans.ejbjar.OpenejbQueryType;
import org.openejb.entity.cmp.PrimaryKeyGeneratorWrapper;
import org.tranql.cache.GlobalSchema;
import org.tranql.cache.GlobalSchemaLoader;
@@ -92,10 +92,11 @@
import org.tranql.ejb.EJB;
import org.tranql.ejb.EJBSchema;
import org.tranql.ejb.FKField;
+import org.tranql.ejb.FinderEJBQLQuery;
import org.tranql.ejb.Relationship;
+import org.tranql.ejb.SelectEJBQLQuery;
import org.tranql.ejb.TransactionManagerDelegate;
import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
-import org.tranql.schema.Schema;
import org.tranql.schema.Association.JoinDefinition;
import org.tranql.sql.Column;
import org.tranql.sql.EndTable;
@@ -324,12 +325,49 @@
}
throw new DeploymentException(fields.toString());
}
-
+
+ processQuery(ejb, entityBean);
+
ejbSchema.addEJB(ejb);
sqlSchema.addTable(table);
}
}
+ private void processQuery(EJB ejb, EntityBeanType entityBean) throws
DeploymentException {
+ QueryType[] queryTypes = entityBean.getQueryArray();
+ if (null == queryTypes) {
+ return;
+ }
+ for (int i = 0; i < queryTypes.length; i++) {
+ QueryType queryType = queryTypes[i];
+ String methodName =
getString(queryType.getQueryMethod().getMethodName());
+ String[] parameterTypes = null;
+ JavaTypeType[] javaTypeTypes =
queryType.getQueryMethod().getMethodParams().getMethodParamArray();
+ if (null != javaTypeTypes) {
+ parameterTypes = new String[javaTypeTypes.length];
+ for (int j = 0; j < javaTypeTypes.length; j++) {
+ parameterTypes[j] = getString(javaTypeTypes[j]);
+ }
+ }
+ String ejbQL = queryType.getEjbQl().getStringValue();
+ if (methodName.startsWith("find")) {
+ ejb.addFinderEJBQLQuery(new FinderEJBQLQuery(methodName,
parameterTypes, ejbQL));
+ } else if (methodName.startsWith("select")) {
+ boolean isLocal = true;
+ if (queryType.isSetResultTypeMapping()) {
+ String typeMapping =
getString(queryType.getResultTypeMapping());
+ if (typeMapping.equals("Remote")) {
+ isLocal = false;
+ }
+ }
+ ejb.addSelectEJBQLQuery(new SelectEJBQLQuery(methodName,
parameterTypes, ejbQL, isLocal));
+ } else {
+ throw new DeploymentException("EJB [" + ejb.getName() + "]
is misconfigured: method " +
+ methodName + " is neiher a finder nor a select.");
+ }
+ }
+ }
+
private void processRelationships(EjbJarType ejbJar,
OpenejbOpenejbJarType openejbEjbJar, EJBSchema ejbSchema, SQL92Schema
sqlSchema) throws DeploymentException {
if ( !ejbJar.isSetRelationships() ) {
return;
@@ -568,7 +606,7 @@
}
- public GBeanMBean createBean(EARContext earContext, EJBModule ejbModule,
String containerId, EntityBeanType entityBean, OpenejbEntityBeanType
openejbEntityBean, EJBSchema ejbSchema, Schema sqlSchema, GlobalSchema
globalSchema, TransactionPolicyHelper transactionPolicyHelper, Security
security, ClassLoader cl, TransactionManagerDelegate tmDelegate) throws
DeploymentException {
+ public GBeanMBean createBean(EARContext earContext, EJBModule ejbModule,
String containerId, EntityBeanType entityBean, OpenejbEntityBeanType
openejbEntityBean, EJBSchema ejbSchema, SQLSchema sqlSchema, GlobalSchema
globalSchema, TransactionPolicyHelper transactionPolicyHelper, Security
security, ClassLoader cl, TransactionManagerDelegate tmDelegate) throws
DeploymentException {
String ejbName = getString(entityBean.getEjbName());
CMPContainerBuilder builder = new CMPContainerBuilder();
builder.setClassLoader(cl);
@@ -607,19 +645,6 @@
builder.setGlobalSchema(globalSchema);
builder.setTransactionManagerDelegate(tmDelegate);
- Map queries = new HashMap();
- if (openejbEntityBean != null) {
- OpenejbQueryType[] queryTypes =
openejbEntityBean.getQueryArray();
- for (int i = 0; i < queryTypes.length; i++) {
- OpenejbQueryType queryType = queryTypes[i];
- MethodSignature signature = new
MethodSignature(queryType.getQueryMethod().getMethodName(),
-
queryType.getQueryMethod().getMethodParams().getMethodParamArray());
- String sql = queryType.getSql();
- queries.put(signature, sql);
- }
- }
- builder.setQueries(queries);
-
try {
GBeanMBean gbean = builder.createConfiguration();
gbean.setReferencePattern("TransactionContextManager",
earContext.getTransactionContextManagerObjectName());
@@ -628,24 +653,6 @@
} catch (Throwable e) {
throw new DeploymentException("Unable to initialize EJBContainer
GBean: ejbName [" + ejbName + "]", e);
}
- }
-
- private static final Map DEFAULTS = new HashMap();
-
- static {
- DEFAULTS.put(Boolean.TYPE, Boolean.FALSE);
- DEFAULTS.put(Byte.TYPE, new Byte((byte) 0));
- DEFAULTS.put(Short.TYPE, new Short((short) 0));
- DEFAULTS.put(Integer.TYPE, new Integer(0));
- DEFAULTS.put(Long.TYPE, new Long(0L));
- DEFAULTS.put(Float.TYPE, new Float(0.0f));
- DEFAULTS.put(Double.TYPE, new Double(0.0d));
- DEFAULTS.put(Character.TYPE, new Character(Character.MIN_VALUE));
- }
-
- private static Object getDefault(Class type) {
- // assumes get returns null and that is valid ...
- return DEFAULTS.get(type);
}
private static class RoleInfo {