You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by bv...@apache.org on 2015/04/02 20:03:53 UTC

camel git commit: CAMEL-7877: support the prettyPrint option by all the supported JSON libraries, that's XStream, Jackson and GSon.

Repository: camel
Updated Branches:
  refs/heads/master c8d23d327 -> 1e923eca2


CAMEL-7877: support the prettyPrint option by all the supported JSON libraries, that's XStream, Jackson and GSon.

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

Branch: refs/heads/master
Commit: 1e923eca2ce118be090231de7454b8793d1e5e54
Parents: c8d23d3
Author: Babak Vahdat <bv...@apache.org>
Authored: Thu Apr 2 20:03:33 2015 +0200
Committer: Babak Vahdat <bv...@apache.org>
Committed: Thu Apr 2 20:03:33 2015 +0200

----------------------------------------------------------------------
 .../apache/camel/builder/DataFormatClause.java  | 69 ++++++++++++++++++++
 .../camel/component/gson/GsonDataFormat.java    | 44 +++++++++++--
 .../gson/SpringGsonJsonDataFormatTest.java      | 22 +++++++
 .../gson/SpringGsonJsonDataFormatTest.xml       | 12 ++++
 .../jackson/JacksonJsonDataFormatTest.java      |  8 +--
 .../component/jackson/JacksonMarshalTest.java   |  4 +-
 .../SpringJacksonJsonDataFormatTest.java        |  2 +-
 .../jackson/SpringJacksonJsonDataFormatTest.xml |  2 +-
 .../dataformat/xstream/JsonDataFormat.java      | 21 ++++++
 .../dataformat/xstream/XStreamDataFormat.java   |  2 +-
 .../xstream/MarshalDomainObjectJSONTest.java    | 34 +++++++++-
 .../XStreamDataFormatDriverConfigTest.java      |  2 +-
 .../SpringMarshalDomainObjectJSONTest.xml       | 12 ++++
 13 files changed, 215 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java b/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java
index c0857a9..1a446c3 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java
@@ -361,6 +361,17 @@ public class DataFormatClause<T extends ProcessorDefinition<?>> {
     }
 
     /**
+     * Uses the JSON data format using the XStream json library with pretty-print option on or off
+     * 
+     * @param prettyPrint turn the pretty-print option on or off
+     */
+    public T json(boolean prettyPrint) {
+        JsonDataFormat json = new JsonDataFormat();
+        json.setPrettyPrint(prettyPrint);
+        return dataFormat(json);
+    }
+
+    /**
      * Uses the JSON data format
      *
      * @param library the json library to use
@@ -372,6 +383,18 @@ public class DataFormatClause<T extends ProcessorDefinition<?>> {
     /**
      * Uses the JSON data format
      *
+     * @param library     the json library to use
+     * @param prettyPrint turn the pretty-print option on or off
+     */
+    public T json(JsonLibrary library, boolean prettyPrint) {
+        JsonDataFormat json = new JsonDataFormat(library);
+        json.setPrettyPrint(prettyPrint);
+        return dataFormat(json);
+    }
+
+    /**
+     * Uses the JSON data format
+     *
      * @param type          the json type to use
      * @param unmarshalType unmarshal type for json jackson type
      */
