Author: norman
Date: Mon Aug 22 10:40:07 2011
New Revision: 1160196

URL: http://svn.apache.org/viewvc?rev=1160196&view=rev
Log:
Use the raw message header if possible when build the FETCH response. See 
MAILBOX-115 and IMAP-332

Added:
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
   (with props)
Removed:
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/ChannelImapResponseWriter.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialWritableByteChannel.java
    
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/PartialWritableByteChannelTest.java
Modified:
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
    
james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.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/EmptyContent.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.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/MimeBodyElement.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java
    
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java
 Mon Aug 22 10:40:07 2011
@@ -20,7 +20,6 @@
 package org.apache.james.imap.encode;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 
 import org.apache.james.imap.message.response.Literal;
 
@@ -44,12 +43,12 @@ public interface ImapResponseWriter {
     void write(Literal literal) throws IOException;
 
     /**
-     * Write a ByteBuffer to the client
+     * Write a byte[] to the client
      * 
      * @param buffer
-     *            <code>ByteBuffer</code> to be written, not null
+     *            <code>byte array</code> to be written, not null
      * @throws IOException
      */
-    void write(ByteBuffer buffer) throws IOException;
+    void write(byte[] buffer) throws IOException;
 
 }

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
 Mon Aug 22 10:40:07 2011
@@ -20,7 +20,6 @@
 package org.apache.james.imap.encode.base;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 
 import javax.mail.Flags;
@@ -184,7 +183,7 @@ public class ImapResponseComposerImpl im
      */
     public ImapResponseComposer end() throws IOException {
         buffer.write(LINE_END.getBytes());
-        writer.write(ByteBuffer.wrap(buffer.toByteArray()));
+        writer.write(buffer.toByteArray());
         buffer.reset();
         return this;
     }

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java
 Mon Aug 22 10:40:07 2011
@@ -20,19 +20,20 @@
 package org.apache.james.imap.main;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
-import java.nio.channels.Channels;
+import org.apache.james.imap.encode.ImapResponseWriter;
+import org.apache.james.imap.message.response.Literal;
 
 /**
  * Class providing methods to send response messages from the server to the
  * client.
  */
-public class OutputStreamImapResponseWriter extends ChannelImapResponseWriter {
+public class OutputStreamImapResponseWriter implements ImapResponseWriter {
 
     private final OutputStream output;
 
     public OutputStreamImapResponseWriter(OutputStream output) {
-        super(Channels.newChannel(output));
         this.output = output;
     }
 
@@ -40,4 +41,35 @@ public class OutputStreamImapResponseWri
         output.flush();
     }
 
+
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.james.imap.encode.ImapResponseWriter#write(org.apache.james
+     * .imap.message.response.Literal)
+     */
+    public void write(Literal literal) throws IOException {
+        InputStream in = null;
+        try {
+            in = literal.getInputStream();
+
+            byte[] buffer = new byte[1024];
+            for (int len; (len = in.read(buffer)) != -1;) {
+                output.write(buffer, 0, len);
+            }
+        } finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+
+    }
+
+    @Override
+    public void write(byte[] buffer) throws IOException {
+        output.write(buffer);
+    }
+
 }

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=1160196&r1=1160195&r2=1160196&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
 Mon Aug 22 10:40:07 2011
