Repository: tomee Updated Branches: refs/heads/master d65c1d68c -> 1c961beea
TOMEE-1726 StreamingOutput should match even in a Response entity Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/1c961bee Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/1c961bee Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/1c961bee Branch: refs/heads/master Commit: 1c961beea5329c35e288387ce0cac3bdf17624d6 Parents: d65c1d6 Author: Romain manni-Bucau <rmannibu...@gmail.com> Authored: Tue Mar 8 10:32:24 2016 +0100 Committer: Romain manni-Bucau <rmannibu...@gmail.com> Committed: Tue Mar 8 10:32:24 2016 +0100 ---------------------------------------------------------------------- .../openejb/server/cxf/rs/CxfRSService.java | 24 +++++++++ .../server/cxf/rs/JSonStreamingOutputTest.java | 55 ++++++++++++++++++++ 2 files changed, 79 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/1c961bee/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java ---------------------------------------------------------------------- diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java index 7c4c05a..641d8fe 100644 --- a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java +++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java @@ -44,6 +44,7 @@ import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.InjectionPoint; import javax.enterprise.inject.spi.PassivationCapable; import javax.enterprise.util.AnnotationLiteral; +import javax.json.JsonStructure; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletRequest; @@ -55,8 +56,11 @@ import javax.ws.rs.container.ResourceContext; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.UriInfo; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; @@ -65,6 +69,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable; +import java.io.Writer; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; @@ -363,11 +368,30 @@ public class CxfRSService extends RESTService { @Produces({"application/json", "application/*+json"}) @Consumes({"application/json", "application/*+json"}) public static class TomEEJohnzonProvider<T> extends JohnzonProvider<T> { + @Override + public boolean isWriteable(final Class<?> rawType, final Type genericType, + final Annotation[] annotations, final MediaType mediaType) { + return super.isWriteable(rawType, genericType, annotations, mediaType) + && !OutputStream.class.isAssignableFrom(rawType) + && !StreamingOutput.class.isAssignableFrom(rawType) + && !Writer.class.isAssignableFrom(rawType) + && !Response.class.isAssignableFrom(rawType) + && !JsonStructure.class.isAssignableFrom(rawType); + } } @Provider @Produces({"application/json", "application/*+json"}) @Consumes({"application/json", "application/*+json"}) public static class TomEEJsonpProvider extends JsrProvider { + @Override + public boolean isWriteable(final Class<?> rawType, final Type genericType, + final Annotation[] annotations, final MediaType mediaType) { + return super.isWriteable(rawType, genericType, annotations, mediaType) + && !OutputStream.class.isAssignableFrom(rawType) + && !StreamingOutput.class.isAssignableFrom(rawType) + && !Writer.class.isAssignableFrom(rawType) + && !Response.class.isAssignableFrom(rawType); + } } } http://git-wip-us.apache.org/repos/asf/tomee/blob/1c961bee/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/JSonStreamingOutputTest.java ---------------------------------------------------------------------- diff --git a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/JSonStreamingOutputTest.java b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/JSonStreamingOutputTest.java new file mode 100644 index 0000000..635bdb0 --- /dev/null +++ b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/JSonStreamingOutputTest.java @@ -0,0 +1,55 @@ +package org.apache.openejb.server.cxf.rs; + +import org.apache.openejb.junit.ApplicationComposer; +import org.apache.openejb.testing.Classes; +import org.apache.openejb.testing.EnableServices; +import org.apache.openejb.testing.RandomPort; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.json.Json; +import javax.json.stream.JsonGenerator; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URL; + +import static org.junit.Assert.assertEquals; + +@Classes(innerClassesAsBean = true) +@EnableServices("jaxrs") +@RunWith(ApplicationComposer.class) +public class JSonStreamingOutputTest { + @RandomPort("http") + private URL root; + + @Test + public void run() { + assertEquals("[{\"id\":1}]", ClientBuilder.newClient().target(root.toExternalForm()).path("/openejb/streamTest").request().get(String.class)); + } + + @Path("streamTest") + public static class En { + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response touch() { + return Response.ok().entity(new StreamingOutput() { + @Override + public void write(final OutputStream os) throws IOException, WebApplicationException { + try (final JsonGenerator jg = Json.createGenerator(os)) { // in real life use the factory + jg.writeStartArray(); + jg.writeStartObject().write("id", 1).writeEnd(); // simple for the assert + jg.writeEnd().close(); + } + } + }).type(MediaType.APPLICATION_JSON).build(); + } + } +}