Author: jogep
Date: Fri Nov 18 18:02:03 2011
New Revision: 1203772

URL: http://svn.apache.org/viewvc?rev=1203772&view=rev
Log:
WW-3629: Provide a JSON Content Handler based on Jackson Lib

Added:
    
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonLibHandler.java
    
struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonLibHandlerTest.java
Modified:
    struts/struts2/trunk/plugins/rest/pom.xml

Modified: struts/struts2/trunk/plugins/rest/pom.xml
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/pom.xml?rev=1203772&r1=1203771&r2=1203772&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/rest/pom.xml (original)
+++ struts/struts2/trunk/plugins/rest/pom.xml Fri Nov 18 18:02:03 2011
@@ -21,17 +21,22 @@
  * under the License.
  */
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
     <modelVersion>4.0.0</modelVersion>
-       <parent>
+    <parent>
         <groupId>org.apache.struts</groupId>
         <artifactId>struts2-plugins</artifactId>
         <version>2.3.1-SNAPSHOT</version>
     </parent>
-   <groupId>org.apache.struts</groupId>
-   <artifactId>struts2-rest-plugin</artifactId>
-   <version>2.3.1-SNAPSHOT</version>
-   <name>Struts 2 REST Plugin</name>
+    <groupId>org.apache.struts</groupId>
+    <artifactId>struts2-rest-plugin</artifactId>
+    <version>2.3.1-SNAPSHOT</version>
+    <name>Struts 2 REST Plugin</name>
+
+    <properties>
+        <jackson.version>1.9.2</jackson.version>
+    </properties>
 
     <dependencies>
         <dependency>
@@ -44,6 +49,16 @@
             <classifier>jdk15</classifier>
         </dependency>
         <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-core-asl</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-mapper-asl</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>
             <scope>provided</scope>
@@ -66,7 +81,7 @@
             <optional>true</optional>
         </dependency>
 
-       <dependency>
+        <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-core</artifactId>
             <optional>true</optional>

Added: 
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonLibHandler.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonLibHandler.java?rev=1203772&view=auto
==============================================================================
--- 
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonLibHandler.java
 (added)
+++ 
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonLibHandler.java
 Fri Nov 18 18:02:03 2011
@@ -0,0 +1,68 @@
+/*
+ * $Id: JsonLibHandler.java 1097172 2011-04-27 16:36:54Z jogep $
+ *
+ * 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.struts2.rest.handler;
+
+import com.opensymphony.xwork2.inject.Inject;
+import org.apache.struts2.StrutsConstants;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.ObjectReader;
+import org.codehaus.jackson.map.SerializationConfig.Feature;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+/**
+ * Handles JSON content using jackson-lib
+ */
+public class JacksonLibHandler implements ContentTypeHandler {
+
+    private static final String DEFAULT_CONTENT_TYPE = "application/json";
+    private String defaultEncoding = "ISO-8859-1";
+    private ObjectMapper mapper = new ObjectMapper();
+
+    public void toObject(Reader in, Object target) throws IOException {
+
+        mapper.configure(Feature.WRITE_NULL_MAP_VALUES, false);
+        ObjectReader or = mapper.readerForUpdating(target);
+        or.readValue(in); //, new TypeReference<clazz>);
+    }
+
+    public String fromObject(Object obj, String resultCode, Writer stream) 
throws IOException {
+        mapper.configure(Feature.WRITE_NULL_MAP_VALUES, false);
+        mapper.writeValue(stream, obj);
+        return null;
+    }
+
+    public String getContentType() {
+        return DEFAULT_CONTENT_TYPE + ";charset=" + this.defaultEncoding;
+    }
+
+    public String getExtension() {
+        return "json";
+    }
+
+    @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
+    public void setDefaultEncoding(String val) {
+        this.defaultEncoding = val;
+    }
+}

Added: 
struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonLibHandlerTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonLibHandlerTest.java?rev=1203772&view=auto
==============================================================================
--- 
struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonLibHandlerTest.java
 (added)
+++ 
struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonLibHandlerTest.java
 Fri Nov 18 18:02:03 2011
@@ -0,0 +1,95 @@
+/*
+ * $Id: JsonLibHandlerTest.java 1097172 2011-04-27 16:36:54Z jogep $
+ *
+ * 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.struts2.rest.handler;
+
+import junit.framework.TestCase;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class JacksonLibHandlerTest extends TestCase {
+
+    public void testFromObject() throws IOException {
+        Contact contact = new Contact("bob", true, 44);
+
+        StringWriter writer = new StringWriter();
+        JacksonLibHandler handler = new JacksonLibHandler();
+        handler.fromObject(contact, "success", writer);
+        String data = writer.toString();
+        assertTrue(data.startsWith("{"));
+        assertTrue(data.contains("\"age\":44"));
+        assertTrue(data.contains("\"important\":true"));
+        assertTrue(data.contains("\"name\":\"bob\""));
+    }
+
+    public void testFromObjectArray() throws IOException {
+        Contact contact = new Contact("bob", true, 44);
+
+        StringWriter writer = new StringWriter();
+        JacksonLibHandler handler = new JacksonLibHandler();
+        handler.fromObject(Arrays.asList(contact), "success", writer);
+
+        String data = writer.toString();
+        assertTrue(data.startsWith("[{"));
+        assertTrue(data.contains("\"age\":44"));
+        assertTrue(data.contains("\"important\":true"));
+        assertTrue(data.contains("\"name\":\"bob\""));
+    }
+
+    public void testToObject() throws IOException {
+        Contact contact = new Contact("bob", true, 44);
+
+        Contact target = new Contact();
+        StringReader reader = new 
StringReader("{\"age\":44,\"important\":true,\"name\":\"bob\"}");
+        JacksonLibHandler handler = new JacksonLibHandler();
+        handler.toObject(reader, target);
+        assertEquals(contact, target);
+    }
+
+    public void testToObjectList() throws IOException {
+
+        List<Contact> source = new ArrayList<Contact>();
+        source.add(new Contact("bob", true, 44));
+        source.add(new Contact("john", false, 33));
+
+        List<Contact> target = new ArrayList<Contact>();
+        StringReader reader = new 
StringReader("[{\"age\":44,\"important\":true,\"name\":\"bob\"},{\"age\":33,\"important\":false,\"name\":\"john\"}]");
+        JacksonLibHandler handler = new JacksonLibHandler();
+        handler.toObject(reader, target);
+        assertEquals(source.size(), target.size());
+    }
+
+    public void testContentType() throws IOException {
+        JacksonLibHandler handler = new JacksonLibHandler();
+        assertEquals(handler.getContentType(), 
"application/json;charset=ISO-8859-1");
+    }
+
+    public void testDefaultEncoding() throws IOException {
+        JacksonLibHandler handler = new JacksonLibHandler();
+        handler.setDefaultEncoding("UTF-8");
+        assertEquals(handler.getContentType(), 
"application/json;charset=UTF-8");
+    }
+}


Reply via email to