This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-3.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-3.x by this push:
new 5cbe8307c83 CAMEL-19009: camel-gson - Date Format with GsonBuilder
(#9300)
5cbe8307c83 is described below
commit 5cbe8307c83fd203ee196ad602ef38585ab77648
Author: Saravanakumar Selvaraj <[email protected]>
AuthorDate: Sun Feb 5 14:02:38 2023 +0530
CAMEL-19009: camel-gson - Date Format with GsonBuilder (#9300)
* CAMEL-19009: camel-gson - Date Format with GsonBuilder
* CAMEL-19009: camel-gson - Date Format with GsonBuilder
---
.../camel/component/gson/GsonDataFormat.java | 2 +-
.../gson/SpringGsonJsonDataFormatTest.java | 23 +++++++++++++++++
.../org/apache/camel/component/gson/TestPojo.java | 11 ++++++++
.../gson/SpringGsonJsonDataFormatTest.xml | 12 +++++++++
.../camel/model/dataformat/JsonDataFormat.java | 29 ++++++++++++++++++++++
.../reifier/dataformat/JsonDataFormatReifier.java | 1 +
6 files changed, 77 insertions(+), 1 deletion(-)
diff --git
a/components/camel-gson/src/main/java/org/apache/camel/component/gson/GsonDataFormat.java
b/components/camel-gson/src/main/java/org/apache/camel/component/gson/GsonDataFormat.java
index c0c1f72d519..e9481cfb8fb 100644
---
a/components/camel-gson/src/main/java/org/apache/camel/component/gson/GsonDataFormat.java
+++
b/components/camel-gson/src/main/java/org/apache/camel/component/gson/GsonDataFormat.java
@@ -48,7 +48,7 @@ import org.apache.camel.util.IOHelper;
* Marshal POJOs to JSON and back using <a
href="http://code.google.com/p/google-gson/">Gson</a>
*/
@Dataformat("gson")
-@Metadata(includeProperties =
"unmarshalType,unmarshalTypeName,prettyPrint,contentTypeHeader")
+@Metadata(includeProperties =
"unmarshalType,unmarshalTypeName,prettyPrint,dateFormatPattern,contentTypeHeader")
public class GsonDataFormat extends ServiceSupport
implements DataFormat, DataFormatName, DataFormatContentTypeHeader,
CamelContextAware {
diff --git
a/components/camel-gson/src/test/java/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.java
b/components/camel-gson/src/test/java/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.java
index 8ed4a13a9cc..824b2013404 100644
---
a/components/camel-gson/src/test/java/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.java
+++
b/components/camel-gson/src/test/java/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.java
@@ -16,6 +16,8 @@
*/
package org.apache.camel.component.gson;
+import java.text.SimpleDateFormat;
+
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
import org.junit.jupiter.api.Test;
@@ -67,6 +69,27 @@ public class SpringGsonJsonDataFormatTest extends
CamelSpringTestSupport {
mock.assertIsSatisfied();
}
+ @Test
+ public void testMarshalAndUnmarshalPojoWithDateFormatPattern() throws
Exception {
+ TestPojo in = new TestPojo();
+ in.setName("Camel");
+ in.setDob(new SimpleDateFormat("yyyyMMdd").parse("20230204"));
+
+ MockEndpoint mock = getMockEndpoint("mock:reversePojo");
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(TestPojo.class);
+ mock.message(0).body().isEqualTo(in);
+
+ Object marshalled = template.requestBody("direct:inFormatDate", in);
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ String expected = "{\"name\":\"Camel\",\"dob\":\"2023-02-04\"}";
+ assertEquals(expected, marshalledAsString);
+
+ template.sendBody("direct:backFormatDate", marshalled);
+
+ mock.assertIsSatisfied();
+ }
+
@Override
protected AbstractXmlApplicationContext createApplicationContext() {
return new
ClassPathXmlApplicationContext("org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.xml");
diff --git
a/components/camel-gson/src/test/java/org/apache/camel/component/gson/TestPojo.java
b/components/camel-gson/src/test/java/org/apache/camel/component/gson/TestPojo.java
index 1d094543140..12edbc5e227 100644
---
a/components/camel-gson/src/test/java/org/apache/camel/component/gson/TestPojo.java
+++
b/components/camel-gson/src/test/java/org/apache/camel/component/gson/TestPojo.java
@@ -16,9 +16,12 @@
*/
package org.apache.camel.component.gson;
+import java.util.Date;
+
public class TestPojo {
private String name;
+ private Date dob;
public String getName() {
return this.name;
@@ -28,6 +31,14 @@ public class TestPojo {
this.name = name;
}
+ public Date getDob() {
+ return this.dob;
+ }
+
+ public void setDob(Date dob) {
+ this.dob = dob;
+ }
+
@Override
public boolean equals(Object obj) {
return this.name.equals(((TestPojo) obj).getName());
diff --git
a/components/camel-gson/src/test/resources/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.xml
b/components/camel-gson/src/test/resources/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.xml
index cd0cebe79ec..650f3ea00ba 100644
---
a/components/camel-gson/src/test/resources/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.xml
+++
b/components/camel-gson/src/test/resources/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.xml
@@ -32,6 +32,7 @@
<!-- this one uses our own TestPojo class as unmarshal type -->
<json id="gson" library="Gson"
unmarshalType="org.apache.camel.component.gson.TestPojo"/>
<json id="pretty" library="Gson" prettyPrint="true"
unmarshalType="org.apache.camel.component.gson.TestPojo"/>
+ <json id="format_date" library="Gson"
dateFormatPattern="yyyy-MM-dd"
unmarshalType="org.apache.camel.component.gson.TestPojo"/>
</dataFormats>
<route>
@@ -56,6 +57,17 @@
<to uri="mock:reversePojo"/>
</route>
+ <route>
+ <from uri="direct:inFormatDate"/>
+ <marshal><custom ref="format_date"/></marshal>
+ </route>
+
+ <route>
+ <from uri="direct:backFormatDate"/>
+ <unmarshal><custom ref="format_date"/></unmarshal>
+ <to uri="mock:reversePojo"/>
+ </route>
+
</camelContext>
<!-- END SNIPPET: e1 -->
diff --git
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
index 099b83dd173..835968bdcf0 100644
---
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
+++
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
@@ -111,6 +111,9 @@ public class JsonDataFormat extends DataFormatDefinition
implements ContentTypeH
description = "Whether the data format should set the
Content-Type header with the type from the data format."
+ " For example application/xml for data formats
marshalling to XML, or application/json for data formats marshalling to JSON")
private String contentTypeHeader;
+ @XmlAttribute
+ @Metadata(description = "To configure the date format while marshall or
unmarshall Date fields in JSON using Gson")
+ private String dateFormatPattern;
public JsonDataFormat() {
super("json");
@@ -149,6 +152,7 @@ public class JsonDataFormat extends DataFormatDefinition
implements ContentTypeH
this.autoDiscoverSchemaResolver = builder.autoDiscoverSchemaResolver;
this.namingStrategy = builder.namingStrategy;
this.contentTypeHeader = builder.contentTypeHeader;
+ this.dateFormatPattern = builder.dateFormatPattern;
}
@Override
@@ -165,6 +169,14 @@ public class JsonDataFormat extends DataFormatDefinition
implements ContentTypeH
this.contentTypeHeader = contentTypeHeader;
}
+ public String getDateFormatPattern() {
+ return dateFormatPattern;
+ }
+
+ public void setDateFormatPattern(String dateFormatPattern) {
+ this.dateFormatPattern = dateFormatPattern;
+ }
+
public String getObjectMapper() {
return objectMapper;
}
@@ -668,17 +680,34 @@ public class JsonDataFormat extends DataFormatDefinition
implements ContentTypeH
private String autoDiscoverSchemaResolver;
private String namingStrategy;
private String contentTypeHeader;
+ private String dateFormatPattern;
+ /**
+ * Whether the data format should set the Content-Type header with the
type from the data format. For example
+ * application/xml for data formats marshalling to XML, or
application/json for data formats marshalling to JSON
+ */
public Builder contentTypeHeader(String contentTypeHeader) {
this.contentTypeHeader = contentTypeHeader;
return this;
}
+ /**
+ * Whether the data format should set the Content-Type header with the
type from the data format. For example
+ * application/xml for data formats marshalling to XML, or
application/json for data formats marshalling to JSON
+ */
public Builder contentTypeHeader(boolean contentTypeHeader) {
this.contentTypeHeader = Boolean.toString(contentTypeHeader);
return this;
}
+ /**
+ * To configure the date format while marshall or unmarshall Date
fields in JSON using Gson.
+ */
+ public Builder dateFormatPattern(String dateFormatPattern) {
+ this.dateFormatPattern = dateFormatPattern;
+ return this;
+ }
+
/**
* Lookup and use the existing ObjectMapper with the given id when
using Jackson.
*/
diff --git
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonDataFormatReifier.java
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonDataFormatReifier.java
index ed584fb3228..d6eb5829652 100644
---
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonDataFormatReifier.java
+++
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonDataFormatReifier.java
@@ -48,6 +48,7 @@ public class JsonDataFormatReifier extends
DataFormatReifier<JsonDataFormat> {
properties.put("unmarshalType", or(definition.getUnmarshalType(),
definition.getUnmarshalTypeName()));
}
properties.put("prettyPrint", definition.getPrettyPrint());
+ properties.put("dateFormatPattern", definition.getDateFormatPattern());
properties.put("include", definition.getInclude());
properties.put("allowJmsType", definition.getAllowJmsType());
if (definition.getLibrary() != JsonLibrary.XStream) {