Author: norman
Date: Thu Jul  7 12:16:59 2011
New Revision: 1143788

URL: http://svn.apache.org/viewvc?rev=1143788&view=rev
Log:
Add BeanPostProcessors which handles @Resource and @PersistenceUnit annotation. 
See JAMES-835

Added:
    
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/AbstractOSGIAnnotationBeanPostProcessor.java
    
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIPersistenceUnitAnnotationBeanPostProcessor.java
    
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIResourceAnnotationBeanPostProcessor.java
Modified:
    james/server/trunk/lifecycle-spring/pom.xml
    
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OsgiLifecycleBeanFactoryPostProcessor.java
    
james/server/trunk/lifecycle-spring/src/main/resources/META-INF/spring/extender/lifecycle-extender.xml

Modified: james/server/trunk/lifecycle-spring/pom.xml
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lifecycle-spring/pom.xml?rev=1143788&r1=1143787&r2=1143788&view=diff
==============================================================================
--- james/server/trunk/lifecycle-spring/pom.xml (original)
+++ james/server/trunk/lifecycle-spring/pom.xml Thu Jul  7 12:16:59 2011
@@ -125,5 +125,9 @@
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-annotation_1.1_spec</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jpa_2.0_spec</artifactId>
+    </dependency>
   </dependencies>
 </project>

Added: 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/AbstractOSGIAnnotationBeanPostProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/AbstractOSGIAnnotationBeanPostProcessor.java?rev=1143788&view=auto
==============================================================================
--- 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/AbstractOSGIAnnotationBeanPostProcessor.java
 (added)
+++ 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/AbstractOSGIAnnotationBeanPostProcessor.java
 Thu Jul  7 12:16:59 2011
