You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wink.apache.org by bl...@apache.org on 2009/09/01 22:45:20 UTC

svn commit: r810226 - in /incubator/wink/trunk: wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/ wink-common/src/main/resources/META-INF/core/ wink-common/src/main/resources/org/apache/wink/common/internal/i18n/ wink-ser...

Author: bluk
Date: Tue Sep  1 20:45:19 2009
New Revision: 810226

URL: http://svn.apache.org/viewvc?rev=810226&view=rev
Log:
Add JSON read/write capabilities with JSONArray

- Add feature to directly read JSONObjects
- Add feature to read/write JSONArrays
- Removed extend AbstractJAXBProvider from JSONProvider
  since it wasn't needed

Added:
    incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonArrayProvider.java
      - copied, changed from r810125, incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java
Modified:
    incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java
    incubator/wink/trunk/wink-common/src/main/resources/META-INF/core/wink-providers
    incubator/wink/trunk/wink-common/src/main/resources/org/apache/wink/common/internal/i18n/resource.properties
    incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/providers/entity/JsonProviderTest.java

Copied: incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonArrayProvider.java (from r810125, incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java)
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonArrayProvider.java?p2=incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonArrayProvider.java&p1=incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java&r1=810125&r2=810226&rev=810226&view=diff
==============================================================================
--- incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java (original)
+++ incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonArrayProvider.java Tue Sep  1 20:45:19 2009
@@ -17,15 +17,16 @@
  *  under the License.
  *  
  *******************************************************************************/
-
 package org.apache.wink.common.internal.providers.entity.json;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
@@ -33,29 +34,32 @@
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.MessageBodyWriter;
 import javax.ws.rs.ext.Provider;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.wink.common.RestConstants;
 import org.apache.wink.common.internal.i18n.Messages;
-import org.apache.wink.common.internal.providers.entity.xml.AbstractJAXBProvider;
 import org.apache.wink.common.internal.utils.MediaTypeUtils;
 import org.apache.wink.common.utils.ProviderUtils;
-import org.json.JSONObject;
+import org.json.JSONArray;
 import org.json.JSONException;
+import org.json.JSONTokener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Provider
+@Consumes( {MediaType.APPLICATION_JSON, MediaTypeUtils.JAVASCRIPT})
 @Produces( {MediaType.APPLICATION_JSON, MediaTypeUtils.JAVASCRIPT})
