Author: berndf
Date: Tue Jul 31 14:09:31 2007
New Revision: 561544

URL: http://svn.apache.org/viewvc?view=rev&rev=561544
Log:
switch from BeanFactoryPostProcessor to BeanPostProcessor. This is for 
mimmicking Avalon lifecycle correctly: Do a complete lifecycle for one 
bean/component, only then go to the next (instead of calling each lifecycle 
method for all beans and then go to the next method, which is wrong)
use property setter injection consequently.

Modified:
    
james/server/sandbox/spring-integration/src/main/config/beans-base-config.xml
    
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/AbstractPropagator.java
    
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ConfigurationPropagator.java
    
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ContextPropagator.java
    
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/InitializationPropagator.java
    
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/LoggerPropagator.java
    
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ServicePropagator.java

Modified: 
james/server/sandbox/spring-integration/src/main/config/beans-base-config.xml
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/spring-integration/src/main/config/beans-base-config.xml?view=diff&rev=561544&r1=561543&r2=561544
==============================================================================
--- 
james/server/sandbox/spring-integration/src/main/config/beans-base-config.xml 
(original)
+++ 
james/server/sandbox/spring-integration/src/main/config/beans-base-config.xml 
Tue Jul 31 14:09:31 2007
@@ -70,13 +70,21 @@
     <!--
          beans managing bootstrapping and component lifecycle
     -->
-    <bean id="loggerPropagator" 
class="org.apache.james.container.spring.lifecycle.LoggerPropagator" />
+    <bean id="loggerPropagator" 
class="org.apache.james.container.spring.lifecycle.LoggerPropagator" >
+        <property name="loggingBridge" ref="logger"/>
+    </bean>
 
-    <bean id="contextPropagator" 
class="org.apache.james.container.spring.lifecycle.ContextPropagator" />
+    <bean id="contextPropagator" 
class="org.apache.james.container.spring.lifecycle.ContextPropagator" >
+        <property name="context" ref="avalonContext"/>
+    </bean>
 
-    <bean id="servicePropagator" 
class="org.apache.james.container.spring.lifecycle.ServicePropagator" />
+    <bean id="servicePropagator" 
class="org.apache.james.container.spring.lifecycle.ServicePropagator" >
+        <property name="serviceManagerFactory" ref="serviceManager"/>
+    </bean>
 
-    <bean id="configurationManager" 
class="org.apache.james.container.spring.lifecycle.ConfigurationPropagator" />
+    <bean id="configurationManager" 
class="org.apache.james.container.spring.lifecycle.ConfigurationPropagator" >
+        <property name="configurationProvider" ref="configurationProvider"/>
+    </bean>
 
     <bean id="initializationManager" 
class="org.apache.james.container.spring.lifecycle.InitializationPropagator" />
 

Modified: 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/AbstractPropagator.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/AbstractPropagator.java?view=diff&rev=561544&r1=561543&r2=561544
==============================================================================
--- 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/AbstractPropagator.java
 (original)
+++ 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/AbstractPropagator.java
 Tue Jul 31 14:09:31 2007
@@ -18,34 +18,46 @@
  ****************************************************************/
 package org.apache.james.container.spring.lifecycle;
 
-import java.util.Collection;
-
-import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.BeanFactoryUtils;
 import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.config.BeanDefinition;
+import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+
+import java.util.Collection;
 
 /**
  * visitor. iterating over all spring beans having some specific 
implementation 
  */
