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 <thomas.dies...@jboss.com> Authored: Mon Jul 27 13:57:42 2015 +0200 Committer: Claus Ibsen <davscl...@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 {