-public class JsonProvider extends AbstractJAXBProvider implements MessageBodyWriter<JSONObject> {
+public class JsonArrayProvider implements MessageBodyWriter<JSONArray>,
+    MessageBodyReader<JSONArray> {
 
     private static final Logger logger = LoggerFactory.getLogger(JsonProvider.class);
 
     @Context
     private UriInfo             uriInfo;
 
-    public long getSize(JSONObject t,
+    public long getSize(JSONArray t,
                         Class<?> type,
                         Type genericType,
                         Annotation[] annotations,
@@ -67,10 +71,10 @@
                                Type genericType,
                                Annotation[] annotations,
                                MediaType mediaType) {
-        return type == JSONObject.class;
+        return type == JSONArray.class;
     }
 
-    public void writeTo(JSONObject t,
+    public void writeTo(JSONArray t,
                         Class<?> type,
                         Type genericType,
                         Annotation[] annotations,
@@ -81,7 +85,7 @@
         try {
             jsonString = t.toString(2);
         } catch (JSONException e) {
-            logger.error(Messages.getMessage("jsonFailWriteJSONObject"));
+            logger.error(Messages.getMessage("jsonFailWriteJSONArray"));
             throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
 
@@ -100,4 +104,26 @@
         writer.flush();
     }
 
+    public boolean isReadable(Class<?> type,
+                              Type genericType,
+                              Annotation[] annotations,
+                              MediaType mediaType) {
+        return type == JSONArray.class;
+    }
+
+    public JSONArray readFrom(Class<JSONArray> type,
+                              Type genericType,
+                              Annotation[] annotations,
+                              MediaType mediaType,
+                              MultivaluedMap<String, String> httpHeaders,
+                              InputStream entityStream) throws IOException, WebApplicationException {
+        try {
+            return new JSONArray(new JSONTokener(ProviderUtils
+                .createReader(entityStream, mediaType)));
+        } catch (JSONException e) {
+            logger.error(Messages.getMessage("jsonFailReadJSONArray"));
+            throw new WebApplicationException(e, Response.Status.BAD_REQUEST);
+        }
+    }
+
 }

Modified: incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java?rev=810226&r1=810225&r2=810226&view=diff
==============================================================================
--- incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java (original)
+++ incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/providers/entity/json/JsonProvider.java Tue Sep  1 20:45:19 2009
@@ -21,11 +21,13 @@
 package org.apache.wink.common.internal.providers.entity.json;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
@@ -33,22 +35,25 @@
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.MessageBodyWriter;
 import javax.ws.rs.ext.Provider;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.wink.common.RestConstants;
 import org.apache.wink.common.internal.i18n.Messages;
-import org.apache.wink.common.internal.providers.entity.xml.AbstractJAXBProvider;
 import org.apache.wink.common.internal.utils.MediaTypeUtils;
 import org.apache.wink.common.utils.ProviderUtils;
-import org.json.JSONObject;
 import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Provider
+@Consumes( {MediaType.APPLICATION_JSON, MediaTypeUtils.JAVASCRIPT})
 @Produces( {MediaType.APPLICATION_JSON, MediaTypeUtils.JAVASCRIPT})
-public class JsonProvider extends AbstractJAXBProvider implements MessageBodyWriter<JSONObject> {
+public class JsonProvider implements MessageBodyWriter<JSONObject>,
+    MessageBodyReader<JSONObject> {
 
     private static final Logger logger = LoggerFactory.getLogger(JsonProvider.class);
 
@@ -100,4 +105,27 @@
         writer.flush();
     }
 
+    public boolean isReadable(Class<?> type,
+                              Type genericType,
+                              Annotation[] annotations,
+                              MediaType mediaType) {
+        return type == JSONObject.class;
+    }
+
+    public JSONObject readFrom(Class<JSONObject> type,
+                               Type genericType,
+                               Annotation[] annotations,
+                               MediaType mediaType,
+                               MultivaluedMap<String, String> httpHeaders,
+                               InputStream entityStream) throws IOException,
+        WebApplicationException {
+        try {
+            return new JSONObject(new JSONTokener(ProviderUtils.createReader(entityStream,
+                                                                             mediaType)));
+        } catch (JSONException e) {
+            logger.error(Messages.getMessage("jsonFailReadJSONObject"));
+            throw new WebApplicationException(e, Response.Status.BAD_REQUEST);
+        }
+    }
+
 }

Modified: incubator/wink/trunk/wink-common/src/main/resources/META-INF/core/wink-providers
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-common/src/main/resources/META-INF/core/wink-providers?rev=810226&r1=810225&r2=810226&view=diff
==============================================================================
--- incubator/wink/trunk/wink-common/src/main/resources/META-INF/core/wink-providers (original)
+++ incubator/wink/trunk/wink-common/src/main/resources/META-INF/core/wink-providers Tue Sep  1 20:45:19 2009
@@ -61,6 +61,7 @@
 
 # Json
 org.apache.wink.common.internal.providers.entity.json.JsonProvider
+org.apache.wink.common.internal.providers.entity.json.JsonArrayProvider
 org.apache.wink.common.internal.providers.entity.json.JsonJAXBProvider
 org.apache.wink.common.internal.providers.entity.json.JsonSyndEntryProvider
 org.apache.wink.common.internal.providers.entity.json.JsonSyndFeedProvider

Modified: incubator/wink/trunk/wink-common/src/main/resources/org/apache/wink/common/internal/i18n/resource.properties
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-common/src/main/resources/org/apache/wink/common/internal/i18n/resource.properties?rev=810226&r1=810225&r2=810226&view=diff
==============================================================================
--- incubator/wink/trunk/wink-common/src/main/resources/org/apache/wink/common/internal/i18n/resource.properties (original)
+++ incubator/wink/trunk/wink-common/src/main/resources/org/apache/wink/common/internal/i18n/resource.properties Tue Sep  1 20:45:19 2009
@@ -82,6 +82,9 @@
 jsonFailConvertXMLToJSON=Failed to convert XML to JSON
 jsonFailConvertJAXBToJSON=Failed to convert JAXB object {} to JSONObject
 jsonFailWriteJSONObject=Failed to write JSONObject
+jsonFailReadJSONObject=Failed to read JSONObject
+jsonFailWriteJSONArray=Failed to write JSONArray
+jsonFailReadJSONArray=Failed to read JSONArray
 
 # JAXB Provider
 jaxbObjectFactoryNotFound=ObjectFactory for {} was not found

Modified: incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/providers/entity/JsonProviderTest.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/providers/entity/JsonProviderTest.java?rev=810226&r1=810225&r2=810226&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/providers/entity/JsonProviderTest.java (original)
+++ incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/providers/entity/JsonProviderTest.java Tue Sep  1 20:45:19 2009
@@ -20,8 +20,12 @@
 
 package org.apache.wink.server.internal.providers.entity;
 
+import java.io.StringReader;
+import java.util.Collections;
+
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
@@ -43,8 +47,10 @@
 import org.apache.wink.common.model.synd.SyndText;
 import org.apache.wink.server.internal.servlet.MockServletInvocationTest;
 import org.apache.wink.test.mock.MockRequestConstructor;
+import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
+import org.json.JSONTokener;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpServletResponse;
 
@@ -83,6 +89,8 @@
                                                               + "  }\n"
                                                               + "}}";
 
+    private static final String    JSON_ARRAY         = "[" + JSON + ", {\"test\":\"ing\"}]";
+
     private static final String    JSON_AS_ATOM_ENTRY =
                                                           "{\"entry\": {\n" + "  \"@xmlns\": {\"$\": \"http:\\/\\/www.w3.org\\/2005\\/Atom\"},\n"
                                                               + "  \"id\": {\n"
@@ -113,6 +121,29 @@
             return new JSONObject(JSON);
         }
 
+        @POST
+        @Path("json")
+        @Consumes(MediaType.APPLICATION_JSON)
+        @Produces(MediaType.APPLICATION_JSON)
+        public JSONObject postJson(JSONObject object) throws Exception {
+            return object.put("foo", "bar");
+        }
+
+        @GET
+        @Path("jsonarray")
+        @Produces(MediaType.APPLICATION_JSON)
+        public JSONArray getJsonArray() throws Exception {
+            return new JSONArray(JSON_ARRAY);
+        }
+
+        @POST
+        @Path("jsonarray")
+        @Consumes(MediaType.APPLICATION_JSON)
+        @Produces(MediaType.APPLICATION_JSON)
+        public JSONArray postJson(JSONArray array) throws Exception {
+            return array.put(Collections.singletonMap("foo", "bar"));
+        }
+
         @GET
         @Path("jsonfeed")
         @Produces("application/json")
@@ -251,6 +282,48 @@
         compairJsonContent(JSON, response.getContentAsString());
     }
 
+    public void testPostJson() throws Exception {
+        MockHttpServletRequest request =
+            MockRequestConstructor.constructMockRequest("POST",
+                                                        "/test/json",
+                                                        "application/json",
+                                                        MediaType.APPLICATION_JSON,
+                                                        JSON.getBytes());
+        MockHttpServletResponse response = invoke(request);
+        assertEquals(200, response.getStatus());
+        JSONObject result = JSONUtils.objectForString(response.getContentAsString());
+        JSONObject want = JSONUtils.objectForString(JSON).put("foo", "bar");
+        assertTrue(JSONUtils.equals(want, result));
+    }
+
+    public void testGetJsonArray() throws Exception {
+        MockHttpServletRequest request =
+            MockRequestConstructor.constructMockRequest("GET",
+                                                        "/test/jsonarray",
+                                                        "application/json");
+        MockHttpServletResponse response = invoke(request);
+        assertEquals(200, response.getStatus());
+        JSONArray result =
+            new JSONArray(new JSONTokener(new StringReader(response.getContentAsString())));
+        JSONArray want = new JSONArray(JSON_ARRAY);
+        assertTrue(JSONUtils.equals(want, result));
+    }
+
+    public void testPostJsonArray() throws Exception {
+        MockHttpServletRequest request =
+            MockRequestConstructor.constructMockRequest("POST",
+                                                        "/test/jsonarray",
+                                                        "application/json",
+                                                        MediaType.APPLICATION_JSON,
+                                                        JSON_ARRAY.getBytes());
+        MockHttpServletResponse response = invoke(request);
+        assertEquals(200, response.getStatus());
+        JSONArray result =
+            new JSONArray(new JSONTokener(new StringReader(response.getContentAsString())));
+        JSONArray want = new JSONArray(JSON_ARRAY).put(Collections.singletonMap("foo", "bar"));
+        assertTrue(JSONUtils.equals(want, result));
+    }
+
     public void testGetJsonFeed() throws Exception {
         MockHttpServletRequest request =
             MockRequestConstructor