gdamour     2005/08/05 07:00:24

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

  GERONIMO-665 - CMP - Prefetching of CMP and CMR fields.
  
  This is a final tweak to add to the transactional cache the CMP returned by
  finders and selects. This way when a CMP or CMR field is accessed after
  a finder or a select returning an entity, which is not associated to a
  prefetching group, only one query is executed by the engine.
  
  The previous implementation was executing two queries in this specific
  scenario.
  
  Revision  Changes    Path
  1.26      +31 -17    
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.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- CMPContainerBuilder.java  9 Jul 2005 13:33:38 -0000       1.25
  +++ CMPContainerBuilder.java  5 Aug 2005 11:00:23 -0000       1.26
  @@ -212,12 +212,16 @@
           interceptorBuilder.setReentrant(reentrant);
           return interceptorBuilder;
       }
  -    
  -    protected Object buildIt(boolean buildContainer) throws Exception {
  +
  +    protected void initialize() throws Exception {
           ejb = ejbSchema.getEJB(getEJBName());
           if (ejb == null) {
               throw new DeploymentException("Schema does not contain EJB: " + 
getEJBName());
           }
  +    }
  +    
  +    protected Object buildIt(boolean buildContainer) throws Exception {
  +        initialize();
   
           // get the bean classes
           ClassLoader classLoader = getClassLoader();
  @@ -288,13 +292,13 @@
                       iter.remove();
                   }
               }
  -            instanceMap = buildInstanceMap(beanClass, cmpFieldAccessors, 
existingCMRFieldAccessors, selects);
  +            instanceMap = buildInstanceMap(beanClass, cmpFieldAccessors, 
existingCMRFieldAccessors, selects, identityDefinerBuilder);
           } else {
               cmp1Bridge = new CMP1Bridge(beanClass, cmpFieldAccessors);
           }
   
           // build the vop table
  -        LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable, 
cmrNoPrefetchFieldAccessors[1], cmp1Bridge, identityDefiner, 
ejb.getPrimaryKeyGenerator(), primaryKeyTransform, localProxyTransform, 
remoteProxyTransform, finders);
  +        LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable, 
cmrNoPrefetchFieldAccessors[1], cmp1Bridge, identityDefinerBuilder, 
ejb.getPrimaryKeyGenerator(), primaryKeyTransform, localProxyTransform, 
remoteProxyTransform, finders);
   
           InterfaceMethodSignature[] signatures = (InterfaceMethodSignature[]) 
vopMap.keySet().toArray(new InterfaceMethodSignature[vopMap.size()]);
           VirtualOperation[] vtable = (VirtualOperation[]) 
vopMap.values().toArray(new VirtualOperation[vopMap.size()]);
  @@ -465,7 +469,7 @@
                   new ReferenceAccessor(relatedIdentityDefiner));
       }
   
  -    private Map buildInstanceMap(Class beanClass, LinkedHashMap cmpFields, 
LinkedHashMap cmrFields, Map selects) {
  +    private Map buildInstanceMap(Class beanClass, LinkedHashMap cmpFields, 
LinkedHashMap cmrFields, Map selects, IdentityDefinerBuilder 
identityDefinerBuilder) {
           Map instanceMap;
           instanceMap = new HashMap();
   
  @@ -476,7 +480,7 @@
           addFieldOperations(instanceMap, beanClass, cmrFields);
   
           // add the select methods
  -        addSelects(instanceMap, beanClass, selects);
  +        addSelects(instanceMap, beanClass, selects, identityDefinerBuilder);
   
           return instanceMap;
       }
  @@ -500,7 +504,7 @@
           }
       }
   
  -    private void addSelects(Map instanceMap, Class beanClass, Map selects) 
