This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 554d9f94e1111f793cafb1018c5926d2c7ca99a4
Author: Andrea Cosentino <anco...@gmail.com>
AuthorDate: Tue Nov 7 13:10:45 2017 +0100

    CAMEL-11982 - camel-jackson - Allow to configure timezone
---
 .../camel/model/dataformat/JsonDataFormat.java     | 114 ++++++++++++++-------
 .../src/main/docs/json-jackson-dataformat.adoc     |   3 +-
 .../camel/component/jackson/JacksonDataFormat.java | 104 ++++++++++++-------
 .../jackson/JacksonMarshalDateTimezoneTest.java    |  60 +++++++++++
 .../component/jacksonxml/JacksonXMLDataFormat.java | 100 ++++++++++++------
 .../jacksonxml/JacksonMarshalDateTimezoneTest.java |  60 +++++++++++
 .../springboot/JacksonDataFormatConfiguration.java |  14 +++
 7 files changed, 346 insertions(+), 109 deletions(-)

diff --git 
a/camel-core/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
 
b/camel-core/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
index 5fe3e66..cc92c90 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.model.dataformat;
 
+import java.text.DateFormat;
+import java.util.TimeZone;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -31,9 +34,10 @@ import org.apache.camel.util.CollectionStringBuffer;
 import org.apache.camel.util.ObjectHelper;
 
 /**
- * JSon data format is used for unmarshal a JSon payload to POJO or to marshal 
POJO back to JSon payload.
+ * JSon data format is used for unmarshal a JSon payload to POJO or to marshal
+ * POJO back to JSon payload.
  *
- * @version 
+ * @version
  */
 @Metadata(label = "dataformat,transformation,json", title = "JSon")
 @XmlRootElement(name = "json")
