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 {