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;
}