Author: norman
Date: Wed Apr  6 19:31:06 2011
New Revision: 1089596

URL: http://svn.apache.org/viewvc?rev=1089596&view=rev
Log:
Allow to get an Inputstream of the content of a Literal

Modified:
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/FetchResponse.java
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/FetchResponse.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/FetchResponse.java?rev=1089596&r1=1089595&r2=1089596&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/FetchResponse.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/FetchResponse.java
 Wed Apr  6 19:31:06 2011
@@ -19,7 +19,7 @@
 package org.apache.james.imap.message.response;
 
 import java.io.IOException;
-import java.nio.channels.WritableByteChannel;
+import java.io.InputStream;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -295,22 +295,6 @@ public final class FetchResponse impleme
          */
         public String getName();
 
-        /**
-         * Size of the literal content data.
-         * 
-         * @return number of octets which {@link #writeTo(WritableByteChannel)}
-         *         will put onto the channel
-         */
-        public long size();
-
-        /**
-         * Writes the contents of this body element to the channel.
-         * 
-         * @param channel
-         *            <code>Channel</code>, not null
-         * @throws IOException
-         */
-        public void writeTo(WritableByteChannel channel) throws IOException;
     }
 
     /**

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java?rev=1089596&r1=1089595&r2=1089596&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
 Wed Apr  6 19:31:06 2011
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.response;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.channels.WritableByteChannel;
 
 public interface Literal {
@@ -39,4 +40,14 @@ public interface Literal {
      * @throws IOException
      */
     public void writeTo(WritableByteChannel channel) throws IOException;
+    
+
+    
+    /**
+     * Return the Literal as {@link InputStream}
+     * 
+     * @return elementIn
+     * @throws IOException
+     */
+    public InputStream getInputStream() throws IOException;
 }

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java?rev=1089596&r1=1089595&r2=1089596&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java
 Wed Apr  6 19:31:06 2011
@@ -22,11 +22,16 @@
  */
 package org.apache.james.imap.processor.fetch;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
 
 import org.apache.james.imap.message.response.FetchResponse.BodyElement;
 import org.apache.james.mailbox.Content;
+import org.apache.james.mailbox.InputStreamContent;
 
 final class ContentBodyElement implements BodyElement {
     private final String name;
@@ -59,4 +64,13 @@ final class ContentBodyElement implement
     public void writeTo(WritableByteChannel channel) throws IOException {
         content.writeTo(channel);
     }
+
+    public InputStream getInputStream() throws IOException {
+        if (content instanceof InputStreamContent) {
+            return ((InputStreamContent) content).getInputStream();
+        }
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        writeTo(Channels.newChannel(out));
+        return new ByteArrayInputStream(out.toByteArray());
+    }
 }
\ No newline at end of file

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java?rev=1089596&r1=1089595&r2=1089596&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java
 Wed Apr  6 19:31:06 2011
@@ -22,8 +22,12 @@
  */
 package org.apache.james.imap.processor.fetch;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
 import java.util.Iterator;
 import java.util.List;
@@ -96,4 +100,14 @@ final class HeaderBodyElement implements
         }
     }
 
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.imap.message.response.FetchResponse.BodyElement#getInputStream()
+     */
+    public InputStream getInputStream() throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        writeTo(Channels.newChannel(out));
+        return new ByteArrayInputStream(out.toByteArray());
+    }
+
 }
\ No newline at end of file

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java?rev=1089596&r1=1089595&r2=1089596&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java
 Wed Apr  6 19:31:06 2011
@@ -19,7 +19,9 @@
 
 package org.apache.james.imap.processor.fetch;
 
+import java.io.FilterInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.channels.WritableByteChannel;
 
 import org.apache.james.imap.message.response.FetchResponse.BodyElement;
@@ -70,4 +72,89 @@ final class PartialFetchBodyElement impl
         delegate.writeTo(partialChannel);
     }
 
+    public InputStream getInputStream() throws IOException {
+        return new LimitingInputStream(delegate.getInputStream(), firstOctet, 
size());
+    }
+    
+    private final class LimitingInputStream  extends FilterInputStream {
+        private long pos = 0;
+        private long length;
+        private long offset;
+
+        public LimitingInputStream(InputStream in, long offset, long length) {
+            super(in);
+            this.length = length;
+            this.offset = offset;
+            
+        }
+        
+        private void checkOffset() throws IOException {
+            if (offset > -1) {
+                while (offset > 0) {
+                    read();
+                    offset--;
+                }
+                offset = -1;
+            }
+        }
+        public int read() throws IOException {
+            checkOffset();
+            if (pos >= length) {
+                return -1;
+            }
+            pos++;
+            return super.read();
+        }
+
+        public int read(byte b[]) throws IOException {
+           
+            return read(b, 0, b.length);
+        }
+
+        public int read(byte b[], int off, int len) throws IOException {
+            checkOffset();
+
+            if (pos >= length) {   
+                return -1;
+            }
+
+            if (pos + len >= length) {
+                int readLimit = (int) length - (int) pos;
+                pos = length;
+
+                return super.read(b, off, readLimit);
+            }
+
+
+            int i =  super.read(b, off, len);
+            pos += i;
+            return i;
+           
+        }
+
+        public long skip(long n) throws IOException {
+            throw new IOException("Not implemented");
+        }
+
+        public int available() throws IOException {
+            int a = in.available() - (int)offset;
+            if (a < -1) {
+                throw new IOException("Unable to calculate size");
+            }
+            return a;
+        }
+
+        public void mark(int readlimit) {
+            // Don't do anything.
+        }
+
+        public synchronized void reset() throws IOException {
+            throw new IOException("mark not supported");
+        }
+
+        public boolean markSupported() {
+            return false;
+        }
+    }
+
 }
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to