@@ -382,6 +405,20 @@ public class DataFormatClause<T extends ProcessorDefinition<?>> {
     }
 
     /**
+     * Uses the JSON data format
+     *
+     * @param type          the json type to use
+     * @param unmarshalType unmarshal type for json jackson type
+     * @param prettyPrint   turn the pretty-print option on or off
+     */
+    public T json(JsonLibrary type, Class<?> unmarshalType, boolean prettyPrint) {
+        JsonDataFormat json = new JsonDataFormat(type);
+        json.setUnmarshalType(unmarshalType);
+        json.setPrettyPrint(prettyPrint);
+        return dataFormat(json);
+    }
+
+    /**
      * Uses the Jackson JSON data format
      *
      * @param unmarshalType unmarshal type for json jackson type
@@ -399,6 +436,21 @@ public class DataFormatClause<T extends ProcessorDefinition<?>> {
      *
      * @param unmarshalType unmarshal type for json jackson type
      * @param jsonView      the view type for json jackson type
+     * @param prettyPrint   turn the pretty-print option on or off
+     */
+    public T json(Class<?> unmarshalType, Class<?> jsonView, boolean prettyPrint) {
+        JsonDataFormat json = new JsonDataFormat(JsonLibrary.Jackson);
+        json.setUnmarshalType(unmarshalType);
+        json.setJsonView(jsonView);
+        json.setPrettyPrint(prettyPrint);
+        return dataFormat(json);
+    }
+
+    /**
+     * Uses the Jackson JSON data format
+     *
+     * @param unmarshalType unmarshal type for json jackson type
+     * @param jsonView      the view type for json jackson type
      * @param include       include such as <tt>ALWAYS</tt>, <tt>NON_NULL</tt>, etc.
      */
     public T json(Class<?> unmarshalType, Class<?> jsonView, String include) {
@@ -410,6 +462,23 @@ public class DataFormatClause<T extends ProcessorDefinition<?>> {
     }
 
     /**
+     * Uses the Jackson JSON data format
+     *
+     * @param unmarshalType unmarshal type for json jackson type
+     * @param jsonView      the view type for json jackson type
+     * @param include       include such as <tt>ALWAYS</tt>, <tt>NON_NULL</tt>, etc.
+      * @param prettyPrint  turn the pretty-print option on or off
+     */
+    public T json(Class<?> unmarshalType, Class<?> jsonView, String include, boolean prettyPrint) {
+        JsonDataFormat json = new JsonDataFormat(JsonLibrary.Jackson);
+        json.setUnmarshalType(unmarshalType);
+        json.setJsonView(jsonView);
+        json.setInclude(include);
+        json.setPrettyPrint(prettyPrint);
+        return dataFormat(json);
+    }
+
+    /**
      * Uses the protobuf data format
      */
     public T protobuf() {

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-gson/src/main/java/org/apache/camel/component/gson/GsonDataFormat.java
----------------------------------------------------------------------
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 f12ff71..92ca6b9 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
@@ -51,8 +51,8 @@ public class GsonDataFormat extends ServiceSupport implements DataFormat {
     private LongSerializationPolicy longSerializationPolicy;
     private FieldNamingPolicy fieldNamingPolicy;
     private FieldNamingStrategy fieldNamingStrategy;
-    private Boolean serializeNulls;
-    private Boolean prettyPrinting;
+    private boolean serializeNulls;
+    private boolean prettyPrint;
     private String dateFormatPattern;
 
     public GsonDataFormat() {
@@ -154,10 +154,10 @@ public class GsonDataFormat extends ServiceSupport implements DataFormat {
             if (fieldNamingStrategy != null) {
                 builder.setFieldNamingStrategy(fieldNamingStrategy);
             }
-            if (serializeNulls != null && serializeNulls) {
+            if (serializeNulls) {
                 builder.serializeNulls();
             }
-            if (prettyPrinting != null && prettyPrinting) {
+            if (prettyPrint) {
                 builder.setPrettyPrinting();
             }
             if (dateFormatPattern != null) {
@@ -223,20 +223,52 @@ public class GsonDataFormat extends ServiceSupport implements DataFormat {
         this.fieldNamingStrategy = fieldNamingStrategy;
     }
 
+    /**
+     * @deprecated use {@link #isSerializeNulls()} instead
+     */
+    @Deprecated
     public Boolean getSerializeNulls() {
         return serializeNulls;
     }
 
+    public boolean isSerializeNulls() {
+        return serializeNulls;
+    }
+
+    /**
+     * @deprecated use {@link #setSerializeNulls(boolean)} instead
+     */
+    @Deprecated
     public void setSerializeNulls(Boolean serializeNulls) {
         this.serializeNulls = serializeNulls;
     }
 
+    public void setSerializeNulls(boolean serializeNulls) {
+        this.serializeNulls = serializeNulls;
+    }
+
+    /**
+     * @deprecated use {@link #isPrettyPrint()} instead
+     */
+    @Deprecated
     public Boolean getPrettyPrinting() {
-        return prettyPrinting;
+        return prettyPrint;
+    }
+
+    public boolean isPrettyPrint() {
+        return prettyPrint;
     }
 
+    /**
+     * @deprecated use {@link #setPrettyPrint(boolean)} instead
+     */
+    @Deprecated
     public void setPrettyPrinting(Boolean prettyPrinting) {
-        this.prettyPrinting = prettyPrinting;
+        this.prettyPrint = prettyPrinting;
+    }
+
+    public void setPrettyPrint(boolean prettyPrint) {
+        this.prettyPrint = prettyPrint;
     }
 
     public String getDateFormatPattern() {

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-gson/src/test/java/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.java
----------------------------------------------------------------------
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 656d0c6..cece6fd 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
@@ -46,6 +46,28 @@ public class SpringGsonJsonDataFormatTest extends CamelSpringTestSupport {
         mock.assertIsSatisfied();
     }
 
+    @Test
+    public void testMarshalAndUnmarshalPojoWithPrettyPrint() throws Exception {
+        TestPojo in = new TestPojo();
+        in.setName("Camel");
+
+        MockEndpoint mock = getMockEndpoint("mock:reversePojo");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(TestPojo.class);
+        mock.message(0).body().equals(in);
+
+        Object marshalled = template.requestBody("direct:inPretty", in);
+        String marshalledAsString = context.getTypeConverter().convertTo(String.class, marshalled);
+        String expected = "{\n" + 
+                          "  \"name\": \"Camel\"" +
+                          "\n}";
+        assertEquals(expected, marshalledAsString);
+
+        template.sendBody("direct:backPretty", marshalled);
+
+        mock.assertIsSatisfied();
+    }
+
     @Override
     protected AbstractXmlApplicationContext createApplicationContext() {
         return new ClassPathXmlApplicationContext("org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.xml");

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-gson/src/test/resources/org/apache/camel/component/gson/SpringGsonJsonDataFormatTest.xml
----------------------------------------------------------------------
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 2111799..8064cb3 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
@@ -29,6 +29,7 @@
         <dataFormats>
             <!-- this one uses our own TestPojo class as unmarshal type -->
             <json id="gson" library="Gson" unmarshalTypeName="org.apache.camel.component.gson.TestPojo"/>
+            <json id="pretty" library="Gson" prettyPrint="true" unmarshalTypeName="org.apache.camel.component.gson.TestPojo"/>
         </dataFormats>
 
         <route>
@@ -42,6 +43,17 @@
             <to uri="mock:reversePojo"/>
         </route>
 
+        <route>
+            <from uri="direct:inPretty"/>
+            <marshal ref="pretty"/>
+        </route>
+
+        <route>
+            <from uri="direct:backPretty"/>
+            <unmarshal ref="pretty"/>
+            <to uri="mock:reversePojo"/>
+        </route>
+
     </camelContext>
     <!-- END SNIPPET: e1 -->
 

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonJsonDataFormatTest.java
----------------------------------------------------------------------
diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonJsonDataFormatTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonJsonDataFormatTest.java
index dfaa3ce..1555367 100644
--- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonJsonDataFormatTest.java
+++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonJsonDataFormatTest.java
@@ -29,12 +29,8 @@ public class JacksonJsonDataFormatTest extends JacksonMarshalTest {
                 from("direct:in").marshal().json(JsonLibrary.Jackson);
                 from("direct:back").unmarshal().json(JsonLibrary.Jackson).to("mock:reverse");
 
-                // no possible usage of the json() DSL method here as there's no prettyPrint option available through it
-                JacksonDataFormat prettyPrintDataFormat = new JacksonDataFormat();
-                prettyPrintDataFormat.setPrettyPrint(true);
-
-                from("direct:pretty").marshal(prettyPrintDataFormat);
-                from("direct:backPretty").unmarshal(prettyPrintDataFormat).to("mock:reverse");
+                from("direct:inPretty").marshal().json(JsonLibrary.Jackson, true);
+                from("direct:backPretty").unmarshal().json(JsonLibrary.Jackson).to("mock:reverse");
 
                 from("direct:inPojo").marshal().json(JsonLibrary.Jackson);
                 from("direct:backPojo").unmarshal().json(JsonLibrary.Jackson, TestPojo.class).to("mock:reversePojo");

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalTest.java
----------------------------------------------------------------------
diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalTest.java
index bb7d0f5..95b8220 100644
--- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalTest.java
+++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalTest.java
@@ -55,7 +55,7 @@ public class JacksonMarshalTest extends CamelTestSupport {
         mock.message(0).body().isInstanceOf(Map.class);
         mock.message(0).body().equals(in);
 
-        Object marshalled = template.requestBody("direct:pretty", in);
+        Object marshalled = template.requestBody("direct:inPretty", in);
         String marshalledAsString = context.getTypeConverter().convertTo(String.class, marshalled);
         String expected = String.format("{%s  \"name\" : \"Camel\"%s}", System.lineSeparator(), System.lineSeparator());
         assertEquals(expected, marshalledAsString);
@@ -99,7 +99,7 @@ public class JacksonMarshalTest extends CamelTestSupport {
                 JacksonDataFormat prettyPrintDataFormat = new JacksonDataFormat();
                 prettyPrintDataFormat.setPrettyPrint(true);
 
-                from("direct:pretty").marshal(prettyPrintDataFormat);
+                from("direct:inPretty").marshal(prettyPrintDataFormat);
                 from("direct:backPretty").unmarshal(prettyPrintDataFormat).to("mock:reverse");
 
                 JacksonDataFormat formatPojo = new JacksonDataFormat(TestPojo.class);

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.java
----------------------------------------------------------------------
diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.java
index bfa13ac..b1ef3ad 100644
--- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.java
+++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.java
@@ -59,7 +59,7 @@ public class SpringJacksonJsonDataFormatTest extends CamelSpringTestSupport {
         mock.message(0).body().isInstanceOf(Map.class);
         mock.message(0).body().equals(in);
 
-        Object marshalled = template.requestBody("direct:pretty", in);
+        Object marshalled = template.requestBody("direct:inPretty", in);
         String marshalledAsString = context.getTypeConverter().convertTo(String.class, marshalled);
         String expected = String.format("{%s  \"name\" : \"Camel\"%s}", System.lineSeparator(), System.lineSeparator());
         assertEquals(expected, marshalledAsString);

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-jackson/src/test/resources/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-jackson/src/test/resources/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.xml b/components/camel-jackson/src/test/resources/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.xml
index 61bd1a0..6849b95 100644
--- a/components/camel-jackson/src/test/resources/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.xml
+++ b/components/camel-jackson/src/test/resources/org/apache/camel/component/jackson/SpringJacksonJsonDataFormatTest.xml
@@ -42,7 +42,7 @@
         </route>
 
         <route>
-            <from uri="direct:pretty"/>
+            <from uri="direct:inPretty"/>
             <marshal ref="pretty"/>
         </route>
 

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/JsonDataFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/JsonDataFormat.java b/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/JsonDataFormat.java
index 7f6d714..bbf96b7 100644
--- a/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/JsonDataFormat.java
+++ b/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/JsonDataFormat.java
@@ -18,6 +18,8 @@ package org.apache.camel.dataformat.xstream;
 
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -26,6 +28,7 @@ import javax.xml.stream.XMLStreamException;
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.io.HierarchicalStreamReader;
 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.io.json.JsonWriter;
 import com.thoughtworks.xstream.io.xml.QNameMap;
 import com.thoughtworks.xstream.io.xml.StaxReader;
 import com.thoughtworks.xstream.io.xml.StaxWriter;
@@ -45,6 +48,7 @@ import org.codehaus.jettison.mapped.MappedXMLOutputFactory;
 public class JsonDataFormat extends AbstractXStreamWrapper {
     private final MappedXMLOutputFactory mof;
     private final MappedXMLInputFactory mif;
+    private boolean prettyPrint;
 
     public JsonDataFormat() {
         final Map<?, ?> nstjsons = new HashMap<Object, Object>();
@@ -52,6 +56,14 @@ public class JsonDataFormat extends AbstractXStreamWrapper {
         mif = new MappedXMLInputFactory(nstjsons);
     }
 
+    public boolean isPrettyPrint() {
+        return prettyPrint;
+    }
+
+    public void setPrettyPrint(boolean prettyPrint) {
+        this.prettyPrint = prettyPrint;
+    }
+
     @Override
     protected XStream createXStream(ClassResolver resolver, ClassLoader classLoader) {
         XStream xs = super.createXStream(resolver, classLoader);
@@ -64,6 +76,15 @@ public class JsonDataFormat extends AbstractXStreamWrapper {
     }
 
     protected HierarchicalStreamWriter createHierarchicalStreamWriter(Exchange exchange, Object body, OutputStream stream) throws XMLStreamException {
+        if (isPrettyPrint()) {
+            try {
+                // the json spec. expects UTF-8 as the default encoding
+                return new JsonWriter(new OutputStreamWriter(stream, "UTF-8"));
+            } catch (UnsupportedEncodingException uee) {
+                throw new XMLStreamException(uee);
+            }
+        }
+
         return new StaxWriter(new QNameMap(), mof.createXMLStreamWriter(stream));
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/XStreamDataFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/XStreamDataFormat.java b/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/XStreamDataFormat.java
index 1ae7c34..ca8a945 100644
--- a/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/XStreamDataFormat.java
+++ b/components/camel-xstream/src/main/java/org/apache/camel/dataformat/xstream/XStreamDataFormat.java
@@ -42,7 +42,7 @@ import org.apache.camel.util.IOHelper;
  * @version 
  */
 public class XStreamDataFormat extends AbstractXStreamWrapper  {
-    String encoding;
+    private String encoding;
     
     public XStreamDataFormat() {
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/MarshalDomainObjectJSONTest.java
----------------------------------------------------------------------
diff --git a/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/MarshalDomainObjectJSONTest.java b/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/MarshalDomainObjectJSONTest.java
index 3c5da94..6c3cdac 100644
--- a/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/MarshalDomainObjectJSONTest.java
+++ b/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/MarshalDomainObjectJSONTest.java
@@ -17,18 +17,50 @@
 package org.apache.camel.dataformat.xstream;
 
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
 
 public class MarshalDomainObjectJSONTest extends MarshalDomainObjectTest {
     
+    @Test
+    public void testMarshalAndUnmarshalWithPrettyPrint() throws Exception {
+        PurchaseOrder order = new PurchaseOrder();
+        order.setName("pretty printed Camel");
+        order.setAmount(1);
+        order.setPrice(7.91);
+
+        MockEndpoint mock = getMockEndpoint("mock:reverse");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(PurchaseOrder.class);
+        mock.message(0).body().equals(order);
+
+        Object marshalled = template.requestBody("direct:inPretty", order);
+        String marshalledAsString = context.getTypeConverter().convertTo(String.class, marshalled);
+        // the line-separator used by JsonWriter is "\n", even on windows
+        String expected = "{\"org.apache.camel.dataformat.xstream.PurchaseOrder\": {\n" +
+                          "  \"name\": \"pretty printed Camel\",\n"+
+                          "  \"price\": 7.91,\n" +
+                          "  \"amount\": 1.0\n" +
+                          "}}";
+        assertEquals(expected, marshalledAsString);
+
+        template.sendBody("direct:backPretty", marshalled);
+
+        mock.assertIsSatisfied();
+    }
+
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
                 from("direct:in").marshal().json().to("mock:result");
 
-                // just used for helping to marhsal
+                // just used for helping to marshal
                 from("direct:marshal").marshal().json();
 
                 from("direct:reverse").unmarshal().json().to("mock:reverse");
+
+                from("direct:inPretty").marshal().json(true);
+                from("direct:backPretty").unmarshal().json().to("mock:reverse");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/XStreamDataFormatDriverConfigTest.java
----------------------------------------------------------------------
diff --git a/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/XStreamDataFormatDriverConfigTest.java b/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/XStreamDataFormatDriverConfigTest.java
index d4777fb..c3e44fe 100644
--- a/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/XStreamDataFormatDriverConfigTest.java
+++ b/components/camel-xstream/src/test/java/org/apache/camel/dataformat/xstream/XStreamDataFormatDriverConfigTest.java
@@ -32,7 +32,7 @@ public class XStreamDataFormatDriverConfigTest extends CamelTestSupport {
         XStreamDataFormat xStreamDataFormat = new XStreamDataFormat();
         xStreamDataFormat.setXstreamDriver(new JsonHierarchicalStreamDriver());
 
-        XStream xStream = xStreamDataFormat.createXStream(new DefaultClassResolver());
+        XStream xStream = xStreamDataFormat.createXStream(context.getClassResolver(), context.getApplicationContextClassLoader());
         String marshalledOrder = xStream.toXML(purchaseOrder);
 
         assertEquals("{", marshalledOrder.substring(0, 1));

http://git-wip-us.apache.org/repos/asf/camel/blob/1e923eca/components/camel-xstream/src/test/resources/org/apache/camel/dataformat/xstream/SpringMarshalDomainObjectJSONTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-xstream/src/test/resources/org/apache/camel/dataformat/xstream/SpringMarshalDomainObjectJSONTest.xml b/components/camel-xstream/src/test/resources/org/apache/camel/dataformat/xstream/SpringMarshalDomainObjectJSONTest.xml
index 0e9f7e4..d44d587 100644
--- a/components/camel-xstream/src/test/resources/org/apache/camel/dataformat/xstream/SpringMarshalDomainObjectJSONTest.xml
+++ b/components/camel-xstream/src/test/resources/org/apache/camel/dataformat/xstream/SpringMarshalDomainObjectJSONTest.xml
@@ -28,6 +28,7 @@
         <!-- we define the json xstream data formats to be used (xstream is default) -->
         <dataFormats>
             <json id="json"/>
+            <json id="pretty" prettyPrint="true"/>
         </dataFormats>
 
         <route>
@@ -47,6 +48,17 @@
             <to uri="mock:reverse"/>
         </route>
 
+        <route>
+            <from uri="direct:inPretty"/>
+            <marshal ref="pretty"/>
+        </route>
+
+        <route>
+            <from uri="direct:backPretty"/>
+            <unmarshal ref="pretty"/>
+            <to uri="mock:reverse"/>
+        </route>
+
     </camelContext>
     <!-- END SNIPPET: e1 -->