CAMEL-8332: Add component implementation to camel-dozer module

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e085e28d
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e085e28d
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e085e28d

Branch: refs/heads/master
Commit: e085e28d7c4100634d543ab418bc9bf1a63638ce
Parents: fee91e7
Author: Keith Babo <kb...@redhat.com>
Authored: Wed Feb 4 10:31:14 2015 -0500
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Wed Feb 11 08:54:02 2015 +0100

----------------------------------------------------------------------
 components/camel-dozer/pom.xml                  |  21 +-
 .../camel/component/dozer/BaseConverter.java    |  50 +++
 .../camel/component/dozer/CustomMapper.java     |  95 +++++
 .../camel/component/dozer/DozerComponent.java   |  44 ++
 .../component/dozer/DozerConfiguration.java     |  96 +++++
 .../camel/component/dozer/DozerEndpoint.java    | 129 ++++++
 .../camel/component/dozer/DozerProducer.java    | 153 +++++++
 .../camel/component/dozer/LiteralMapper.java    |  44 ++
 .../services/org/apache/camel/component/dozer   |  17 +
 .../camel/component/dozer/CustomMapperTest.java | 101 +++++
 .../component/dozer/CustomMappingTest.java      |  67 +++
 .../component/dozer/DozerComponentTest.java     |  52 +++
 .../component/dozer/LiteralMappingTest.java     |  67 +++
 .../camel/component/dozer/XmlToJsonTest.java    |  82 ++++
 .../component/dozer/example/CustomMapper.java   |  27 ++
 .../dozer/example/CustomMapperOperations.java   |  31 ++
 .../component/dozer/example/abc/ABCOrder.java   | 418 +++++++++++++++++++
 .../dozer/example/abc/ObjectFactory.java        |  79 ++++
 .../component/dozer/example/xyz/LineItem.java   | 107 +++++
 .../component/dozer/example/xyz/XYZOrder.java   | 132 ++++++
 .../dozer/CustomMappingTest-context.xml         |  29 ++
 .../dozer/LiteralMappingTest-context.xml        |  29 ++
 .../component/dozer/XmlToJsonTest-context.xml   |  33 ++
 .../apache/camel/component/dozer/abc-order.xml  |  30 ++
 .../camel/component/dozer/customMapping.xml     |  57 +++
 .../camel/component/dozer/dozerBeanMapping.xml  |  55 +++
 .../camel/component/dozer/literalMapping.xml    |  59 +++
 .../apache/camel/component/dozer/xyz-order.json |   1 +
 28 files changed, 2103 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-dozer/pom.xml b/components/camel-dozer/pom.xml
index c4c276a..75b177a 100644
--- a/components/camel-dozer/pom.xml
+++ b/components/camel-dozer/pom.xml
@@ -30,7 +30,10 @@
     <description>Camel Support for the Dozer type conversion 
framework</description>
 
     <properties>
-        
<camel.osgi.export.pkg>org.apache.camel.converter.dozer.*</camel.osgi.export.pkg>
+        <camel.osgi.export.pkg>
+            org.apache.camel.converter.dozer.*,
+            org.apache.camel.component.dozer.*
+        </camel.osgi.export.pkg>
     </properties>
 
     <dependencies>
@@ -57,7 +60,21 @@
           <artifactId>slf4j-log4j12</artifactId>
           <scope>test</scope>
         </dependency>
-
+           <dependency>
+             <groupId>org.apache.camel</groupId>
+             <artifactId>camel-test-spring</artifactId>
+             <scope>test</scope>
+           </dependency>
+           <dependency>
+             <groupId>org.apache.camel</groupId>
+             <artifactId>camel-jaxb</artifactId>
+             <scope>test</scope>
+           </dependency>
+           <dependency>
+             <groupId>org.apache.camel</groupId>
+             <artifactId>camel-jackson</artifactId>
+             <scope>test</scope>
+           </dependency>
     </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/BaseConverter.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/BaseConverter.java
 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/BaseConverter.java