@@ -29,17 +29,10 @@ public interface Literal {
      * 
      * @return number of octets which {@link #writeTo(WritableByteChannel)} 
will
      *         put onto the channel
+     * @throws IOException 
      */
-    public long size();
+    public long size() throws IOException;
 
-    /**
-     * 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;
 
     /**
      * Return the Literal as {@link InputStream}

Modified: 
james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java
 (original)
+++ 
james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java
 Mon Aug 22 10:40:07 2011
@@ -21,9 +21,7 @@ package org.apache.james.imap.encode.bas
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.Channels;
-import java.nio.channels.WritableByteChannel;
+import java.io.InputStream;
 
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.encode.ImapResponseWriter;
@@ -37,7 +35,6 @@ public class ByteImapResponseWriter impl
 
 
     private ByteArrayOutputStream out;
-    private WritableByteChannel channel;
 
 
     public ByteImapResponseWriter() {
@@ -55,15 +52,27 @@ public class ByteImapResponseWriter impl
     
     public void clear() {
         this.out = new ByteArrayOutputStream();
-        channel = Channels.newChannel(out);
     }
 
     public void write(Literal literal) throws IOException {
-        literal.writeTo(channel);
-    }
-    public void write(ByteBuffer buffer) throws IOException {
-        while (channel.write(buffer) > 0) { // NOPMD false positive
-            // Write all
+        InputStream in = null;
+        try {
+            in = literal.getInputStream();
+
+            byte[] buffer = new byte[1024];
+            for (int len; (len = in.read(buffer)) != -1;) {
+                out.write(buffer, 0, len);
+            }
+        } finally {
+            if (in != null) {
+                in.close();
+            }
         }
     }
+
+    @Override
+    public void write(byte[] buffer) throws IOException {
+        out.write(buffer);
+    }
+
 }

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=1160196&r1=1160195&r2=1160196&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
 Mon Aug 22 10:40:07 2011
@@ -22,21 +22,18 @@
  */
 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;
+import org.apache.james.mailbox.MailboxException;
 
-final class ContentBodyElement implements BodyElement {
+class ContentBodyElement implements BodyElement {
     private final String name;
 
-    private final Content content;
+    protected final Content content;
 
     public ContentBodyElement(final String name, final Content content) {
         super();
@@ -52,29 +49,23 @@ final class ContentBodyElement implement
     }
 
     /**
+     * @throws MailboxException 
      * @see 
org.apache.james.imap.message.response.FetchResponse.BodyElement#size()
      */
-    public long size() {
-        return content.size();
+    public long size() throws IOException {
+        try {
+            return content.size();
+        } catch (MailboxException e) {
+            throw new IOException("Unable to get size for body element",e);
+        }
     }
 
-    /**
-     * @see 
org.apache.james.imap.message.response.FetchResponse.BodyElement#writeTo(WritableByteChannel)
-     */
-    public void writeTo(WritableByteChannel channel) throws IOException {
-        content.writeTo(channel);
-    }
 
     /*
      * (non-Javadoc)
      * @see org.apache.james.imap.message.response.Literal#getInputStream()
      */
     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());
+        return content.getInputStream();
     }
 }
\ No newline at end of file

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java
 Mon Aug 22 10:40:07 2011
@@ -18,8 +18,9 @@
  ****************************************************************/
 package org.apache.james.imap.processor.fetch;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.nio.channels.WritableByteChannel;
+import java.io.InputStream;
 
 import org.apache.james.mailbox.Content;
 
@@ -30,17 +31,15 @@ import org.apache.james.mailbox.Content;
 public class EmptyContent implements Content{
 
     /**
-     * Write nothing as this {@link Content} is empty
-     */
-    public void writeTo(WritableByteChannel channel) throws IOException {
-        // do nothing..
-    }
-
-    /**
      * Return 0 as this {@link Content} is empty
      */
     public long size() {
         return 0;
     }
 
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream("".getBytes());
+    }
+
 }

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
 Mon Aug 22 10:40:07 2011
@@ -22,6 +22,7 @@
  */
 package org.apache.james.imap.processor.fetch;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
@@ -194,7 +195,7 @@ public final class FetchResponseBuilder 
     }
 
     private FetchResponse.Envelope buildEnvelope(final MessageResult result) 
throws MailboxException {
-        return envelopeBuilder.buildEnvelope(result);
+        return envelopeBuilder.buildEnvelope(result.getHeaders());
     }
 
     private void setSize(long size) {
@@ -222,6 +223,7 @@ public final class FetchResponseBuilder 
 
     private FetchResponse.BodyElement bodyContent(final MessageResult 
messageResult, final String name, final int specifier, final int[] path, final 
Collection<String> names, final boolean isBase) throws MailboxException {
         final FetchResponse.BodyElement fullResult;
+
         switch (specifier) {
         case BodyFetchElement.CONTENT:
             fullResult = content(messageResult, name, path, isBase);
@@ -265,7 +267,10 @@ public final class FetchResponseBuilder 
                 numberOfOctetsAsLong = numberOfOctets.longValue();
             }
             final long firstOctetAsLong = firstOctet.longValue();
+
             result = new PartialFetchBodyElement(fullResult, firstOctetAsLong, 
numberOfOctetsAsLong);
+            
+           
         }
         return result;
     }
@@ -274,7 +279,11 @@ public final class FetchResponseBuilder 
         final FetchResponse.BodyElement result;
         Content body;
         if (isBase) {
-            body = messageResult.getBody();
+            try {
+                body = messageResult.getBody();
+            } catch (IOException e) {
+                throw new MailboxException("Unable to get TEXT of body", e);
+            }
         } else {
             MessageResult.MimePath mimePath = new MimePathImpl(path);
             body = messageResult.getBody(mimePath);
@@ -309,17 +318,39 @@ public final class FetchResponseBuilder 
                     result.noBody();
                 }
               
-            } else if (content(messageResult, name, path, isBase).size() <= 0) 
{
-                // Seems like this mail has no body 
-                result.noBody();
-            }
+            } else
+                try {
+                    if (content(messageResult, name, path, isBase).size() <= 
0) {
+                        // Seems like this mail has no body 
+                        result.noBody();
+                    }
+                } catch (IOException e) {
+                    throw new MailboxException("Unable to get size of header 
body element", e);
+                }
         }
         return result;
     }
