Repository: johnzon
Updated Branches:
  refs/heads/master d9ba15398 -> 0e207b0a5


JOHNZON-133 ensure we test correctly jaxrs types and not just assume the 
signature is right


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/0e207b0a
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/0e207b0a
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/0e207b0a

Branch: refs/heads/master
Commit: 0e207b0a5fdb1bc119dd650f2be3689482b91ed4
Parents: d9ba153
Author: Romain Manni-Bucau <rmannibu...@gmail.com>
Authored: Tue Aug 8 15:12:27 2017 +0200
Committer: Romain Manni-Bucau <rmannibu...@gmail.com>
Committed: Tue Aug 8 15:12:27 2017 +0200

----------------------------------------------------------------------
 .../johnzon/jaxrs/JohnzonMessageBodyReader.java |  6 +-
 .../johnzon/jaxrs/JohnzonMessageBodyWriter.java | 12 +--
 .../johnzon/jaxrs/JohnzonProviderTest.java      | 82 ++++++++++++++------
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java   | 18 +++--
 4 files changed, 80 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/0e207b0a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java
 
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java
index f3d9a18..42fcbf0 100644
--- 
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java
+++ 
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java
@@ -58,8 +58,10 @@ public class JohnzonMessageBodyReader<T> extends 
IgnorableTypes implements Messa
     public boolean isReadable(final Class<?> rawType, final Type genericType,
                               final Annotation[] annotations, final MediaType 
mediaType) {
         return !isIgnored(rawType)
-                && InputStream.class != genericType && Reader.class != 
genericType && Response.class != genericType
-                && String.class != genericType
+                && !InputStream.class.isAssignableFrom(rawType)
+                && !Reader.class.isAssignableFrom(rawType)
+                && !Response.class.isAssignableFrom(rawType)
+                && !CharSequence.class.isAssignableFrom(rawType)
                 && !JsonStructure.class.isAssignableFrom(rawType);
     }
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0e207b0a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java
 
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java
index e6a8d36..6a3e163 100644
--- 
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java
+++ 
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java
@@ -65,12 +65,12 @@ public class JohnzonMessageBodyWriter<T> extends 
IgnorableTypes implements Messa
     public boolean isWriteable(final Class<?> rawType, final Type genericType,
                                final Annotation[] annotations, final MediaType 
mediaType) {
         return !isIgnored(rawType)
-                && InputStream.class != genericType
-                && OutputStream.class != genericType
-                && Writer.class != genericType
-                && StreamingOutput.class != genericType
-                && String.class != genericType
-                && Response.class != genericType
+                && !InputStream.class.isAssignableFrom(rawType)
+                && !OutputStream.class.isAssignableFrom(rawType)
+                && !Writer.class.isAssignableFrom(rawType)
+                && !StreamingOutput.class.isAssignableFrom(rawType)
+                && !CharSequence.class.isAssignableFrom(rawType)
+                && !Response.class.isAssignableFrom(rawType)
                 && !JsonStructure.class.isAssignableFrom(rawType);
     }
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0e207b0a/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java 
b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
index 6af6f68..a77752d 100644
--- 
a/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
+++ 
b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
@@ -18,14 +18,20 @@
  */
 package org.apache.johnzon.jaxrs;
 
