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); }