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]