Repository: cxf
Updated Branches:
  refs/heads/master 8bc72ec08 -> 30529297e


[CXF-6006] Support for StreamingOutput on the read side; patch from Gerald 
Quintana applied This closes #23


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/30529297
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/30529297
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/30529297

Branch: refs/heads/master
Commit: 30529297e058283728aabf4899606a0847326c54
Parents: 8bc72ec
Author: Sergey Beryozkin <sberyoz...@talend.com>
Authored: Wed Sep 17 10:24:24 2014 +0100
Committer: Sergey Beryozkin <sberyoz...@talend.com>
Committed: Wed Sep 17 10:24:24 2014 +0100

----------------------------------------------------------------------
 .../cxf/jaxrs/provider/BinaryDataProvider.java      | 16 +++++++++++++++-
 .../cxf/jaxrs/provider/BinaryDataProviderTest.java  | 11 +++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/30529297/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java
----------------------------------------------------------------------
diff --git 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java
 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java
index 431f6fe..d430a68 100644
--- 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java
+++ 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java
@@ -65,7 +65,18 @@ public class BinaryDataProvider<T> extends 
AbstractConfigurableProvider
         return byte[].class.isAssignableFrom(type)
                || InputStream.class.isAssignableFrom(type)
                || Reader.class.isAssignableFrom(type)
-               || File.class.isAssignableFrom(type);
+               || File.class.isAssignableFrom(type)
+               || StreamingOutput.class.isAssignableFrom(type);
+    }
+
+    private static final class ReadingStreamingOutput implements 
StreamingOutput {
+        private final InputStream inputStream;
+        private ReadingStreamingOutput(InputStream inputStream) {
+            this.inputStream = inputStream;
+        }
+        public void write(OutputStream outputStream) throws IOException {
+            IOUtils.copy(inputStream, outputStream);
+        }        
     }
 
     public T readFrom(Class<T> clazz, Type genericType, Annotation[] 
annotations, MediaType type, 
@@ -99,6 +110,9 @@ public class BinaryDataProvider<T> extends 
AbstractConfigurableProvider
                 fos.close();
                 return clazz.cast(f);
             }
+            if (StreamingOutput.class.isAssignableFrom(clazz)) {
+                return clazz.cast(new ReadingStreamingOutput(is));
+            }
         } catch (ClassCastException e) {
             String msg = "Unsupported class: " + clazz.getName();
             LOG.warning(msg);

http://git-wip-us.apache.org/repos/asf/cxf/blob/30529297/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java
----------------------------------------------------------------------
diff --git 
a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java
 
b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java
index ffb6fc4..0a9ff02 100644
--- 
a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java
+++ 
b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java
@@ -58,6 +58,7 @@ public class BinaryDataProviderTest extends Assert {
         assertTrue(p.isReadable(byte[].class, null, null, null)
                    && p.isReadable(InputStream.class, null, null, null)
                    && p.isReadable(File.class, null, null, null)
+                   && p.isReadable(StreamingOutput.class, null, null, null)
                    && !p.isReadable(int[].class, null, null, null));
     }
     
@@ -83,6 +84,16 @@ public class BinaryDataProviderTest extends Assert {
                                       new MetadataMap<String, Object>(),
                                       new 
ByteArrayInputStream("hi".getBytes()));
         assertEquals(IOUtils.toString(r), "hi");
+
+        StreamingOutput so = 
(StreamingOutput)p.readFrom(StreamingOutput.class, StreamingOutput.class, 
+                                      new Annotation[]{}, 
+                                      MediaType.APPLICATION_OCTET_STREAM_TYPE, 
+                                      new MetadataMap<String, Object>(),
+                                      new 
ByteArrayInputStream("hi".getBytes()));
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        so.write(baos);
+        bytes = baos.toByteArray();
+        assertTrue(Arrays.equals(new String("hi").getBytes(), bytes));
     }
     
     @SuppressWarnings({ "unchecked", "rawtypes" })

Reply via email to