-public abstract class AbstractPropagator {
+public abstract class AbstractPropagator implements BeanFactoryAware {
 
     private Collection excludeBeans;
+    private BeanFactory beanFactory;
 
-       public void postProcessBeanFactory(ConfigurableListableBeanFactory 
configurableListableBeanFactory) throws BeansException {
+    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+        this.beanFactory = beanFactory;
+    }
+    
+    public Object postProcessBeforeInitialization(Object bean, String 
beanName) throws BeansException {
+        return bean;
+    }
 
-        Class lifecycleInterface = getLifecycleInterface();
-        String[] beanNames = 
BeanFactoryUtils.beanNamesForTypeIncludingAncestors(configurableListableBeanFactory,
 lifecycleInterface);
-        for (int i = 0; i < beanNames.length; i++) {
-            String beanName = beanNames[i];
-            if (excludeBeans == null || !excludeBeans.contains(beanName)) {
-                BeanDefinition beanDefinition = 
configurableListableBeanFactory.getBeanDefinition(beanName);
-                Object bean = 
configurableListableBeanFactory.getBean(beanName);
-                   invokeLifecycleWorker(beanName, bean, beanDefinition);
-            }
+    protected BeanDefinition getBeanDefinition(String beanName) {
+        if (beanFactory instanceof ConfigurableListableBeanFactory) {
+            ConfigurableListableBeanFactory configurableListableBeanFactory = 
(ConfigurableListableBeanFactory) beanFactory;
+            return 
configurableListableBeanFactory.getBeanDefinition(beanName); 
         }
+        return null; // cannot lookup bean definition
     }
-    
+
+    public Object postProcessAfterInitialization(Object bean, String beanName) 
throws BeansException {
+        if (excludeBeans == null || !excludeBeans.contains(beanName)) {
+            BeanDefinition beanDefinition = getBeanDefinition(beanName);
+            invokeLifecycleWorker(beanName, bean, beanDefinition);
+        }
+        return bean;
+    }
+
     public void setExcludeBeans(Collection excludeBeans) {
        this.excludeBeans=excludeBeans;
     }

Modified: 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ConfigurationPropagator.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ConfigurationPropagator.java?view=diff&rev=561544&r1=561543&r2=561544
==============================================================================
--- 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ConfigurationPropagator.java
 (original)
+++ 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ConfigurationPropagator.java
 Tue Jul 31 14:09:31 2007
@@ -22,18 +22,21 @@
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.james.container.spring.adaptor.ConfigurationProvider;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
-import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.core.Ordered;
 
 /**
  * calls configure() for all avalon components
  */
-public class ConfigurationPropagator extends AbstractPropagator implements 
BeanFactoryPostProcessor, Ordered {
+public class ConfigurationPropagator extends AbstractPropagator implements 
BeanPostProcessor, Ordered {
+
     private Configuration configuration;
 
+    public void setConfigurationProvider(ConfigurationProvider 
configurationProvider) {
+        this.configuration = configurationProvider.getConfiguration();
+    }
+
     private boolean isConfigurationEmpty(Configuration componentConfiguration) 
{
         return     (componentConfiguration.getChildren() == null || 
componentConfiguration.getChildren().length == 0)
                 && (componentConfiguration.getAttributeNames() == null || 
componentConfiguration.getAttributeNames().length == 0);
@@ -47,16 +50,8 @@
         return Configurable.class;
     }
 
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory 
configurableListableBeanFactory) throws BeansException {
-
-        // prepare load data
-        ConfigurationProvider configurationProvider = (ConfigurationProvider) 
configurableListableBeanFactory.getBean("configurationProvider");
-        configuration = configurationProvider.getConfiguration();
-
-        super.postProcessBeanFactory(configurableListableBeanFactory);
-    }
-
     protected void invokeLifecycleWorker(String beanName, Object bean, 
BeanDefinition beanDefinition) {
+        if (!(bean instanceof Configurable)) return;
         Configurable configurable = (Configurable)bean;
          try {
              Configuration componentConfiguration = 
configuration.getChild(beanName);

Modified: 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ContextPropagator.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ContextPropagator.java?view=diff&rev=561544&r1=561543&r2=561544
==============================================================================
--- 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ContextPropagator.java
 (original)
+++ 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ContextPropagator.java
 Tue Jul 31 14:09:31 2007
@@ -21,30 +21,27 @@
 import org.apache.avalon.framework.context.Context;
 import org.apache.avalon.framework.context.ContextException;
 import org.apache.avalon.framework.context.Contextualizable;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
-import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.core.Ordered;
 
 /**
  * calls contextualize() for all avalon components
  */
-public class ContextPropagator extends AbstractPropagator implements 
BeanFactoryPostProcessor, Ordered {
-    private Context context;
-
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory 
configurableListableBeanFactory) throws BeansException {
+public class ContextPropagator extends AbstractPropagator implements 
BeanPostProcessor, Ordered {
 
-        context = (Context) 
configurableListableBeanFactory.getBean("avalonContext");
+    private Context context;
 
-        super.postProcessBeanFactory(configurableListableBeanFactory);
+    public void setContext(Context context) {
+        this.context = context;
     }
-
+    
     protected Class getLifecycleInterface() {
         return Contextualizable.class;
     }
 
     protected void invokeLifecycleWorker(String beanName, Object bean, 
BeanDefinition beanDefinition) {
+        if (!(bean instanceof Contextualizable)) return;
         Contextualizable contextualizable = (Contextualizable) bean;
         try {
             contextualizable.contextualize(context);

Modified: 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/InitializationPropagator.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/InitializationPropagator.java?view=diff&rev=561544&r1=561543&r2=561544
==============================================================================
--- 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/InitializationPropagator.java
 (original)
+++ 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/InitializationPropagator.java
 Tue Jul 31 14:09:31 2007
@@ -19,20 +19,21 @@
 package org.apache.james.container.spring.lifecycle;
 
 import org.apache.avalon.framework.activity.Initializable;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.core.Ordered;
 
 /**
  * calls initialize() for all avalon components
  */
-public class InitializationPropagator extends AbstractPropagator implements 
BeanFactoryPostProcessor, Ordered {
+public class InitializationPropagator extends AbstractPropagator implements 
BeanPostProcessor, Ordered {
 
     protected Class getLifecycleInterface() {
         return Initializable.class;
     }
 
     protected void invokeLifecycleWorker(String beanName, Object bean, 
BeanDefinition beanDefinition) {
+        if (!(bean instanceof Initializable)) return;
         Initializable initializable = (Initializable) bean;
         try {
             initializable.initialize();

Modified: 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/LoggerPropagator.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/LoggerPropagator.java?view=diff&rev=561544&r1=561543&r2=561544
==============================================================================
--- 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/LoggerPropagator.java
 (original)
+++ 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/LoggerPropagator.java
 Tue Jul 31 14:09:31 2007
@@ -19,37 +19,33 @@
 package org.apache.james.container.spring.lifecycle;
 
 import org.apache.avalon.framework.logger.LogEnabled;
-import org.apache.james.container.spring.logging.LoggerToComponentMapper;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
-import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.apache.james.container.spring.adaptor.LoggingBridge;
 import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.core.Ordered;
 
 /**
  * propagates Loggers for all avalon components
  */
-public class LoggerPropagator extends AbstractPropagator implements 
BeanFactoryPostProcessor, Ordered {
-    private LoggerToComponentMapper loggerToComponentMapper;
+public class LoggerPropagator extends AbstractPropagator implements 
BeanPostProcessor, Ordered {
 
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory 
configurableListableBeanFactory) throws BeansException {
-
-        loggerToComponentMapper = (LoggerToComponentMapper) 
configurableListableBeanFactory.getBean("loggerMap");
-
-        super.postProcessBeanFactory(configurableListableBeanFactory);
-    }
+    private LoggingBridge loggingBridge;
 
     protected Class getLifecycleInterface() {
         return LogEnabled.class;
     }
 
     protected void invokeLifecycleWorker(String beanName, Object bean, 
BeanDefinition beanDefinition) {
+        if (!(bean instanceof LogEnabled)) return;
         LogEnabled logEnabled = (LogEnabled) bean;
-        
logEnabled.enableLogging(loggerToComponentMapper.getComponentLogger(beanName));
+        logEnabled.enableLogging(loggingBridge);
     }
 
     public int getOrder() {
         return 0;
     }
 
+    public void setLoggingBridge(LoggingBridge loggingBridge) {
+        this.loggingBridge = loggingBridge;
+    }
 }

Modified: 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ServicePropagator.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ServicePropagator.java?view=diff&rev=561544&r1=561543&r2=561544
==============================================================================
--- 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ServicePropagator.java
 (original)
+++ 
james/server/sandbox/spring-integration/src/main/java/org/apache/james/container/spring/lifecycle/ServicePropagator.java
 Tue Jul 31 14:09:31 2007
@@ -1,35 +1,50 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
 package org.apache.james.container.spring.lifecycle;
 
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.james.container.spring.adaptor.ServiceManagerFactory;
-import org.springframework.beans.BeansException;
+import org.apache.james.container.spring.adaptor.DefaultServiceManagerFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
-import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.core.Ordered;
 
 /**
  * calls service() for all avalon components
  */
-public class ServicePropagator extends AbstractPropagator implements 
BeanFactoryPostProcessor, Ordered {
+public class ServicePropagator extends AbstractPropagator implements 
BeanPostProcessor, Ordered {
 
     private ServiceManagerFactory serviceManagerFactory;
-
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory 
configurableListableBeanFactory) throws BeansException {
-
-        serviceManagerFactory = (ServiceManagerFactory) 
configurableListableBeanFactory.getBean("serviceManager");
-
-        super.postProcessBeanFactory(configurableListableBeanFactory);
+    
+    public void setServiceManagerFactory(DefaultServiceManagerFactory 
serviceManagerFactory) {
+        this.serviceManagerFactory = serviceManagerFactory;
     }
-
+    
     protected Class getLifecycleInterface() {
         return Serviceable.class;
     }
 
     protected void invokeLifecycleWorker(String beanName, Object bean, 
BeanDefinition beanDefinition) {
-        
+        if (!(bean instanceof Serviceable)) return;
         Serviceable serviceable = (Serviceable) bean;
         try {
             ServiceManager serviceManager = 
serviceManagerFactory.getInstanceFor(beanName, beanDefinition);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to