Author: mrdon
Date: Sat Nov 3 04:32:28 2007
New Revision: 591601
URL: http://svn.apache.org/viewvc?rev=591601&view=rev
Log:
Changing json handler to use json-lib over xstream for cleaner output
Added:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/JsonLibHandler.java
- copied, changed from r589075,
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamJsonHandler.java
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/Contact.java
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/JsonLibHandlerTest.java
Removed:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamJsonHandler.java
Modified:
struts/sandbox/trunk/struts2-rest-plugin/pom.xml
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeInterceptor.java
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/ContentTypeHandler.java
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/HtmlHandler.java
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java
struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java
Modified: struts/sandbox/trunk/struts2-rest-plugin/pom.xml
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/pom.xml?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-rest-plugin/pom.xml (original)
+++ struts/sandbox/trunk/struts2-rest-plugin/pom.xml Sat Nov 3 04:32:28 2007
@@ -24,14 +24,10 @@
<version>1.2.2</version>
</dependency>
<dependency>
- <groupId>org.codehaus.jettison</groupId>
- <artifactId>jettison</artifactId>
- <version>1.0-RC1</version>
- </dependency>
- <dependency>
- <groupId>stax</groupId>
- <artifactId>stax-api</artifactId>
- <version>1.0.1</version>
+ <groupId>net.sf.json-lib</groupId>
+ <artifactId>json-lib</artifactId>
+ <classifier>jdk15</classifier>
+ <version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
@@ -56,6 +52,13 @@
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
+ <version>1.2.8</version>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
<version>1.2.8</version>
<optional>true</optional>
</dependency>
Modified:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java
Sat Nov 3 04:32:28 2007
@@ -33,6 +33,7 @@
import static javax.servlet.http.HttpServletResponse.SC_OK;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@@ -132,13 +133,14 @@
if (actionConfig.getResults().get(extCode) != null) {
resultCode = extCode;
} else {
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
-
- resultCode = handler.fromObject(target, resultCode, bout);
- if (bout.size() > 0) {
- res.setContentLength(bout.size());
+ StringWriter writer = new StringWriter();
+ resultCode = handler.fromObject(target, resultCode, writer);
+ String text = writer.toString();
+ if (text.length() > 0) {
+ byte[] data = text.getBytes("UTF-8");
+ res.setContentLength(data.length);
res.setContentType(handler.getContentType());
- res.getOutputStream().write(bout.toByteArray());
+ res.getOutputStream().write(data);
res.getOutputStream().close();
}
}
Modified:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeInterceptor.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeInterceptor.java?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeInterceptor.java
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeInterceptor.java
Sat Nov 3 04:32:28 2007
@@ -57,7 +57,7 @@
}
if (request.getContentLength() > 0) {
- handler.toObject(request.getInputStream(), target);
+ handler.toObject(request.getReader(), target);
}
return invocation.invoke();
}
Modified:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java
Sat Nov 3 04:32:28 2007
@@ -157,7 +157,7 @@
}
/**
- * Intercept [EMAIL PROTECTED] ActionInvocation} and processes the
errors using the [EMAIL PROTECTED] ContentTypeHandler}
+ * Intercept [EMAIL PROTECTED] ActionInvocation} and processes the
errors using the [EMAIL PROTECTED]
org.apache.struts2.rest.handler.ContentTypeHandler}
* appropriate for the request.
*
* @return String result name
Modified:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/ContentTypeHandler.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/ContentTypeHandler.java?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/ContentTypeHandler.java
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/ContentTypeHandler.java
Sat Nov 3 04:32:28 2007
@@ -20,9 +20,7 @@
*/
package org.apache.struts2.rest.handler;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.*;
import com.opensymphony.xwork2.ActionInvocation;
@@ -36,7 +34,7 @@
* @param in The input stream, usually the body of the request
* @param target The target, usually the action class
*/
- void toObject(InputStream in, Object target);
+ void toObject(Reader in, Object target) throws IOException;
/**
* Writes content to the stream
@@ -47,7 +45,7 @@
* @return The new result code
* @throws IOException If unable to write to the output stream
*/
- String fromObject(Object obj, String resultCode, OutputStream stream)
throws IOException;
+ String fromObject(Object obj, String resultCode, Writer stream) throws
IOException;
/**
* Gets the content type for this handler
Modified:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/HtmlHandler.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/HtmlHandler.java?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/HtmlHandler.java
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/HtmlHandler.java
Sat Nov 3 04:32:28 2007
@@ -21,23 +21,19 @@
package org.apache.struts2.rest.handler;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Collections;
-
-import com.opensymphony.xwork2.Action;
-import com.opensymphony.xwork2.ActionInvocation;
+import java.io.Reader;
+import java.io.Writer;
/**
* Handles HTML content, usually just a simple passthrough to the framework
*/
public class HtmlHandler implements ContentTypeHandler {
- public String fromObject(Object obj, String resultCode, OutputStream out)
throws IOException {
+ public String fromObject(Object obj, String resultCode, Writer out) throws
IOException {
return resultCode;
}
- public void toObject(InputStream in, Object target) {
+ public void toObject(Reader in, Object target) {
}
public String getExtension() {
Copied:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/JsonLibHandler.java
(from r589075,
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamJsonHandler.java)
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/JsonLibHandler.java?p2=struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/JsonLibHandler.java&p1=struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamJsonHandler.java&r1=589075&r2=591601&rev=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamJsonHandler.java
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/JsonLibHandler.java
Sat Nov 3 04:32:28 2007
@@ -20,20 +20,37 @@
*/
package org.apache.struts2.rest.handler;
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
+import java.io.*;
+
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
/**
- * Handles JSON content using XStream
+ * Handles JSON content using json-lib
*/
-public class XStreamJsonHandler extends XStreamHandler {
+public class JsonLibHandler implements ContentTypeHandler {
+
+ public void toObject(Reader in, Object target) throws IOException {
+ StringBuilder sb = new StringBuilder();
+ char[] buffer = new char[1024];
+ int len = 0;
+ while ((len = in.read(buffer)) > 0) {
+ sb.append(buffer, 0, len);
+ }
+ JSONObject jsonObject = JSONObject.fromObject(sb.toString());
+ JSONObject.toBean(jsonObject, target, new JsonConfig());
+ }
+
+ public String fromObject(Object obj, String resultCode, Writer stream)
throws IOException {
+ if (obj != null) {
+ JSONObject jsonObject = JSONObject.fromObject(obj);
+ stream.write(jsonObject.toString());
+ }
+ return null;
+
- @Override
- protected XStream createXStream() {
- return new XStream(new JettisonMappedXmlDriver());
}
- @Override
public String getContentType() {
return "text/javascript";
}
Modified:
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java
Sat Nov 3 04:32:28 2007
@@ -21,8 +21,8 @@
package org.apache.struts2.rest.handler;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
import com.thoughtworks.xstream.XStream;
@@ -31,7 +31,7 @@
*/
public class XStreamHandler implements ContentTypeHandler {
- public String fromObject(Object obj, String resultCode, OutputStream out)
throws IOException {
+ public String fromObject(Object obj, String resultCode, Writer out) throws
IOException {
if (obj != null) {
XStream xstream = createXStream();
xstream.toXML(obj, out);
@@ -39,7 +39,7 @@
return null;
}
- public void toObject(InputStream in, Object target) {
+ public void toObject(Reader in, Object target) {
XStream xstream = createXStream();
xstream.fromXML(in, target);
}
Modified:
struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml
Sat Nov 3 04:32:28 2007
@@ -14,7 +14,7 @@
<bean class="org.apache.struts2.rest.ContentTypeHandlerManager" />
<bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="xml"
class="org.apache.struts2.rest.handler.XStreamHandler" />
- <bean type="org.apache.struts2.rest.handler.ContentTypeHandler"
name="json" class="org.apache.struts2.rest.handler.XStreamJsonHandler" />
+ <bean type="org.apache.struts2.rest.handler.ContentTypeHandler"
name="json" class="org.apache.struts2.rest.handler.JsonLibHandler" />
<bean type="org.apache.struts2.rest.handler.ContentTypeHandler"
name="html" class="org.apache.struts2.rest.handler.HtmlHandler" />
<constant name="struts.actionProxyFactory" value="rest" />
Modified:
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java?rev=591601&r1=591600&r2=591601&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java
(original)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java
Sat Nov 3 04:32:28 2007
@@ -34,8 +34,8 @@
import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
@@ -69,9 +69,9 @@
String obj = "mystring";
ContentTypeHandler handler = new ContentTypeHandler() {
- public void toObject(InputStream in, Object target) {}
- public String fromObject(Object obj, String resultCode,
OutputStream stream) throws IOException {
- stream.write(obj.toString().getBytes());
+ public void toObject(Reader in, Object target) {}
+ public String fromObject(Object obj, String resultCode, Writer
stream) throws IOException {
+ stream.write(obj.toString());
return resultCode;
}
public String getContentType() { return "foo"; }
Added:
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/Contact.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/Contact.java?rev=591601&view=auto
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/Contact.java
(added)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/Contact.java
Sat Nov 3 04:32:28 2007
@@ -0,0 +1,91 @@
+/*
+ * $Id: Restful2ActionMapper.java 540819 2007-05-23 02:48:36Z mrdon $
+ *
+ * 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 java.util.HashMap;
+
+public class Contact {
+ private String name;
+ private boolean important;
+ private int age;
+
+ public Contact() {}
+
+ public Contact(String name, boolean important, int age) {
+ this.name = name;
+ this.important = important;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public boolean isImportant() {
+ return important;
+ }
+
+ public void setImportant(boolean important) {
+ this.important = important;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Contact contact = (Contact) o;
+
+ if (age != contact.age) return false;
+ if (important != contact.important) return false;
+ if (name != null ? !name.equals(contact.name) : contact.name != null)
return false;
+
+ return true;
+ }
+
+ public String toString() {
+ HashMap map = new HashMap();
+ map.put("age", age);
+ map.put("important", important);
+ map.put("name", name);
+ return map.toString();
+ }
+
+ public int hashCode() {
+ int result;
+ result = (name != null ? name.hashCode() : 0);
+ result = 31 * result + (important ? 1 : 0);
+ result = 31 * result + age;
+ return result;
+ }
+}
Added:
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/JsonLibHandlerTest.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/JsonLibHandlerTest.java?rev=591601&view=auto
==============================================================================
---
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/JsonLibHandlerTest.java
(added)
+++
struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/handler/JsonLibHandlerTest.java
Sat Nov 3 04:32:28 2007
@@ -0,0 +1,51 @@
+/*
+ * $Id: Restful2ActionMapper.java 540819 2007-05-23 02:48:36Z mrdon $
+ *
+ * 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.StringWriter;
+import java.io.IOException;
+import java.io.StringReader;
+
+public class JsonLibHandlerTest extends TestCase {
+
+ public void testFromObject() throws IOException {
+ Contact contact = new Contact("bob", true, 44);
+
+ StringWriter writer = new StringWriter();
+ JsonLibHandler handler = new JsonLibHandler();
+ handler.fromObject(contact, "success", writer);
+
+ assertEquals("{\"age\":44,\"important\":true,\"name\":\"bob\"}",
writer.toString());
+ }
+
+ 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\"}");
+ JsonLibHandler handler = new JsonLibHandler();
+ handler.toObject(reader, target);
+
+ assertEquals(contact, target);
+ }
+}