Repository: camel Updated Branches: refs/heads/master 07ff1d9c4 -> a04a95313
CAMEL-6380: OSGi blueprint classloading is half fucked up. Now works. But wonder if we must have the .class at imports so the felix bundle plugin ensures these packages are in the OSGi import manifest. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a04a9531 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a04a9531 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a04a9531 Branch: refs/heads/master Commit: a04a9531323d6a33b2bd06e661f6f825a53195cf Parents: 07ff1d9 Author: Claus Ibsen <davscl...@apache.org> Authored: Sun Feb 15 16:59:24 2015 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Feb 15 16:59:24 2015 +0100 ---------------------------------------------------------------------- .../camel/blueprint/BlueprintCamelContext.java | 4 +- .../BlueprintModelJAXBContextFactory.java | 50 ++++++++++++++++---- .../handler/CamelNamespaceHandler.java | 16 +++---- .../camel/blueprint/BlueprintJaxbRestTest.java | 2 +- .../camel/blueprint/BlueprintJaxbTest.java | 9 ++-- 5 files changed, 55 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/a04a9531/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java ---------------------------------------------------------------------- diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java index db5342f..9f5a6cd 100644 --- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java +++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Properties; import org.apache.camel.TypeConverter; +import org.apache.camel.blueprint.handler.CamelNamespaceHandler; import org.apache.camel.core.osgi.OsgiCamelContextHelper; import org.apache.camel.core.osgi.OsgiCamelContextPublisher; import org.apache.camel.core.osgi.OsgiFactoryFinderResolver; @@ -68,7 +69,8 @@ public class BlueprintCamelContext extends DefaultCamelContext implements Servic setLanguageResolver(new BlueprintLanguageResolver(bundleContext)); setDataFormatResolver(new BlueprintDataFormatResolver(bundleContext)); setApplicationContextClassLoader(new BundleDelegatingClassLoader(bundleContext.getBundle())); - setModelJAXBContextFactory(new BlueprintModelJAXBContextFactory()); + // must use classloader of the namespace handler + setModelJAXBContextFactory(new BlueprintModelJAXBContextFactory(CamelNamespaceHandler.class.getClassLoader())); } public BundleContext getBundleContext() { http://git-wip-us.apache.org/repos/asf/camel/blob/a04a9531/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java ---------------------------------------------------------------------- diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java index 90a74d8..dac0952 100644 --- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java +++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java @@ -16,20 +16,50 @@ */ package org.apache.camel.blueprint; -import org.apache.camel.impl.DefaultModelJAXBContextFactory; +import java.util.LinkedHashSet; +import java.util.Set; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; -public class BlueprintModelJAXBContextFactory extends DefaultModelJAXBContextFactory{ +import org.apache.camel.core.xml.AbstractCamelContextFactoryBean; +import org.apache.camel.spi.ModelJAXBContextFactory; +import org.apache.camel.util.blueprint.SSLContextParametersFactoryBean; - public static final String ADDITIONAL_JAXB_CONTEXT_PACKAGES = ":" - + "org.apache.camel.core.xml:" - + "org.apache.camel.blueprint:" - + "org.apache.camel.util.blueprint:"; +public class BlueprintModelJAXBContextFactory implements ModelJAXBContextFactory { - protected String getPackages() { - return super.getPackages() + ADDITIONAL_JAXB_CONTEXT_PACKAGES; + private final ClassLoader classLoader; + + public BlueprintModelJAXBContextFactory(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + private String getPackages() { + // we nedd to have a class from each different package with jaxb models + // and we must use the .class for the classloader to work in OSGi + Set<Class<?>> classes = new LinkedHashSet<Class<?>>(); + classes.add(CamelContextFactoryBean.class); + classes.add(AbstractCamelContextFactoryBean.class); + classes.add(SSLContextParametersFactoryBean.class); + classes.add(org.apache.camel.ExchangePattern.class); + classes.add(org.apache.camel.model.RouteDefinition.class); + classes.add(org.apache.camel.model.config.StreamResequencerConfig.class); + classes.add(org.apache.camel.model.dataformat.DataFormatsDefinition.class); + classes.add(org.apache.camel.model.language.ExpressionDefinition.class); + classes.add(org.apache.camel.model.loadbalancer.RoundRobinLoadBalancerDefinition.class); + classes.add(org.apache.camel.model.rest.RestDefinition.class); + + StringBuilder packages = new StringBuilder(); + for (Class<?> cl : classes) { + if (packages.length() > 0) { + packages.append(":"); + } + packages.append(cl.getName().substring(0, cl.getName().lastIndexOf('.'))); + } + return packages.toString(); } - protected ClassLoader getClassLoader() { - return getClass().getClassLoader(); + @Override + public JAXBContext newJAXBContext() throws JAXBException { + return JAXBContext.newInstance(getPackages(), classLoader); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/a04a9531/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java ---------------------------------------------------------------------- diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java index 8d0dceb..31f7723 100644 --- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java +++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java @@ -32,12 +32,6 @@ import javax.xml.bind.Binder; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - import org.apache.aries.blueprint.BeanProcessor; import org.apache.aries.blueprint.ComponentDefinitionRegistry; import org.apache.aries.blueprint.ComponentDefinitionRegistryProcessor; @@ -54,15 +48,14 @@ import org.apache.camel.Endpoint; import org.apache.camel.EndpointInject; import org.apache.camel.Produce; import org.apache.camel.PropertyInject; -import org.apache.camel.blueprint.BlueprintModelJAXBContextFactory; import org.apache.camel.blueprint.BlueprintCamelContext; +import org.apache.camel.blueprint.BlueprintModelJAXBContextFactory; import org.apache.camel.blueprint.CamelContextFactoryBean; import org.apache.camel.blueprint.CamelEndpointFactoryBean; import org.apache.camel.blueprint.CamelRestContextFactoryBean; import org.apache.camel.blueprint.CamelRouteContextFactoryBean; import org.apache.camel.builder.xml.Namespaces; import org.apache.camel.component.properties.PropertiesComponent; -import org.apache.camel.core.xml.AbstractCamelContextFactoryBean; import org.apache.camel.core.xml.AbstractCamelFactoryBean; import org.apache.camel.impl.CamelPostProcessorHelper; import org.apache.camel.impl.DefaultCamelContextNameStrategy; @@ -107,6 +100,11 @@ import org.osgi.service.blueprint.reflect.Metadata; import org.osgi.service.blueprint.reflect.RefMetadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import static org.osgi.service.blueprint.reflect.ComponentMetadata.ACTIVATION_LAZY; import static org.osgi.service.blueprint.reflect.ServiceReferenceMetadata.AVAILABILITY_MANDATORY; @@ -633,7 +631,7 @@ public class CamelNamespaceHandler implements NamespaceHandler { public JAXBContext getJaxbContext() throws JAXBException { if (jaxbContext == null) { - jaxbContext = new BlueprintModelJAXBContextFactory().newJAXBContext(); + jaxbContext = new BlueprintModelJAXBContextFactory(getClass().getClassLoader()).newJAXBContext(); } return jaxbContext; } http://git-wip-us.apache.org/repos/asf/camel/blob/a04a9531/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbRestTest.java ---------------------------------------------------------------------- diff --git a/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbRestTest.java b/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbRestTest.java index 3ee9f75..0e3ab3a 100644 --- a/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbRestTest.java +++ b/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbRestTest.java @@ -54,7 +54,7 @@ public class BlueprintJaxbRestTest extends TestSupport { } CamelNamespaceHandler.doBeforeParse(elem, CamelNamespaceHandler.BLUEPRINT_NS, CamelNamespaceHandler.SPRING_NS); - JAXBContext context = new BlueprintModelJAXBContextFactory().newJAXBContext(); + JAXBContext context = new BlueprintModelJAXBContextFactory(getClass().getClassLoader()).newJAXBContext(); Unmarshaller unmarshaller = context.createUnmarshaller(); Object object = unmarshaller.unmarshal(elem); assertNotNull(object); http://git-wip-us.apache.org/repos/asf/camel/blob/a04a9531/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbTest.java ---------------------------------------------------------------------- diff --git a/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbTest.java b/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbTest.java index 7e4194a..2825f1f 100644 --- a/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbTest.java +++ b/components/camel-blueprint/src/test/java/org/apache/camel/blueprint/BlueprintJaxbTest.java @@ -21,15 +21,14 @@ import javax.xml.bind.Unmarshaller; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.camel.blueprint.handler.CamelNamespaceHandler; +import org.apache.camel.test.junit4.TestSupport; +import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import org.apache.camel.blueprint.handler.CamelNamespaceHandler; -import org.apache.camel.test.junit4.TestSupport; -import org.junit.Test; - public class BlueprintJaxbTest extends TestSupport { @Test @@ -54,7 +53,7 @@ public class BlueprintJaxbTest extends TestSupport { } CamelNamespaceHandler.doBeforeParse(elem, CamelNamespaceHandler.BLUEPRINT_NS, CamelNamespaceHandler.SPRING_NS); - JAXBContext context = new BlueprintModelJAXBContextFactory().newJAXBContext(); + JAXBContext context = new BlueprintModelJAXBContextFactory(getClass().getClassLoader()).newJAXBContext(); Unmarshaller unmarshaller = context.createUnmarshaller(); Object object = unmarshaller.unmarshal(elem); assertNotNull(object);