diff --git a/activemq-osgi/pom.xml b/activemq-osgi/pom.xml index 6389022e46..07928f936a 100644 --- a/activemq-osgi/pom.xml +++ b/activemq-osgi/pom.xml @@ -64,7 +64,9 @@ org.apache.xbean.spring*;resolution:=optional;version="[3.13,5)", org.apache.xbean*;version="[3.13,5)", javax.annotation*, - javax.jms*, + !com.thoughtworks.qdox*, + org.apache.commons.logging;version="[1.2,2)";resolution:=optional, + javax.jms*;version="[1.1,3)", javax.management*, javax.transaction*, javax.naming*;resolution:=optional, diff --git a/activemq-osgi/src/main/java/org/apache/activemq/osgi/ActiveMQServiceFactory.java b/activemq-osgi/src/main/java/org/apache/activemq/osgi/ActiveMQServiceFactory.java index 5e49dfa3f4..7c8d177588 100644 --- a/activemq-osgi/src/main/java/org/apache/activemq/osgi/ActiveMQServiceFactory.java +++ b/activemq-osgi/src/main/java/org/apache/activemq/osgi/ActiveMQServiceFactory.java @@ -26,15 +26,19 @@ import java.util.Properties; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.spring.SpringBrokerContext; import org.apache.activemq.spring.Utils; +import org.apache.camel.osgi.CamelContextFactoryBean; import org.osgi.framework.BundleContext; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedServiceFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; -import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; +import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.Resource; -import org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext; public class ActiveMQServiceFactory implements ManagedServiceFactory { @@ -74,14 +78,34 @@ public class ActiveMQServiceFactory implements ManagedServiceFactory { Thread.currentThread().setContextClassLoader(BrokerService.class.getClassLoader()); Resource resource = Utils.resourceFromString(config); - // when camel is embedded it needs a bundle context - OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(new String[]{resource.getURL().toExternalForm()}) { - @Override - protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) { - reader.setValidating(false); - } - }; - ctx.setBundleContext(bundleContext); + ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext( + new String[]{resource.getURL().toExternalForm()}, false); + + if (isCamelContextFactoryBeanExist()) { + + ctx.addBeanFactoryPostProcessor(new BeanFactoryPostProcessor() { + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + + beanFactory.addBeanPostProcessor(new BeanPostProcessor() { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof CamelContextFactoryBean) { + ((CamelContextFactoryBean) bean).setBundleContext(bundleContext); + } + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + }); + } + }); + } // Handle properties in configuration PropertyPlaceholderConfigurer configurator = new PropertyPlaceholderConfigurer(); @@ -121,6 +145,15 @@ public class ActiveMQServiceFactory implements ManagedServiceFactory { } } + private boolean isCamelContextFactoryBeanExist() { + try { + Class.forName("org.apache.camel.osgi.CamelContextFactoryBean"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + @Override synchronized public void deleted(String pid) { BrokerService broker = brokers.get(pid);