@@ -0,0 +1,326 @@
+/****************************************************************
+ * 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.osgi;
+
+import java.beans.PropertyDescriptor;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.beans.MutablePropertyValues;
+import org.springframework.beans.PropertyValues;
+import org.springframework.beans.factory.BeanClassLoaderAware;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import 
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.osgi.context.BundleContextAware;
+import org.springframework.osgi.service.importer.support.Cardinality;
+import 
org.springframework.osgi.service.importer.support.OsgiServiceCollectionProxyFactoryBean;
+import 
org.springframework.osgi.service.importer.support.OsgiServiceProxyFactoryBean;
+import org.springframework.util.ReflectionUtils;
+
+/**
+ * Abstract base class for {@link BeanPostProcessor} implementations which 
need to wire stuff via annotations and need to be functional via OSGI.
+ * 
+ * Many of this code is borrowed from the spring-dm's class 
<code>org.springframework.osgi.extensions.annotation.ServiceReferenceInjectionBeanPostProcessor.</code>
+ *  * 
+ * 
+ *
+ * @param <A>
+ */
+public abstract class AbstractOSGIAnnotationBeanPostProcessor<A extends 
Annotation> extends InstantiationAwareBeanPostProcessorAdapter implements 
BundleContextAware, BeanClassLoaderAware, BeanFactoryAware{
+
+    public final static long DEFAULT_TIMEOUT = 60 * 1000* 5;
+    private BundleContext bundleContext;
+
+    private static Logger logger = 
LoggerFactory.getLogger(AbstractOSGIAnnotationBeanPostProcessor.class);
+
+    protected BeanFactory beanFactory;
+
+    private ClassLoader classLoader;
+
+    private boolean lookupBeanFactory = true;
+
+    private long timeout = DEFAULT_TIMEOUT;
+
+
+    /**
+     * Set the timeout in milliseconds. The default is 5 minutes
+     * 
+     * @param timeout
+     */
+    public void setTimeout(long timeout) {
+        this.timeout = timeout;
+    }
+    public void setLookupBeanFactory(boolean lookupBeanFactory) {
+        this.lookupBeanFactory = lookupBeanFactory;
+    }
+    
+    private abstract static class ImporterCallAdapter {
+
+        @SuppressWarnings("rawtypes")
+        static void setInterfaces(Object importer, Class[] classes) {
+            if (importer instanceof OsgiServiceProxyFactoryBean)
+                ((OsgiServiceProxyFactoryBean) 
importer).setInterfaces(classes);
+            else
+                ((OsgiServiceCollectionProxyFactoryBean) 
importer).setInterfaces(classes);
+        }
+
+        static void setBundleContext(Object importer, BundleContext context) {
+            ((BundleContextAware) importer).setBundleContext(context);
+        }
+
+        static void setBeanClassLoader(Object importer, ClassLoader cl) {
+            ((BeanClassLoaderAware) importer).setBeanClassLoader(cl);
+        }
+
+        static void setCardinality(Object importer, Cardinality cardinality) {
+            if (importer instanceof OsgiServiceProxyFactoryBean)
+                ((OsgiServiceProxyFactoryBean) 
importer).setCardinality(cardinality);
+            else
+                ((OsgiServiceCollectionProxyFactoryBean) 
importer).setCardinality(cardinality);
+        }
+
+
+        static void afterPropertiesSet(Object importer) throws Exception {
+            ((InitializingBean) importer).afterPropertiesSet();
+        }
+
+        static void setFilter(Object importer, String filter) throws Exception 
{
+            if (importer instanceof OsgiServiceProxyFactoryBean)
+                ((OsgiServiceProxyFactoryBean) importer).setFilter(filter);
+            else
+                ((OsgiServiceCollectionProxyFactoryBean) 
importer).setFilter(filter);
+        }
+
+
+        @SuppressWarnings("unused")
+        static void setServiceBean(Object importer, String name) {
+            if (importer instanceof OsgiServiceProxyFactoryBean)
+                ((OsgiServiceProxyFactoryBean) 
importer).setServiceBeanName(name);
+            else
+                ((OsgiServiceCollectionProxyFactoryBean) 
importer).setServiceBeanName(name);
+        }
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.springframework.beans.factory.BeanClassLoaderAware#setBeanClassLoader(java.lang.ClassLoader)
+     */
+    public void setBeanClassLoader(ClassLoader classLoader) {
+        this.classLoader = classLoader;
+    }
+
+    /**
+     * process FactoryBean created objects, since these will not have had
+     * services injected.
+     * 
+     * @param bean
+     * @param beanName
+     */
+    @Override
+    public Object postProcessAfterInitialization(final Object bean, final 
String beanName) throws BeansException {
+        if (logger.isDebugEnabled())
+            logger.debug("processing [" + bean.getClass().getName() + ", " + 
beanName + "]");
+        // Catch FactoryBean created instances.
+        if (!(bean instanceof FactoryBean) && 
beanFactory.containsBean(BeanFactory.FACTORY_BEAN_PREFIX + beanName)) {
+            injectServices(bean, beanName);
+        }
+        return bean;
+    }
+
+    /* private version of the injector can use */
+    private void injectServices(final Object bean, final String beanName) {
+        ReflectionUtils.doWithMethods(bean.getClass(), new 
ReflectionUtils.MethodCallback() {
+
+            public void doWith(Method method) {
+                A s = AnnotationUtils.getAnnotation(method, getAnnotation());
+                if (s != null && method.getParameterTypes().length == 1) {
+                    try {
+                        if (logger.isDebugEnabled())
+                            logger.debug("Processing annotation [" + s + "] 
for [" + bean.getClass().getName() + "."
+                                    + method.getName() + "()] on bean [" + 
beanName + "]");
+                        method.invoke(bean, getServiceImporter(s, method, 
beanName).getObject());
+                    }
+                    catch (Exception e) {
+                        throw new IllegalArgumentException("Error processing 
annotation " +s , e);
+                    }
+                }
+            }
+        });
+    }
+
+    @Override
+    @SuppressWarnings("rawtypes")
+    public PropertyValues postProcessPropertyValues(PropertyValues pvs, 
PropertyDescriptor[] pds, Object bean,
+            String beanName) throws BeansException {
+
+        MutablePropertyValues newprops = new MutablePropertyValues(pvs);
+        for (PropertyDescriptor pd : pds) {
+            A s = hasAnnotatedProperty(pd);
+            if (s != null && !pvs.contains(pd.getName())) {
+                try {
+                    if (logger.isDebugEnabled())
+                        logger.debug("Processing annotation [" + s + "] for [" 
+ beanName + "." + pd.getName() + "]");
+                    FactoryBean importer = getServiceImporter(s, 
pd.getWriteMethod(), beanName);
+                    // BPPs are created in stageOne(), even though they are 
run in stageTwo(). This check means that
+                    // the call to getObject() will not fail with 
ServiceUnavailable. This is safe to do because
+                    // ServiceReferenceDependencyBeanFactoryPostProcessor will 
ensure that mandatory services are
+                    // satisfied before stageTwo() is run.
+                    if (bean instanceof BeanPostProcessor) {
+                        ImporterCallAdapter.setCardinality(importer, 
Cardinality.C_0__1);
+                    }
+                    newprops.addPropertyValue(pd.getName(), 
importer.getObject());
+                }
+                catch (Exception e) {
+                    throw new FatalBeanException("Could not create service 
reference", e);
+                }
+            }
+        }
+        return newprops;
+    }
+
+    @SuppressWarnings("rawtypes")
+    private FactoryBean getServiceImporter(final A s, final Method 
writeMethod, String beanName) throws Exception {
+        // Invocations will block here, so although the ApplicationContext is
+        // created nothing will
+        // proceed until all the dependencies are satisfied.
+        Class<?>[] params = writeMethod.getParameterTypes();
+        if (params.length != 1) {
+            throw new IllegalArgumentException("Setter for [" + beanName + "] 
must have only one argument");
+        }
+
+        if (lookupBeanFactory) {
+            if (logger.isDebugEnabled())
+                logger.debug("Lookup the bean via the BeanFactory");
+            
+            final Class<?> clazz = writeMethod.getParameterTypes()[0];
+            Object bean;
+            try {
+                bean = getBeanFromFactory(s, clazz);
+            } catch (NoSuchBeanDefinitionException e) {
+                // We was not able to find the bean in the factory so fallback 
to the osgi registry
+                bean = null;
+            }
+            
+            if (bean != null) {
+                final Object fBean = bean;
+                
+                // Create a new FactoryBean which just return the found beab
+                return new FactoryBean() {
+
+                    @Override
+                    public Object getObject() throws Exception {
+                        return fBean;
+                    }
+
+                    @Override
+                    public Class getObjectType() {
+                        return fBean.getClass();
+                    }
+
+                    @Override
+                    public boolean isSingleton() {
+                        return true;
+                    }
+                };
+            }
+        }
+        // The bean was not found in the BeanFactory. Its time to lookup it 
via the OSGI-Registry
+        return getResourceProperty(new OsgiServiceProxyFactoryBean(), 
getFilter(s), writeMethod, beanName);
+    }
+
+    
+
+    @SuppressWarnings("rawtypes")
+    private FactoryBean getResourceProperty(OsgiServiceProxyFactoryBean pfb,  
String filter, Method writeMethod, String beanName) throws Exception {
+        pfb.setTimeout(timeout);
+        
+        // check if the we have a name for the requested bean. If so we set 
the filter for it
+        if (filter != null) {
+            ImporterCallAdapter.setFilter(pfb, filter );
+        }
+        ImporterCallAdapter.setInterfaces(pfb, 
writeMethod.getParameterTypes());
+        
+        ImporterCallAdapter.setBundleContext(pfb, bundleContext);
+        ImporterCallAdapter.setBeanClassLoader(pfb, classLoader);
+        ImporterCallAdapter.afterPropertiesSet(pfb);
+        return pfb;
+    }
+
+
+    private A hasAnnotatedProperty(PropertyDescriptor propertyDescriptor) {
+        Method setter = propertyDescriptor.getWriteMethod();
+        return setter != null ? AnnotationUtils.getAnnotation(setter, 
getAnnotation()) : null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.springframework.osgi.context.BundleContextAware#setBundleContext(org.osgi.framework.BundleContext)
+     */
+    public void setBundleContext(BundleContext context) {
+        this.bundleContext = context;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory)
+     */
+    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+        this.beanFactory = beanFactory;
+    }
+    
+
+    /**
+     * Return the class of the {@link Annotation}
+     * 
+     * @return clazz
+     */
+    protected abstract Class<A> getAnnotation();
+    
+    /**
+     * Return the filter which should get used to lookup the service in the 
osgi registry.
+     * If no special filter should be used, just return null
+     * 
+     * @param annotation
+     * @return filter
+     */
+    protected abstract String getFilter(A annotation);
+    
+    /**
+     * Return the Bean lookup-ed from the {@link BeanFactory}. If non can be 
found just return null
+     * 
+     * @param a
+     * @param clazz
+     * @return bean
+     */
+    protected abstract Object getBeanFromFactory(A a, Class<?> clazz);
+    
+}
+

Added: 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIPersistenceUnitAnnotationBeanPostProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIPersistenceUnitAnnotationBeanPostProcessor.java?rev=1143788&view=auto
==============================================================================
--- 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIPersistenceUnitAnnotationBeanPostProcessor.java
 (added)
+++ 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIPersistenceUnitAnnotationBeanPostProcessor.java
 Thu Jul  7 12:16:59 2011
@@ -0,0 +1,49 @@
+/****************************************************************
+ * 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.osgi;
+
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceUnit;
+
+
+/**
+ * Inject the {@link EntityManagerFactory} if an method is marked with the 
{@link PersistenceUnit} annotation
+ * 
+ *
+ */
+public class OSGIPersistenceUnitAnnotationBeanPostProcessor extends 
AbstractOSGIAnnotationBeanPostProcessor<PersistenceUnit>{
+
+
+    @Override
+    protected Class<PersistenceUnit> getAnnotation() {
+        return PersistenceUnit.class;
+    }
+
+    @Override
+    protected String getFilter(PersistenceUnit a) {
+        return null;
+    }
+
+    @Override
+    protected Object getBeanFromFactory(PersistenceUnit a, Class<?> clazz) {
+        return beanFactory.getBean(clazz);
+    }
+
+}

Added: 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIResourceAnnotationBeanPostProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIResourceAnnotationBeanPostProcessor.java?rev=1143788&view=auto
==============================================================================
--- 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIResourceAnnotationBeanPostProcessor.java
 (added)
+++ 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OSGIResourceAnnotationBeanPostProcessor.java
 Thu Jul  7 12:16:59 2011
@@ -0,0 +1,45 @@
+/****************************************************************
+ * 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.osgi;
+
+import javax.annotation.Resource;
+
+import org.springframework.osgi.service.exporter.OsgiServicePropertiesResolver;
+
+public class OSGIResourceAnnotationBeanPostProcessor extends 
AbstractOSGIAnnotationBeanPostProcessor<Resource>{
+
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.container.spring.lifecycle.osgi.AbstractOSGIAnnotationBeanPostProcessor#getAnnotation()
+     */
+    protected Class<Resource> getAnnotation() {
+        return Resource.class;
+    }
+
+    @Override
+    protected String getFilter(Resource a) {
+        return  "(" +OsgiServicePropertiesResolver.BEAN_NAME_PROPERTY_KEY + 
"=" + a.name() +")";
+    }
+    @Override
+    protected Object getBeanFromFactory(Resource a, Class<?> clazz) {
+        return beanFactory.getBean(a.name(), clazz);
+    }
+    
+}

Modified: 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OsgiLifecycleBeanFactoryPostProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OsgiLifecycleBeanFactoryPostProcessor.java?rev=1143788&r1=1143787&r2=1143788&view=diff
==============================================================================
--- 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OsgiLifecycleBeanFactoryPostProcessor.java
 (original)
+++ 
james/server/trunk/lifecycle-spring/src/main/java/org/apache/james/container/spring/lifecycle/osgi/OsgiLifecycleBeanFactoryPostProcessor.java
 Thu Jul  7 12:16:59 2011
@@ -18,45 +18,72 @@
  ****************************************************************/
 package org.apache.james.container.spring.lifecycle.osgi;
 
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
 import 
org.apache.james.container.spring.lifecycle.ConfigurableBeanPostProcessor;
+import org.apache.james.container.spring.lifecycle.ConfigurationProvider;
 import org.apache.james.container.spring.lifecycle.LogEnabledBeanPostProcessor;
+import org.apache.james.container.spring.lifecycle.LogProvider;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.InvalidSyntaxException;
 import org.springframework.beans.BeansException;
+import 
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor;
 import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import 
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
 import org.springframework.osgi.extender.OsgiBeanFactoryPostProcessor;
 
 
 public class OsgiLifecycleBeanFactoryPostProcessor implements 
OsgiBeanFactoryPostProcessor {
 
-    private ConfigurableBeanPostProcessor configurationProcessor;
-    private LogEnabledBeanPostProcessor loggingProcessor;
-    private CommonAnnotationBeanPostProcessor annotationProcessor;
 
-    public void setConfigurationProcessor(ConfigurableBeanPostProcessor 
configurationProcessor) {
-        this.configurationProcessor = configurationProcessor;
-    }
+    private ConfigurationProvider confProvider;
+    private LogProvider logProvider;
 
-    public void setLoggingProcessor(LogEnabledBeanPostProcessor 
loggingProcessor) {
-        this.loggingProcessor = loggingProcessor;
+    public void setConfigurationProvider(ConfigurationProvider confProvider) {
+        this.confProvider = confProvider;
     }
 
-    public void setAnnotationProcessor(CommonAnnotationBeanPostProcessor 
annotationProcessor) {
-        this.annotationProcessor = annotationProcessor;
+    public void setLogProvider(LogProvider logProvider) {
+        this.logProvider = logProvider;
     }
 
+
     @Override
     public void postProcessBeanFactory(BundleContext context, 
ConfigurableListableBeanFactory factory) throws BeansException, 
InvalidSyntaxException, BundleException {
         // We need to set the beanfactory by hand. This MAY be a bug in 
spring-dm but I'm not sure yet
+        LogEnabledBeanPostProcessor loggingProcessor = new 
LogEnabledBeanPostProcessor();
         loggingProcessor.setBeanFactory(factory);
+        loggingProcessor.setLogProvider(logProvider);
+        loggingProcessor.setOrder(0);
         factory.addBeanPostProcessor(loggingProcessor);
+        
+        OSGIResourceAnnotationBeanPostProcessor resourceProcessor = new 
OSGIResourceAnnotationBeanPostProcessor();
+        resourceProcessor.setBeanClassLoader(factory.getBeanClassLoader());
+        resourceProcessor.setBeanFactory(factory);
+        resourceProcessor.setBundleContext(context);
+        resourceProcessor.setTimeout(60 * 1000);
+        factory.addBeanPostProcessor(resourceProcessor);
+        
+        OSGIPersistenceUnitAnnotationBeanPostProcessor persistenceProcessor = 
new OSGIPersistenceUnitAnnotationBeanPostProcessor();
+        persistenceProcessor.setBeanClassLoader(factory.getBeanClassLoader());
+        persistenceProcessor.setBeanFactory(factory);
+        persistenceProcessor.setBundleContext(context);
+        persistenceProcessor.setTimeout(60 * 1000);
+        factory.addBeanPostProcessor(persistenceProcessor);
+        
+        ConfigurableBeanPostProcessor configurationProcessor = new 
ConfigurableBeanPostProcessor();
         configurationProcessor.setBeanFactory(factory);
+        configurationProcessor.setConfigurationProvider(confProvider);
+        configurationProcessor.setOrder(2);
         factory.addBeanPostProcessor(configurationProcessor);
-        annotationProcessor.setBeanFactory(factory);
+        
+        InitDestroyAnnotationBeanPostProcessor annotationProcessor = new 
InitDestroyAnnotationBeanPostProcessor();
+        annotationProcessor.setInitAnnotationType(PostConstruct.class);
+        annotationProcessor.setDestroyAnnotationType(PreDestroy.class);
         factory.addBeanPostProcessor(annotationProcessor);
 
+
     }
 
 }

Modified: 
james/server/trunk/lifecycle-spring/src/main/resources/META-INF/spring/extender/lifecycle-extender.xml
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lifecycle-spring/src/main/resources/META-INF/spring/extender/lifecycle-extender.xml?rev=1143788&r1=1143787&r2=1143788&view=diff
==============================================================================
--- 
james/server/trunk/lifecycle-spring/src/main/resources/META-INF/spring/extender/lifecycle-extender.xml
 (original)
+++ 
james/server/trunk/lifecycle-spring/src/main/resources/META-INF/spring/extender/lifecycle-extender.xml
 Thu Jul  7 12:16:59 2011
@@ -23,35 +23,14 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd";>
 
     <!-- 
-    ===========================================================================
-       Annotation - Bean Post-Processors
-    ===========================================================================
-    -->
-          
-    <!-- 
-      Enable Java Annotations processing.
-     -->
-    <bean id="annotationProcessor" 
class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
-        <property name="order" value="3" />
-    </bean>
-
-    <!-- 
       Spring "Bean-Post-Processor" for LogEnabled interface.
      -->
-    <bean id="loggingProcessor" 
class="org.apache.james.container.spring.lifecycle.LogEnabledBeanPostProcessor">
-        <property name="logProvider" ref="logprovider" />
-        <property name="order" value="0" />
-    </bean>
     <bean id="logprovider" 
class="org.apache.james.container.spring.lifecycle.LogProviderImpl">
     </bean>
 
     <!-- 
       Spring "Bean-Post-Processor" for Configurable interface.
      -->
-    <bean id="configurationProcessor" 
class="org.apache.james.container.spring.lifecycle.ConfigurableBeanPostProcessor">
-        <property name="configurationProvider" ref="configurationprovider" />
-        <property name="order" value="1" />
-    </bean>
     <bean id="configurationprovider" 
class="org.apache.james.container.spring.lifecycle.osgi.OSGIConfigurationProvider">
     <!--  
         <property name="configurationMappings">
@@ -65,9 +44,8 @@
     </bean>
     
     <bean 
class="org.apache.james.container.spring.lifecycle.osgi.OsgiLifecycleBeanFactoryPostProcessor">
-        <property name="loggingProcessor" ref="loggingProcessor" />
-        <property name="configurationProcessor" ref="configurationProcessor" />
-        <property name="annotationProcessor" ref="annotationProcessor" />
+        <property name="logProvider" ref="logprovider" />
+        <property name="configurationProvider" ref="configurationprovider" />
     </bean>
   
 </beans>



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to