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