[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