new file mode 100644
index 0000000..d57167d
--- /dev/null
+++ 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/BaseConverter.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import org.dozer.ConfigurableCustomConverter;
+
+/**
+ * Configurable converters in Dozer are not thread-safe if a single converter 
+ * instance is used.  One thread could step on the parameter being used by 
+ * another thread since setParameter() is called first and convert() is called 
+ * separately.  This implementation holds a copy of the parameter in 
+ * thread-local storage which eliminates the possibility of collision between
+ * threads on a single converter instance.
+ * 
+ * Any converter which is referenced by ID with the Dozer component should
+ * extend this class.  It is recommended to call done() in a finally block 
+ * in the implementation of convert() to clean up the value stored in the 
+ * thread local.
+ */
+public abstract class BaseConverter implements ConfigurableCustomConverter {
+    
+    private ThreadLocal<String> localParameter = new ThreadLocal<String>();
+    
+    @Override
+    public void setParameter(String parameter) {
+        localParameter.set(parameter);
+    }
+    
+    public void done() {
+        localParameter.set(null);
+    }
+    
+    public String getParameter() {
+        return localParameter.get();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/CustomMapper.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/CustomMapper.java
 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/CustomMapper.java
new file mode 100644
index 0000000..7d46d4b
--- /dev/null
+++ 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/CustomMapper.java
@@ -0,0 +1,95 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import java.lang.reflect.Method;
+
+import org.apache.camel.spi.ClassResolver;
+
+/**
+ * Allows a user to customize a field mapping using a POJO that is not
+ * required to extend/implement Dozer-specific classes.
+ */
+public class CustomMapper extends BaseConverter {
+    
+    private ClassResolver resolver;
+    
+    public CustomMapper(ClassResolver resolver) {
+        this.resolver = resolver;
+    }
+    
+    @Override
+    public Object convert(Object existingDestinationFieldValue, 
+            Object sourceFieldValue, 
+            Class<?> destinationClass,
+            Class<?> sourceClass) {
+        try {
+            return mapCustom(sourceFieldValue);
+        } finally {
+            done();
+        }
+    }
+    
+    Method selectMethod(Class<?> customClass, Object fromType) {
+        Method method = null;
+        for (Method m : customClass.getDeclaredMethods()) {
+            if (m.getReturnType() != null 
+                    && m.getParameterTypes().length == 1
+                    && 
m.getParameterTypes()[0].isAssignableFrom(fromType.getClass())) {
+                method = m;
+                break;
+            }
+        }
+        return method;
+    }
+
+    Object mapCustom(Object source) {
+        Object customMapObj;
+        Method mapMethod = null;
+        
+        // The converter parameter is stored in a thread local variable, so 
+        // we need to parse the parameter on each invocation
+        String[] params = getParameter().split(",");
+        String className = params[0];
+        String operation = params.length > 1 ? params[1] : null;
+        
+        try {
+            Class<?> customClass = resolver.resolveClass(className);
+            customMapObj = customClass.newInstance();
+            // If a specific mapping operation has been supplied use that
+            if (operation != null) {
+                mapMethod = customClass.getMethod(operation, 
source.getClass());
+            } else {
+                mapMethod = selectMethod(customClass, source);
+            }
+        } catch (Exception cnfEx) {
+            throw new RuntimeException("Failed to load custom mapping", cnfEx);
+        }
+        
+        // Verify that we found a matching method
+        if (mapMethod == null) {
+            throw new RuntimeException("No eligible custom mapping methods in 
" + className);
+        }
+        
+        // Invoke the custom mapping method
+        try {
+            return mapMethod.invoke(customMapObj, source);
+        } catch (Exception ex) {
+            throw new RuntimeException("Error while invoking custom mapping", 
ex);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/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
new file mode 100644
index 0000000..09a44ce
--- /dev/null
+++ 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerComponent.java
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.UriEndpointComponent;
+
+/**
+ * Represents the component that manages {@link DozerEndpoint}.
+ */
+public class DozerComponent extends UriEndpointComponent {
+
+    public DozerComponent() {
+        super(DozerEndpoint.class);
+    }
+    
+    public DozerComponent(CamelContext context) {
+        super(context, DozerEndpoint.class);
+    }
+
+    protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
+        DozerConfiguration config = new DozerConfiguration();
+        config.setName(remaining);
+        setProperties(config, parameters);
+        return new DozerEndpoint(uri, this, config);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerConfiguration.java
 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerConfiguration.java
new file mode 100644
index 0000000..c390c05
--- /dev/null
+++ 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerConfiguration.java
@@ -0,0 +1,96 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+import static org.dozer.util.DozerConstants.DEFAULT_MAPPING_FILE;
+
+
+/**
+ * Configuration used for a Dozer endpoint.
+ */
+@UriParams
+public class DozerConfiguration {
+
+    @UriPath
+    private String name;
+    @UriParam
+    private String marshalId;
+    @UriParam
+    private String unmarshalId;
+    @UriParam
+    private String sourceModel;
+    @UriParam
+    private String targetModel;
+    @UriParam(defaultValue = DEFAULT_MAPPING_FILE)
+    private String mappingFile;
+    
+    public DozerConfiguration() {
+        setMappingFile(DEFAULT_MAPPING_FILE);
+    }
+    
+    public String getMarshalId() {
+        return marshalId;
+    }
+
+    public void setMarshalId(String marshalId) {
+        this.marshalId = marshalId;
+    }
+
+    public String getUnmarshalId() {
+        return unmarshalId;
+    }
+
+    public void setUnmarshalId(String unmarshalId) {
+        this.unmarshalId = unmarshalId;
+    }
+
+    public String getSourceModel() {
+        return sourceModel;
+    }
+
+    public void setSourceModel(String sourceModel) {
+        this.sourceModel = sourceModel;
+    }
+
+    public String getTargetModel() {
+        return targetModel;
+    }
+
+    public void setTargetModel(String targetModel) {
+        this.targetModel = targetModel;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public String getMappingFile() {
+        return mappingFile;
+    }
+
+    public void setMappingFile(String mappingFile) {
+        this.mappingFile = mappingFile;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/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
new file mode 100644
index 0000000..0bcbda0
--- /dev/null
+++ 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java
@@ -0,0 +1,129 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.util.ResourceHelper;
+import org.dozer.CustomConverter;
+import org.dozer.DozerBeanMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents a Dozer endpoint.
+ */
+@UriEndpoint(scheme = "dozer", label = "transformation")
+public class DozerEndpoint extends DefaultEndpoint {
+    private static final Logger LOG = 
LoggerFactory.getLogger(DozerEndpoint.class);
+
+    // IDs for built-in custom converters used with the Dozer component
+    private static final String CUSTOM_MAPPING_ID = "_customMapping";
+    private static final String LITERAL_MAPPING_ID = "_literalMapping";
+    
+    private DozerConfiguration configuration;
+    private DozerBeanMapper mapper;
+    private LiteralMapper literalMapper;
+    private CustomMapper customMapper;
+
+    /**
+     * Create a new TransformEndpoint.
+     * @param endpointUri The uri of the Camel endpoint.
+     * @param component The {@link DozerComponent}.
+     * @param configuration endpoint configuration
+     */
+    public DozerEndpoint(String endpointUri, Component component, 
DozerConfiguration configuration) throws Exception {
+        super(endpointUri, component);
+        this.configuration = configuration;
+        literalMapper = new LiteralMapper();
+        customMapper = new CustomMapper(getCamelContext().getClassResolver());
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new DozerProducer(this);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException(
+                "Consumer not supported for Transform endpoints");
+    }
+
+    @Override
+    public boolean isSingleton() {
+        return true;
+    }
+
+    public synchronized DozerBeanMapper getMapper() throws Exception {
+        if (mapper == null) {
+            initDozer();
+        }
+        return mapper;
+    }
+
+    public DozerConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(DozerConfiguration configuration) {
+        this.configuration = configuration;
+    }
+    
+    CustomMapper getCustomMapper() {
+        return customMapper;
+    }
+    
+    LiteralMapper getLiteralMapper() {
+        return literalMapper;
+    }
+
+    private void initDozer() throws Exception {
+        mapper = new DozerBeanMapper();
+        InputStream mapStream = null;
+        try {
+            LOG.info("Loading Dozer mapping file {}.", 
configuration.getMappingFile());
+            // create the mapper instance and add the mapping file
+            mapStream = ResourceHelper.resolveResourceAsInputStream(
+                    getCamelContext().getClassResolver(), 
configuration.getMappingFile());
+            if (mapStream == null) {
+                throw new Exception("Unable to resolve Dozer config: " + 
configuration.getMappingFile());
+            }
+            mapper.addMapping(mapStream);
+            
+            // add our built-in converters
+            Map<String, CustomConverter> converters = new HashMap<String, 
CustomConverter>();
+            converters.put(CUSTOM_MAPPING_ID, customMapper);
+            converters.put(LITERAL_MAPPING_ID, literalMapper);
+            converters.putAll(mapper.getCustomConvertersWithId());
+            mapper.setCustomConvertersWithId(converters);
+            
+        } finally {
+            if (mapStream != null) {
+                mapStream.close();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerProducer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerProducer.java
 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerProducer.java
new file mode 100644
index 0000000..fd7f6c4
--- /dev/null
+++ 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerProducer.java
@@ -0,0 +1,153 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.model.DataFormatDefinition;
+import org.apache.camel.processor.MarshalProcessor;
+import org.apache.camel.processor.UnmarshalProcessor;
+import org.apache.camel.spi.DataFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Producer class for Dozer endpoints.
+ */
+public class DozerProducer extends DefaultProducer {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(DozerProducer.class);
+    
+    private DozerEndpoint endpoint;
+    private UnmarshalProcessor unmarshaller;
+    private MarshalProcessor marshaller;
+
+    /**
+     * Create a new producer for dozer endpoints.
+     * @param endpoint endpoint requiring a producer
+     */
+    public DozerProducer(DozerEndpoint endpoint) {
+        super(endpoint);
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    public void process(Exchange exchange) throws Exception {
+        // Unmarshal the source content only if an unmarshaller is configured.
+        String unmarshalId = endpoint.getConfiguration().getUnmarshalId();
+        if (unmarshalId != null) {
+            LOG.debug("Unmarshalling input data using data format '{}'.", 
unmarshalId);
+            resolveUnmarshaller(exchange, unmarshalId).process(exchange);
+        }
+        
+        // Load the target model class
+        Class<?> targetModel = 
endpoint.getCamelContext().getClassResolver().resolveClass(
+                endpoint.getConfiguration().getTargetModel());
+        // If an unmarshaller was used, the unmarshalled message is the OUT
+        // message.
+        Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+        LOG.debug("Mapping to target model {}.", targetModel.getName());
+        // Trigger the Dozer mapping and set that as the content of the IN 
message
+        Object targetObject = endpoint.getMapper().map(msg.getBody(), 
targetModel);
+        // Second pass to process literal mappings
+        endpoint.getMapper().map(endpoint.getLiteralMapper(), targetObject);
+        msg.setBody(targetObject);
+        exchange.setIn(msg);
+        
+        // Marshal the source content only if a marshaller is configured.
+        String marshalId = endpoint.getConfiguration().getMarshalId();
+        if (marshalId != null) {
+            LOG.debug("Marshalling output data using data format '{}'.", 
marshalId);
+            resolveMarshaller(exchange, marshalId).process(exchange);
+        }
+    }
+    
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+        if (unmarshaller != null) {
+            unmarshaller.stop();
+        }
+        if (marshaller != null) {
+            marshaller.stop();
+        }
+    }
+    
+    @Override
+    protected void doShutdown() throws Exception {
+        super.doShutdown();
+        if (unmarshaller != null) {
+            unmarshaller.shutdown();
+        }
+        if (marshaller != null) {
+            marshaller.shutdown();
+        }
+    }
+    
+    /**
+     * Find and configure an unmarshaller for the specified data format.
+     */
+    private synchronized UnmarshalProcessor resolveUnmarshaller(
+            Exchange exchange, String dataFormatId) throws Exception {
+        
+        if (unmarshaller == null) {
+            DataFormat dataFormat = DataFormatDefinition.getDataFormat(
+                    exchange.getUnitOfWork().getRouteContext(), null, 
dataFormatId);
+            if (dataFormat == null) {
+                throw new Exception("Unable to resolve data format for 
unmarshalling: " + dataFormatId);
+            }
+            
+            // Wrap the data format in a processor and start/configure it.  
+            // Stop/shutdown is handled when the corresponding methods are 
+            // called on this producer.
+            unmarshaller = new UnmarshalProcessor(dataFormat);
+            if (unmarshaller instanceof CamelContextAware) {
+                
((CamelContextAware)unmarshaller).setCamelContext(exchange.getContext());
+            }
+            unmarshaller.start();
+        }
+        return unmarshaller;
+    }
+    
+    /**
+     * Find and configure an unmarshaller for the specified data format.
+     */
+    private synchronized MarshalProcessor resolveMarshaller(
+            Exchange exchange, String dataFormatId) throws Exception {
+        
+        if (marshaller == null) {
+            DataFormat dataFormat = DataFormatDefinition.getDataFormat(
+                    exchange.getUnitOfWork().getRouteContext(), null, 
dataFormatId);
+            if (dataFormat == null) {
+                throw new Exception("Unable to resolve data format for 
marshalling: " + dataFormatId);
+            }
+            
+            // Wrap the data format in a processor and start/configure it.  
+            // Stop/shutdown is handled when the corresponding methods are 
+            // called on this producer.
+            marshaller = new MarshalProcessor(dataFormat);
+            if (marshaller instanceof CamelContextAware) {
+                
((CamelContextAware)marshaller).setCamelContext(exchange.getContext());
+            }
+            marshaller.start();
+        }
+        return marshaller;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/LiteralMapper.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/LiteralMapper.java
 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/LiteralMapper.java
new file mode 100644
index 0000000..4d09963
--- /dev/null
+++ 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/LiteralMapper.java
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+/**
+ * Used to map literal values (e.g. "ACME" or "ABC-123") to a field in the 
+ * target object.
+ */
+public class LiteralMapper extends BaseConverter {
+     
+    @Override
+    public Object convert(Object existingDestinationFieldValue, 
+            Object sourceFieldValue, 
+            Class<?> destinationClass,
+            Class<?> sourceClass) {
+        try {
+            return getParameter();
+        } finally {
+            done();
+        }
+    }
+    
+    /**
+     * We need at least one field in this class so that we can use it as a
+     * source for Dozer transformations.
+     */
+    public String getLiteral() {
+        return getParameter();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/main/resources/META-INF/services/org/apache/camel/component/dozer
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/main/resources/META-INF/services/org/apache/camel/component/dozer
 
b/components/camel-dozer/src/main/resources/META-INF/services/org/apache/camel/component/dozer
new file mode 100644
index 0000000..22afe69
--- /dev/null
+++ 
b/components/camel-dozer/src/main/resources/META-INF/services/org/apache/camel/component/dozer
@@ -0,0 +1,17 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+class=org.apache.camel.component.dozer.DozerComponent
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/CustomMapperTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/CustomMapperTest.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/CustomMapperTest.java
new file mode 100644
index 0000000..259a426
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/CustomMapperTest.java
@@ -0,0 +1,101 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import java.lang.reflect.Method;
+
+import org.apache.camel.impl.DefaultClassResolver;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CustomMapperTest {
+    
+    private CustomMapper customMapper;
+    
+    @Before
+    public void setup() {
+        customMapper = new CustomMapper(new DefaultClassResolver());
+    }
+    
+    @Test
+    public void selectMapperOneMethod() {
+        customMapper.setParameter(MapperWithOneMethod.class.getName());
+        
Assert.assertNotNull(customMapper.selectMethod(MapperWithOneMethod.class, 
"test"));
+    }
+    
+    @Test
+    public void selectMapperMultipleMethods() throws Exception {
+        Method selectedMethod = 
customMapper.selectMethod(MapperWithTwoMethods.class, new B());
+        Assert.assertNotNull(selectedMethod);
+        Assert.assertEquals(
+                MapperWithTwoMethods.class.getMethod("convertToA", B.class),
+                selectedMethod);
+    }
+    
+    @Test
+    public void mapCustomFindOperation() throws Exception {
+        customMapper.setParameter(MapperWithTwoMethods.class.getName());
+        Assert.assertNotNull(customMapper.mapCustom(new B()));
+    }
+    
+    @Test
+    public void mapCustomDeclaredOperation() throws Exception {
+        customMapper.setParameter(MapperWithTwoMethods.class.getName() + 
",convertToA");
+        Assert.assertNotNull(customMapper.mapCustom(new B()));
+    }
+    
+    @Test
+    public void mapCustomInvalidOperation() {
+        customMapper.setParameter(MapperWithTwoMethods.class.getName() + 
",convertToB");
+        try {
+            customMapper.mapCustom(new B());
+            Assert.fail("Invalid operation should result in exception");
+        } catch (RuntimeException ex) {
+            Assert.assertTrue(ex.getCause() instanceof NoSuchMethodException);
+        }
+    }
+}
+
+class A {
+    
+}
+
+class B extends A {
+    
+}
+
+class MapperWithOneMethod {
+    
+    public A convertToA(String val) {
+        return new A();
+    }
+}
+
+class MapperWithTwoMethods {
+    
+    public A convertToA(String val) {
+        return new A();
+    }
+    
+    public A convertToA(B val) {
+        return new A();
+    }
+    
+}
+
+

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/CustomMappingTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/CustomMappingTest.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/CustomMappingTest.java
new file mode 100644
index 0000000..6b44a2c
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/CustomMappingTest.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.dozer.example.abc.ABCOrder;
+import org.apache.camel.component.dozer.example.abc.ABCOrder.Header;
+import org.apache.camel.component.dozer.example.xyz.XYZOrder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class CustomMappingTest {
+    
+    @EndpointInject(uri = "mock:result")
+    private MockEndpoint resultEndpoint;
+    
+    @Produce(uri = "direct:start")
+    private ProducerTemplate startEndpoint;
+    
+    @Autowired
+    private CamelContext camelContext;
+    
+    @After
+    public void tearDown() {
+        resultEndpoint.reset();
+    }
+    
+    @Test
+    public void testCustomMapping() throws Exception {
+        resultEndpoint.expectedMessageCount(1);
+        ABCOrder abcOrder = new ABCOrder();
+        abcOrder.setHeader(new Header());
+        abcOrder.getHeader().setStatus("GOLD");
+        abcOrder.getHeader().setCustomerNum("ACME");
+        startEndpoint.sendBody(abcOrder);
+        // check results
+        resultEndpoint.assertIsSatisfied();
+        XYZOrder result = 
resultEndpoint.getExchanges().get(0).getIn().getBody(XYZOrder.class);
+        Assert.assertEquals(result.getPriority(), "custom2:GOLD");
+        Assert.assertEquals(result.getCustId(), "mapCustomer:ACME");
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/DozerComponentTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/DozerComponentTest.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/DozerComponentTest.java
new file mode 100644
index 0000000..4dad0f0
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/DozerComponentTest.java
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class DozerComponentTest {
+    
+    private static final String NAME = "examplename";
+    private static final String MARSHAL_ID = "marshal123";
+    private static final String UNMARSHAL_ID = "unmarshal456";
+    private static final String SOURCE_MODEL = "org.example.A";
+    private static final String TARGET_MODEL = "org.example.B";
+    private static final String DOZER_CONFIG_PATH = 
"test/dozerBeanMapping.xml";
+    private static final String TRANSFORM_EP_1 =
+            "dozer:" + NAME 
+            + "?marshalId=" + MARSHAL_ID 
+            + "&unmarshalId=" + UNMARSHAL_ID 
+            + "&sourceModel=" + SOURCE_MODEL 
+            + "&targetModel=" + TARGET_MODEL
+            + "&mappingFile=" + DOZER_CONFIG_PATH;
+    
+    @Test
+    public void testCreateEndpoint() throws Exception {
+        DozerComponent comp = new DozerComponent();
+        comp.setCamelContext(new DefaultCamelContext());
+        DozerEndpoint ep = (DozerEndpoint)comp.createEndpoint(TRANSFORM_EP_1);
+        DozerConfiguration config = ep.getConfiguration();
+        Assert.assertEquals(NAME, config.getName());
+        Assert.assertEquals(MARSHAL_ID, config.getMarshalId());
+        Assert.assertEquals(UNMARSHAL_ID, config.getUnmarshalId());
+        Assert.assertEquals(SOURCE_MODEL, config.getSourceModel());
+        Assert.assertEquals(TARGET_MODEL, config.getTargetModel());
+        Assert.assertEquals(DOZER_CONFIG_PATH, config.getMappingFile());
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/LiteralMappingTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/LiteralMappingTest.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/LiteralMappingTest.java
new file mode 100644
index 0000000..f519991
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/LiteralMappingTest.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.dozer.example.abc.ABCOrder;
+import org.apache.camel.component.dozer.example.abc.ABCOrder.Header;
+import org.apache.camel.component.dozer.example.xyz.XYZOrder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class LiteralMappingTest {
+    
+    @EndpointInject(uri = "mock:result")
+    private MockEndpoint resultEndpoint;
+    
+    @Produce(uri = "direct:start")
+    private ProducerTemplate startEndpoint;
+    
+    @Autowired
+    private CamelContext camelContext;
+    
+    @After
+    public void tearDown() {
+        resultEndpoint.reset();
+    }
+    
+    @Test
+    public void testLiteralMapping() throws Exception {
+        resultEndpoint.expectedMessageCount(1);
+        ABCOrder abcOrder = new ABCOrder();
+        abcOrder.setHeader(new Header());
+        abcOrder.getHeader().setStatus("GOLD");
+        startEndpoint.sendBody(abcOrder);
+        // check results
+        resultEndpoint.assertIsSatisfied();
+        XYZOrder result = 
resultEndpoint.getExchanges().get(0).getIn().getBody(XYZOrder.class);
+        Assert.assertEquals(result.getPriority(), "GOLD");
+        Assert.assertEquals(result.getCustId(), "LITERAL_CUST_ID");
+        Assert.assertEquals(result.getOrderId(), "LITERAL_ORDER_ID");
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/XmlToJsonTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/XmlToJsonTest.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/XmlToJsonTest.java
new file mode 100644
index 0000000..03ba54f
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/XmlToJsonTest.java
@@ -0,0 +1,82 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer;
+
+import java.io.InputStream;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class XmlToJsonTest {
+    
+    private static final String ABC_ORDER_PATH = 
"org/apache/camel/component/dozer/abc-order.xml";
+    private static final String XYZ_ORDER_PATH = 
"org/apache/camel/component/dozer/xyz-order.json";
+    
+    @EndpointInject(uri = "mock:result")
+    private MockEndpoint resultEndpoint;
+    
+    @Produce(uri = "direct:start")
+    private ProducerTemplate startEndpoint;
+    
+    @Autowired
+    private CamelContext camelContext;
+    
+    @After
+    public void tearDown() {
+        resultEndpoint.reset();
+    }
+    
+    @Test
+    public void testXmlToJson() throws Exception {
+        resultEndpoint.expectedMessageCount(1);
+        startEndpoint.sendBody(getResourceAsString(ABC_ORDER_PATH));
+        // check results
+        resultEndpoint.assertIsSatisfied();
+        String result = 
resultEndpoint.getExchanges().get(0).getIn().getBody(String.class);
+        Assert.assertEquals(getResourceAsString(XYZ_ORDER_PATH), result);
+    }
+    
+    @Test
+    public void testMultipleSends() throws Exception {
+        resultEndpoint.expectedMessageCount(2);
+        startEndpoint.sendBody(getResourceAsString(ABC_ORDER_PATH));
+        startEndpoint.sendBody(getResourceAsString(ABC_ORDER_PATH));
+        // check results
+        resultEndpoint.assertIsSatisfied();
+        String result1 = 
resultEndpoint.getExchanges().get(0).getIn().getBody(String.class);
+        String result2 = 
resultEndpoint.getExchanges().get(1).getIn().getBody(String.class);
+        Assert.assertEquals(getResourceAsString(XYZ_ORDER_PATH), result1);
+        Assert.assertEquals(getResourceAsString(XYZ_ORDER_PATH), result2);
+    }
+    
+    private String getResourceAsString(String resourcePath) {
+        InputStream is = 
getClass().getClassLoader().getResourceAsStream(resourcePath);
+        return camelContext.getTypeConverter().convertTo(String.class, is);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/CustomMapper.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/CustomMapper.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/CustomMapper.java
new file mode 100644
index 0000000..fd3ed7d
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/CustomMapper.java
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer.example;
+
+/**
+ * Custom mapping class with one operation.
+ */
+public class CustomMapper {
+
+    public Object mapCustomer(String source) {
+        return "mapCustomer:" + source;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/CustomMapperOperations.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/CustomMapperOperations.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/CustomMapperOperations.java
new file mode 100644
index 0000000..746ff3f
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/CustomMapperOperations.java
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer.example;
+
+/**
+ * Custom mapping class with multiple operations.
+ */
+public class CustomMapperOperations {
+
+    public Object custom1(String source) {
+        return "custom1:" + source.toString();
+    }
+    
+    public Object custom2(String source) {
+        return "custom2:" + source.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/abc/ABCOrder.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/abc/ABCOrder.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/abc/ABCOrder.java
new file mode 100644
index 0000000..90e3a85
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/abc/ABCOrder.java
@@ -0,0 +1,418 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer.example.abc;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for anonymous complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained 
within this class.
+ * 
+ * <pre>
+ * &lt;complexType>
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType";>
+ *       &lt;sequence>
+ *         &lt;element name="header">
+ *           &lt;complexType>
+ *             &lt;complexContent>
+ *               &lt;restriction 
base="{http://www.w3.org/2001/XMLSchema}anyType";>
+ *                 &lt;sequence>
+ *                   &lt;element name="status" 
type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                   &lt;element name="customer-num" 
type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                   &lt;element name="order-num" 
type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                 &lt;/sequence>
+ *               &lt;/restriction>
+ *             &lt;/complexContent>
+ *           &lt;/complexType>
+ *         &lt;/element>
+ *         &lt;element name="order-items">
+ *           &lt;complexType>
+ *             &lt;complexContent>
+ *               &lt;restriction 
base="{http://www.w3.org/2001/XMLSchema}anyType";>
+ *                 &lt;sequence>
+ *                   &lt;element name="item" maxOccurs="unbounded" 
minOccurs="0">
+ *                     &lt;complexType>
+ *                       &lt;complexContent>
+ *                         &lt;restriction 
base="{http://www.w3.org/2001/XMLSchema}anyType";>
+ *                           &lt;sequence>
+ *                             &lt;element name="price" 
type="{http://www.w3.org/2001/XMLSchema}float"/>
+ *                             &lt;element name="quantity" 
type="{http://www.w3.org/2001/XMLSchema}short"/>
+ *                           &lt;/sequence>
+ *                           &lt;attribute name="id" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
+ *                         &lt;/restriction>
+ *                       &lt;/complexContent>
+ *                     &lt;/complexType>
+ *                   &lt;/element>
+ *                 &lt;/sequence>
+ *               &lt;/restriction>
+ *             &lt;/complexContent>
+ *           &lt;/complexType>
+ *         &lt;/element>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+        "header",
+        "orderItems"
+        })
+@XmlRootElement(name = "ABCOrder")
+public class ABCOrder {
+
+    @XmlElement(required = true)
+    protected ABCOrder.Header header;
+    @XmlElement(name = "order-items", required = true)
+    protected ABCOrder.OrderItems orderItems;
+
+    /**
+     * Gets the value of the header property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link ABCOrder.Header }
+     *     
+     */
+    public ABCOrder.Header getHeader() {
+        return header;
+    }
+
+    /**
+     * Sets the value of the header property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link ABCOrder.Header }
+     *     
+     */
+    public void setHeader(ABCOrder.Header value) {
+        this.header = value;
+    }
+
+    /**
+     * Gets the value of the orderItems property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link ABCOrder.OrderItems }
+     *     
+     */
+    public ABCOrder.OrderItems getOrderItems() {
+        return orderItems;
+    }
+
+    /**
+     * Sets the value of the orderItems property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link ABCOrder.OrderItems }
+     *     
+     */
+    public void setOrderItems(ABCOrder.OrderItems value) {
+        this.orderItems = value;
+    }
+
+
+    /**
+     * <p>Java class for anonymous complex type.
+     * 
+     * <p>The following schema fragment specifies the expected content 
contained within this class.
+     * 
+     * <pre>
+     * &lt;complexType>
+     *   &lt;complexContent>
+     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType";>
+     *       &lt;sequence>
+     *         &lt;element name="status" 
type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *         &lt;element name="customer-num" 
type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *         &lt;element name="order-num" 
type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *       &lt;/sequence>
+     *     &lt;/restriction>
+     *   &lt;/complexContent>
+     * &lt;/complexType>
+     * </pre>
+     * 
+     * 
+     */
+    @XmlAccessorType(XmlAccessType.FIELD)
+    @XmlType(name = "", propOrder = {
+            "status",
+            "customerNum",
+            "orderNum"
+            })
+    public static class Header {
+
+        @XmlElement(required = true)
+        protected String status;
+        @XmlElement(name = "customer-num", required = true)
+        protected String customerNum;
+        @XmlElement(name = "order-num", required = true)
+        protected String orderNum;
+
+        /**
+         * Gets the value of the status property.
+         * 
+         * @return
+         *     possible object is
+         *     {@link String }
+         *     
+         */
+        public String getStatus() {
+            return status;
+        }
+
+        /**
+         * Sets the value of the status property.
+         * 
+         * @param value
+         *     allowed object is
+         *     {@link String }
+         *     
+         */
+        public void setStatus(String value) {
+            this.status = value;
+        }
+
+        /**
+         * Gets the value of the customerNum property.
+         * 
+         * @return
+         *     possible object is
+         *     {@link String }
+         *     
+         */
+        public String getCustomerNum() {
+            return customerNum;
+        }
+
+        /**
+         * Sets the value of the customerNum property.
+         * 
+         * @param value
+         *     allowed object is
+         *     {@link String }
+         *     
+         */
+        public void setCustomerNum(String value) {
+            this.customerNum = value;
+        }
+
+        /**
+         * Gets the value of the orderNum property.
+         * 
+         * @return
+         *     possible object is
+         *     {@link String }
+         *     
+         */
+        public String getOrderNum() {
+            return orderNum;
+        }
+
+        /**
+         * Sets the value of the orderNum property.
+         * 
+         * @param value
+         *     allowed object is
+         *     {@link String }
+         *     
+         */
+        public void setOrderNum(String value) {
+            this.orderNum = value;
+        }
+
+    }
+
+
+    /**
+     * <p>Java class for anonymous complex type.
+     * 
+     * <p>The following schema fragment specifies the expected content 
contained within this class.
+     * 
+     * <pre>
+     * &lt;complexType>
+     *   &lt;complexContent>
+     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType";>
+     *       &lt;sequence>
+     *         &lt;element name="item" maxOccurs="unbounded" minOccurs="0">
+     *           &lt;complexType>
+     *             &lt;complexContent>
+     *               &lt;restriction 
base="{http://www.w3.org/2001/XMLSchema}anyType";>
+     *                 &lt;sequence>
+     *                   &lt;element name="price" 
type="{http://www.w3.org/2001/XMLSchema}float"/>
+     *                   &lt;element name="quantity" 
type="{http://www.w3.org/2001/XMLSchema}short"/>
+     *                 &lt;/sequence>
+     *                 &lt;attribute name="id" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
+     *               &lt;/restriction>
+     *             &lt;/complexContent>
+     *           &lt;/complexType>
+     *         &lt;/element>
+     *       &lt;/sequence>
+     *     &lt;/restriction>
+     *   &lt;/complexContent>
+     * &lt;/complexType>
+     * </pre>
+     * 
+     * 
+     */
+    @XmlAccessorType(XmlAccessType.FIELD)
+    @XmlType(name = "", propOrder = {
+            "item"
+            })
+    public static class OrderItems {
+
+        protected List<ABCOrder.OrderItems.Item> item;
+
+        /**
+         * Gets the value of the item property.
+         * 
+         * <p>
+         * This accessor method returns a reference to the live list,
+         * not a snapshot. Therefore any modification you make to the
+         * returned list will be present inside the JAXB object.
+         * This is why there is not a <CODE>set</CODE> method for the item 
property.
+         * 
+         * <p>
+         * For example, to add a new item, do as follows:
+         * <pre>
+         *    getItem().add(newItem);
+         * </pre>
+         * 
+         * 
+         * <p>
+         * Objects of the following type(s) are allowed in the list
+         * {@link ABCOrder.OrderItems.Item }
+         * 
+         * 
+         */
+        public List<ABCOrder.OrderItems.Item> getItem() {
+            if (item == null) {
+                item = new ArrayList<ABCOrder.OrderItems.Item>();
+            }
+            return this.item;
+        }
+
+
+        /**
+         * <p>Java class for anonymous complex type.
+         * 
+         * <p>The following schema fragment specifies the expected content 
contained within this class.
+         * 
+         * <pre>
+         * &lt;complexType>
+         *   &lt;complexContent>
+         *     &lt;restriction 
base="{http://www.w3.org/2001/XMLSchema}anyType";>
+         *       &lt;sequence>
+         *         &lt;element name="price" 
type="{http://www.w3.org/2001/XMLSchema}float"/>
+         *         &lt;element name="quantity" 
type="{http://www.w3.org/2001/XMLSchema}short"/>
+         *       &lt;/sequence>
+         *       &lt;attribute name="id" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
+         *     &lt;/restriction>
+         *   &lt;/complexContent>
+         * &lt;/complexType>
+         * </pre>
+         * 
+         * 
+         */
+        @XmlAccessorType(XmlAccessType.FIELD)
+        @XmlType(name = "", propOrder = {
+                "price",
+                "quantity"
+                })
+        public static class Item {
+
+            protected float price;
+            protected short quantity;
+            @XmlAttribute(name = "id")
+            protected String id;
+
+            /**
+             * Gets the value of the price property.
+             * 
+             */
+            public float getPrice() {
+                return price;
+            }
+
+            /**
+             * Sets the value of the price property.
+             * 
+             */
+            public void setPrice(float value) {
+                this.price = value;
+            }
+
+            /**
+             * Gets the value of the quantity property.
+             * 
+             */
+            public short getQuantity() {
+                return quantity;
+            }
+
+            /**
+             * Sets the value of the quantity property.
+             * 
+             */
+            public void setQuantity(short value) {
+                this.quantity = value;
+            }
+
+            /**
+             * Gets the value of the id property.
+             * 
+             * @return
+             *     possible object is
+             *     {@link String }
+             *     
+             */
+            public String getId() {
+                return id;
+            }
+
+            /**
+             * Sets the value of the id property.
+             * 
+             * @param value
+             *     allowed object is
+             *     {@link String }
+             *     
+             */
+            public void setId(String value) {
+                this.id = value;
+            }
+
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/abc/ObjectFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/abc/ObjectFactory.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/abc/ObjectFactory.java
new file mode 100644
index 0000000..2032ee5
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/abc/ObjectFactory.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer.example.abc;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+
+/**
+ * This object contains factory methods for each 
+ * Java content interface and Java element interface 
+ * generated in the example.abc package. 
+ * <p>An ObjectFactory allows you to programatically 
+ * construct new instances of the Java representation 
+ * for XML content. The Java representation of XML 
+ * content can consist of schema derived interfaces 
+ * and classes representing the binding of schema 
+ * type definitions, element declarations and model 
+ * groups.  Factory methods for each of these are 
+ * provided in this class.
+ * 
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of 
schema derived classes for package: example.abc
+     * 
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link ABCOrder }
+     * 
+     */
+    public ABCOrder createABCOrder() {
+        return new ABCOrder();
+    }
+
+    /**
+     * Create an instance of {@link ABCOrder.OrderItems }
+     * 
+     */
+    public ABCOrder.OrderItems createABCOrderOrderItems() {
+        return new ABCOrder.OrderItems();
+    }
+
+    /**
+     * Create an instance of {@link ABCOrder.Header }
+     * 
+     */
+    public ABCOrder.Header createABCOrderHeader() {
+        return new ABCOrder.Header();
+    }
+
+    /**
+     * Create an instance of {@link ABCOrder.OrderItems.Item }
+     * 
+     */
+    public ABCOrder.OrderItems.Item createABCOrderOrderItemsItem() {
+        return new ABCOrder.OrderItems.Item();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/xyz/LineItem.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/xyz/LineItem.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/xyz/LineItem.java
new file mode 100644
index 0000000..2998c59
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/xyz/LineItem.java
@@ -0,0 +1,107 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer.example.xyz;
+
+import javax.annotation.Generated;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+
+/**
+ * LineItem
+ * <p>
+ * 
+ * 
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@Generated("org.jsonschema2pojo")
+@JsonPropertyOrder({
+    "itemId",
+    "amount",
+    "cost"
+})
+public class LineItem {
+
+    @JsonProperty("itemId")
+    private String itemId;
+    @JsonProperty("amount")
+    private int amount;
+    @JsonProperty("cost")
+    private double cost;
+
+    /**
+     * 
+     * @return
+     *     The itemId
+     */
+    @JsonProperty("itemId")
+    public String getItemId() {
+        return itemId;
+    }
+
+    /**
+     * 
+     * @param itemId
+     *     The itemId
+     */
+    @JsonProperty("itemId")
+    public void setItemId(String itemId) {
+        this.itemId = itemId;
+    }
+
+    /**
+     * 
+     * @return
+     *     The amount
+     */
+    @JsonProperty("amount")
+    public int getAmount() {
+        return amount;
+    }
+
+    /**
+     * 
+     * @param amount
+     *     The amount
+     */
+    @JsonProperty("amount")
+    public void setAmount(int amount) {
+        this.amount = amount;
+    }
+
+    /**
+     * 
+     * @return
+     *     The cost
+     */
+    @JsonProperty("cost")
+    public double getCost() {
+        return cost;
+    }
+
+    /**
+     * 
+     * @param cost
+     *     The cost
+     */
+    @JsonProperty("cost")
+    public void setCost(double cost) {
+        this.cost = cost;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/xyz/XYZOrder.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/xyz/XYZOrder.java
 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/xyz/XYZOrder.java
new file mode 100644
index 0000000..10351ae
--- /dev/null
+++ 
b/components/camel-dozer/src/test/java/org/apache/camel/component/dozer/example/xyz/XYZOrder.java
@@ -0,0 +1,132 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.dozer.example.xyz;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.annotation.Generated;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+
+/**
+ * XYZOrder
+ * <p>
+ * 
+ * 
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@Generated("org.jsonschema2pojo")
+@JsonPropertyOrder({
+    "custId",
+    "priority",
+    "orderId",
+    "lineItems"
+})
+public class XYZOrder {
+
+    @JsonProperty("custId")
+    private String custId;
+    @JsonProperty("priority")
+    private String priority;
+    @JsonProperty("orderId")
+    private String orderId;
+    @JsonProperty("lineItems")
+    private List<LineItem> lineItems = new ArrayList<LineItem>();
+
+    /**
+     * 
+     * @return
+     *     The custId
+     */
+    @JsonProperty("custId")
+    public String getCustId() {
+        return custId;
+    }
+
+    /**
+     * 
+     * @param custId
+     *     The custId
+     */
+    @JsonProperty("custId")
+    public void setCustId(String custId) {
+        this.custId = custId;
+    }
+
+    /**
+     * 
+     * @return
+     *     The priority
+     */
+    @JsonProperty("priority")
+    public String getPriority() {
+        return priority;
+    }
+
+    /**
+     * 
+     * @param priority
+     *     The priority
+     */
+    @JsonProperty("priority")
+    public void setPriority(String priority) {
+        this.priority = priority;
+    }
+
+    /**
+     * 
+     * @return
+     *     The orderId
+     */
+    @JsonProperty("orderId")
+    public String getOrderId() {
+        return orderId;
+    }
+
+    /**
+     * 
+     * @param orderId
+     *     The orderId
+     */
+    @JsonProperty("orderId")
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    /**
+     * 
+     * @return
+     *     The lineItems
+     */
+    @JsonProperty("lineItems")
+    public List<LineItem> getLineItems() {
+        return lineItems;
+    }
+
+    /**
+     * 
+     * @param lineItems
+     *     The lineItems
+     */
+    @JsonProperty("lineItems")
+    public void setLineItems(List<LineItem> lineItems) {
+        this.lineItems = lineItems;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/CustomMappingTest-context.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/CustomMappingTest-context.xml
 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/CustomMappingTest-context.xml
new file mode 100644
index 0000000..fde0332
--- /dev/null
+++ 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/CustomMappingTest-context.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"; 
xmlns:camel="http://camel.apache.org/schema/spring"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="      
  http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd        
http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd";>
+
+   <!-- Camel route -->
+   <camelContext xmlns="http://camel.apache.org/schema/spring";>
+    <endpoint 
uri="dozer:java2java?mappingFile=org/apache/camel/component/dozer/customMapping.xml&amp;targetModel=org.apache.camel.component.dozer.example.xyz.XYZOrder"
 id="java2java"/>
+    <route>
+        <from uri="direct:start"/>
+        <to ref="java2java"/>
+        <to uri="mock:result"/>
+    </route>
+</camelContext>
+</beans>

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/LiteralMappingTest-context.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/LiteralMappingTest-context.xml
 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/LiteralMappingTest-context.xml
new file mode 100644
index 0000000..f13d5a9
--- /dev/null
+++ 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/LiteralMappingTest-context.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"; 
xmlns:camel="http://camel.apache.org/schema/spring"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="      
  http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd        
http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd";>
+
+   <!-- Camel route -->
+   <camelContext xmlns="http://camel.apache.org/schema/spring";>
+    <endpoint 
uri="dozer:java2java?mappingFile=org/apache/camel/component/dozer/literalMapping.xml&amp;targetModel=org.apache.camel.component.dozer.example.xyz.XYZOrder"
 id="java2java"/>
+    <route>
+        <from uri="direct:start"/>
+        <to ref="java2java"/>
+        <to uri="mock:result"/>
+    </route>
+</camelContext>
+</beans>

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/XmlToJsonTest-context.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/XmlToJsonTest-context.xml
 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/XmlToJsonTest-context.xml
new file mode 100644
index 0000000..e9678d0
--- /dev/null
+++ 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/XmlToJsonTest-context.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"; 
xmlns:camel="http://camel.apache.org/schema/spring"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="      
  http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd        
http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd";>
+
+   <!-- Camel route -->
+   <camelContext xmlns="http://camel.apache.org/schema/spring";>
+    <endpoint 
uri="dozer:xml2json?mappingFile=org/apache/camel/component/dozer/dozerBeanMapping.xml&amp;marshalId=myjson&amp;unmarshalId=myjaxb&amp;targetModel=org.apache.camel.component.dozer.example.xyz.XYZOrder"
 id="xml2json"/>
+    <dataFormats>
+        <json library="Jackson" id="myjson"/>
+        <jaxb contextPath="org.apache.camel.component.dozer.example.abc" 
id="myjaxb"/>
+    </dataFormats>
+    <route>
+        <from uri="direct:start"/>
+        <to ref="xml2json"/>
+        <to uri="mock:result"/>
+    </route>
+</camelContext>
+</beans>

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/abc-order.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/abc-order.xml
 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/abc-order.xml
new file mode 100644
index 0000000..4abcef8
--- /dev/null
+++ 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/abc-order.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<ABCOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:java="http://java.sun.com";>
+    <header>
+        <status>GOLD</status>
+        <customer-num>ACME-123</customer-num>
+        <order-num>ORDER1</order-num>
+    </header>
+    <order-items>
+        <item id="PICKLE">
+            <price>2.25</price>
+            <quantity>1000</quantity>
+        </item>
+    </order-items>
+</ABCOrder>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/e085e28d/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/customMapping.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/customMapping.xml
 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/customMapping.xml
new file mode 100644
index 0000000..5ef7f3a
--- /dev/null
+++ 
b/components/camel-dozer/src/test/resources/org/apache/camel/component/dozer/customMapping.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<mappings xmlns="http://dozer.sourceforge.net"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://dozer.sourceforge.net 
http://dozer.sourceforge.net/schema/beanmapping.xsd";>
+    <mapping>
+        
<class-a>org.apache.camel.component.dozer.example.abc.ABCOrder</class-a>
+        
<class-b>org.apache.camel.component.dozer.example.xyz.XYZOrder</class-b>
+        <field custom-converter-id="_customMapping" 
+               
custom-converter-param="org.apache.camel.component.dozer.example.CustomMapper">
+            <a>header.customerNum</a>
+            <b>custId</b>
+        </field>
+        <field custom-converter-id="_customMapping" 
+               
custom-converter-param="org.apache.camel.component.dozer.example.CustomMapperOperations,custom2">
+            <a>header.status</a>
+            <b>priority</b>
+        </field>
+        <field>
+            <a>header.orderNum</a>
+            <b>orderId</b>
+        </field>
+        <field>
+            <a>orderItems.item</a>
+            <b>lineItems</b>
+        </field>
+    </mapping>
+    <mapping>
+        
<class-a>org.apache.camel.component.dozer.example.abc.ABCOrder$OrderItems$Item</class-a>
+        
<class-b>org.apache.camel.component.dozer.example.xyz.LineItem</class-b>
+        <field>
+            <a>id</a>
+            <b>itemId</b>
+        </field>
+        <field>
+            <a>price</a>
+            <b>cost</b>
+        </field>
+        <field>
+            <a>quantity</a>
+            <b>amount</b>
+        </field>
+    </mapping>
+</mappings>

Reply via email to