@@ -43,7 +47,8 @@ public class JsonDataFormat extends DataFormatDefinition {
     private String objectMapper;
     @XmlAttribute
     private Boolean prettyPrint;
-    @XmlAttribute @Metadata(defaultValue = "XStream")
+    @XmlAttribute
+    @Metadata(defaultValue = "XStream")
     private JsonLibrary library = JsonLibrary.XStream;
     @XmlAttribute
     private String unmarshalTypeName;
@@ -75,7 +80,9 @@ public class JsonDataFormat extends DataFormatDefinition {
     private String permissions;
     @XmlAttribute
     private Boolean allowUnmarshallType;
-
+    @XmlAttribute
+    private String timezone;
+    
     public JsonDataFormat() {
         super("json");
     }
@@ -89,7 +96,8 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * Lookup and use the existing ObjectMapper with the given id when using 
Jackson.
+     * Lookup and use the existing ObjectMapper with the given id when using
+     * Jackson.
      */
     public void setObjectMapper(String objectMapper) {
         this.objectMapper = objectMapper;
@@ -146,9 +154,10 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * When marshalling a POJO to JSON you might want to exclude certain 
fields from the JSON output.
-     * With Jackson you can use JSON views to accomplish this. This option is 
to refer to the class
-     * which has @JsonView annotations
+     * When marshalling a POJO to JSON you might want to exclude certain fields
+     * from the JSON output. With Jackson you can use JSON views to accomplish
+     * this. This option is to refer to the class which has @JsonView
+     * annotations
      */
     public void setJsonView(Class<?> jsonView) {
         this.jsonView = jsonView;
@@ -159,8 +168,9 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * If you want to marshal a pojo to JSON, and the pojo has some fields 
with null values.
-     * And you want to skip these null values, you can set this option to 
<tt>NOT_NULL</tt>
+     * If you want to marshal a pojo to JSON, and the pojo has some fields with
+     * null values. And you want to skip these null values, you can set this
+     * option to <tt>NOT_NULL</tt>
      */
     public void setInclude(String include) {
         this.include = include;
@@ -171,8 +181,8 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * Used for JMS users to allow the JMSType header from the JMS spec to 
specify a FQN classname
-     * to use to unmarshal to.
+     * Used for JMS users to allow the JMSType header from the JMS spec to
+     * specify a FQN classname to use to unmarshal to.
      */
     public void setAllowJmsType(Boolean allowJmsType) {
         this.allowJmsType = allowJmsType;
@@ -183,8 +193,9 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * Refers to a custom collection type to lookup in the registry to use. 
This option should rarely be used, but allows
-     * to use different collection types than java.util.Collection based as 
default.
+     * Refers to a custom collection type to lookup in the registry to use. 
This
+     * option should rarely be used, but allows to use different collection
+     * types than java.util.Collection based as default.
      */
     public void setCollectionTypeName(String collectionTypeName) {
         this.collectionTypeName = collectionTypeName;
@@ -206,8 +217,8 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * Whether to enable the JAXB annotations module when using jackson. When 
enabled then JAXB annotations
-     * can be used by Jackson.
+     * Whether to enable the JAXB annotations module when using jackson. When
+     * enabled then JAXB annotations can be used by Jackson.
      */
     public void setEnableJaxbAnnotationModule(Boolean 
enableJaxbAnnotationModule) {
         this.enableJaxbAnnotationModule = enableJaxbAnnotationModule;
@@ -218,8 +229,9 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * To use custom Jackson modules com.fasterxml.jackson.databind.Module 
specified as a String with FQN class names.
-     * Multiple classes can be separated by comma.
+     * To use custom Jackson modules com.fasterxml.jackson.databind.Module
+     * specified as a String with FQN class names. Multiple classes can be
+     * separated by comma.
      */
     public void setModuleClassNames(String moduleClassNames) {
         this.moduleClassNames = moduleClassNames;
@@ -230,8 +242,8 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * To use custom Jackson modules referred from the Camel registry.
-     * Multiple modules can be separated by comma.
+     * To use custom Jackson modules referred from the Camel registry. Multiple
+     * modules can be separated by comma.
      */
     public void setModuleRefs(String moduleRefs) {
         this.moduleRefs = moduleRefs;
@@ -242,10 +254,13 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * Set of features to enable on the Jackson 
<tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+     * Set of features to enable on the Jackson
+     * <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
      * <p/>
-     * The features should be a name that matches a enum from 
<tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
-     * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or 
<tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+     * The features should be a name that matches a enum from
+     * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+     * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+     * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
      * <p/>
      * Multiple features can be separated by comma
      */
@@ -258,10 +273,13 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * Set of features to disable on the Jackson 
<tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+     * Set of features to disable on the Jackson
+     * <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
      * <p/>
-     * The features should be a name that matches a enum from 
<tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
-     * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or 
<tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+     * The features should be a name that matches a enum from
+     * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+     * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+     * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
      * <p/>
      * Multiple features can be separated by comma
      */
@@ -274,18 +292,20 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * Adds permissions that controls which Java packages and classes XStream 
is allowed to use during
-     * unmarshal from xml/json to Java beans.
+     * Adds permissions that controls which Java packages and classes XStream 
is
+     * allowed to use during unmarshal from xml/json to Java beans.
      * <p/>
-     * A permission must be configured either here or globally using a JVM 
system property. The permission
-     * can be specified in a syntax where a plus sign is allow, and minus sign 
is deny.
-     * <br/>
-     * Wildcards is supported by using <tt>.*</tt> as prefix. For example to 
allow <tt>com.foo</tt> and all subpackages
-     * then specfy <tt>+com.foo.*</tt>. Multiple permissions can be configured 
separated by comma, such as
-     * <tt>+com.foo.*,-com.foo.bar.MySecretBean</tt>.
-     * <br/>
-     * The following default permission is always included: 
<tt>"-*,java.lang.*,java.util.*"</tt> unless
-     * its overridden by specifying a JVM system property with they key 
<tt>org.apache.camel.xstream.permissions</tt>.
+     * A permission must be configured either here or globally using a JVM
+     * system property. The permission can be specified in a syntax where a 
plus
+     * sign is allow, and minus sign is deny. <br/>
+     * Wildcards is supported by using <tt>.*</tt> as prefix. For example to
+     * allow <tt>com.foo</tt> and all subpackages then specfy
+     * <tt>+com.foo.*</tt>. Multiple permissions can be configured separated by
+     * comma, such as <tt>+com.foo.*,-com.foo.bar.MySecretBean</tt>. <br/>
+     * The following default permission is always included:
+     * <tt>"-*,java.lang.*,java.util.*"</tt> unless its overridden by 
specifying
+     * a JVM system property with they key
+     * <tt>org.apache.camel.xstream.permissions</tt>.
      */
     public void setPermissions(String permissions) {
         this.permissions = permissions;
@@ -293,6 +313,7 @@ public class JsonDataFormat extends DataFormatDefinition {
 
     /**
      * To add permission for the given pojo classes.
+     * 
      * @param type the pojo class(es) xstream should use as allowed permission
      * @see #setPermissions(String)
      */
@@ -310,7 +331,8 @@ public class JsonDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * If enabled then Jackson is allowed to attempt to use the 
CamelJacksonUnmarshalType header during the unmarshalling.
+     * If enabled then Jackson is allowed to attempt to use the
+     * CamelJacksonUnmarshalType header during the unmarshalling.
      * <p/>
      * This should only be enabled when desired to be used.
      */
@@ -318,6 +340,19 @@ public class JsonDataFormat extends DataFormatDefinition {
         this.allowUnmarshallType = allowUnmarshallType;
     }
 
+    public String getTimezone() {
+        return timezone;
+    }
+
+    /**
+     * If set then Jackson will use the Timezone when 
marshalling/unmarshalling.
+     * This option will have no effect on the others Json DataFormat, like 
gson,
+     * fastjson and xstream.
+     */
+    public void setTimezone(String timezone) {
+        this.timezone = timezone;
+    }
+
     @Override
     public String getDataFormatName() {
         // json data format is special as the name can be from different 
bundles
@@ -405,7 +440,8 @@ public class JsonDataFormat extends DataFormatDefinition {
         if (allowUnmarshallType != null) {
             setProperty(camelContext, dataFormat, "allowUnmarshallType", 
allowUnmarshallType);
         }
-        // if we have the unmarshal type, but no permission set, then use it 
to be allowed
+        // if we have the unmarshal type, but no permission set, then use it to
+        // be allowed
         if (permissions == null && unmarshalType != null) {
             String allow = "+" + unmarshalType.getName();
             setProperty(camelContext, dataFormat, "permissions", allow);
diff --git 
a/components/camel-jackson/src/main/docs/json-jackson-dataformat.adoc 
b/components/camel-jackson/src/main/docs/json-jackson-dataformat.adoc
index cf6d114..1233cd8 100644
--- a/components/camel-jackson/src/main/docs/json-jackson-dataformat.adoc
+++ b/components/camel-jackson/src/main/docs/json-jackson-dataformat.adoc
@@ -17,7 +17,7 @@ from("activemq:My.Queue").
 
 
 // dataformat options: START
-The JSon Jackson dataformat supports 17 options which are listed below.
+The JSon Jackson dataformat supports 18 options which are listed below.
 
 
 
@@ -40,6 +40,7 @@ The JSon Jackson dataformat supports 17 options which are 
listed below.
 | disableFeatures |  | String | Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. The features should be a name that 
matches a enum from com.fasterxml.jackson.databind.SerializationFeature 
com.fasterxml.jackson.databind.DeserializationFeature or 
com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated 
by comma
 | permissions |  | String | Adds permissions that controls which Java packages 
and classes XStream is allowed to use during unmarshal from xml/json to Java 
beans. A permission must be configured either here or globally using a JVM 
system property. The permission can be specified in a syntax where a plus sign 
is allow and minus sign is deny. Wildcards is supported by using . as prefix. 
For example to allow com.foo and all subpackages then specfy com.foo.. Multiple 
permissions can be confi [...]
 | allowUnmarshallType | false | Boolean | If enabled then Jackson is allowed 
to attempt to use the CamelJacksonUnmarshalType header during the 
unmarshalling. This should only be enabled when desired to be used.
+| timezone |  | String | If set then Jackson will use the Timezone when 
marshalling/unmarshalling. This option will have no effect on the others Json 
DataFormat like gson fastjson and xstream.
 | contentTypeHeader | false | Boolean | Whether the data format should set the 
Content-Type header with the type from the data format if the data format is 
capable of doing so. For example application/xml for data formats marshalling 
to XML or application/json for data formats marshalling to JSon etc.
 |===
 // dataformat options: END
diff --git 
a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java
 
b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java
index ce981a7..dd86f70 100644
--- 
a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java
+++ 
b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TimeZone;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -34,6 +35,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.type.CollectionType;
 import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
@@ -46,8 +48,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * A <a href="http://camel.apache.org/data-format.html";>data format</a> 
({@link DataFormat})
- * using <a href="http://jackson.codehaus.org/";>Jackson</a> to marshal to and 
from JSON.
+ * A <a href="http://camel.apache.org/data-format.html";>data format</a>
+ * ({@link DataFormat}) using <a 
href="http://jackson.codehaus.org/";>Jackson</a>
+ * to marshal to and from JSON.
  */
 public class JacksonDataFormat extends ServiceSupport implements DataFormat, 
DataFormatName, CamelContextAware {
 
@@ -71,6 +74,7 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     private boolean enableJacksonTypeConverter;
     private boolean allowUnmarshallType;
     private boolean contentTypeHeader = true;
+    private TimeZone timezone;
 
     /**
      * Use the default Jackson {@link ObjectMapper} and {@link Object}
@@ -80,8 +84,8 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     }
 
     /**
-     * Use the default Jackson {@link ObjectMapper} and with a custom
-     * unmarshal type
+     * Use the default Jackson {@link ObjectMapper} and with a custom unmarshal
+     * type
      *
      * @param unmarshalType the custom unmarshal type
      */
@@ -90,25 +94,28 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     }
 
     /**
-     * Use the default Jackson {@link ObjectMapper} and with a custom
-     * unmarshal type and JSON view
+     * Use the default Jackson {@link ObjectMapper} and with a custom unmarshal
+     * type and JSON view
      *
      * @param unmarshalType the custom unmarshal type
-     * @param jsonView marker class to specify properties to be included 
during marshalling.
-     *                 See also http://wiki.fasterxml.com/JacksonJsonViews
+     * @param jsonView marker class to specify properties to be included during
+     *            marshalling. See also
+     *            http://wiki.fasterxml.com/JacksonJsonViews
      */
     public JacksonDataFormat(Class<?> unmarshalType, Class<?> jsonView) {
         this(unmarshalType, jsonView, true);
     }
-    
+
     /**
-     * Use the default Jackson {@link ObjectMapper} and with a custom
-     * unmarshal type and JSON view
+     * Use the default Jackson {@link ObjectMapper} and with a custom unmarshal
+     * type and JSON view
      *
      * @param unmarshalType the custom unmarshal type
-     * @param jsonView marker class to specify properties to be included 
during marshalling.
-     *                 See also http://wiki.fasterxml.com/JacksonJsonViews
-     * @param enableJaxbAnnotationModule if it is true, will enable the 
JaxbAnnotationModule.
+     * @param jsonView marker class to specify properties to be included during
+     *            marshalling. See also
+     *            http://wiki.fasterxml.com/JacksonJsonViews
+     * @param enableJaxbAnnotationModule if it is true, will enable the
+     *            JaxbAnnotationModule.
      */
     public JacksonDataFormat(Class<?> unmarshalType, Class<?> jsonView, 
boolean enableJaxbAnnotationModule) {
         this.unmarshalType = unmarshalType;
@@ -119,7 +126,7 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     /**
      * Use a custom Jackson mapper and and unmarshal type
      *
-     * @param mapper        the custom mapper
+     * @param mapper the custom mapper
      * @param unmarshalType the custom unmarshal type
      */
     public JacksonDataFormat(ObjectMapper mapper, Class<?> unmarshalType) {
@@ -129,10 +136,11 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     /**
      * Use a custom Jackson mapper, unmarshal type and JSON view
      *
-     * @param mapper        the custom mapper
+     * @param mapper the custom mapper
      * @param unmarshalType the custom unmarshal type
-     * @param jsonView marker class to specify properties to be included 
during marshalling.
-     *                 See also http://wiki.fasterxml.com/JacksonJsonViews
+     * @param jsonView marker class to specify properties to be included during
+     *            marshalling. See also
+     *            http://wiki.fasterxml.com/JacksonJsonViews
      */
     public JacksonDataFormat(ObjectMapper mapper, Class<?> unmarshalType, 
Class<?> jsonView) {
         this.objectMapper = mapper;
@@ -284,8 +292,8 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     }
 
     /**
-     * To use custom Jackson {@link Module}s specified as a String with FQN 
class names.
-     * Multiple classes can be separated by comma.
+     * To use custom Jackson {@link Module}s specified as a String with FQN
+     * class names. Multiple classes can be separated by comma.
      */
     public void setModuleClassNames(String moduleClassNames) {
         this.moduleClassNames = moduleClassNames;
@@ -296,8 +304,8 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     }
 
     /**
-     * To use custom Jackson modules referred from the Camel registry.
-     * Multiple modules can be separated by comma.
+     * To use custom Jackson modules referred from the Camel registry. Multiple
+     * modules can be separated by comma.
      */
     public void setModuleRefs(String moduleRefs) {
         this.moduleRefs = moduleRefs;
@@ -319,7 +327,8 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     }
 
     /**
-     * Allows jackson to use the <tt>JMSType</tt> header as an indicator what 
the classname is for unmarshaling json content to POJO
+     * Allows jackson to use the <tt>JMSType</tt> header as an indicator what
+     * the classname is for unmarshaling json content to POJO
      * <p/>
      * By default this option is <tt>false</tt>.
      */
@@ -332,21 +341,24 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     }
 
     /**
-     * If enabled then Jackson is allowed to attempt to be used during Camels 
<a href="https://camel.apache.org/type-converter.html";>type converter</a>
-     * as a {@link org.apache.camel.FallbackConverter} that attempts to 
convert POJOs to/from {@link Map}/{@link List} types.
+     * If enabled then Jackson is allowed to attempt to be used during Camels
+     * <a href="https://camel.apache.org/type-converter.html";>type 
converter</a>
+     * as a {@link org.apache.camel.FallbackConverter} that attempts to convert
+     * POJOs to/from {@link Map}/{@link List} types.
      * <p/>
      * This should only be enabled when desired to be used.
      */
     public void setEnableJacksonTypeConverter(boolean 
enableJacksonTypeConverter) {
         this.enableJacksonTypeConverter = enableJacksonTypeConverter;
     }
-    
+
     public boolean isAllowUnmarshallType() {
         return allowUnmarshallType;
     }
 
     /**
-     * If enabled then Jackson is allowed to attempt to use the 
CamelJacksonUnmarshalType header during the unmarshalling.
+     * If enabled then Jackson is allowed to attempt to use the
+     * CamelJacksonUnmarshalType header during the unmarshalling.
      * <p/>
      * This should only be enabled when desired to be used.
      */
@@ -359,19 +371,33 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     }
 
     /**
-     * If enabled then Jackson will set the Content-Type header to 
<tt>application/json</tt> when marshalling.
+     * If enabled then Jackson will set the Content-Type header to
+     * <tt>application/json</tt> when marshalling.
      */
     public void setContentTypeHeader(boolean contentTypeHeader) {
         this.contentTypeHeader = contentTypeHeader;
     }
 
+    public TimeZone getTimezone() {
+        return timezone;
+    }
+
+    /**
+     * If set then Jackson will use the Timezone when 
marshalling/unmarshalling.
+     */
+    public void setTimezone(TimeZone timezone) {
+        this.timezone = timezone;
+    }
+
     public String getEnableFeatures() {
         return enableFeatures;
     }
 
     /**
-     * Set of features to enable on the Jackson {@link ObjectMapper}.
-     * The features should be a name that matches a enum from {@link 
SerializationFeature}, {@link DeserializationFeature}, or {@link MapperFeature}.
+     * Set of features to enable on the Jackson {@link ObjectMapper}. The
+     * features should be a name that matches a enum from
+     * {@link SerializationFeature}, {@link DeserializationFeature}, or
+     * {@link MapperFeature}.
      */
     public void setEnableFeatures(String enableFeatures) {
         this.enableFeatures = enableFeatures;
@@ -382,8 +408,10 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
     }
 
     /**
-     * Set of features to disable on the Jackson {@link ObjectMapper}.
-     * The features should be a name that matches a enum from {@link 
SerializationFeature}, {@link DeserializationFeature}, or {@link MapperFeature}.
+     * Set of features to disable on the Jackson {@link ObjectMapper}. The
+     * features should be a name that matches a enum from
+     * {@link SerializationFeature}, {@link DeserializationFeature}, or
+     * {@link MapperFeature}.
      */
     public void setDisableFeatures(String disableFeatures) {
         this.disableFeatures = disableFeatures;
@@ -455,7 +483,7 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
                 LOG.debug("Creating new ObjectMapper to use: {}", 
objectMapper);
             }
         }
-        
+
         if (enableJaxbAnnotationModule) {
             // Enables JAXB processing
             JaxbAnnotationModule module = new JaxbAnnotationModule();
@@ -494,7 +522,8 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
                     objectMapper.enable(mf);
                     continue;
                 }
-                throw new IllegalArgumentException("Enable feature: " + enable 
+ " cannot be converted to an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature]");
+                throw new IllegalArgumentException("Enable feature: " + enable
+                                                   + " cannot be converted to 
an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature]");
             }
         }
         if (disableFeatures != null) {
@@ -517,7 +546,8 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
                     objectMapper.disable(mf);
                     continue;
                 }
-                throw new IllegalArgumentException("Disable feature: " + 
disable + " cannot be converted to an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature]");
+                throw new IllegalArgumentException("Disable feature: " + 
disable
+                                                   + " cannot be converted to 
an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature]");
             }
         }
 
@@ -549,6 +579,10 @@ public class JacksonDataFormat extends ServiceSupport 
implements DataFormat, Dat
                 objectMapper.registerModule(module);
             }
         }
+        if (ObjectHelper.isNotEmpty(timezone)) {
+            LOG.debug("Setting timezone to Object Mapper: {}", timezone);
+            objectMapper.setTimeZone(timezone);
+        }
     }
 
     @Override
diff --git 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalDateTimezoneTest.java
 
b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalDateTimezoneTest.java
new file mode 100644
index 0000000..30457e8
--- /dev/null
+++ 
b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalDateTimezoneTest.java
@@ -0,0 +1,60 @@
+/**
+ * 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.jackson;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class JacksonMarshalDateTimezoneTest extends CamelTestSupport {
+
+    @Test
+    public void testMarshalDate() throws Exception {
+        GregorianCalendar in = new GregorianCalendar(2017, Calendar.APRIL, 25, 
17, 0, 10);
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+
+        Object marshalled = template.requestBody("direct:in", in.getTime());
+        String marshalledAsString = 
context.getTypeConverter().convertTo(String.class, marshalled);
+        assertEquals("1493132410000", marshalledAsString);
+
+        mock.expectedMessageCount(1);
+
+        mock.assertIsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+
+            @Override
+            public void configure() throws Exception {
+                JacksonDataFormat format = new JacksonDataFormat();
+                TimeZone timeZone = TimeZone.getTimeZone("Africa/Ouagadougou");
+                format.setTimezone(timeZone);
+
+                from("direct:in").marshal(format).to("mock:result");
+            }
+        };
+    }
+
+}
diff --git 
a/components/camel-jacksonxml/src/main/java/org/apache/camel/component/jacksonxml/JacksonXMLDataFormat.java
 
b/components/camel-jacksonxml/src/main/java/org/apache/camel/component/jacksonxml/JacksonXMLDataFormat.java
index eeaddcc..3c63d20 100644
--- 
a/components/camel-jacksonxml/src/main/java/org/apache/camel/component/jacksonxml/JacksonXMLDataFormat.java
+++ 
b/components/camel-jacksonxml/src/main/java/org/apache/camel/component/jacksonxml/JacksonXMLDataFormat.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.TimeZone;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -33,6 +34,7 @@ import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.type.CollectionType;
 import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
@@ -45,8 +47,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * A <a href="http://camel.apache.org/data-format.html";>data format</a> 
({@link DataFormat})
- * using <a href="http://jackson.codehaus.org/";>Jackson</a> to marshal to and 
from XML.
+ * A <a href="http://camel.apache.org/data-format.html";>data format</a>
+ * ({@link DataFormat}) using <a 
href="http://jackson.codehaus.org/";>Jackson</a>
+ * to marshal to and from XML.
  */
 public class JacksonXMLDataFormat extends ServiceSupport implements 
DataFormat, DataFormatName, CamelContextAware {
 
@@ -70,6 +73,7 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     private boolean enableJacksonTypeConverter;
     private boolean allowUnmarshallType;
     private boolean contentTypeHeader = true;
+    private TimeZone timezone;
 
     /**
      * Use the default Jackson {@link XmlMapper} and {@link Map}
@@ -79,8 +83,8 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     }
 
     /**
-     * Use the default Jackson {@link XmlMapper} and with a custom
-     * unmarshal type
+     * Use the default Jackson {@link XmlMapper} and with a custom unmarshal
+     * type
      *
      * @param unmarshalType the custom unmarshal type
      */
@@ -89,25 +93,28 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     }
 
     /**
-     * Use the default Jackson {@link XmlMapper} and with a custom
-     * unmarshal type and JSON view
+     * Use the default Jackson {@link XmlMapper} and with a custom unmarshal
+     * type and JSON view
      *
      * @param unmarshalType the custom unmarshal type
-     * @param jsonView      marker class to specify properties to be included 
during marshalling.
-     *                      See also http://wiki.fasterxml.com/JacksonJsonViews
+     * @param jsonView marker class to specify properties to be included during
+     *            marshalling. See also
+     *            http://wiki.fasterxml.com/JacksonJsonViews
      */
     public JacksonXMLDataFormat(Class<?> unmarshalType, Class<?> jsonView) {
         this(unmarshalType, jsonView, true);
     }
 
     /**
-     * Use the default Jackson {@link XmlMapper} and with a custom
-     * unmarshal type and JSON view
+     * Use the default Jackson {@link XmlMapper} and with a custom unmarshal
+     * type and JSON view
      *
-     * @param unmarshalType              the custom unmarshal type
-     * @param jsonView                   marker class to specify properties to 
be included during marshalling.
-     *                                   See also 
http://wiki.fasterxml.com/JacksonJsonViews
-     * @param enableJaxbAnnotationModule if it is true, will enable the 
JaxbAnnotationModule.
+     * @param unmarshalType the custom unmarshal type
+     * @param jsonView marker class to specify properties to be included during
+     *            marshalling. See also
+     *            http://wiki.fasterxml.com/JacksonJsonViews
+     * @param enableJaxbAnnotationModule if it is true, will enable the
+     *            JaxbAnnotationModule.
      */
     public JacksonXMLDataFormat(Class<?> unmarshalType, Class<?> jsonView, 
boolean enableJaxbAnnotationModule) {
         this.unmarshalType = unmarshalType;
@@ -118,7 +125,7 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     /**
      * Use a custom Jackson mapper and and unmarshal type
      *
-     * @param mapper        the custom mapper
+     * @param mapper the custom mapper
      * @param unmarshalType the custom unmarshal type
      */
     public JacksonXMLDataFormat(XmlMapper mapper, Class<?> unmarshalType) {
@@ -128,10 +135,11 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     /**
      * Use a custom Jackson mapper, unmarshal type and JSON view
      *
-     * @param mapper        the custom mapper
+     * @param mapper the custom mapper
      * @param unmarshalType the custom unmarshal type
-     * @param jsonView      marker class to specify properties to be included 
during marshalling.
-     *                      See also http://wiki.fasterxml.com/JacksonJsonViews
+     * @param jsonView marker class to specify properties to be included during
+     *            marshalling. See also
+     *            http://wiki.fasterxml.com/JacksonJsonViews
      */
     public JacksonXMLDataFormat(XmlMapper mapper, Class<?> unmarshalType, 
Class<?> jsonView) {
         this.xmlMapper = mapper;
@@ -283,8 +291,8 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     }
 
     /**
-     * To use custom Jackson {@link Module}s specified as a String with FQN 
class names.
-     * Multiple classes can be separated by comma.
+     * To use custom Jackson {@link Module}s specified as a String with FQN
+     * class names. Multiple classes can be separated by comma.
      */
     public void setModuleClassNames(String moduleClassNames) {
         this.moduleClassNames = moduleClassNames;
@@ -295,8 +303,8 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     }
 
     /**
-     * To use custom Jackson modules referred from the Camel registry.
-     * Multiple modules can be separated by comma.
+     * To use custom Jackson modules referred from the Camel registry. Multiple
+     * modules can be separated by comma.
      */
     public void setModuleRefs(String moduleRefs) {
         this.moduleRefs = moduleRefs;
@@ -318,7 +326,8 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     }
 
     /**
-     * Allows jackson to use the <tt>JMSType</tt> header as an indicator what 
the classname is for unmarshaling XML content to POJO
+     * Allows jackson to use the <tt>JMSType</tt> header as an indicator what
+     * the classname is for unmarshaling XML content to POJO
      * <p/>
      * By default this option is <tt>false</tt>.
      */
@@ -331,21 +340,24 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     }
 
     /**
-     * If enabled then Jackson is allowed to attempt to be used during Camels 
<a href="https://camel.apache.org/type-converter.html";>type converter</a>
-     * as a {@link org.apache.camel.FallbackConverter} that attempts to 
convert POJOs to/from {@link Map}/{@link List} types.
+     * If enabled then Jackson is allowed to attempt to be used during Camels
+     * <a href="https://camel.apache.org/type-converter.html";>type 
converter</a>
+     * as a {@link org.apache.camel.FallbackConverter} that attempts to convert
+     * POJOs to/from {@link Map}/{@link List} types.
      * <p/>
      * This should only be enabled when desired to be used.
      */
     public void setEnableJacksonTypeConverter(boolean 
enableJacksonTypeConverter) {
         this.enableJacksonTypeConverter = enableJacksonTypeConverter;
     }
-    
+
     public boolean isAllowUnmarshallType() {
         return allowUnmarshallType;
     }
 
     /**
-     * If enabled then Jackson is allowed to attempt to use the 
CamelJacksonUnmarshalType header during the unmarshalling.
+     * If enabled then Jackson is allowed to attempt to use the
+     * CamelJacksonUnmarshalType header during the unmarshalling.
      * <p/>
      * This should only be enabled when desired to be used.
      */
@@ -358,19 +370,32 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     }
 
     /**
-     * If enabled then Jackson will set the Content-Type header to 
<tt>application/xml</tt> when marshalling.
+     * If enabled then Jackson will set the Content-Type header to
+     * <tt>application/xml</tt> when marshalling.
      */
     public void setContentTypeHeader(boolean contentTypeHeader) {
         this.contentTypeHeader = contentTypeHeader;
     }
 
+    public TimeZone getTimezone() {
+        return timezone;
+    }
+
+    /**
+     * If set then Jackson will use the Timezone when 
marshalling/unmarshalling.
+     */
+    public void setTimezone(TimeZone timezone) {
+        this.timezone = timezone;
+    }
+
     public String getEnableFeatures() {
         return enableFeatures;
     }
 
     /**
-     * Set of features to enable on the Jackson {@link XmlMapper}.
-     * The features should be a name that matches a enum from {@link 
SerializationFeature}, {@link DeserializationFeature}, or {@link MapperFeature}.
+     * Set of features to enable on the Jackson {@link XmlMapper}. The features
+     * should be a name that matches a enum from {@link SerializationFeature},
+     * {@link DeserializationFeature}, or {@link MapperFeature}.
      */
     public void setEnableFeatures(String enableFeatures) {
         this.enableFeatures = enableFeatures;
@@ -381,8 +406,9 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
     }
 
     /**
-     * Set of features to disable on the Jackson {@link XmlMapper}.
-     * The features should be a name that matches a enum from {@link 
SerializationFeature}, {@link DeserializationFeature}, or {@link MapperFeature}.
+     * Set of features to disable on the Jackson {@link XmlMapper}. The 
features
+     * should be a name that matches a enum from {@link SerializationFeature},
+     * {@link DeserializationFeature}, or {@link MapperFeature}.
      */
     public void setDisableFeatures(String disableFeatures) {
         this.disableFeatures = disableFeatures;
@@ -480,7 +506,8 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
                     xmlMapper.enable(mf);
                     continue;
                 }
-                throw new IllegalArgumentException("Enable feature: " + enable 
+ " cannot be converted to an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature]");
+                throw new IllegalArgumentException("Enable feature: " + enable
+                                                   + " cannot be converted to 
an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature]");
             }
         }
         if (disableFeatures != null) {
@@ -503,7 +530,8 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
                     xmlMapper.disable(mf);
                     continue;
                 }
-                throw new IllegalArgumentException("Disable feature: " + 
disable + " cannot be converted to an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature]");
+                throw new IllegalArgumentException("Disable feature: " + 
disable
+                                                   + " cannot be converted to 
an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature]");
             }
         }
 
@@ -535,6 +563,10 @@ public class JacksonXMLDataFormat extends ServiceSupport 
implements DataFormat,
                 xmlMapper.registerModule(module);
             }
         }
+        if (ObjectHelper.isNotEmpty(timezone)) {
+            LOG.debug("Setting timezone to XML Mapper: {}", timezone);
+            xmlMapper.setTimeZone(timezone);
+        }
     }
 
     @Override
