[CAMEL-9545] Dozer classloading may fail with spring based context
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/740a5a73 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/740a5a73 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/740a5a73 Branch: refs/heads/master Commit: 740a5a73c2ead8b56ce10e4f112b55fec75e8101 Parents: 626e08d Author: Thomas Diesler <thomas.dies...@jboss.com> Authored: Thu Jan 28 11:18:08 2016 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Thu Jan 28 11:25:56 2016 +0100 ---------------------------------------------------------------------- .../camel/component/dozer/DozerComponent.java | 27 +++++++++++++------- .../camel/component/dozer/DozerEndpoint.java | 12 ++++----- .../dozer/DozerTypeConverterLoader.java | 17 +++--------- 3 files changed, 27 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/740a5a73/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerComponent.java ---------------------------------------------------------------------- diff --git a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerComponent.java b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerComponent.java index 764bf35..f401798 100644 --- a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerComponent.java +++ b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerComponent.java @@ -17,53 +17,62 @@ package org.apache.camel.component.dozer; import java.lang.reflect.Field; +import java.util.List; import java.util.Map; import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.converter.dozer.DozerBeanMapperConfiguration; +import org.apache.camel.converter.dozer.DozerThreadContextClassLoader; import org.apache.camel.impl.UriEndpointComponent; import org.apache.camel.util.ReflectionHelper; +import org.dozer.DozerBeanMapper; import org.dozer.config.GlobalSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DozerComponent extends UriEndpointComponent { - + private static final Logger LOG = LoggerFactory.getLogger(DozerComponent.class); public DozerComponent() { super(DozerEndpoint.class); - initDozerSettings(); } - + public DozerComponent(CamelContext context) { super(context, DozerEndpoint.class); - initDozerSettings(); } - + protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { DozerConfiguration config = new DozerConfiguration(); config.setName(remaining); config.setMappingConfiguration(getAndRemoveOrResolveReferenceParameter( parameters, "mappingConfiguration", DozerBeanMapperConfiguration.class)); setProperties(config, parameters); - + // Validate endpoint parameters if (config.getTargetModel() == null) { throw new IllegalArgumentException("The targetModel parameter is required for dozer endpoints"); } return new DozerEndpoint(uri, this, config); } - - private void initDozerSettings() { + + public static DozerBeanMapper createDozerBeanMapper(List<String> mappingFiles) { + GlobalSettings settings = GlobalSettings.getInstance(); + try { + LOG.info("Configuring GlobalSettings to use Camel classloader: {}", DozerThreadContextClassLoader.class.getName()); + Field field = settings.getClass().getDeclaredField("classLoaderBeanName"); + ReflectionHelper.setField(field, settings, DozerThreadContextClassLoader.class.getName()); + } catch (Exception e) { + throw new IllegalStateException("Cannot configure Dozer GlobalSettings to use DozerThreadContextClassLoader as classloader due " + e.getMessage(), e); + } try { - GlobalSettings settings = GlobalSettings.getInstance(); LOG.info("Configuring GlobalSettings to enable EL"); Field field = settings.getClass().getDeclaredField("elEnabled"); ReflectionHelper.setField(field, settings, true); } catch (NoSuchFieldException nsfEx) { throw new IllegalStateException("Failed to enable EL in global Dozer settings", nsfEx); } + return new DozerBeanMapper(mappingFiles); } } http://git-wip-us.apache.org/repos/asf/camel/blob/740a5a73/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java index 2d48d11..9e056b1 100644 --- a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java +++ b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java @@ -17,6 +17,7 @@ package org.apache.camel.component.dozer; import java.io.InputStream; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -89,15 +90,15 @@ public class DozerEndpoint extends DefaultEndpoint { public void setConfiguration(DozerConfiguration configuration) { this.configuration = configuration; } - + CustomMapper getCustomMapper() { return customMapper; } - + VariableMapper getVariableMapper() { return variableMapper; } - + ExpressionMapper getExpressionMapper() { return expressionMapper; } @@ -122,9 +123,9 @@ public class DozerEndpoint extends DefaultEndpoint { super.doStop(); // noop } - + private DozerBeanMapper createDozerBeanMapper() throws Exception { - DozerBeanMapper answer = new DozerBeanMapper(); + DozerBeanMapper answer = DozerComponent.createDozerBeanMapper(Collections.<String>emptyList()); InputStream mapStream = null; try { LOG.info("Loading Dozer mapping file {}.", configuration.getMappingFile()); @@ -134,7 +135,6 @@ public class DozerEndpoint extends DefaultEndpoint { } finally { IOHelper.close(mapStream); } - return answer; } http://git-wip-us.apache.org/repos/asf/camel/blob/740a5a73/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 9d6d3ae..f9396a9 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,7 +16,6 @@ */ package org.apache.camel.converter.dozer; -import java.lang.reflect.Field; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; @@ -28,17 +27,16 @@ import java.util.Map; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; import org.apache.camel.TypeConverter; +import org.apache.camel.component.dozer.DozerComponent; import org.apache.camel.spi.ClassResolver; import org.apache.camel.spi.TypeConverterRegistry; import org.apache.camel.support.ServiceSupport; import org.apache.camel.util.ObjectHelper; -import org.apache.camel.util.ReflectionHelper; import org.apache.camel.util.ResourceHelper; import org.dozer.DozerBeanMapper; import org.dozer.Mapper; import org.dozer.classmap.ClassMap; import org.dozer.classmap.MappingFileData; -import org.dozer.config.GlobalSettings; import org.dozer.loader.api.BeanMappingBuilder; import org.dozer.loader.xml.MappingFileReader; import org.dozer.loader.xml.XMLParserFactory; @@ -101,15 +99,6 @@ public class DozerTypeConverterLoader extends ServiceSupport implements CamelCon * @param configuration dozer mapping bean configuration. */ public DozerTypeConverterLoader(CamelContext camelContext, DozerBeanMapperConfiguration configuration) { - GlobalSettings settings = GlobalSettings.getInstance(); - try { - log.info("Configuring GlobalSettings to use Camel classloader: {}", DozerThreadContextClassLoader.class.getName()); - Field field = settings.getClass().getDeclaredField("classLoaderBeanName"); - ReflectionHelper.setField(field, settings, DozerThreadContextClassLoader.class.getName()); - } catch (Exception e) { - throw new IllegalStateException("Cannot configure Dozer GlobalSettings to use CamelToDozerClassResolverAdapter as classloader due " + e.getMessage(), e); - } - ClassLoader tccl = Thread.currentThread().getContextClassLoader(); try { ClassLoader appcl = camelContext.getApplicationContextClassLoader(); @@ -241,9 +230,9 @@ public class DozerTypeConverterLoader extends ServiceSupport implements CamelCon public static DozerBeanMapper createDozerBeanMapper(DozerBeanMapperConfiguration configuration) { DozerBeanMapper mapper; if (configuration.getMappingFiles() != null) { - mapper = new DozerBeanMapper(configuration.getMappingFiles()); + mapper = DozerComponent.createDozerBeanMapper(configuration.getMappingFiles()); } else { - mapper = new DozerBeanMapper(); + mapper = DozerComponent.createDozerBeanMapper(Collections.<String>emptyList()); } if (configuration.getCustomConverters() != null) { mapper.setCustomConverters(configuration.getCustomConverters());