You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/08/22 08:22:55 UTC

svn commit: r1160119 - in /james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store: MimeDescriptorImpl.java ResultHeader.java streaming/FullByteContent.java streaming/PartContentBuilder.java

Author: norman
Date: Mon Aug 22 06:22:54 2011
New Revision: 1160119

URL: http://svn.apache.org/viewvc?rev=1160119&view=rev
Log:
Allow to access raw message header without parsing it. This will give us some possibilities to improve performance in imap and pop3. See MAILBOX-115

Modified:
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MimeDescriptorImpl.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/FullByteContent.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/PartContentBuilder.java

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MimeDescriptorImpl.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MimeDescriptorImpl.java?rev=1160119&r1=1160118&r2=1160119&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MimeDescriptorImpl.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MimeDescriptorImpl.java Mon Aug 22 06:22:54 2011
@@ -19,8 +19,10 @@
 
 package org.apache.james.mailbox.store;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -28,6 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageResult;
 import org.apache.james.mailbox.MimeDescriptor;
 import org.apache.james.mailbox.store.mail.model.Message;
@@ -44,6 +47,8 @@ import org.apache.james.mime4j.stream.Re
 
 public class MimeDescriptorImpl implements MimeDescriptor {
 
+    private final static Charset US_ASCII = Charset.forName("US-ASCII");
+    
     public static MimeDescriptorImpl build(final Message<?> document) throws IOException, MimeException {
         final MimeDescriptorImpl result;
         final String mediaType = document.getMediaType();
@@ -255,6 +260,7 @@ public class MimeDescriptorImpl implemen
 
     private final String md5;
 
+
     public MimeDescriptorImpl(final long bodyOctets,
             final String contentDescription, final String contentId,
             final long lines, final String subType, final String type,
@@ -349,4 +355,32 @@ public class MimeDescriptorImpl implemen
     public String getContentMD5() {
         return md5;
     }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        StringBuilder sb = new StringBuilder();
+        Iterator<MessageResult.Header> hIt = headers.iterator();
+        while(hIt.hasNext()) {
+            MessageResult.Header header = hIt.next();
+            try {
+                sb.append(header.getName()).append(": " ).append(header.getValue()).append("\r\n");
+            } catch (MailboxException e) {
+                throw new IOException("Unable to read headers", e);
+            }
+        }
+        return new ByteArrayInputStream(sb.toString().getBytes(US_ASCII));
+    }
+
+    @Override
+    public long size() throws MailboxException {
+        long result = 0;
+        for (final Iterator<MessageResult.Header> it = headers.iterator(); it.hasNext();) {
+            final MessageResult.Header header = it.next();
+            if (header != null) {
+                result += header.size();
+                result += 2;
+            }
+        }
+        return result;
+    }
 }

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java?rev=1160119&r1=1160118&r2=1160119&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java Mon Aug 22 06:22:54 2011
@@ -23,24 +23,20 @@
 package org.apache.james.mailbox.store;
 
 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 org.apache.james.mailbox.InputStreamContent;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageResult;
 
-public final class ResultHeader implements MessageResult.Header, InputStreamContent {
+public final class ResultHeader implements MessageResult.Header {
     private final String name;
 
     private final String value;
 
     private final long size;
-
+    private final static Charset US_ASCII = Charset.forName("US-ASCII");
 
     public ResultHeader(String name, String value) {
         this.name = name;
@@ -72,25 +68,6 @@ public final class ResultHeader implemen
         return size;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.Content#writeTo(java.nio.channels.WritableByteChannel)
-     */
-    public void writeTo(WritableByteChannel channel) throws IOException {
-        writeAll(channel, ResultUtils.US_ASCII.encode(name));
-        ByteBuffer buffer = ByteBuffer
-                .wrap(ResultUtils.BYTES_HEADER_FIELD_VALUE_SEP);
-        writeAll(channel, buffer);
-        writeAll(channel, ResultUtils.US_ASCII.encode(value));
-    }
-
-    private void writeAll(WritableByteChannel channel, ByteBuffer buffer)
-            throws IOException {
-        while (channel.write(buffer) > 0) {
-            // write more
-        }
-    }
-
     public String toString() {
         return "[HEADER " + name + ": " + value + "]";
     }
@@ -100,8 +77,6 @@ public final class ResultHeader implemen
      * @see org.apache.james.mailbox.InputStreamContent#getInputStream()
      */
     public InputStream getInputStream() throws IOException {
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        writeTo(Channels.newChannel(out));
-        return new ByteArrayInputStream(out.toByteArray());
+        return new ByteArrayInputStream((name + ": " + value).getBytes(US_ASCII));
     }
 }
\ No newline at end of file

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/FullByteContent.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/FullByteContent.java?rev=1160119&r1=1160118&r2=1160119&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/FullByteContent.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/FullByteContent.java Mon Aug 22 06:22:54 2011
@@ -28,6 +28,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.james.mailbox.Content;
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageResult;
 import org.apache.james.mailbox.MessageResult.Header;
 
@@ -43,13 +44,13 @@ public class FullByteContent implements 
     private byte[] body;
     private long size;
     
-    public FullByteContent(final byte[] body, final List<MessageResult.Header> headers) throws IOException {
+    public FullByteContent(final byte[] body, final List<MessageResult.Header> headers) throws MailboxException {
         this.headers = headers;
         this.body = body;
         this.size = caculateSize();
     }
     
-    protected long caculateSize() throws IOException{
+    protected long caculateSize() throws MailboxException{
         long result = body.length;
         result += 2;
         for (final Iterator<MessageResult.Header> it = headers.iterator(); it.hasNext();) {

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/PartContentBuilder.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/PartContentBuilder.java?rev=1160119&r1=1160118&r2=1160119&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/PartContentBuilder.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/PartContentBuilder.java Mon Aug 22 06:22:54 2011
@@ -27,6 +27,7 @@ import java.util.List;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.Content;
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageResult;
 import org.apache.james.mailbox.MessageResult.Header;
 import org.apache.james.mailbox.store.ResultHeader;
@@ -128,7 +129,7 @@ public class PartContentBuilder {
         }
     }
 
-    public Content getFullContent() throws IOException, UnexpectedEOFException, MimeException {
+    public Content getFullContent() throws IOException, UnexpectedEOFException, MimeException, MailboxException {
         final List<Header> headers = getMimeHeaders();
         final byte[] content = mimeBodyContent();
         return new FullByteContent(content, headers);



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