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

Reply via email to