You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2016/03/08 10:33:44 UTC

tomee git commit: TOMEE-1726 StreamingOutput should match even in a Response entity

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 <rm...@gmail.com>
Authored: Tue Mar 8 10:32:24 2016 +0100
Committer: Romain manni-Bucau <rm...@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();
+        }
+    }
+}