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 {
  
  
  

Reply via email to