gdamour     2005/03/02 06:43:22

  Modified:    modules/openejb-builder/src/java/org/openejb/deployment
                        CMPContainerBuilder.java CMPEntityBuilder.java
  Log:

  GERONIMO-580
  
  o add an itests test verifying the correct behavior of the implementation.
  
  GERONIMO-598
  
  o add the flush-cache-before-query optional element, which identifies if
  the transactional cache should be flushed before the execution of the
  associated finder or select operation; and
  o update the various XValuedFinder and XValuedSelect in order to flush
  the transaction cache if required.
  
  Revision  Changes    Path
  1.15      +27 -37    
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.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- CMPContainerBuilder.java  20 Feb 2005 15:44:49 -0000      1.14
  +++ CMPContainerBuilder.java  2 Mar 2005 11:43:21 -0000       1.15
  @@ -49,7 +49,6 @@
   
   import java.lang.reflect.Method;
   import java.util.HashMap;
  -import java.util.IdentityHashMap;
   import java.util.Iterator;
   import java.util.LinkedHashMap;
   import java.util.List;
  @@ -104,9 +103,9 @@
   import org.tranql.ejb.CMPFieldTransform;
   import org.tranql.ejb.CMRField;
   import org.tranql.ejb.EJB;
  -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;
  @@ -115,6 +114,7 @@
   import org.tranql.ejb.OneToManyCMR;
   import org.tranql.ejb.OneToOneCMR;
   import org.tranql.ejb.RemoteProxyTransform;
  +import org.tranql.ejb.SelectEJBQLQuery;
   import org.tranql.ejb.SingleValuedCMRAccessor;
   import org.tranql.ejb.SingleValuedCMRFaultHandler;
   import org.tranql.ejb.TransactionManagerDelegate;
  @@ -256,14 +256,16 @@
           QueryCommand remoteProxyLoad = 
mapper.transform(remoteProxyLoadView.getQueryCommand());
           remoteProxyLoadView = new QueryCommandView(remoteProxyLoad, 
remoteProxyLoadView.getView());
   
  -        finders.put(new InterfaceMethodSignature("findByPrimaryKey",
  -                new String[]{getPrimaryKeyClassName()}, true),
  -                new QueryCommandView[]{localProxyLoadView, 
remoteProxyLoadView});
  +        FinderEJBQLQuery pkFinder = new FinderEJBQLQuery("findByPrimaryKey", 
new Class[] {ejb.getPrimaryKeyClass()}, "UNDEFINED");
  +        FinderEJBQLQuery previousPkFinder = (FinderEJBQLQuery) 
finders.put(pkFinder, new QueryCommandView[]{localProxyLoadView, 
remoteProxyLoadView});
  +        if (null != previousPkFinder) {
  +            
pkFinder.setFlushCacheBeforeQuery(previousPkFinder.isFlushCacheBeforeQuery());
  +        }
   
           // build the instance factory
           LinkedHashMap cmpFieldAccessors = 
