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