Updated Branches: refs/heads/master d11440c31 -> b24f380c1
Polsihed camel-dozer to support better loading mapping files using file paths Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/b24f380c Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b24f380c Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b24f380c Branch: refs/heads/master Commit: b24f380c1089e1c4b07a33fbbc130f065025b226 Parents: d11440c Author: Claus Ibsen <[email protected]> Authored: Thu Aug 1 13:40:25 2013 +0200 Committer: Claus Ibsen <[email protected]> Committed: Thu Aug 1 13:40:25 2013 +0200 ---------------------------------------------------------------------- .../converter/dozer/DozerTypeConverter.java | 6 +- .../dozer/DozerTypeConverterLoader.java | 76 +++++++++++++------- 2 files changed, 57 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/b24f380c/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverter.java ---------------------------------------------------------------------- diff --git a/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverter.java b/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverter.java index 035e8ff..e5b584c 100644 --- a/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverter.java +++ b/components/camel-dozer/src/main/java/org/apache/camel/converter/dozer/DozerTypeConverter.java @@ -36,12 +36,16 @@ import org.dozer.Mapper; */ public class DozerTypeConverter implements TypeConverter { - private DozerBeanMapper mapper; + private final DozerBeanMapper mapper; public DozerTypeConverter(DozerBeanMapper mapper) { this.mapper = mapper; } + public DozerBeanMapper getMapper() { + return mapper; + } + public <T> T convertTo(Class<T> type, Object value) { return mapper.map(value, type); } http://git-wip-us.apache.org/repos/asf/camel/blob/b24f380c/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 f44d5e9..e5a8385 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 @@ -102,7 +102,9 @@ public class DozerTypeConverterLoader implements CamelContextAware { */ public void init(CamelContext camelContext, DozerBeanMapper mapper) { this.camelContext = camelContext; - this.mapper = mapper; + if (mapper != null) { + this.mapper = mapper; + } CamelToDozerClassResolverAdapter adapter = new CamelToDozerClassResolverAdapter(camelContext); BeanContainer.getInstance().setClassLoader(adapter); @@ -133,17 +135,21 @@ public class DozerTypeConverterLoader implements CamelContextAware { return new HashMap<String, DozerBeanMapper>(camelContext.getRegistry().findByTypeWithName(DozerBeanMapper.class)); } - private void registerClassMaps(TypeConverterRegistry registry, DozerBeanMapper dozer, List<ClassMap> all) { + protected void registerClassMaps(TypeConverterRegistry registry, DozerBeanMapper dozer, List<ClassMap> all) { DozerTypeConverter converter = new DozerTypeConverter(dozer); for (ClassMap map : all) { - if (log.isInfoEnabled()) { - log.info("Added {} -> {} as type converter to: {}", new Object[]{map.getSrcClassName(), map.getDestClassName(), registry}); - } - registry.addTypeConverter(map.getSrcClassToMap(), map.getDestClassToMap(), converter); - registry.addTypeConverter(map.getDestClassToMap(), map.getSrcClassToMap(), converter); + addDozerTypeConverter(registry, converter, map.getMapId(), map.getSrcClassToMap(), map.getDestClassToMap()); } } + protected void addDozerTypeConverter(TypeConverterRegistry registry, DozerTypeConverter converter, String mapId, Class<?> to, Class<?> from) { + if (log.isInfoEnabled()) { + log.info("Added Dozer map id {} as Camel type converter {} <-> {}", new Object[]{mapId, from, to}); + } + registry.addTypeConverter(from, to, converter); + registry.addTypeConverter(to, from, converter); + } + private List<ClassMap> loadMappings(CamelContext camelContext, DozerBeanMapper mapper) { List<ClassMap> answer = new ArrayList<ClassMap>(); @@ -155,9 +161,11 @@ public class DozerTypeConverterLoader implements CamelContextAware { } for (String name : mappingFiles) { - URL url = camelContext.getClassResolver().loadResourceAsURL(name); - MappingFileData data = reader.read(url); - answer.addAll(data.getClassMaps()); + URL url = loadMappingFile(camelContext.getClassResolver(), name); + if (url != null) { + MappingFileData data = reader.read(url); + answer.addAll(data.getClassMaps()); + } } return answer; @@ -189,10 +197,40 @@ public class DozerTypeConverterLoader implements CamelContextAware { return camelContext; } + /** + * Sets the {@link CamelContext} <b>and also</b> initializes this loader. + * <p/> + * The reason why {@link #init(org.apache.camel.CamelContext, org.dozer.DozerBeanMapper)} is also called + * is because making using Dozer in Spring XML files easier, as no need to use the init-method attribute. + * + * @param camelContext the CamelContext + */ public void setCamelContext(CamelContext camelContext) { init(camelContext, null); } + public DozerBeanMapper getMapper() { + return mapper; + } + + public void setMapper(DozerBeanMapper mapper) { + this.mapper = mapper; + } + + protected static URL loadMappingFile(ClassResolver classResolver, String mappingFile) { + URL url = null; + try { + url = ResourceHelper.resolveResourceAsUrl(classResolver, mappingFile); + } catch (MalformedURLException e) { + // ignore + } + if (url == null) { + // using the classloader of DozerClassLoader as a fallback + url = DozerClassLoader.class.getClassLoader().getResource(mappingFile); + } + return url; + } + private static final class CamelToDozerClassResolverAdapter implements DozerClassLoader { private final ClassResolver classResolver; @@ -201,22 +239,12 @@ public class DozerTypeConverterLoader implements CamelContextAware { classResolver = camelContext.getClassResolver(); } - public Class<?> loadClass(String s) { - return classResolver.resolveClass(s); + public Class<?> loadClass(String name) { + return classResolver.resolveClass(name); } - public URL loadResource(String s) { - URL url = null; - try { - url = ResourceHelper.resolveResourceAsUrl(classResolver, s); - } catch (MalformedURLException e) { - // ignore - } - if (url == null) { - // using the classloader of DozerClassLoader as a fallback - url = DozerClassLoader.class.getClassLoader().getResource(s); - } - return url; + public URL loadResource(String name) { + return loadMappingFile(classResolver, name); } }
