You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by oz...@apache.org on 2009/10/27 17:39:15 UTC

svn commit: r830240 - in /incubator/aries/trunk/blueprint: blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/ blueprint-core/src/main/java/org/apache/aries/blueprint/ blueprint-core/src/main/java/org/apache/aries/blueprint/container/

Author: ozzy
Date: Tue Oct 27 16:39:14 2009
New Revision: 830240

URL: http://svn.apache.org/viewvc?rev=830240&view=rev
Log:
ARIES-27 Add BeanMetadata and BeanCreator to BeanProcessor interface.

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

Modified: incubator/aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedProperties.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedProperties.java?rev=830240&r1=830239&r2=830240&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedProperties.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedProperties.java Tue Oct 27 16:39:14 2009
@@ -38,9 +38,10 @@
 import org.apache.aries.blueprint.utils.ReflectionUtils;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
+import org.osgi.service.blueprint.container.ReifiedType;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.blueprint.container.ReifiedType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -162,7 +163,7 @@
         }.start();
     }
 
-    public Object beforeInit(Object bean, String beanName) {
+    public Object beforeInit(Object bean, String beanName, BeanCreator beanCreator, BeanMetadata beanData) {
         if (beanName != null && beanName.equals(this.beanName)) {
             LOGGER.debug("Adding bean for bean={} / pid={}", beanName, persistentId);
             synchronized (lock) {
@@ -173,7 +174,7 @@
         return bean;
     }
 
-    public Object afterInit(Object bean, String beanName) {
+    public Object afterInit(Object bean, String beanName, BeanCreator beanCreator, BeanMetadata beanData) {
         return bean;
     }
 

Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/BeanProcessor.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/BeanProcessor.java?rev=830240&r1=830239&r2=830240&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/BeanProcessor.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/BeanProcessor.java Tue Oct 27 16:39:14 2009
@@ -18,6 +18,8 @@
  */
 package org.apache.aries.blueprint;
 
+import org.osgi.service.blueprint.reflect.BeanMetadata;
+
 /**
  * TODO: javadoc
  *
@@ -31,9 +33,22 @@
  */
 public interface BeanProcessor extends Processor {
 
-    Object beforeInit(Object bean, String beanName);
+    /**
+     * Interface from which a BeanProcessor can obtain another bean.
+     */
+    interface BeanCreator {
+        /**
+         * Obtains a new instance of the Bean this BeanProcessor handled. <br>
+         * New instances have been processed by the same chain of BeanProcessors
+         * that the original Bean had been. 
+         * @return new instance of bean.
+         */
+        Object getBean();
+    }    
+    
+    Object beforeInit(Object bean, String beanName, BeanCreator beanCreator, BeanMetadata beanData);
 
-    Object afterInit(Object bean, String beanName);
+    Object afterInit(Object bean, String beanName, BeanCreator beanCreator, BeanMetadata beanData);
 
     void beforeDestroy(Object bean, String beanName);
 

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=830240&r1=830239&r2=830240&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 Tue Oct 27 16:39:14 2009
@@ -18,6 +18,8 @@
  */
 package org.apache.aries.blueprint.container;
 
+import static org.apache.aries.blueprint.utils.ReflectionUtils.getRealCause;
+
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
@@ -35,9 +37,9 @@
 import org.apache.aries.blueprint.di.AbstractRecipe;
 import org.apache.aries.blueprint.di.Recipe;
 import org.apache.aries.blueprint.utils.ReflectionUtils;
-import static org.apache.aries.blueprint.utils.ReflectionUtils.getRealCause;
-import org.osgi.service.blueprint.container.ReifiedType;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
+import org.osgi.service.blueprint.container.ReifiedType;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -485,6 +487,33 @@
         return method;
     }
     
+    /**
+     * Small helper class, to construct a chain of BeanCreators.
+     * <br> 
+     * Each bean creator in the chain will return a bean that has been 
+     * processed by every BeanProcessor in the chain before it.
+     */
+    private static class BeanCreatorChain implements BeanProcessor.BeanCreator {
+        private BeanProcessor.BeanCreator parentBeanCreator;
+        private BeanProcessor parentBeanProcessor;
+        private BeanMetadata beanData;
+        private String beanName;
+        public BeanCreatorChain(BeanProcessor.BeanCreator parentBeanCreator, 
+                                BeanProcessor parentBeanProcessor,
+                                BeanMetadata beanData,
+                                String beanName){
+            this.parentBeanCreator = parentBeanCreator;
+            this.parentBeanProcessor = parentBeanProcessor;
+            this.beanData = beanData;
+            this.beanName = beanName;
+        }
+
+        public Object getBean() {
+            Object previousBean = parentBeanCreator.getBean();
+            return parentBeanProcessor.beforeInit(previousBean, beanName, parentBeanCreator, beanData);
+        }   
+    }
+        
     @Override
     protected Object internalCreate() throws ComponentDefinitionException {
         
@@ -505,9 +534,28 @@
 
         // inject properties
         setProperties(obj);
-
-        for (BeanProcessor processor : blueprintContainer.getProcessors(BeanProcessor.class)) {
-            obj = processor.beforeInit(obj, getName());
+        
+        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);
+                return obj;
+            }
+        };
+
+        BeanProcessor.BeanCreator currentCreator = initialBeanCreator;
+        for(BeanProcessor processor : processors){
+            obj = processor.beforeInit(obj, getName(), currentCreator, beanData);
+            currentCreator = new BeanCreatorChain(currentCreator, processor, beanData, beanName);
         }
         
         // call init method