You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2018/09/25 06:55:51 UTC

[camel] branch master updated: CAMEL-12832: Improve Camel CDI context XML resource loading

This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new c4df1d9  CAMEL-12832: Improve Camel CDI context XML resource loading
c4df1d9 is described below

commit c4df1d9ba7ee383b5ea5f4111e66e85f37f2c753
Author: James Netherton <ja...@gmail.com>
AuthorDate: Tue Sep 25 07:47:26 2018 +0100

    CAMEL-12832: Improve Camel CDI context XML resource loading
---
 .../org/apache/camel/cdi/CdiCamelExtension.java    | 11 ++++----
 .../java/org/apache/camel/cdi/ResourceHelper.java  | 32 +++++++++++++++++-----
 .../org/apache/camel/cdi/XmlCdiBeanFactory.java    | 11 ++++----
 3 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
index e4e4c84..6535aa9 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
@@ -118,7 +118,7 @@ public class CdiCamelExtension implements Extension {
 
     private final Set<Annotation> eventQualifiers = newSetFromMap(new ConcurrentHashMap<>());
 
-    private final Set<ImportResource> resources = newSetFromMap(new ConcurrentHashMap<>());
+    private final Map<AnnotatedType<?>, ImportResource> resources = new ConcurrentHashMap<>();
 
     private final CdiCamelConfigurationEvent configuration = new CdiCamelConfigurationEvent();
 
@@ -148,7 +148,7 @@ public class CdiCamelExtension implements Extension {
             eagerBeans.add(pat.getAnnotatedType());
         }
         if (hasAnnotation(pat.getAnnotatedType(), ImportResource.class)) {
-            resources.add(pat.getAnnotatedType().getAnnotation(ImportResource.class));
+            resources.put(pat.getAnnotatedType(), pat.getAnnotatedType().getAnnotation(ImportResource.class));
         }
     }
 
@@ -245,11 +245,12 @@ public class CdiCamelExtension implements Extension {
         Set<SyntheticBean<?>> extraBeans = new HashSet<>();
 
         // Add beans from Camel XML resources
-        for (ImportResource resource : resources) {
+        for (AnnotatedType<?> annotatedType: resources.keySet()) {
             XmlCdiBeanFactory factory = XmlCdiBeanFactory.with(manager, environment, this);
+            ImportResource resource = resources.get(annotatedType);
             for (String path : resource.value()) {
                 try {
-                    extraBeans.addAll(factory.beansFrom(path));
+                    extraBeans.addAll(factory.beansFrom(path, annotatedType));
                 } catch (NoClassDefFoundError cause) {
                     if (cause.getMessage().contains("AbstractCamelContextFactoryBean")) {
                         logger.error("Importing Camel XML requires to have the 'camel-core-xml' dependency in the classpath!");
@@ -258,7 +259,7 @@ public class CdiCamelExtension implements Extension {
                 } catch (Exception cause) {
                     abd.addDefinitionError(
                         new InjectionException(
-                            "Error while importing resource [" + getResource(path) + "]", cause));
+                            "Error while importing resource [" + getResource(path, annotatedType.getJavaClass().getClassLoader()) + "]", cause));
                 }
             }
         }
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/ResourceHelper.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/ResourceHelper.java
index 0cfef7e..aac57be 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/ResourceHelper.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/ResourceHelper.java
@@ -24,15 +24,33 @@ final class ResourceHelper {
     private ResourceHelper() {
     }
 
-    static URL getResource(String path) {
-        ClassLoader loader = Thread.currentThread().getContextClassLoader();
-        if (loader == null) {
-            loader = ResourceHelper.class.getClassLoader();
+    static URL getResource(String path, ClassLoader classLoader) {
+        // Try resource loading from the ClassLoader associated with the @ImportResource annotated class
+        URL url = loadResource(path, classLoader);
+        if (url != null) {
+            return url;
         }
-        if (loader == null) {
-            loader = ClassLoader.getSystemClassLoader();
+
+        // Try resource loading from TCCL
+        url = loadResource(path, Thread.currentThread().getContextClassLoader());
+        if (url != null) {
+            return url;
+        }
+
+        // Try resource loading from this class ClassLoader
+        url = loadResource(path, ResourceHelper.class.getClassLoader());
+        if (url != null) {
+            return url;
         }
 
-        return loader.getResource(path);
+        // Fall back to resource loading via the system ClassLoader
+        return loadResource(path, ClassLoader.getSystemClassLoader());
+    }
+
+    private static URL loadResource(String path, ClassLoader classLoader) {
+        if (classLoader != null) {
+            return classLoader.getResource(path);
+        }
+        return null;
     }
 }
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java
index 53d7a6b..3ef81e2 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java
@@ -35,6 +35,7 @@ import static java.util.Objects.requireNonNull;
 import static java.util.stream.Collectors.toSet;
 
 import javax.enterprise.inject.CreationException;
+import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.xml.bind.JAXBException;
@@ -87,16 +88,16 @@ final class XmlCdiBeanFactory {
         return new XmlCdiBeanFactory(manager, environment, extension);
     }
 
-    Set<SyntheticBean<?>> beansFrom(String path) throws JAXBException, IOException {
-        URL url = getResource(path);
+    Set<SyntheticBean<?>> beansFrom(String path, AnnotatedType<?> annotatedType) throws JAXBException, IOException {
+        URL url = getResource(path, annotatedType.getJavaClass().getClassLoader());
         if (url == null) {
             logger.warn("Unable to locate resource [{}] for import!", path);
             return emptySet();
         }
-        return beansFrom(url);
+        return beansFrom(url, annotatedType);
     }
 
-    Set<SyntheticBean<?>> beansFrom(URL url) throws JAXBException, IOException {
+    Set<SyntheticBean<?>> beansFrom(URL url, AnnotatedType<?> annotatedType) throws JAXBException, IOException {
         try (InputStream xml = url.openStream()) {
             Object node = XmlCdiJaxbContexts.CAMEL_CDI.instance()
                 .createUnmarshaller()
@@ -119,7 +120,7 @@ final class XmlCdiBeanFactory {
                     // Get the base URL as imports are relative to this
                     String path = url.getFile().substring(0, url.getFile().lastIndexOf('/'));
                     String base = url.getProtocol() + "://" + url.getHost() + path;
-                    beans.addAll(beansFrom(base + "/" + definition.getResource()));
+                    beans.addAll(beansFrom(base + "/" + definition.getResource(), annotatedType));
                 }
                 for (RestContextDefinition factory : app.getRestContexts()) {
                     beans.add(restContextBean(factory, url));