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 rd...@apache.org on 2009/01/18 20:03:53 UTC

svn commit: r735521 - in /james/protocols/imap/trunk: api/src/main/java/org/apache/james/api/imap/imap4rev1/ decode/src/main/java/org/apache/james/imap/decode/base/ decode/src/main/java/org/apache/james/imap/decode/imap4rev1/ mailbox/src/main/java/org/...

Author: rdonkin
Date: Sun Jan 18 11:03:53 2009
New Revision: 735521

URL: http://svn.apache.org/viewvc?rev=735521&view=rev
Log:
Step one to MimeMessage replacement: alter interface and move usage inside mailboxes. Also, lose string creation.

Modified:
    james/protocols/imap/trunk/api/src/main/java/org/apache/james/api/imap/imap4rev1/Imap4Rev1MessageFactory.java
    james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
    james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/imap4rev1/AppendCommandParser.java
    james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java
    james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/AppendRequest.java
    james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/BaseImap4Rev1MessageFactory.java
    james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/AppendProcessor.java
    james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
    james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java

Modified: james/protocols/imap/trunk/api/src/main/java/org/apache/james/api/imap/imap4rev1/Imap4Rev1MessageFactory.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/api/src/main/java/org/apache/james/api/imap/imap4rev1/Imap4Rev1MessageFactory.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/api/src/main/java/org/apache/james/api/imap/imap4rev1/Imap4Rev1MessageFactory.java (original)
+++ james/protocols/imap/trunk/api/src/main/java/org/apache/james/api/imap/imap4rev1/Imap4Rev1MessageFactory.java Sun Jan 18 11:03:53 2009
@@ -21,7 +21,6 @@
 import java.util.Date;
 
 import javax.mail.Flags;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapMessage;
@@ -56,7 +55,7 @@
 
     public ImapMessage createAppendMessage(ImapCommand command,
             String mailboxName, Flags flags, Date datetime,
-            MimeMessage message, String tag);
+            byte[] message, String tag);
 
     public ImapMessage createAuthenticateMessage(final ImapCommand command,
             final String authType, final String tag);

Modified: james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java (original)
+++ james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java Sun Jan 18 11:03:53 2009
@@ -324,45 +324,50 @@
         if (charset == null) {
             return consumeLiteral(request, US_ASCII);
         } else {
-            // The 1st character must be '{'
-            consumeChar(request, '{');
-
-            StringBuffer digits = new StringBuffer();
-            char next = request.nextChar();
-            while (next != '}' && next != '+') {
-                digits.append(next);
-                request.consume();
-                next = request.nextChar();
-            }
-
-            // If the number is *not* suffixed with a '+', we *are* using a
-            // synchronized literal,
-            // and we need to send command continuation request before reading
-            // data.
-            boolean synchronizedLiteral = true;
-            // '+' indicates a non-synchronized literal (no command continuation
-            // request)
-            if (next == '+') {
-                synchronizedLiteral = false;
-                consumeChar(request, '+');
-            }
-
-            // Consume the '}' and the newline
-            consumeChar(request, '}');
-            consumeCRLF(request);
-
-            if (synchronizedLiteral) {
-                request.commandContinuationRequest();
-            }
-
-            final int size = Integer.parseInt(digits.toString());
-            final byte[] bytes = new byte[size];
-            request.read(bytes);
+            final byte[] bytes = consumeLiteral(request);
             final ByteBuffer buffer = ByteBuffer.wrap(bytes);
             return decode(charset, buffer);
         }
     }
 
+    protected byte[] consumeLiteral(final ImapRequestLineReader request) throws ProtocolException {
+        // The 1st character must be '{'
+        consumeChar(request, '{');
+
+        StringBuffer digits = new StringBuffer();
+        char next = request.nextChar();
+        while (next != '}' && next != '+') {
+            digits.append(next);
+            request.consume();
+            next = request.nextChar();
+        }
+
+        // If the number is *not* suffixed with a '+', we *are* using a
+        // synchronized literal,
+        // and we need to send command continuation request before reading
+        // data.
+        boolean synchronizedLiteral = true;
+        // '+' indicates a non-synchronized literal (no command continuation
+        // request)
+        if (next == '+') {
+            synchronizedLiteral = false;
+            consumeChar(request, '+');
+        }
+
+        // Consume the '}' and the newline
+        consumeChar(request, '}');
+        consumeCRLF(request);
+
+        if (synchronizedLiteral) {
+            request.commandContinuationRequest();
+        }
+
+        final int size = Integer.parseInt(digits.toString());
+        final byte[] bytes = new byte[size];
+        request.read(bytes);
+        return bytes;
+    }
+
     private String decode(final Charset charset, final ByteBuffer buffer)
             throws ProtocolException {
         try {

Modified: james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/imap4rev1/AppendCommandParser.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/imap4rev1/AppendCommandParser.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/imap4rev1/AppendCommandParser.java (original)
+++ james/protocols/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/imap4rev1/AppendCommandParser.java Sun Jan 18 11:03:53 2009
@@ -18,11 +18,9 @@
  ****************************************************************/
 package org.apache.james.imap.decode.imap4rev1;
 
-import java.io.ByteArrayInputStream;
 import java.util.Date;
 
 import javax.mail.Flags;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapMessage;
@@ -76,32 +74,6 @@
         }
     }
 