createCMPFieldAccessors(faultHandler);
           LinkedHashMap cmrFieldAccessors = createCMRFieldAccessors();
  -        LinkedHashMap selects = createSelects(ejb);
  +        Map selects = createSelects(ejb);
           Map instanceMap = null;
           CMP1Bridge cmp1Bridge = null;
           if (cmp2) {
  @@ -307,31 +309,15 @@
       private Map createFinders(EJB ejb) throws Exception {
           EJBQLToPhysicalQuery toPhysicalQuery = new 
EJBQLToPhysicalQuery(ejbSchema, sqlSchema, globalSchema);
   
  -        IdentityHashMap findersMap = toPhysicalQuery.buildFinders(ejb);
  -        return createEJBQLQueryMap(findersMap);
  +        return toPhysicalQuery.buildFinders(ejb);
       }
       
  -    private LinkedHashMap createSelects(EJB ejb) throws Exception {
  +    private Map createSelects(EJB ejb) throws Exception {
           EJBQLToPhysicalQuery toPhysicalQuery = new 
EJBQLToPhysicalQuery(ejbSchema, sqlSchema, globalSchema);
   
  -        IdentityHashMap selectsMap = toPhysicalQuery.buildSelects(ejb);
  -        return createEJBQLQueryMap(selectsMap);
  +        return toPhysicalQuery.buildSelects(ejb);
       }
   
  -    private LinkedHashMap createEJBQLQueryMap(Map ejbQLMap) {
  -        LinkedHashMap queryCommands = new LinkedHashMap();
  -        
  -        for (Iterator iter = ejbQLMap.entrySet().iterator(); 
iter.hasNext();) {
  -            Map.Entry entry = (Map.Entry) iter.next();
  -            EJBQLQuery ejbQLQuery = (EJBQLQuery) entry.getKey();
  -            
  -            MethodSignature signature = new 
MethodSignature(ejbQLQuery.getMethodName(), ejbQLQuery.getParameterTypes());
  -            queryCommands.put(new InterfaceMethodSignature(signature, true), 
entry.getValue());
  -        }
  -        
  -        return queryCommands;
  -    }
  -    
       private LinkedHashMap createCMPFieldAccessors(FaultHandler faultHandler) 
{
           List attributes = ejb.getAttributes();
           List virtualAttributes = ejb.getVirtualCMPFields();
  @@ -436,7 +422,7 @@
                   new ReferenceAccessor(relatedIdentityDefiner));
       }
   
  -    private Map buildInstanceMap(Class beanClass, LinkedHashMap cmpFields, 
LinkedHashMap cmrFields, LinkedHashMap selects) {
  +    private Map buildInstanceMap(Class beanClass, LinkedHashMap cmpFields, 
LinkedHashMap cmrFields, Map selects) {
           Map instanceMap;
           instanceMap = new HashMap();
   
  @@ -471,10 +457,12 @@
           }
       }
   
  -    private void addSelects(Map instanceMap, Class beanClass, LinkedHashMap 
selects) throws IllegalArgumentException {
  +    private void addSelects(Map instanceMap, Class beanClass, Map selects) 
throws IllegalArgumentException {
           for (Iterator iterator = selects.entrySet().iterator(); 
iterator.hasNext();) {
               Map.Entry entry = (Map.Entry) iterator.next();
  -            InterfaceMethodSignature signature = (InterfaceMethodSignature) 
entry.getKey();
  +            SelectEJBQLQuery query = (SelectEJBQLQuery) entry.getKey();
  +            
  +            InterfaceMethodSignature signature = new 
InterfaceMethodSignature(query.getMethodName(), query.getParameterTypes(), 
true);
               QueryCommandView view = (QueryCommandView) entry.getValue();
   
               Method method = signature.getMethod(beanClass);
  @@ -485,11 +473,11 @@
               
               String returnType = method.getReturnType().getName();
               if (returnType.equals("java.util.Collection")) {
  -                instanceMap.put(methodSignature, new 
CollectionValuedSelect(view));
  +                instanceMap.put(methodSignature, new 
CollectionValuedSelect(view, query.isFlushCacheBeforeQuery()));
               } else if (returnType.equals("java.util.Set")) {
  -                instanceMap.put(methodSignature, new SetValuedSelect(view));
  +                instanceMap.put(methodSignature, new SetValuedSelect(view, 
query.isFlushCacheBeforeQuery()));
               } else {
  -                instanceMap.put(methodSignature, new 
SingleValuedSelect(view));
  +                instanceMap.put(methodSignature, new 
SingleValuedSelect(view, query.isFlushCacheBeforeQuery()));
               }
           }
       }
  @@ -607,7 +595,9 @@
           Class localHomeInterface = proxyInfo.getLocalHomeInterface();
           for (Iterator iterator = finders.entrySet().iterator(); 
iterator.hasNext();) {
               Map.Entry entry = (Map.Entry) iterator.next();
  -            InterfaceMethodSignature signature = (InterfaceMethodSignature) 
entry.getKey();
  +            FinderEJBQLQuery query = (FinderEJBQLQuery) entry.getKey();
  +            
  +            InterfaceMethodSignature signature = new 
InterfaceMethodSignature(query.getMethodName(), query.getParameterTypes(), 
true);
               QueryCommandView[] views = (QueryCommandView[]) entry.getValue();
   
               Method method = signature.getMethod(homeInterface);
  @@ -620,13 +610,13 @@
   
               String returnType = method.getReturnType().getName();
               if (returnType.equals("java.util.Collection")) {
  -                vopMap.put(signature, new CollectionValuedFinder(views[0], 
views[1]));
  +                vopMap.put(signature, new CollectionValuedFinder(views[0], 
views[1], query.isFlushCacheBeforeQuery()));
               } else if (returnType.equals("java.util.Set")) {
  -                vopMap.put(signature, new SetValuedFinder(views[0], 
views[1]));
  +                vopMap.put(signature, new SetValuedFinder(views[0], 
views[1], query.isFlushCacheBeforeQuery()));
               } else if (returnType.equals("java.util.Enumeration")) {
  -                vopMap.put(signature, new EnumerationValuedFinder(views[0], 
views[1]));
  +                vopMap.put(signature, new EnumerationValuedFinder(views[0], 
views[1], query.isFlushCacheBeforeQuery()));
               } else {
  -                vopMap.put(signature, new SingleValuedFinder(views[0], 
views[1]));
  +                vopMap.put(signature, new SingleValuedFinder(views[0], 
views[1], query.isFlushCacheBeforeQuery()));
               }
           }
           
  
  
  
  1.20      +41 -10    
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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- CMPEntityBuilder.java     27 Feb 2005 07:20:58 -0000      1.19
  +++ CMPEntityBuilder.java     2 Mar 2005 11:43:21 -0000       1.20
  @@ -337,6 +337,8 @@
       }
   
       private void processQuery(EJB ejb, EntityBeanType entityBean, 
OpenejbEntityBeanType openEjbEntity, ClassLoader cl) throws DeploymentException 
{
  +        Map queries = new HashMap();
  +        
           QueryType[] queryTypes = entityBean.getQueryArray();
           if (null != queryTypes) {
               for (int i = 0; i < queryTypes.length; i++) {
  @@ -358,7 +360,9 @@
                   }
                   String ejbQL = queryType.getEjbQl().getStringValue();
                   if (methodName.startsWith("find")) {
  -                    ejb.addFinder(new FinderEJBQLQuery(methodName, 
parameterTypes, ejbQL));
  +                    FinderEJBQLQuery query = new 
FinderEJBQLQuery(methodName, parameterTypes, ejbQL);
  +                    ejb.addFinder(query);
  +                    queries.put(query, query);
                   } else if (methodName.startsWith("ejbSelect")) {
                       boolean isLocal = true;
                       if (queryType.isSetResultTypeMapping()) {
  @@ -367,13 +371,15 @@
                               isLocal = false;
                           }
                       }
  -                    ejb.addSelect(new SelectEJBQLQuery(methodName, 
parameterTypes, ejbQL, isLocal));
  +                    SelectEJBQLQuery query = new 
SelectEJBQLQuery(methodName, parameterTypes, ejbQL, isLocal); 
  +                    ejb.addSelect(query);
  +                    queries.put(query, query);
                   } else {
  -                    throw new DeploymentException("EJB [" + ejb.getName() + 
"] is misconfigured: method " +
  -                            methodName + " is neiher a finder nor a 
select.");
  +                    throw new DeploymentException("Method " + methodName + " 
is neiher a finder nor a select.");
                   }
               }
           }
  +        
           OpenejbQueryType[] openejbQueryTypes = openEjbEntity.getQueryArray();
           if (null != openejbQueryTypes) {
               for (int i = 0; i < openejbQueryTypes.length; i++) {
  @@ -393,9 +399,26 @@
                           }
                       }
                   }
  -                String ejbQL = openejbQueryType.getEjbQl();
  +
  +                boolean flushCacheBeforeQuery = 
openejbQueryType.isSetFlushCacheBeforeQuery();
  +                String ejbQL = null;
  +                if (openejbQueryType.isSetEjbQl()) {
  +                    ejbQL = openejbQueryType.getEjbQl();
  +                } else if (false == flushCacheBeforeQuery) {
  +                    throw new DeploymentException("No ejb-ql defined and 
flush-cache-before-query not set. method " + methodName);
  +                }
  +                
                   if (methodName.startsWith("find")) {
  -                    ejb.addFinder(new FinderEJBQLQuery(methodName, 
parameterTypes, ejbQL));
  +                    FinderEJBQLQuery query = new 
FinderEJBQLQuery(methodName, parameterTypes, ejbQL);
  +                    if (null == ejbQL) {
  +                        query = (FinderEJBQLQuery) queries.get(query);
  +                        if (null == query) {
  +                            throw new DeploymentException("Method " + 
methodName + " does not define an ejb-ql.");
  +                        }
  +                    } else {
  +                        ejb.addFinder(query);
  +                    }
  +                    query.setFlushCacheBeforeQuery(flushCacheBeforeQuery);
                   } else if (methodName.startsWith("ejbSelect")) {
                       boolean isLocal = true;
                       if (openejbQueryType.isSetResultTypeMapping()) {
  @@ -404,10 +427,18 @@
                               isLocal = false;
                           }
                       }
  -                    ejb.addSelect(new SelectEJBQLQuery(methodName, 
parameterTypes, ejbQL, isLocal));
  +                    SelectEJBQLQuery query = new 
SelectEJBQLQuery(methodName, parameterTypes, ejbQL, isLocal);
  +                    if (null == ejbQL) {
  +                        query = (SelectEJBQLQuery) queries.get(query);
  +                        if (null == query) {
  +                            throw new DeploymentException("Method " + 
methodName + " does not define an ejb-ql.");
  +                        }
  +                    } else {
  +                        ejb.addSelect(query);
  +                    }
  +                    query.setFlushCacheBeforeQuery(flushCacheBeforeQuery);
                   } else {
  -                    throw new DeploymentException("EJB [" + ejb.getName() + 
"] is misconfigured: method " +
  -                            methodName + " is neiher a finder nor a 
select.");
  +                    throw new DeploymentException("Method " + methodName + " 
is neiher a finder nor a select.");
                   }
               }
           }
  
  
  

Reply via email to