-    private FetchResponse.BodyElement headers(final MessageResult 
messageResult, String name, final int[] path, final boolean isBase) throws 
MailboxException {        
-        final Iterator<MessageResult.Header> headers = 
getHeaders(messageResult, path, isBase);
-        List<MessageResult.Header> lines = MessageResultUtils.getAll(headers);
-        return headerBodyElement(messageResult, name, lines, path, isBase);
+    private FetchResponse.BodyElement headers(final MessageResult 
messageResult, String name, final int[] path, final boolean isBase) throws 
MailboxException {      
+        if (isBase) {
+            // if its base we can just return the raw headers without parsing
+            // them. See MAILBOX-311 and IMAP-?
+            HeadersBodyElement element = new HeadersBodyElement(name, 
messageResult.getHeaders());
+            try {
+                if (messageResult.getSize() - element.size() <= 0) {
+                    // Seems like this mail has no body
+                    element.noBody();
+
+                }
+            } catch (IOException e) {
+                throw new MailboxException("Unable to get size of header body 
element", e);
+
+            }
+            return element;
+        } else {
+            final Iterator<MessageResult.Header> headers = 
getHeaders(messageResult, path, isBase);
+            List<MessageResult.Header> lines = 
MessageResultUtils.getAll(headers);
+            return headerBodyElement(messageResult, name, lines, path, isBase);
+        }
     }
 
     private FetchResponse.BodyElement fieldsNot(final MessageResult 
messageResult, String name, final int[] path, Collection<String> names, final 
boolean isBase) throws MailboxException {
@@ -338,7 +369,7 @@ public final class FetchResponseBuilder 
     private Iterator<MessageResult.Header> getHeaders(final MessageResult 
messageResult, final int[] path, final boolean isBase) throws MailboxException {
         final Iterator<MessageResult.Header> headers;
         if (isBase) {
-            headers = messageResult.headers();
+            headers = messageResult.getHeaders().headers();
         } else {
             MessageResult.MimePath mimePath = new MimePathImpl(path);
             headers = messageResult.iterateHeaders(mimePath);
@@ -356,11 +387,17 @@ public final class FetchResponseBuilder 
         final FetchResponse.BodyElement result;
         Content full;
         if (isBase) {
-            full = messageResult.getFullContent();
+            try {
+                full = messageResult.getFullContent();
+
+            } catch (IOException e) {
+                throw new MailboxException("Unable to get content", e);
+            }
         } else {
             MessageResult.MimePath mimePath = new MimePathImpl(path);
             full = messageResult.getMimeBody(mimePath);
         }
+
         if (full == null) {
             full = new EmptyContent();
         }

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=1160196&r1=1160195&r2=1160196&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
 Mon Aug 22 10:40:07 2011
@@ -26,6 +26,7 @@ import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.message.response.FetchResponse.BodyElement;
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageResult;
 
 /**
@@ -33,7 +34,7 @@ import org.apache.james.mailbox.MessageR
  */
 public class HeaderBodyElement extends MimeBodyElement {
 
-    public HeaderBodyElement(final String name, final 
List<MessageResult.Header> headers) {
+    public HeaderBodyElement(final String name, final 
List<MessageResult.Header> headers) throws MailboxException {
         super(name, headers);
     }
 
@@ -49,7 +50,7 @@ public class HeaderBodyElement extends M
     }
 
     @Override
-    protected long calculateSize(List<MessageResult.Header> headers) {
+    protected long calculateSize(List<MessageResult.Header> headers) throws 
MailboxException {
         if (headers.isEmpty()) {
             // even if the headers are empty we need to include the headers 
body
             // seperator

Added: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java?rev=1160196&view=auto
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
 (added)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
 Mon Aug 22 10:40:07 2011
@@ -0,0 +1,68 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imap.processor.fetch;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
+
+import org.apache.james.mailbox.Content;
+
+public class HeadersBodyElement extends ContentBodyElement{
+
+    private boolean noBody = false;
+    
+    public HeadersBodyElement(String name, Content content) {
+        super(name, content);
+    }
+
+
+    /**
+     * Indicate that there is no text body in the message. In this case we 
don't need to write a single CRLF in anycase if
+     * this Element does not contain a header.
+     * @throws IOException 
+     */
+    public void noBody() throws IOException {
+        if (super.size() == 0) {
+            noBody = true;
+        }
+    }
+    
+    @Override
+    public long size() throws IOException {
+        if (noBody) {
+            return 0;
+        } else {
+            return super.size() + 2;
+
+        }
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        if (!noBody &&size() > 0) {
+            return new SequenceInputStream(super.getInputStream(),  new 
ByteArrayInputStream("\r\n".getBytes("US-ASCII")));
+        } else {
+            return super.getInputStream();
+        }
+    }
+
+}

Propchange: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java
 Mon Aug 22 10:40:07 2011
@@ -22,14 +22,13 @@ 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.nio.charset.Charset;
 import java.util.Iterator;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.message.response.FetchResponse.BodyElement;
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageResult;
 
 
@@ -43,9 +42,10 @@ public class MimeBodyElement implements 
     protected final List<MessageResult.Header> headers;
 
     protected long size;
+    private static final Charset US_ASCII = Charset.forName("US-ASCII");
 
 
-    public MimeBodyElement(final String name, final List<MessageResult.Header> 
headers) {
+    public MimeBodyElement(final String name, final List<MessageResult.Header> 
headers) throws MailboxException {
         super();
         this.name = name;
         this.headers = headers;
@@ -65,7 +65,7 @@ public class MimeBodyElement implements 
     }
     
 
-    protected long calculateSize(List<MessageResult.Header> headers) {
+    protected long calculateSize(List<MessageResult.Header> headers) throws 
MailboxException {
         final int result;
         if (headers.isEmpty()) {
            result = 0;
@@ -90,39 +90,28 @@ public class MimeBodyElement implements 
         return size;
     }
 
+
     /*
      * (non-Javadoc)
      * 
-     * @see
-     * org.apache.james.imap.message.response.FetchResponse.BodyElement#writeTo
-     * (java.nio.channels.WritableByteChannel)
+     * @see org.apache.james.imap.message.response.FetchResponse.BodyElement#
+     * getInputStream()
      */
-    public void writeTo(WritableByteChannel channel) throws IOException {
-        ByteBuffer endLine = 
ByteBuffer.wrap(ImapConstants.LINE_END.getBytes());
-        endLine.rewind();
+    public InputStream getInputStream() throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
         for (final Iterator<MessageResult.Header> it = headers.iterator(); 
it.hasNext();) {
             MessageResult.Header header = it.next();
-            header.writeTo(channel);
-            while (channel.write(endLine) > 0) { // NOPMD false positive
+            try {
+                out.write((header.getName() + ": " + header.getValue() + 
ImapConstants.LINE_END).getBytes(US_ASCII));
+            } catch (MailboxException e) {
+                throw new IOException("Unable to read header", e);
             }
-            endLine.rewind();
         }
         // no empty line with CRLF for MIME headers. See IMAP-297
         if (size > 0) {
-            while (channel.write(endLine) > 0) { // NOPMD false positive
-            }
+            out.write(ImapConstants.LINE_END.getBytes());
         }
-    }
-
-    /*
-     * (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());
     }
 

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=1160196&r1=1160195&r2=1160196&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
 Mon Aug 22 10:40:07 2011
@@ -22,7 +22,6 @@ package org.apache.james.imap.processor.
 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;
 
@@ -59,7 +58,7 @@ final class PartialFetchBodyElement impl
      * (non-Javadoc)
      * @see org.apache.james.imap.message.response.Literal#size()
      */
-    public long size() {
+    public long size() throws IOException {
         final long size = delegate.size();
         final long lastOctet = this.numberOfOctets + firstOctet;
         final long result;
@@ -73,14 +72,6 @@ final class PartialFetchBodyElement impl
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see 
org.apache.james.imap.message.response.Literal#writeTo(java.nio.channels.WritableByteChannel)
-     */
-    public void writeTo(WritableByteChannel channel) throws IOException {
-        PartialWritableByteChannel partialChannel = new 
PartialWritableByteChannel(channel, firstOctet, size());
-        delegate.writeTo(partialChannel);
-    }
 
     /*
      * (non-Javadoc)
@@ -159,15 +150,14 @@ final class PartialFetchBodyElement impl
             if (pos >= length) {
                 return -1;
             }
-
+            int readLimit;
             if (pos + len >= length) {
-                int readLimit = (int) length - (int) pos;
-                pos = length;
-
-                return super.read(b, off, readLimit);
+                readLimit = (int) length - (int) pos;
+            } else {
+                readLimit = len;
             }
 
-            int i = super.read(b, off, len);
+            int i = super.read(b, off, readLimit);
             pos += i;
             return i;
 

Modified: 
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java
 (original)
+++ 
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java
 Mon Aug 22 10:40:07 2011
@@ -22,7 +22,7 @@ package org.apache.james.imap.processor.
 import static org.junit.Assert.*;
 
 import java.io.IOException;
-import java.nio.channels.WritableByteChannel;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -66,10 +66,12 @@ public class MessageResultUtilsTest {
             return value;
         }
 
-        public void writeTo(WritableByteChannel channel) throws IOException {
-
+        @Override
+        public InputStream getInputStream() throws IOException {
+            return null;
         }
 
+
     }
 
     @Before



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to