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