-    /**
-     * Reads a MimeMessage encoded as a string literal from the request. TODO
-     * shouldn't need to read as a string and write out bytes use
-     * FixedLengthInputStream instead. Hopefully it can then be dynamic.
-     * 
-     * @param request
-     *            The Imap APPEND request
-     * @return A MimeMessage read off the request.
-     */
-    public MimeMessage mimeMessage(ImapRequestLineReader request)
-            throws ProtocolException {
-        request.nextWordChar();
-        String mailString = consumeLiteral(request, null);
-        MimeMessage mm = null;
-
-        try {
-            byte[] messageBytes = mailString.getBytes("US-ASCII");
-            mm = new MimeMessage(null, new ByteArrayInputStream(messageBytes));
-        } catch (Exception e) {
-            throw new ProtocolException("UnexpectedException: "
-                    + e.getMessage(), e);
-
-        }
-        return mm;
-    }
-
     protected ImapMessage decode(ImapCommand command,
             ImapRequestLineReader request, String tag) throws ProtocolException {
         String mailboxName = mailbox(request);
@@ -113,7 +85,8 @@
         if (datetime == null) {
             datetime = new Date();
         }
-        MimeMessage message = mimeMessage(request);
+        request.nextWordChar();
+        final byte[] message = consumeLiteral(request);
         endLine(request);
         final Imap4Rev1MessageFactory factory = getMessageFactory();
         final ImapMessage result = factory.createAppendMessage(command,

Modified: james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java (original)
+++ james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java Sun Jan 18 11:03:53 2009
@@ -23,7 +23,6 @@
 import java.util.Iterator;
 
 import javax.mail.Flags;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.james.imap.mailbox.MessageResult.FetchGroup;
 
@@ -147,6 +146,7 @@
      *            minimal fetch group only
      * @param mailboxSession
      *            TODO
+     * @param isRecent TODO
      * @return MessageResult with the fields defined by <b>result</b>
      *         <ul>
      *         <li> IMAP, Javamail Folder: nothing required </li>
@@ -156,8 +156,8 @@
      * @throws MailboxException
      *             if anything went wrong
      */
-    MessageResult appendMessage(MimeMessage message, Date internalDate,
-            FetchGroup fetchGroup, MailboxSession mailboxSession)
+    MessageResult appendMessage(byte[] message, Date internalDate,
+            FetchGroup fetchGroup, MailboxSession mailboxSession, boolean isRecent)
             throws MailboxException;
 
     /**

Modified: james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/AppendRequest.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/AppendRequest.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/AppendRequest.java (original)
+++ james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/AppendRequest.java Sun Jan 18 11:03:53 2009
@@ -21,7 +21,6 @@
 import java.util.Date;
 
 import javax.mail.Flags;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.james.api.imap.ImapCommand;
 
@@ -32,10 +31,10 @@
 
     private final Date datetime;
 
-    private final MimeMessage message;
+    private final byte[] message;
 
     public AppendRequest(ImapCommand command, String mailboxName, Flags flags,
-            Date datetime, MimeMessage message, String tag) {
+            Date datetime, byte[] message, String tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.flags = flags;
@@ -55,7 +54,7 @@
         return mailboxName;
     }
 
-    public MimeMessage getMessage() {
+    public byte[] getMessage() {
         return message;
     }
 }

Modified: james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/BaseImap4Rev1MessageFactory.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/BaseImap4Rev1MessageFactory.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/BaseImap4Rev1MessageFactory.java (original)
+++ james/protocols/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/imap4rev1/BaseImap4Rev1MessageFactory.java Sun Jan 18 11:03:53 2009
@@ -21,7 +21,6 @@
 import java.util.Date;
 
 import javax.mail.Flags;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapMessage;
@@ -49,7 +48,7 @@
 
     public ImapMessage createAppendMessage(ImapCommand command,
             String mailboxName, Flags flags, Date datetime,
-            MimeMessage message, String tag) {
+            byte[] message, String tag) {
         return new AppendRequest(command, mailboxName, flags, datetime,
                 message, tag);
     }

Modified: james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/AppendProcessor.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/AppendProcessor.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/AppendProcessor.java (original)
+++ james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/AppendProcessor.java Sun Jan 18 11:03:53 2009
@@ -21,10 +21,6 @@
 
 import java.util.Date;
 
-import javax.mail.MessagingException;
-import javax.mail.Flags.Flag;
-import javax.mail.internet.MimeMessage;
-
 import org.apache.commons.logging.Log;
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapMessage;
@@ -64,7 +60,7 @@
             String tag, ImapCommand command, Responder responder) {
         final AppendRequest request = (AppendRequest) message;
         final String mailboxName = request.getMailboxName();
-        final MimeMessage mimeMessage = request.getMessage();
+        final byte[] messageBytes = request.getMessage();
         final Date datetime = request.getDatetime();
         // TODO: Flags are ignore: check whether the specification says that
         // they should be processed
@@ -73,7 +69,7 @@
             final String fullMailboxName = buildFullName(session, mailboxName);
             final MailboxManager mailboxManager = getMailboxManager();
             final Mailbox mailbox = mailboxManager.getMailbox(fullMailboxName);
-            appendToMailbox(mimeMessage, datetime, session, tag, command,
+            appendToMailbox(messageBytes, datetime, session, tag, command,
                     mailbox, responder, fullMailboxName);
 
         } catch (MailboxException mme) {
@@ -96,7 +92,7 @@
 
     }
 
-    private void appendToMailbox(final MimeMessage message, final Date datetime,
+    private void appendToMailbox(final byte[] message, final Date datetime,
             final ImapSession session, final String tag, final ImapCommand command,
             final Mailbox mailbox, Responder responder, final String fullMailboxName) {
         try {
@@ -105,11 +101,8 @@
             final SelectedMailbox selectedMailbox = session.getSelected();
             final boolean isSelectedMailbox = selectedMailbox != null
                     && fullMailboxName.equals(selectedMailbox.getName());
-            if (!isSelectedMailbox) {
-                message.setFlag(Flag.RECENT, true);
-            }
             final MessageResult result = mailbox.appendMessage(message,
-                    datetime, FetchGroupImpl.MINIMAL, mailboxSession);
+                    datetime, FetchGroupImpl.MINIMAL, mailboxSession, !isSelectedMailbox);
             final long uid = result.getUid();
             if (isSelectedMailbox) {
                 selectedMailbox.addRecent(uid);
@@ -119,9 +112,6 @@
         } catch (MailboxException e) {
             // TODO why not TRYCREATE?
             no(command, tag, responder, e);
-        } catch (MessagingException e) {
-            no(command, tag, responder, e);
         }
-
     }
 }

Modified: james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java (original)
+++ james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java Sun Jan 18 11:03:53 2009
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.store;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -86,8 +87,8 @@
         return (int) messageMapper.countMessagesInMailbox(mailboxId);
     }
 
-    public MessageResult appendMessage(MimeMessage mimeMessage, Date internalDate,
-            FetchGroup fetchGroup, MailboxSession mailboxSession)
+    public MessageResult appendMessage(byte[] messageBytes, Date internalDate,
+            FetchGroup fetchGroup, MailboxSession mailboxSession, boolean isRecent)
     throws MailboxException {
         final Mailbox mailbox = reserveNextUid();
 
@@ -103,6 +104,10 @@
                 // is
                 // inserted long before 4, when
                 // mail 4 is big and comes over a slow connection.
+                final MimeMessage mimeMessage = new MimeMessage(null, new ByteArrayInputStream(messageBytes));
+                if (isRecent) {
+                    mimeMessage.setFlag(Flags.Flag.RECENT, true);
+                }
                 final long uid = mailbox.getLastUid();
                 final int size = size(mimeMessage);
                 final byte[] body = body(mimeMessage);

Modified: james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java?rev=735521&r1=735520&r2=735521&view=diff
==============================================================================
--- james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java (original)
+++ james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java Sun Jan 18 11:03:53 2009
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailboxmanager.torque;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -115,8 +116,8 @@
         }
     }
 
-    public MessageResult appendMessage(MimeMessage message, Date internalDate,
-            FetchGroup fetchGroup, MailboxSession mailboxSession)
+    public MessageResult appendMessage(byte[] message, Date internalDate,
+            FetchGroup fetchGroup, MailboxSession mailboxSession, boolean isRecent)
             throws MailboxException {
 
         try {
@@ -141,14 +142,17 @@
                     messageRow.setMailboxId(getMailboxRow().getMailboxId());
                     messageRow.setUid(uid);
                     messageRow.setInternalDate(internalDate);
-
-                    final int size = size(message);
+                    final MimeMessage mimeMessage = new MimeMessage(null, new ByteArrayInputStream(message));
+                    if (isRecent) {
+                        mimeMessage.setFlag(Flags.Flag.RECENT, true);
+                    }
+                    final int size = size(mimeMessage);
                     messageRow.setSize(size);
-                    populateFlags(message, messageRow);
+                    populateFlags(mimeMessage, messageRow);
 
-                    addHeaders(message, messageRow);
+                    addHeaders(mimeMessage, messageRow);
 
-                    MessageBody mb = populateBody(message);
+                    MessageBody mb = populateBody(mimeMessage);
                     messageRow.addMessageBody(mb);
 
                     save(messageRow);



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