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);

Reply via email to