[exo-jcr-commits] exo-jcr SVN: r3251 - in ws/trunk: exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/provider and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Oct 6 05:31:30 EDT 2010


Author: aparfonov
Date: 2010-10-06 05:31:29 -0400 (Wed, 06 Oct 2010)
New Revision: 3251

Modified:
   ws/trunk/exo.ws.frameworks.json/src/main/java/org/exoplatform/ws/frameworks/json/impl/JsonGeneratorImpl.java
   ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/provider/JsonEntityProvider.java
   ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/provider/JsonEntityTest.java
Log:
EXOJCR-992

Modified: ws/trunk/exo.ws.frameworks.json/src/main/java/org/exoplatform/ws/frameworks/json/impl/JsonGeneratorImpl.java
===================================================================
--- ws/trunk/exo.ws.frameworks.json/src/main/java/org/exoplatform/ws/frameworks/json/impl/JsonGeneratorImpl.java	2010-10-06 07:48:31 UTC (rev 3250)
+++ ws/trunk/exo.ws.frameworks.json/src/main/java/org/exoplatform/ws/frameworks/json/impl/JsonGeneratorImpl.java	2010-10-06 09:31:29 UTC (rev 3251)
@@ -29,6 +29,7 @@
 import org.exoplatform.ws.frameworks.json.value.impl.ObjectValue;
 import org.exoplatform.ws.frameworks.json.value.impl.StringValue;
 
+import java.io.StringReader;
 import java.lang.reflect.Array;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
