Author: ozzy
Date: Thu Oct 29 14:05:06 2009
New Revision: 830952

URL: http://svn.apache.org/viewvc?rev=830952&view=rev
Log:
ARIES-44 add invoke for BeanProcessor.afterInit

Modified:
    
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java

Modified: 
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java?rev=830952&r1=830951&r2=830952&view=diff
==============================================================================
--- 
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java
 (original)
+++ 
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java
 Thu Oct 29 14:05:06 2009
@@ -494,47 +494,40 @@
      * processed by every BeanProcessor in the chain before it.
      */
     private static class BeanCreatorChain implements BeanProcessor.BeanCreator 
{
+        public enum ChainType{Before,After};
         private BeanProcessor.BeanCreator parentBeanCreator;
         private BeanProcessor parentBeanProcessor;
         private BeanMetadata beanData;
-        private String beanName;
+        private String beanName;        
+        private ChainType when;
         public BeanCreatorChain(BeanProcessor.BeanCreator parentBeanCreator, 
                                 BeanProcessor parentBeanProcessor,
                                 BeanMetadata beanData,
-                                String beanName){
+                                String beanName,
+                                ChainType when){
             this.parentBeanCreator = parentBeanCreator;
             this.parentBeanProcessor = parentBeanProcessor;
             this.beanData = beanData;
             this.beanName = beanName;
+            this.when = when;
         }
 
         public Object getBean() {
             Object previousBean = parentBeanCreator.getBean();
-            return parentBeanProcessor.beforeInit(previousBean, beanName, 
parentBeanCreator, beanData);
+            Object processed = null;
+            switch(when){
+                case Before :
+                  processed = parentBeanProcessor.beforeInit(previousBean, 
beanName, parentBeanCreator, beanData);
+                  break;
+                case After:
+                  processed = parentBeanProcessor.afterInit(previousBean, 
beanName, parentBeanCreator, beanData);
+                  break;
+            }
+            return processed;
         }   
     }
-        
-    @Override
-    protected Object internalCreate() throws ComponentDefinitionException {
-        
-        instantiateExplicitDependencies();
-
-        Object obj = getInstance();
-                
-        // check for init lifecycle method (if any)
-        Method initMethod = getInitMethod(obj);
-        
-        // check for destroy lifecycle method (if any)
-        getDestroyMethod(obj);
-        
-        // Add partially created object to the container
-//        if (initMethod == null) {
-            addPartialObject(obj);
-//        }
-
-        // inject properties
-        setProperties(obj);
-        
+    
+    private Object runBeanProcPreInit(Object obj){
         String beanName = getName();
         BeanMetadata beanData = (BeanMetadata) blueprintContainer
           .getComponentDefinitionRegistry().getComponentDefinition(beanName);  
      
@@ -555,9 +548,12 @@
         BeanProcessor.BeanCreator currentCreator = initialBeanCreator;
         for(BeanProcessor processor : processors){
             obj = processor.beforeInit(obj, getName(), currentCreator, 
beanData);
-            currentCreator = new BeanCreatorChain(currentCreator, processor, 
beanData, beanName);
+            currentCreator = new BeanCreatorChain(currentCreator, processor, 
beanData, beanName, BeanCreatorChain.ChainType.Before);
         }
-        
+        return obj;
+    }
+    
+    private void runBeanProcInit(Method initMethod, Object obj){
         // call init method
         if (initMethod != null) {
             try {
@@ -565,7 +561,66 @@
             } catch (Throwable t) {
                 throw new ComponentDefinitionException("Unable to intialize 
bean " + getName(), getRealCause(t));
             }
+        }   
+    }
+    
+    private Object runBeanProcPostInit(Object obj){
+        String beanName = getName();
+        BeanMetadata beanData = (BeanMetadata) blueprintContainer
+          .getComponentDefinitionRegistry().getComponentDefinition(beanName);  
      
+        List<BeanProcessor> processors = 
blueprintContainer.getProcessors(BeanProcessor.class);
+        
+        //The start link of the chain, that provides the 
+        //original, unprocessed bean to the head of the chain.
+        BeanProcessor.BeanCreator initialBeanCreator = new 
BeanProcessor.BeanCreator() {            
+            public Object getBean() {                                
+                Object obj = getInstance();
+                //getinit, getdestroy, addpartial object don't need calling 
again.
+                //however, property injection does.
+                setProperties(obj);
+                //as this is the post init chain, new beans need to go thru 
+                //the pre-init chain, and then have init called, before 
+                //being passed along the post-init chain.
+                obj = runBeanProcPreInit(obj);
+                runBeanProcInit(getInitMethod(obj), obj);
+                return obj;
+            }
+        };
+
+        BeanProcessor.BeanCreator currentCreator = initialBeanCreator;
+        for(BeanProcessor processor : processors){
+            obj = processor.afterInit(obj, getName(), currentCreator, 
beanData);
+            currentCreator = new BeanCreatorChain(currentCreator, processor, 
beanData, beanName, BeanCreatorChain.ChainType.After);
         }
+        return obj;
+    }    
+        
+    @Override
+    protected Object internalCreate() throws ComponentDefinitionException {
+        
+        instantiateExplicitDependencies();
+
+        Object obj = getInstance();
+                
+        // check for init lifecycle method (if any)
+        Method initMethod = getInitMethod(obj);
+        
+        // check for destroy lifecycle method (if any)
+        getDestroyMethod(obj);
+        
+        // Add partially created object to the container
+//        if (initMethod == null) {
+            addPartialObject(obj);
+//        }
+
+        // inject properties
+        setProperties(obj);
+        
+        obj = runBeanProcPreInit(obj);
+        
+        runBeanProcInit(initMethod, obj);
+        
+        obj = runBeanProcPostInit(obj);
         
         return obj;
     }


Reply via email to