Author: norman
Date: Wed Jul  6 20:33:34 2011
New Revision: 1143550

URL: http://svn.apache.org/viewvc?rev=1143550&view=rev
Log:
Make sure the right BeanFactory is used for register the beans (still work in 
progress). See JAMES-855

Modified:
    
james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/osgi/AbstractServiceTracker.java

Modified: 
james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/osgi/AbstractServiceTracker.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/osgi/AbstractServiceTracker.java?rev=1143550&r1=1143549&r2=1143550&view=diff
==============================================================================
--- 
james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/osgi/AbstractServiceTracker.java
 (original)
+++ 
james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/osgi/AbstractServiceTracker.java
 Wed Jul  6 20:33:34 2011
@@ -30,16 +30,21 @@ import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.BundleListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.BeanFactory;
 import org.springframework.beans.factory.BeanFactoryAware;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.context.ApplicationContext;
 import org.springframework.osgi.context.BundleContextAware;
+import org.springframework.osgi.service.exporter.OsgiServicePropertiesResolver;
 import 
org.springframework.osgi.service.exporter.support.BeanNameServicePropertiesResolver;
 
 /**
@@ -53,9 +58,9 @@ import org.springframework.osgi.service.
 public abstract class AbstractServiceTracker implements BeanFactoryAware, 
BundleListener, BundleContextAware, InitializingBean, DisposableBean {
 
     private BundleContext context;
-    private BeanFactory factory;
     private String configuredClass;
     private final List<ServiceRegistration> reg = new 
ArrayList<ServiceRegistration>();
+    private BeanFactory factory;
 
     @Override
     public void setBeanFactory(BeanFactory factory) throws BeansException {
@@ -89,7 +94,7 @@ public abstract class AbstractServiceTra
 
                     String className = file.replaceAll("/", 
".").replaceAll(".class", "").replaceFirst(".", "");
                     if (className.equals(configuredClass)) {
-                        
+                        BeanFactory bFactory = 
getBeanFactory(b.getBundleContext());
                         // Get the right service properties from the resolver
                         Properties p = new Properties();
 
@@ -102,12 +107,12 @@ public abstract class AbstractServiceTra
                         Class<?> clazz = getServiceClass();
                         
                         // Create the definition and register it
-                        BeanDefinitionRegistry registry = 
(BeanDefinitionRegistry) factory;
+                        BeanDefinitionRegistry registry = 
(BeanDefinitionRegistry) bFactory;
                         BeanDefinition def = 
BeanDefinitionBuilder.genericBeanDefinition(className).getBeanDefinition();
                         registry.registerBeanDefinition(getComponentName(), 
def);
 
                         // register the bean as service in the BundleContext
-                        
reg.add(b.getBundleContext().registerService(clazz.getName(), 
factory.getBean(getComponentName(), clazz), p));
+                        
reg.add(b.getBundleContext().registerService(clazz.getName(), 
bFactory.getBean(getComponentName(), clazz), p));
                     }
                 }
             }
@@ -133,6 +138,23 @@ public abstract class AbstractServiceTra
 
     }
 
+    private static AutowireCapableBeanFactory getBeanFactory(final 
BundleContext bundleContext) {
+        final String filter = "(" + 
OsgiServicePropertiesResolver.BEAN_NAME_PROPERTY_KEY + "=" + 
bundleContext.getBundle().getSymbolicName() + ")";
+        final ServiceReference[] applicationContextRefs;       
+        try {
+            applicationContextRefs = 
bundleContext.getServiceReferences(ApplicationContext.class.getName(), filter);
+        } catch (final InvalidSyntaxException e) {
+            throw new RuntimeException(e);
+        }
+       
+        if(applicationContextRefs.length != 1) {
+            return null;
+        }
+       
+        return ((ApplicationContext) 
bundleContext.getService(applicationContextRefs[0])).getAutowireCapableBeanFactory();
+       
+    }
+
     @Override
     public void afterPropertiesSet() throws Exception {
         ConfigurationProvider confProvider = 
factory.getBean(ConfigurationProvider.class);



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

Reply via email to