-import org.apache.cxf.endpoint.Server;
-import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
-import org.apache.cxf.jaxrs.client.WebClient;
-import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.cxf.transport.local.LocalConduit;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
@@ -34,24 +40,25 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.client.Entity;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.StreamingOutput;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 
-import static java.util.Arrays.asList;
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.transport.local.LocalConduit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
 
 public class JohnzonProviderTest {
+
     private final static String ENDPOINT_ADDRESS = "local://johnzon";
+
     private static Server server;
 
     @BeforeClass
@@ -72,7 +79,8 @@ public class JohnzonProviderTest {
 
     @Test
     public void asParam() {
-        final String result = 
client().path("johnzon").type(MediaType.APPLICATION_JSON_TYPE).post(new 
Johnzon("client")).readEntity(String.class);
+        final String result = 
client().path("johnzon").type(MediaType.APPLICATION_JSON_TYPE).post(new 
Johnzon("client"))
+                .readEntity(String.class);
         assertTrue(Boolean.parseBoolean(result));
     }
 
@@ -89,6 +97,19 @@ public class JohnzonProviderTest {
     }
 
     @Test
+    public void untypedStreamOutput() {
+        final StreamingOutput impl = new StreamingOutput() {
+
+            @Override
+            public void write(final OutputStream outputStream) throws 
IOException, WebApplicationException {
+                // no-op
+            }
+        };
+        assertFalse(new 
JohnzonMessageBodyWriter().isWriteable(impl.getClass(), impl.getClass(), new 
Annotation[0],
+                MediaType.APPLICATION_JSON_TYPE));
+    }
+
+    @Test
     public void primitive() {
         final String val = 
client(MediaType.TEXT_PLAIN_TYPE).path("johnzon/primitive").get(String.class);
         assertEquals("1986", val);
@@ -106,9 +127,10 @@ public class JohnzonProviderTest {
     @Test
     public void list() {
         final ParameterizedType list = new ParameterizedType() {
+
             @Override
             public Type[] getActualTypeArguments() {
-                return new Type[]{Johnzon.class};
+                return new Type[] { Johnzon.class };
             }
 
             @Override
@@ -146,12 +168,14 @@ public class JohnzonProviderTest {
     }
 
     private static WebClient client(final MediaType mediaType) {
-        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, 
singletonList(new JohnzonProvider<Object>())).accept(mediaType);
+        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, 
singletonList(new JohnzonProvider<Object>()))
+                .accept(mediaType);
         
WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH,
 Boolean.TRUE);
         return client;
     }
 
     public static class Johnzon {
+
         private String name;
 
         public Johnzon(final String name) {
@@ -173,6 +197,7 @@ public class JohnzonProviderTest {
 
     @Path("johnzon")
     public static class JohnzonResource {
+
         @GET
         public Johnzon johnzon() {
             return new Johnzon("johnzon");
@@ -207,6 +232,7 @@ public class JohnzonProviderTest {
         @Path("stream")
         public StreamingOutput out() {
             return new StreamingOutput() {
+
                 @Override
                 public void write(OutputStream outputStream) throws 
IOException, WebApplicationException {
                     outputStream.write("ok".getBytes());
@@ -215,6 +241,18 @@ public class JohnzonProviderTest {
         }
 
         @GET
+        @Path("lazy_stream")
+        public void out(@Suspended final AsyncResponse response) {
+            response.resume(new StreamingOutput() {
+
+                @Override
+                public void write(OutputStream outputStream) throws 
IOException, WebApplicationException {
+                    outputStream.write("ok".getBytes());
+                }
+            });
+        }
+
+        @GET
         @Produces(MediaType.TEXT_PLAIN)
         @Path("primitive")
         public Integer primitive() {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/0e207b0a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
index 089406f..ae97533 100644
--- 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
+++ 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
@@ -118,20 +118,22 @@ public class JsonbJaxrsProvider<T> implements 
MessageBodyWriter<T>, MessageBodyR
     @Override
     public boolean isReadable(final Class<?> type, final Type genericType, 
final Annotation[] annotations, final MediaType mediaType) {
         return !isIgnored(type)
-                && InputStream.class != genericType && Reader.class != 
genericType && Response.class != genericType
-                && String.class != genericType
+                && !InputStream.class.isAssignableFrom(type)
+                && !Reader.class.isAssignableFrom(type)
+                && !Response.class.isAssignableFrom(type)
+                && !CharSequence.class.isAssignableFrom(type)
                 && !JsonStructure.class.isAssignableFrom(type);
     }
 
     @Override
     public boolean isWriteable(final Class<?> type, final Type genericType, 
final Annotation[] annotations, final MediaType mediaType) {
         return !isIgnored(type)
-                && InputStream.class != genericType
-                && OutputStream.class != genericType
-                && Writer.class != genericType
-                && StreamingOutput.class != genericType
-                && String.class != genericType
-                && Response.class != genericType
+                && !InputStream.class.isAssignableFrom(type)
+                && !OutputStream.class.isAssignableFrom(type)
+                && !Writer.class.isAssignableFrom(type)
+                && !StreamingOutput.class.isAssignableFrom(type)
+                && !CharSequence.class.isAssignableFrom(type)
+                && !Response.class.isAssignableFrom(type)
                 && !JsonStructure.class.isAssignableFrom(type);
     }
 

Reply via email to