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 <jamesnether...@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));