diff --git 
a/components/camel-jacksonxml/src/test/java/org/apache/camel/component/jacksonxml/JacksonMarshalDateTimezoneTest.java
 
b/components/camel-jacksonxml/src/test/java/org/apache/camel/component/jacksonxml/JacksonMarshalDateTimezoneTest.java
new file mode 100644
index 0000000..740b8aa
--- /dev/null
+++ 
b/components/camel-jacksonxml/src/test/java/org/apache/camel/component/jacksonxml/JacksonMarshalDateTimezoneTest.java
@@ -0,0 +1,60 @@
+/**
+ * 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.jacksonxml;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class JacksonMarshalDateTimezoneTest extends CamelTestSupport {
+
+    @Test
+    public void testMarshalDate() throws Exception {
+        GregorianCalendar in = new GregorianCalendar(2017, Calendar.APRIL, 25, 
17, 0, 10);
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+
+        Object marshalled = template.requestBody("direct:in", in.getTime());
+        String marshalledAsString = 
context.getTypeConverter().convertTo(String.class, marshalled);
+        assertEquals("<Date>1493132410000</Date>", marshalledAsString);
+
+        mock.expectedMessageCount(1);
+
+        mock.assertIsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+
+            @Override
+            public void configure() throws Exception {
+                JacksonXMLDataFormat format = new JacksonXMLDataFormat();
+                TimeZone timeZone = TimeZone.getTimeZone("Africa/Ouagadougou");
+                format.setTimezone(timeZone);
+
+                from("direct:in").marshal(format).to("mock:result");
+            }
+        };
+    }
+
+}
diff --git 
a/platforms/spring-boot/components-starter/camel-jackson-starter/src/main/java/org/apache/camel/component/jackson/springboot/JacksonDataFormatConfiguration.java
 
b/platforms/spring-boot/components-starter/camel-jackson-starter/src/main/java/org/apache/camel/component/jackson/springboot/JacksonDataFormatConfiguration.java
index e3bca66..c6c0130 100644
--- 
a/platforms/spring-boot/components-starter/camel-jackson-starter/src/main/java/org/apache/camel/component/jackson/springboot/JacksonDataFormatConfiguration.java
+++ 
b/platforms/spring-boot/components-starter/camel-jackson-starter/src/main/java/org/apache/camel/component/jackson/springboot/JacksonDataFormatConfiguration.java
@@ -135,6 +135,12 @@ public class JacksonDataFormatConfiguration
      */
     private Boolean allowUnmarshallType = false;
     /**
+     * If set then Jackson will use the Timezone when 
marshalling/unmarshalling.
+     * This option will have no effect on the others Json DataFormat like gson
+     * fastjson and xstream.
+     */
+    private String timezone;
+    /**
      * Whether the data format should set the Content-Type header with the type
      * from the data format if the data format is capable of doing so. For
      * example application/xml for data formats marshalling to XML or
@@ -270,6 +276,14 @@ public class JacksonDataFormatConfiguration
         this.allowUnmarshallType = allowUnmarshallType;
     }
 
+    public String getTimezone() {
+        return timezone;
+    }
+
+    public void setTimezone(String timezone) {
+        this.timezone = timezone;
+    }
+
     public Boolean getContentTypeHeader() {
         return contentTypeHeader;
     }

-- 
To stop receiving notification emails like this one, please contact
"commits@camel.apache.org" <commits@camel.apache.org>.

Reply via email to