throws IllegalArgumentException {
  +    private void addSelects(Map instanceMap, Class beanClass, Map selects, 
IdentityDefinerBuilder idDefinerBuilder) throws IllegalArgumentException {
           for (Iterator iterator = selects.entrySet().iterator(); 
iterator.hasNext();) {
               Map.Entry entry = (Map.Entry) iterator.next();
               SelectEJBQLQuery query = (SelectEJBQLQuery) entry.getKey();
  @@ -514,13 +518,20 @@
               }
               MethodSignature methodSignature = new MethodSignature(method);
               
  +            IdentityDefiner idDefiner = null;
  +            IdentityDefiner idInjector = null;
  +            if (null != query.getSelectedEJB()) {
  +                idDefiner = 
idDefinerBuilder.getIdentityDefiner(query.getSelectedEJB(), 0);
  +                idInjector = 
idDefinerBuilder.getIdentityDefiner(query.getSelectedEJB());
  +            }
  +            
               String returnType = method.getReturnType().getName();
               if (returnType.equals("java.util.Collection")) {
  -                instanceMap.put(methodSignature, new 
CollectionValuedSelect(command, query.isFlushCacheBeforeQuery()));
  +                instanceMap.put(methodSignature, new 
CollectionValuedSelect(command, query.isFlushCacheBeforeQuery(), idDefiner, 
idInjector));
               } else if (returnType.equals("java.util.Set")) {
  -                instanceMap.put(methodSignature, new 
SetValuedSelect(command, query.isFlushCacheBeforeQuery()));
  +                instanceMap.put(methodSignature, new 
SetValuedSelect(command, query.isFlushCacheBeforeQuery(), idDefiner, 
idInjector));
               } else {
  -                instanceMap.put(methodSignature, new 
SingleValuedSelect(command, query.isFlushCacheBeforeQuery()));
  +                instanceMap.put(methodSignature, new 
SingleValuedSelect(command, query.isFlushCacheBeforeQuery(), idDefiner, 
idInjector));
               }
           }
       }
  @@ -529,7 +540,7 @@
               CacheTable cacheTable,
               Map cmrFieldAccessors,
               CMP1Bridge cmp1Bridge,
  -            IdentityDefiner identityDefiner,
  +            IdentityDefinerBuilder identityDefinerBuilder,
               PrimaryKeyGenerator keyGenerator,
               IdentityTransform primaryKeyTransform,
               IdentityTransform localProxyTransform,
  @@ -539,7 +550,7 @@
           ProxyInfo proxyInfo = createProxyInfo();
   
           LinkedHashMap vopMap = new LinkedHashMap();
  -
  +        
           // get the context set unset method objects
           Method setEntityContext;
           Method unsetEntityContext;
  @@ -576,6 +587,7 @@
                   // ejbCreate vop needs a reference to the ejbPostCreate 
method
                   MethodSignature postCreateSignature = new 
MethodSignature("ejbPostCreate" + name.substring(9),
                           beanMethod.getParameterTypes());
  +                IdentityDefiner identityDefiner = 
identityDefinerBuilder.getIdentityDefiner(ejb); 
                   vopMap.put(MethodHelper.translateToInterface(signature),
                           new CMPCreateMethod(beanClass,
                                   cmp1Bridge,
  @@ -634,6 +646,8 @@
               }
           }
   
  +        IdentityDefiner idDefiner = 
identityDefinerBuilder.getIdentityDefiner(ejb, 0);
  +        IdentityDefiner idInjector = 
identityDefinerBuilder.getIdentityDefiner(ejb);
           Class homeInterface = proxyInfo.getHomeInterface();
           Class localHomeInterface = proxyInfo.getLocalHomeInterface();
           for (Iterator iterator = finders.entrySet().iterator(); 
iterator.hasNext();) {
  @@ -653,13 +667,13 @@
   
               String returnType = method.getReturnType().getName();
               if (returnType.equals("java.util.Collection")) {
  -                vopMap.put(signature, new 
CollectionValuedFinder(commands[0], commands[1], 
query.isFlushCacheBeforeQuery()));
  +                vopMap.put(signature, new 
CollectionValuedFinder(commands[0], commands[1], 
query.isFlushCacheBeforeQuery(), idDefiner, idInjector));
               } else if (returnType.equals("java.util.Set")) {
  -                vopMap.put(signature, new SetValuedFinder(commands[0], 
commands[1], query.isFlushCacheBeforeQuery()));
  +                vopMap.put(signature, new SetValuedFinder(commands[0], 
commands[1], query.isFlushCacheBeforeQuery(), idDefiner, idInjector));
               } else if (returnType.equals("java.util.Enumeration")) {
  -                vopMap.put(signature, new 
EnumerationValuedFinder(commands[0], commands[1], 
query.isFlushCacheBeforeQuery()));
  +                vopMap.put(signature, new 
EnumerationValuedFinder(commands[0], commands[1], 
query.isFlushCacheBeforeQuery(), idDefiner, idInjector));
               } else {
  -                vopMap.put(signature, new SingleValuedFinder(commands[0], 
commands[1], query.isFlushCacheBeforeQuery()));
  +                vopMap.put(signature, new SingleValuedFinder(commands[0], 
commands[1], query.isFlushCacheBeforeQuery(), idDefiner, idInjector));
               }
           }
           
  
  
  

Reply via email to