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