@@ -114,6 +115,22 @@
    }
 
    /**
+    * Create JSON object from specified string imply it is JSON object in String
+    * format.
+    *
+    * @param s source string
+    * @return JSON representation of map
+    * @throws JsonException if map can't be transformed in JSON representation
+    */
+   public JsonValue createJsonObjectFromString(String s) throws JsonException
+   {
+      JsonParserImpl parser = new JsonParserImpl();
+      JsonDefaultHandler handler = new JsonDefaultHandler();
+      parser.parse(new StringReader(s), handler);
+      return handler.getJsonObject();
+   }
+
+   /**
     * Create JSON object from specified object. Object must be conform with java
     * bean structure.
     *

Modified: ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/provider/JsonEntityProvider.java
===================================================================
--- ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/provider/JsonEntityProvider.java	2010-10-06 07:48:31 UTC (rev 3250)
+++ ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/provider/JsonEntityProvider.java	2010-10-06 09:31:29 UTC (rev 3251)
@@ -29,19 +29,27 @@
 import org.exoplatform.ws.frameworks.json.impl.JsonUtils.Types;
 import org.exoplatform.ws.frameworks.json.value.JsonValue;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.Reader;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Map;
 
+import javax.activation.DataSource;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.StreamingOutput;
 import javax.ws.rs.ext.Provider;
+import javax.xml.bind.JAXBElement;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamSource;
 
 /**
  * @author <a href="mailto:andrew00x at gmail.com">Andrey Parfonov</a>
@@ -60,13 +68,30 @@
    // Or probably enough check only content type 'application/json'
    // and if this content type set trust it and try parse/write
 
+   /** Do not process via JSON "known" JAX-RS types. */
+   private static final Class<?>[] IGNORED =
+      new Class<?>[]{byte[].class, DataSource.class, DOMSource.class, File.class, InputStream.class, JAXBElement.class,
+         MultivaluedMap.class, Reader.class, SAXSource.class, StreamingOutput.class, StreamSource.class, String.class};
+
+   private static boolean isIgnored(Class<?> type)
+   {
+      for (Class<?> c : IGNORED)
+      {
+         if (c.isAssignableFrom(type))
+         {
+            return true;
+         }
+      }
+      return false;
+   }
+
    /**
     * {@inheritDoc}
     */
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
    {
-      // say as support all objects, see _TODO_ above
-      return Object.class.isAssignableFrom(type);
+      //      return Object.class.isAssignableFrom(type);
+      return !isIgnored(type);
    }
 
    /**
@@ -124,8 +149,8 @@
     */
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
    {
-      // say as support all objects, see _TODO_ above
-      return Object.class.isAssignableFrom(type);
+      //      return Object.class.isAssignableFrom(type);
+      return !isIgnored(type);
    }
 
    /**

Modified: ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/provider/JsonEntityTest.java
===================================================================
--- ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/provider/JsonEntityTest.java	2010-10-06 07:48:31 UTC (rev 3250)
+++ ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/provider/JsonEntityTest.java	2010-10-06 09:31:29 UTC (rev 3251)
@@ -40,7 +40,9 @@
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
 
 /**
  * @author <a href="mailto:andrew00x at gmail.com">Andrey Parfonov</a>
@@ -111,6 +113,17 @@
    }
 
    @Path("/")
+   public static class ResourceString
+   {
+      @POST
+      @Consumes("application/json")
+      public void m1(String b)
+      {
+         assertEquals(jsonBook, b);
+      }
+   }
+
+   @Path("/")
    public static class ResourceBook2
    {
       @GET
@@ -228,6 +241,33 @@
       }
    }
 
+   @Path("/")
+   public static class ResourceString2
+   {
+      @GET
+      @Produces("application/json")
+      public String m1()
+      {
+         return jsonBook;
+      }
+
+      @POST
+      public Response m2()
+      {
+         return Response.ok(jsonBook).type(MediaType.APPLICATION_JSON).build();
+      }
+   }
+
+   private static String jsonBook = "{\"title\":\"Hamlet\", \"author\":\"William Shakespeare\", \"sendByPost\":true}";
+
+   private static String jsonArray =
+      "[{\"title\":\"Hamlet\", \"author\":\"William Shakespeare\", \"sendByPost\":true},"
+         + "{\"title\":\"Collected Stories\", \"author\":\"Gabriel Garcia Marquez\", \"sendByPost\":true}]";
+
+   private static String jsonMap =
+      "{\"12345\":{\"title\":\"Hamlet\", \"author\":\"William Shakespeare\", \"sendByPost\":true},"
+         + "\"54321\":{\"title\":\"Collected Stories\", \"author\":\"Gabriel Garcia Marquez\", \"sendByPost\":true}}";
+
    private byte[] jsonBookData;
 
    private byte[] jsonArrayData;
@@ -237,16 +277,9 @@
    public void setUp() throws Exception
    {
       super.setUp();
-      jsonBookData =
-         ("{\"title\":\"Hamlet\", \"author\":\"William Shakespeare\", \"sendByPost\":true}").getBytes("UTF-8");
-      jsonArrayData =
-         ("[{\"title\":\"Hamlet\", \"author\":\"William Shakespeare\", \"sendByPost\":true},"
-            + "{\"title\":\"Collected Stories\", \"author\":\"Gabriel Garcia Marquez\", \"sendByPost\":true}]")
-            .getBytes("UTF-8");
-      jsonMapData =
-         ("{\"12345\":{\"title\":\"Hamlet\", \"author\":\"William Shakespeare\", \"sendByPost\":true},"
-            + "\"54321\":{\"title\":\"Collected Stories\", \"author\":\"Gabriel Garcia Marquez\", \"sendByPost\":true}}")
-            .getBytes("UTF-8");
+      jsonBookData = jsonBook.getBytes("UTF-8");
+      jsonArrayData = jsonArray.getBytes("UTF-8");
+      jsonMapData = jsonMap.getBytes("UTF-8");
    }
 
    public void testJsonEntityBean() throws Exception
@@ -299,6 +332,17 @@
       unregistry(r1);
    }
 
+   public void testJsonEntityString() throws Exception
+   {
+      ResourceString r1 = new ResourceString();
+      registry(r1);
+      MultivaluedMap<String, String> h = new MultivaluedMapImpl();
+      h.putSingle("content-type", "application/json");
+      h.putSingle("content-length", "" + jsonBookData.length);
+      assertEquals(204, launcher.service("POST", "/", "", h, jsonBookData, null).getStatus());
+      unregistry(r1);
+   }
+
    public void testJsonReturnBean() throws Exception
    {
       ResourceBook2 r2 = new ResourceBook2();
@@ -472,4 +516,30 @@
 
       unregistry(r2);
    }
+
+   public void testJsonReturnString() throws Exception
+   {
+      ResourceString2 r2 = new ResourceString2();
+      registry(r2);
+      MultivaluedMap<String, String> h = new MultivaluedMapImpl();
+      h.putSingle("accept", "application/json");
+      ByteArrayContainerResponseWriter writer = new ByteArrayContainerResponseWriter();
+
+      // ResourceString2#m1()
+      ContainerResponse response = launcher.service("GET", "/", "", h, null, writer, null);
+      assertEquals(200, response.getStatus());
+      assertEquals("application/json", response.getContentType().toString());
+      assertEquals(jsonBook, response.getEntity());
+      //System.out.println("string: " + new String(writer.getBody()));
+
+      // ResourceString2#m2()
+      writer.reset();
+      response = launcher.service("POST", "/", "", h, null, writer, null);
+      assertEquals(200, response.getStatus());
+      assertEquals("application/json", response.getContentType().toString());
+      assertEquals(jsonBook, response.getEntity());
+      //System.out.println("string: " + new String(writer.getBody()));
+
+      unregistry(r2);
+   }
 }



More information about the exo-jcr-commits mailing list