You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/09/11 09:22:10 UTC
camel git commit: [CAMEL-8748] DozerBeanMapper cannot instantiate
DozerThreadContextClassLoader. This closes #607.
Repository: camel
Updated Branches:
refs/heads/camel-2.15.x bb3a145a9 -> cd22d3412
[CAMEL-8748] DozerBeanMapper cannot instantiate DozerThreadContextClassLoader. This closes #607.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/cd22d341
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/cd22d341
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/cd22d341
Branch: refs/heads/camel-2.15.x
Commit: cd22d341243221174e493c713629eea42f54c41e
Parents: bb3a145
Author: Thomas Diesler <th...@jboss.com>
Authored: Mon Jul 27 13:57:42 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Sep 11 09:21:39 2015 +0200
----------------------------------------------------------------------
.../dozer/DozerThreadContextClassLoader.java | 17 +--
.../dozer/DozerTypeConverterLoader.java | 138 +++++++++----------
2 files changed, 68 insertions(+), 87 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/cd22d341/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerThreadContextClassLoader.java
----------------------------------------------------------------------
diff --git a/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerThreadContextClassLoader.java b/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerThreadContextClassLoader.java
index b5d9806..8d1d482 100644
--- a/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerThreadContextClassLoader.java
+++ b/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerThreadContextClassLoader.java
@@ -29,13 +29,7 @@ import org.slf4j.LoggerFactory;
public class DozerThreadContextClassLoader implements DozerClassLoader {
private static final Logger LOG = LoggerFactory.getLogger(DozerThreadContextClassLoader.class);
-
- private final DozerClassLoader delegate;
- public DozerThreadContextClassLoader(DozerClassLoader delegate) {
- this.delegate = delegate;
- }
-
@Override
public Class<?> loadClass(String className) {
LOG.debug("Loading class from classloader: {}.", Thread.currentThread().getContextClassLoader());
@@ -44,11 +38,7 @@ public class DozerThreadContextClassLoader implements DozerClassLoader {
// try to resolve the class from the thread context classloader
result = ClassUtils.getClass(Thread.currentThread().getContextClassLoader(), className);
} catch (ClassNotFoundException e) {
- // if unresolvable, ask the delegate
- result = delegate.loadClass(className);
- if (result == null) {
- MappingUtils.throwMappingException(e);
- }
+ MappingUtils.throwMappingException(e);
}
return result;
}
@@ -63,11 +53,6 @@ public class DozerThreadContextClassLoader implements DozerClassLoader {
answer = cl.getResource(uri);
}
- // try loading it from the delegate
- if (answer == null && delegate != null) {
- answer = delegate.loadResource(uri);
- }
-
// try treating it as a system resource
if (answer == null) {
answer = ClassLoader.getSystemResource(uri);
http://git-wip-us.apache.org/repos/asf/camel/blob/cd22d341/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverterLoader.java
----------------------------------------------------------------------
diff --git a/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverterLoader.java b/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverterLoader.java
index 080e621..6696115 100644
--- a/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverterLoader.java
+++ b/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverterLoader.java
@@ -16,8 +16,9 @@
*/
package org.apache.camel.converter.dozer;
-import java.lang.reflect.Field;
+import static org.dozer.classmap.MappingDirection.ONE_WAY;
+import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
@@ -39,7 +40,6 @@ import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
import org.dozer.classmap.ClassMap;
import org.dozer.classmap.MappingFileData;
-import org.dozer.config.BeanContainer;
import org.dozer.config.GlobalSettings;
import org.dozer.loader.api.BeanMappingBuilder;
import org.dozer.loader.xml.MappingFileReader;
@@ -48,8 +48,6 @@ import org.dozer.util.DozerClassLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.dozer.classmap.MappingDirection.ONE_WAY;
-
/**
* <code>DozerTypeConverterLoader</code> provides the mechanism for registering
* a Dozer {@link Mapper} as {@link TypeConverter} for a {@link CamelContext}.
@@ -112,19 +110,24 @@ public class DozerTypeConverterLoader extends ServiceSupport implements CamelCon
throw new IllegalStateException("Cannot configure Dozer GlobalSettings to use CamelToDozerClassResolverAdapter as classloader due " + e.getMessage(), e);
}
- switchClassloader();
-
- log.info("Using DozerBeanMapperConfiguration: {}", configuration);
- DozerBeanMapper mapper = createDozerBeanMapper(configuration);
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ try {
+ ClassLoader appcl = camelContext.getApplicationContextClassLoader();
+ if (appcl != null) {
+ Thread.currentThread().setContextClassLoader(appcl);
+ }
+ log.info("Using DozerBeanMapperConfiguration: {}", configuration);
+ DozerBeanMapper mapper = createDozerBeanMapper(configuration);
- this.camelContext = camelContext;
- this.mapper = mapper;
- this.configuration = configuration;
+ this.camelContext = camelContext;
+ this.mapper = mapper;
+ this.configuration = configuration;
- try {
camelContext.addService(this);
} catch (Exception e) {
throw ObjectHelper.wrapRuntimeCamelException(e);
+ } finally {
+ Thread.currentThread().setContextClassLoader(tccl);
}
}
@@ -163,60 +166,69 @@ public class DozerTypeConverterLoader extends ServiceSupport implements CamelCon
this.mapper = mapper;
}
- switchClassloader();
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ try {
+ ClassLoader appcl = camelContext.getApplicationContextClassLoader();
+ if (appcl != null) {
+ Thread.currentThread().setContextClassLoader(appcl);
+ }
- Map<String, DozerBeanMapper> mappers = lookupDozerBeanMappers();
- // only add if we do not already have it
- if (mapper != null && !mappers.containsValue(mapper)) {
- mappers.put("parameter", mapper);
- }
+ Map<String, DozerBeanMapper> mappers = lookupDozerBeanMappers();
+ // only add if we do not already have it
+ if (mapper != null && !mappers.containsValue(mapper)) {
+ mappers.put("parameter", mapper);
+ }
- // add any dozer bean mapper configurations
- Map<String, DozerBeanMapperConfiguration> configurations = lookupDozerBeanMapperConfigurations();
- if (configurations != null && configuration != null) {
- // filter out existing configuration, as we do not want to use it twice
- String key = null;
- for (Map.Entry<String, DozerBeanMapperConfiguration> entry : configurations.entrySet()) {
- if (entry.getValue() == configuration) {
- key = entry.getKey();
- break;
+ // add any dozer bean mapper configurations
+ Map<String, DozerBeanMapperConfiguration> configurations = lookupDozerBeanMapperConfigurations();
+ if (configurations != null && configuration != null) {
+ // filter out existing configuration, as we do not want to use it twice
+ String key = null;
+ for (Map.Entry<String, DozerBeanMapperConfiguration> entry : configurations.entrySet()) {
+ if (entry.getValue() == configuration) {
+ key = entry.getKey();
+ break;
+ }
+ }
+ if (key != null) {
+ configurations.remove(key);
}
}
- if (key != null) {
- configurations.remove(key);
+
+ if (configurations != null) {
+ if (configurations.size() > 1) {
+ log.warn("Loaded " + configurations.size() + " Dozer configurations from Camel registry."
+ + " Dozer is most efficient when there is a single mapper instance. Consider amalgamating instances.");
+ }
+ for (Map.Entry<String, DozerBeanMapperConfiguration> entry : configurations.entrySet()) {
+ String id = entry.getKey();
+ DozerBeanMapper beanMapper = createDozerBeanMapper(entry.getValue());
+ // only add if we do not already have it
+ if (!mappers.containsValue(beanMapper)) {
+ mappers.put(id, beanMapper);
+ }
+ }
}
- }
- if (configurations != null) {
- if (configurations.size() > 1) {
- log.warn("Loaded " + configurations.size() + " Dozer configurations from Camel registry."
+ if (mappers.size() > 1) {
+ log.warn("Loaded " + mappers.size() + " Dozer mappers from Camel registry."
+ " Dozer is most efficient when there is a single mapper instance. Consider amalgamating instances.");
+ } else if (mappers.size() == 0) {
+ log.warn("No Dozer mappers found in Camel registry. You should add Dozer mappers as beans to the registry of the type: "
+ + DozerBeanMapper.class.getName());
}
- for (Map.Entry<String, DozerBeanMapperConfiguration> entry : configurations.entrySet()) {
- String id = entry.getKey();
- DozerBeanMapper beanMapper = createDozerBeanMapper(entry.getValue());
- // only add if we do not already have it
- if (!mappers.containsValue(beanMapper)) {
- mappers.put(id, beanMapper);
- }
- }
- }
- if (mappers.size() > 1) {
- log.warn("Loaded " + mappers.size() + " Dozer mappers from Camel registry."
- + " Dozer is most efficient when there is a single mapper instance. Consider amalgamating instances.");
- } else if (mappers.size() == 0) {
- log.warn("No Dozer mappers found in Camel registry. You should add Dozer mappers as beans to the registry of the type: "
- + DozerBeanMapper.class.getName());
- }
+ TypeConverterRegistry registry = camelContext.getTypeConverterRegistry();
+ for (Map.Entry<String, DozerBeanMapper> entry : mappers.entrySet()) {
+ String mapperId = entry.getKey();
+ DozerBeanMapper dozer = entry.getValue();
+ List<ClassMap> all = loadMappings(camelContext, mapperId, dozer);
+ registerClassMaps(registry, mapperId, dozer, all);
+ }
- TypeConverterRegistry registry = camelContext.getTypeConverterRegistry();
- for (Map.Entry<String, DozerBeanMapper> entry : mappers.entrySet()) {
- String mapperId = entry.getKey();
- DozerBeanMapper dozer = entry.getValue();
- List<ClassMap> all = loadMappings(camelContext, mapperId, dozer);
- registerClassMaps(registry, mapperId, dozer, all);
+ } finally {
+ Thread.currentThread().setContextClassLoader(tccl);
}
}
@@ -359,22 +371,6 @@ public class DozerTypeConverterLoader extends ServiceSupport implements CamelCon
this.mapper = mapper;
}
- protected void switchClassloader() {
- // must set class loader before we create bean mapper
- DozerClassLoader oldCl = BeanContainer.getInstance().getClassLoader();
- log.info("Current Dozer container-wide classloader: {}.", oldCl);
-
- // if the classloader we're replacing is not a ThreadContextClassLoader, pass it on as delegate target
- // otherwise, don't do anything as we have
- if (!(oldCl instanceof DozerThreadContextClassLoader)) {
- DozerThreadContextClassLoader newCl = new DozerThreadContextClassLoader(oldCl);
- BeanContainer.getInstance().setClassLoader(newCl);
- log.info("Switched Dozer container-wide classloader from: {} to {} (where the latter delegates to former).", oldCl, newCl);
- } else {
- log.info("Dozer container-wide classloader already set: {}. No switch necessary.", oldCl);
- }
- }
-
protected static URL loadMappingFile(ClassResolver classResolver, String mappingFile) {
URL url = null;
try {