You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wink.apache.org by ma...@apache.org on 2009/07/02 16:45:31 UTC
svn commit: r790605 - in /incubator/wink/trunk/wink-server/src:
main/java/org/apache/wink/server/internal/handlers/
test/java/org/apache/wink/server/internal/activation/
test/resources/META-INF/
Author: martins
Date: Thu Jul 2 14:45:31 2009
New Revision: 790605
URL: http://svn.apache.org/viewvc?rev=790605&view=rev
Log:
Fix JIRA [WINK-32] - support for JavaBeans Activation Framework DataContentHandler
Added:
incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/activation/
incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/activation/ActivationDataContentHandlerTest.java
incubator/wink/trunk/wink-server/src/test/resources/META-INF/
incubator/wink/trunk/wink-server/src/test/resources/META-INF/mailcap
Modified:
incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/FlushResultHandler.java
Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/FlushResultHandler.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/FlushResultHandler.java?rev=790605&r1=790604&r2=790605&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/FlushResultHandler.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/FlushResultHandler.java Thu Jul 2 14:45:31 2009
@@ -28,6 +28,8 @@
import java.util.Properties;
import java.util.Map.Entry;
+import javax.activation.CommandMap;
+import javax.activation.DataContentHandler;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.WebApplicationException;
@@ -127,9 +129,6 @@
MessageBodyWriter<Object> messageBodyWriter = (MessageBodyWriter<Object>)providers.getMessageBodyWriter(
rawType, genericType, declaredAnnotations, responseMediaType);
- // TODO: try to find a data handler using JavaBeans Activation Framework,
- // if found use DataSourceProvider
-
// use the provider to write the entity
if (messageBodyWriter != null) {
logger.debug("Serialization using provider {}", messageBodyWriter.getClass().getName());
@@ -143,9 +142,28 @@
messageBodyWriter.writeTo(entity, rawType, genericType, declaredAnnotations, responseMediaType,
httpHeaders, new FlushHeadersOutputStream(httpResponse, headers));
-
+ return;
+
} else {
- logger.error("Could not find a writer for {} and {}", entity.getClass().getName(), responseMediaType);
+ logger.warn("Could not find a writer for {} and {}. Try to find JAF DataSourceProvider", entity.getClass().getName(), responseMediaType);
+ }
+
+ DataContentHandler dataContentHandler = null;
+ // Write Entity with ASF DataContentHandler
+ try{
+ // try to find a data handler using JavaBeans Activation Framework, if found use DataSourceProvider
+ dataContentHandler = CommandMap.getDefaultCommandMap().createDataContentHandler(responseMediaType.toString());
+
+ if(dataContentHandler == null){
+ logger.error("Could not find a DataSourceProvider for {} ", responseMediaType);
+ throw new WebApplicationException(500);
+ }
+
+ dataContentHandler.writeTo(entity, responseMediaType.toString(), new FlushHeadersOutputStream(httpResponse, httpHeaders));
+
+ }catch (Exception e) {
+ logger.error("Could not write {} with DataSourceProvider {} for mediatype {} ",
+ new Object[]{entity.getClass().getName(), dataContentHandler.getClass().getName(), responseMediaType.toString() });
throw new WebApplicationException(500);
}
}
Added: incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/activation/ActivationDataContentHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/activation/ActivationDataContentHandlerTest.java?rev=790605&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/activation/ActivationDataContentHandlerTest.java (added)
+++ incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/activation/ActivationDataContentHandlerTest.java Thu Jul 2 14:45:31 2009
@@ -0,0 +1,161 @@
+package org.apache.wink.server.internal.activation;
+
+import java.awt.datatransfer.DataFlavor;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+
+import javax.activation.ActivationDataFlavor;
+import javax.activation.DataContentHandler;
+import javax.activation.DataSource;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.apache.wink.server.internal.servlet.MockServletInvocationTest;
+import org.apache.wink.test.mock.MockRequestConstructor;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+public class ActivationDataContentHandlerTest extends MockServletInvocationTest {
+
+ private static final String DATA = "data";
+
+ @Override
+ protected Class<?>[] getClasses() {
+ return new Class[] {TestResource.class};
+ }
+
+ @Path("/root")
+ public static class TestResource {
+ public String data;
+
+ public TestResource(){}
+ public TestResource(String data){this.data = data;}
+
+ @Path("/exists")
+ @GET
+ @Produces("text/resource")
+ public TestResource getResource() {
+ return new TestResource(DATA);
+ }
+
+ @Path("/missing")
+ @GET
+ @Produces("text/resource")
+ public ActivationDataContentHandlerTest getResourceNoHandler() {
+ return new ActivationDataContentHandlerTest();
+ }
+ }
+
+ public static class TestResourceContentHandler implements DataContentHandler{
+
+ public TestResourceContentHandler()
+ {
+ }
+
+ public DataFlavor[] getTransferDataFlavors()
+ {
+ DataFlavor adataflavor[] = new DataFlavor[2];
+ try
+ {
+ adataflavor[0] = new ActivationDataFlavor(Class.forName("org.apache.wink.server.internal.activation.ActivationDataContentHandlerTest$TestResource"), "text/resource", "text string");
+ }
+ catch(Exception exception) { }
+ adataflavor[1] = new DataFlavor("text/resource", "Plain Text");
+ return adataflavor;
+ }
+
+ public Object getTransferData(DataFlavor dataflavor, DataSource datasource)
+ {
+ if(!dataflavor.getMimeType().startsWith("text/resource"))
+ throw new RuntimeException();
+ if(dataflavor.getRepresentationClass().getName().equals("java.lang.String"))
+ {
+ StringBuffer stringbuffer = new StringBuffer();
+ char ac[] = new char[1024];
+ int j = 0;
+ try
+ {
+ InputStreamReader inputstreamreader = new InputStreamReader(datasource.getInputStream());
+ do
+ {
+ int i = inputstreamreader.read(ac);
+ if(i <= 0)
+ break;
+ stringbuffer.append(ac, 0, i);
+ j += i;
+ } while(true);
+ }
+ catch(Exception exception1) { }
+ return stringbuffer.toString();
+ }
+ if(!dataflavor.getRepresentationClass().getName().equals("java.io.InputStream"))
+ throw new RuntimeException();
+ try {
+ return datasource.getInputStream();
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public Object getContent(DataSource datasource)
+ {
+ StringBuffer stringbuffer = new StringBuffer();
+ char ac[] = new char[1024];
+ int j = 0;
+ try
+ {
+ InputStreamReader inputstreamreader = new InputStreamReader(datasource.getInputStream());
+ do
+ {
+ int i = inputstreamreader.read(ac);
+ if(i <= 0)
+ break;
+ stringbuffer.append(ac, 0, i);
+ j += i;
+ } while(true);
+ }
+ catch(Exception exception) { }
+ return stringbuffer.toString();
+ }
+
+ public void writeTo(Object obj, String s, OutputStream outputstream)
+ throws IOException
+ {
+ if(!s.startsWith("text/resource"))
+ {
+ throw new IOException((new StringBuilder()).append("Invalid type \"").append(s).append("\" on StringDCH").toString());
+ } else
+ {
+ OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
+ outputstreamwriter.write(((TestResource)obj).data);
+ outputstreamwriter.flush();
+ return;
+ }
+ }
+ }
+
+ public void testHandlerExists() throws Exception {
+ System.out.println(TestResource.class.getName());
+ MockHttpServletRequest mockRequest =
+ MockRequestConstructor.constructMockRequest("GET", "/root/exists", "text/resource");
+
+ MockHttpServletResponse response = invoke(mockRequest);
+ String content = response.getContentAsString();
+ assertTrue(content.equals(DATA));
+ }
+
+ public void testMissingHandlerExists() throws Exception {
+ System.out.println(TestResource.class.getName());
+ MockHttpServletRequest mockRequest =
+ MockRequestConstructor.constructMockRequest("GET", "/root/missing", "text/resource");
+ MockHttpServletResponse response = invoke(mockRequest);
+ int family = response.getStatus() / 100;
+ assertTrue(family == 5 || family == 4);
+ }
+
+
+
+}
Added: incubator/wink/trunk/wink-server/src/test/resources/META-INF/mailcap
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/resources/META-INF/mailcap?rev=790605&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/resources/META-INF/mailcap (added)
+++ incubator/wink/trunk/wink-server/src/test/resources/META-INF/mailcap Thu Jul 2 14:45:31 2009
@@ -0,0 +1 @@
+text/resource;; x-java-content-handler=org.apache.wink.server.internal.activation.ActivationDataContentHandlerTest$TestResourceContentHandler
\ No newline at end of file