gdamour 2005/01/07 01:37:54
Modified: modules/openejb-builder/src/java/org/openejb/deployment
CMPContainerBuilder.java CMPEntityBuilder.java
Log:
Represent some EJBQL progress.
o aggregate functions are now partially supported. At least they do not
generate parse errors;
o selects are hooked in;
o EJBQL returned types are extracted. This allows:
* in the case of finders, to check that the returned type is the abstract
schema type of the owning EJB.
* in the case of selects, to return the relevant type.
o EJBQL queries use EJB abstract schema names instead of EJB names.
Revision Changes Path
1.7 +69 -71
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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- CMPContainerBuilder.java 10 Dec 2004 00:40:31 -0000 1.6
+++ CMPContainerBuilder.java 7 Jan 2005 06:37:54 -0000 1.7
@@ -48,8 +48,8 @@
package org.openejb.deployment;
import java.lang.reflect.Method;
-import java.util.Collection;
import java.util.HashMap;
+import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
@@ -60,7 +60,6 @@
import javax.management.ObjectName;
import org.apache.geronimo.common.DeploymentException;
-import org.apache.geronimo.kernel.ClassLoading;
import org.openejb.EJBComponentType;
import org.openejb.InstanceContextFactory;
import org.openejb.InterceptorBuilder;
@@ -81,8 +80,12 @@
import org.openejb.entity.cmp.CMPRemoveMethod;
import org.openejb.entity.cmp.CMPSetter;
import org.openejb.entity.cmp.CollectionValuedFinder;
+import org.openejb.entity.cmp.CollectionValuedSelect;
import org.openejb.entity.cmp.EnumerationValuedFinder;
+import org.openejb.entity.cmp.SetValuedFinder;
+import org.openejb.entity.cmp.SetValuedSelect;
import org.openejb.entity.cmp.SingleValuedFinder;
+import org.openejb.entity.cmp.SingleValuedSelect;
import org.openejb.entity.dispatch.EJBActivateOperation;
import org.openejb.entity.dispatch.EJBLoadOperation;
import org.openejb.entity.dispatch.EJBPassivateOperation;
@@ -102,11 +105,9 @@
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.EJBQLQuery;
import org.tranql.ejb.EJBQueryBuilder;
import org.tranql.ejb.EJBSchema;
-import org.tranql.ejb.FinderEJBQLQuery;
import org.tranql.ejb.LocalProxyTransform;
import org.tranql.ejb.ManyToManyCMR;
import org.tranql.ejb.ManyToOneCMR;
@@ -118,9 +119,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;
import org.tranql.identity.DerivedIdentity;
import org.tranql.identity.IdentityDefiner;
@@ -129,9 +128,6 @@
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;
import org.tranql.query.AssociationEndFaultHandlerBuilder;
import org.tranql.query.CommandTransform;
@@ -241,7 +237,8 @@
FaultHandler faultHandler = new QueryFaultHandler(loadCommand,
identityDefiner, slotLoaders);
// EJB QL queries
- LinkedHashMap queryCommands = createEJBQLQueries(ejb);
+ Map finders = createFinders(ejb);
+ Map selects = createSelects(ejb);
// findByPrimaryKey
QueryCommandView localProxyLoadView =
queryBuilder.buildFindByPrimaryKey(getEJBName(), true);
@@ -252,7 +249,7 @@
QueryCommand remoteProxyLoad =
mapper.transform(remoteProxyLoadView.getQueryCommand());
remoteProxyLoadView = new QueryCommandView(remoteProxyLoad,
remoteProxyLoadView.getView());
- queryCommands.put(new InterfaceMethodSignature("findByPrimaryKey",
+ finders.put(new InterfaceMethodSignature("findByPrimaryKey",
new String[]{getPrimaryKeyClassName()}, true),
new QueryCommandView[]{localProxyLoadView,
remoteProxyLoadView});
@@ -277,7 +274,7 @@
}
// build the vop table
- LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable,
cmrFieldAccessors, cmp1Bridge, identityDefiner,
ejb.getPrimaryKeyGeneratorDelegate(), primaryKeyTransform, localProxyTransform,
remoteProxyTransform, queryCommands);
+ LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable,
cmrFieldAccessors, cmp1Bridge, identityDefiner,
ejb.getPrimaryKeyGeneratorDelegate(), primaryKeyTransform, localProxyTransform,
remoteProxyTransform, finders, selects);
InterfaceMethodSignature[] signatures = (InterfaceMethodSignature[])
vopMap.keySet().toArray(new InterfaceMethodSignature[vopMap.size()]);
VirtualOperation[] vtable = (VirtualOperation[])
vopMap.values().toArray(new VirtualOperation[vopMap.size()]);
@@ -299,53 +296,31 @@
}
}
- 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));
- }
+ private Map createFinders(EJB ejb) throws Exception {
+ EJBQLToPhysicalQuery toPhysicalQuery = new
EJBQLToPhysicalQuery(ejbSchema, sqlSchema, globalSchema);
- 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);
+ IdentityHashMap findersMap = toPhysicalQuery.buildFinders(ejb);
+ return createEJBQLQueryMap(findersMap);
+ }
+
+ private Map createSelects(EJB ejb) throws Exception {
+ EJBQLToPhysicalQuery toPhysicalQuery = new
EJBQLToPhysicalQuery(ejbSchema, sqlSchema, globalSchema);
- FieldTransform localView = new
EJBLocalObjectAsIdTransform(baseView, proxyFactory, ejb.getPrimaryKeyClass());
- QueryCommand queryCommand =
sqlSchema.getCommandFactory().createQuery(query);
- QueryCommandView localProxyLoadView = new
QueryCommandView(queryCommand, new FieldTransform[] {localView});
+ IdentityHashMap selectsMap = toPhysicalQuery.buildSelects(ejb);
+ return createEJBQLQueryMap(selectsMap);
+ }
- FieldTransform remoteView = new EJBObjectAsIdTransform(baseView,
proxyFactory, ejb.getPrimaryKeyClass());
- QueryCommandView remoteProxyLoadView = new
QueryCommandView(queryCommand, new FieldTransform[] {remoteView});
+ private Map createEJBQLQueryMap(Map ejbQLMap) {
+ Map queryCommands = new HashMap();
+
+ for (Iterator iter = ejbQLMap.entrySet().iterator();
iter.hasNext();) {
+ Map.Entry entry = (Map.Entry) iter.next();
+ EJBQLQuery ejbQLQuery = (EJBQLQuery) entry.getKey();
- MethodSignature signature = new
MethodSignature(finder.getMethodName(), finder.getParameterTypes());
- queryCommands.put(new InterfaceMethodSignature(signature, true),
- new QueryCommandView[]{localProxyLoadView,
remoteProxyLoadView});
+ MethodSignature signature = new
MethodSignature(ejbQLQuery.getMethodName(), ejbQLQuery.getParameterTypes());
+ queryCommands.put(new InterfaceMethodSignature(signature, true),
entry.getValue());
}
+
return queryCommands;
}
@@ -496,7 +471,8 @@
IdentityTransform primaryKeyTransform,
IdentityTransform localProxyTransform,
IdentityTransform remoteProxyTransform,
- LinkedHashMap queries) throws Exception {
+ Map finders,
+ Map selects) throws Exception {
ProxyInfo proxyInfo = createProxyInfo();
@@ -513,6 +489,12 @@
throw new IllegalArgumentException("Bean does not implement
javax.ejb.EntityBean");
}
+ if (TimedObject.class.isAssignableFrom(beanClass)) {
+ MethodSignature signature = new MethodSignature("ejbTimeout",
new Class[]{Timer.class});
+ vopMap.put(MethodHelper.translateToInterface(signature)
+ , EJBTimeoutOperation.INSTANCE);
+ }
+
// Build the VirtualOperations for business methods defined by the
EJB implementation
Method[] beanMethods = beanClass.getMethods();
for (int i = 0; i < beanMethods.length; i++) {
@@ -526,12 +508,6 @@
// create a VirtualOperation for the method (if the method is
understood)
String name = beanMethod.getName();
- if (TimedObject.class.isAssignableFrom(beanClass)) {
- MethodSignature signature = new
MethodSignature("ejbTimeout", new Class[]{Timer.class});
- vopMap.put(MethodHelper.translateToInterface(signature)
- , EJBTimeoutOperation.INSTANCE);
- }
-
MethodSignature signature = new MethodSignature(beanMethod);
if (name.startsWith("ejbCreate")) {
@@ -585,6 +561,8 @@
} else if (unsetEntityContext.equals(beanMethod)) {
vopMap.put(MethodHelper.translateToInterface(signature)
, UnsetEntityContextOperation.INSTANCE);
+ } else if (name.startsWith("ejbSelect")) {
+ ;
} else if (name.startsWith("ejb")) {
//TODO this shouldn't happen?
continue;
@@ -596,10 +574,10 @@
Class homeInterface = proxyInfo.getHomeInterface();
Class localHomeInterface = proxyInfo.getLocalHomeInterface();
- for (Iterator iterator = queries.entrySet().iterator();
iterator.hasNext();) {
+ for (Iterator iterator = finders.entrySet().iterator();
iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
InterfaceMethodSignature signature = (InterfaceMethodSignature)
entry.getKey();
- QueryCommandView[] queryCommandViews = (QueryCommandView[])
entry.getValue();
+ QueryCommandView[] views = (QueryCommandView[]) entry.getValue();
Method method = signature.getMethod(homeInterface);
if (method == null) {
@@ -611,16 +589,36 @@
String returnType = method.getReturnType().getName();
if (returnType.equals("java.util.Collection")) {
- vopMap.put(signature, new CollectionValuedFinder(cacheTable,
identityDefiner,
- localProxyTransform, remoteProxyTransform,
queryCommandViews[0], queryCommandViews[1]));
+ vopMap.put(signature, new CollectionValuedFinder(views[0],
views[1]));
+ } else if (returnType.equals("java.util.Set")) {
+ vopMap.put(signature, new SetValuedFinder(views[0],
views[1]));
} else if (returnType.equals("java.util.Enumeration")) {
- vopMap.put(signature, new
EnumerationValuedFinder(cacheTable, identityDefiner,
- localProxyTransform, remoteProxyTransform,
queryCommandViews[0], queryCommandViews[1]));
+ vopMap.put(signature, new EnumerationValuedFinder(views[0],
views[1]));
+ } else {
+ vopMap.put(signature, new SingleValuedFinder(views[0],
views[1]));
+ }
+ }
+
+ for (Iterator iterator = selects.entrySet().iterator();
iterator.hasNext();) {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ InterfaceMethodSignature signature = (InterfaceMethodSignature)
entry.getKey();
+ QueryCommandView view = (QueryCommandView) entry.getValue();
+
+ Method method = signature.getMethod(beanClass);
+ if (method == null) {
+ throw new DeploymentException("Could not find method for
signature: " + signature);
+ }
+
+ String returnType = method.getReturnType().getName();
+ if (returnType.equals("java.util.Collection")) {
+ vopMap.put(signature, new CollectionValuedSelect(view));
+ } else if (returnType.equals("java.util.Set")) {
+ vopMap.put(signature, new SetValuedSelect(view));
} else {
- vopMap.put(signature, new SingleValuedFinder(cacheTable,
identityDefiner,
- localProxyTransform, remoteProxyTransform,
queryCommandViews[0], queryCommandViews[1]));
+ vopMap.put(signature, new SingleValuedSelect(view));
}
}
+
return vopMap;
}
}
1.12 +24 -19
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.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- CMPEntityBuilder.java 27 Dec 2004 02:03:25 -0000 1.11
+++ CMPEntityBuilder.java 7 Jan 2005 06:37:54 -0000 1.12
@@ -65,6 +65,7 @@
import org.apache.geronimo.j2ee.deployment.EARContext;
import org.apache.geronimo.j2ee.deployment.EJBModule;
import org.apache.geronimo.j2ee.j2eeobjectnames.J2eeContext;
+import org.apache.geronimo.kernel.ClassLoading;
import org.apache.geronimo.security.deploy.Security;
import org.apache.geronimo.xbeans.j2ee.CmpFieldType;
import org.apache.geronimo.xbeans.j2ee.EjbJarType;
@@ -109,6 +110,9 @@
import org.tranql.sql.sql92.SQL92Schema;
+/**
+ * @version $Revision$ $Date$
+ */
class CMPEntityBuilder extends EntityBuilder {
public CMPEntityBuilder(OpenEJBModuleBuilder builder) {
super(builder);
@@ -326,14 +330,14 @@
throw new DeploymentException(fields.toString());
}
- processQuery(ejb, entityBean);
+ processQuery(ejb, entityBean, cl);
ejbSchema.addEJB(ejb);
sqlSchema.addTable(table);
}
}
- private void processQuery(EJB ejb, EntityBeanType entityBean) throws
DeploymentException {
+ private void processQuery(EJB ejb, EntityBeanType entityBean,
ClassLoader cl) throws DeploymentException {
QueryType[] queryTypes = entityBean.getQueryArray();
if (null == queryTypes) {
return;
@@ -341,18 +345,24 @@
for (int i = 0; i < queryTypes.length; i++) {
QueryType queryType = queryTypes[i];
String methodName =
getString(queryType.getQueryMethod().getMethodName());
- String[] parameterTypes = null;
+ Class[] parameterTypes = null;
JavaTypeType[] javaTypeTypes =
queryType.getQueryMethod().getMethodParams().getMethodParamArray();
if (null != javaTypeTypes) {
- parameterTypes = new String[javaTypeTypes.length];
+ parameterTypes = new Class[javaTypeTypes.length];
for (int j = 0; j < javaTypeTypes.length; j++) {
- parameterTypes[j] = getString(javaTypeTypes[j]);
+ String paramType = getString(javaTypeTypes[j]);
+ try {
+ parameterTypes[j] =
ClassLoading.loadClass(paramType, cl);
+ } catch (ClassNotFoundException e) {
+ throw new DeploymentException("Can not load
parameter type " + paramType +
+ " defined by method " + methodName);
+ }
}
}
String ejbQL = queryType.getEjbQl().getStringValue();
if (methodName.startsWith("find")) {
- ejb.addFinderEJBQLQuery(new FinderEJBQLQuery(methodName,
parameterTypes, ejbQL));
- } else if (methodName.startsWith("select")) {
+ ejb.addFinder(new FinderEJBQLQuery(methodName,
parameterTypes, ejbQL));
+ } else if (methodName.startsWith("ejbSelect")) {
boolean isLocal = true;
if (queryType.isSetResultTypeMapping()) {
String typeMapping =
getString(queryType.getResultTypeMapping());
@@ -360,7 +370,7 @@
isLocal = false;
}
}
- ejb.addSelectEJBQLQuery(new SelectEJBQLQuery(methodName,
parameterTypes, ejbQL, isLocal));
+ ejb.addSelect(new SelectEJBQLQuery(methodName,
parameterTypes, ejbQL, isLocal));
} else {
throw new DeploymentException("EJB [" + ejb.getName() + "]
is misconfigured: method " +
methodName + " is neiher a finder nor a select.");
@@ -528,27 +538,22 @@
roleInfo[1].table.addEndTable(new EndTable(endName1,
roleInfo[0].table, roleInfo[0].isOne, roleInfo[0].isCascadeDelete, joinTable,
isVirtual));
if (null != mtmEntityName) {
- EJB mtmEJB = (EJB) ejbSchema.getEJB(mtmEntityName);
+ EJB mtmEJB = ejbSchema.getEJB(mtmEntityName);
Relationship mtmRelationship = new
Relationship(relationship.getLeftJoinDefinition());
- CMRField field = new CMRField(endName0, roleInfo[0].ejb, true,
false, mtmRelationship, true);
- mtmEJB.addCMRField(field);
+ mtmEJB.addCMRField(new CMRField(endName0, roleInfo[0].ejb, true,
false, mtmRelationship, true));
mtmRelationship.addAssociationEnd(roleInfo[0].ejb.getAssociationEnd(endName0));
mtmRelationship = new
Relationship(relationship.getRightJoinDefinition());
- field = new CMRField(endName1, roleInfo[1].ejb, true, false,
mtmRelationship, true);
- mtmEJB.addCMRField(field);
+ mtmEJB.addCMRField(new CMRField(endName1, roleInfo[1].ejb, true,
false, mtmRelationship, true));
mtmRelationship.addAssociationEnd(roleInfo[1].ejb.getAssociationEnd(endName1));
- Table mtmTable = (Table) sqlSchema.getTable(mtmEntityName);
+ Table mtmTable = sqlSchema.getTable(mtmEntityName);
JoinTable mtmJoinTable = new
JoinTable(joinTable.getLeftJoinDefinition());
- EndTable endTable = new EndTable(endName0, roleInfo[0].table,
true, false, mtmJoinTable, true);
- mtmTable.addEndTable(endTable);
+ mtmTable.addEndTable(new EndTable(endName0, roleInfo[0].table,
true, false, mtmJoinTable, true));
mtmJoinTable.addAssociationEnd(roleInfo[0].table.getAssociationEnd(endName0));
- mtmTable = (Table) sqlSchema.getTable(mtmEntityName);
mtmJoinTable = new JoinTable(joinTable.getRightJoinDefinition());
- endTable = new EndTable(endName1, roleInfo[1].table, true,
false, mtmJoinTable, true);
- mtmTable.addEndTable(endTable);
+ mtmTable.addEndTable(new EndTable(endName1, roleInfo[1].table,
true, false, mtmJoinTable, true));
mtmJoinTable.addAssociationEnd(roleInfo[1].table.getAssociationEnd(endName1));
}
}