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 2010/04/06 20:48:15 UTC

svn commit: r931266 - in /james/imap/trunk: api/src/main/java/org/apache/james/imap/api/ api/src/main/java/org/apache/james/imap/api/message/request/ decode/ decode/src/main/java/org/apache/james/imap/decode/ decode/src/main/java/org/apache/james/imap/...

Author: norman
Date: Tue Apr  6 18:48:14 2010
New Revision: 931266

URL: http://svn.apache.org/viewvc?rev=931266&view=rev
Log:
Allow to append message without read it into memory first (IMAP-127)

Added:
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/EolInputStream.java
Modified:
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessage.java
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/request/SearchKey.java
    james/imap/trunk/decode/pom.xml
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/DecodingException.java
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/FixedLengthInputStream.java
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
    james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
    james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java
    james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java
    james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AppendRequest.java
    james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java
    james/imap/trunk/parent/pom.xml
    james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
    james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
    james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java
    james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessage.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessage.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessage.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessage.java Tue Apr  6 18:48:14 2010
@@ -28,4 +28,5 @@ package org.apache.james.imap.api;
  * </p>
  */
 public interface ImapMessage {
+  
 }

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java Tue Apr  6 18:48:14 2010
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.james.imap.api;
 
-import java.io.InputStream;
 import java.util.Date;
 
 import javax.mail.Flags;
@@ -29,6 +28,7 @@ import org.apache.james.imap.api.message
 import org.apache.james.imap.api.message.StatusDataItems;
 import org.apache.james.imap.api.message.request.SearchKey;
 import org.apache.james.imap.api.message.response.StatusResponse;
+import org.apache.james.imap.decode.base.EolInputStream;
 
 /**
  * Creates messages. Implementations may support message pooling but this is not
@@ -54,7 +54,7 @@ public interface ImapMessageFactory {
 
     public ImapMessage createAppendMessage(ImapCommand command,
             String mailboxName, Flags flags, Date datetime,
-            InputStream message, String tag);
+            EolInputStream message, String tag);
 
     public ImapMessage createAuthenticateMessage(final ImapCommand command,
             final String authType, final String tag);

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/request/SearchKey.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/request/SearchKey.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/request/SearchKey.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/request/SearchKey.java Tue Apr  6 18:48:14 2010
@@ -427,7 +427,9 @@ public final class SearchKey {
         int result = 1;
         result = PRIME * result + ((date == null) ? 0 : date.hashCode());
         result = PRIME * result + ((name == null) ? 0 : name.hashCode());
-        result = PRIME * result + sequence.length;
+        if (sequence != null) {
+            result = PRIME * result + sequence.length;
+        }
         result = PRIME * result + (int) (size ^ (size >>> 32));
         result = PRIME * result + ((keys == null) ? 0 : keys.hashCode());
         result = PRIME * result + type;

Modified: james/imap/trunk/decode/pom.xml
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/pom.xml?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/decode/pom.xml (original)
+++ james/imap/trunk/decode/pom.xml Tue Apr  6 18:48:14 2010
@@ -59,7 +59,10 @@
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>apache-james-imap-api</artifactId>

Modified: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/DecodingException.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/DecodingException.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/DecodingException.java (original)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/DecodingException.java Tue Apr  6 18:48:14 2010
@@ -19,6 +19,8 @@
 
 package org.apache.james.imap.decode;
 
+import java.io.IOException;
+
 import org.apache.james.imap.api.display.HumanReadableText;
 
 /**
@@ -36,7 +38,7 @@ import org.apache.james.imap.api.display
  * <li>{@link HumanReadableText#BAD_IO_ENCODING}</li>
  * </ul>
  */
-public class DecodingException extends Exception {
+public class DecodingException extends IOException {
 
     private static final long serialVersionUID = 8719349386686261422L;
 

Modified: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java (original)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java Tue Apr  6 18:48:14 2010
@@ -24,6 +24,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 
 import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.decode.base.FixedLengthInputStream;
 
 /**
  * Wraps the client input reader with a bunch of convenience methods, allowing
@@ -161,25 +162,12 @@ public class ImapRequestLineReader {
      * @throws DecodingException
      *             If a char can't be read into each array element.
      */
-    public void read(byte[] holder) throws DecodingException {
-        int readTotal = 0;
-        try {
-            while (readTotal < holder.length) {
-                int count = 0;
-                count = input
-                        .read(holder, readTotal, holder.length - readTotal);
-                if (count == -1) {
-                    throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Unexpected end of stream.");
-                }
-                readTotal += count;
-            }
-            // Unset the next char.
-            nextSeen = false;
-            nextChar = 0;
-        } catch (IOException e) {
-            throw new DecodingException(HumanReadableText.SOCKET_IO_FAILURE, 
-                    "Error reading from stream.", e);
-        }
+    public InputStream read(int size) throws DecodingException {
+
+        // Unset the next char.
+        nextSeen = false;
+        nextChar = 0;
+        return new FixedLengthInputStream(input, size);
 
     }
 

Modified: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java (original)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java Tue Apr  6 18:48:14 2010
@@ -19,6 +19,9 @@
 
 package org.apache.james.imap.decode.base;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.CharacterCodingException;
@@ -33,6 +36,7 @@ import java.util.Date;
 
 import javax.mail.Flags;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.james.imap.api.ImapMessageFactory;
 import org.apache.james.imap.api.ImapCommand;
@@ -115,6 +119,7 @@ public abstract class AbstractImapComman
 
         } catch (DecodingException e) {
             logger.debug("Cannot parse protocol ", e);
+            e.printStackTrace();
             result = messageFactory.taggedBad(tag, command, e.getKey());
         }
         return result;
@@ -319,13 +324,19 @@ public abstract class AbstractImapComman
         if (charset == null) {
             return consumeLiteral(request, US_ASCII);
         } else {
-            final byte[] bytes = consumeLiteral(request);
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            try {
+                IOUtils.copy(consumeLiteral(request),out);
+            } catch (IOException e) {
+                throw new DecodingException(HumanReadableText.BAD_IO_ENCODING, "Bad character encoding",  e);
+            }
+            final byte[] bytes = out.toByteArray();
             final ByteBuffer buffer = ByteBuffer.wrap(bytes);
             return decode(charset, buffer);
         }
     }
 
-    protected byte[] consumeLiteral(final ImapRequestLineReader request) throws DecodingException {
+    protected InputStream  consumeLiteral(final ImapRequestLineReader request) throws DecodingException {
         // The 1st character must be '{'
         consumeChar(request, '{');
 
@@ -358,15 +369,12 @@ public abstract class AbstractImapComman
         }
 
         final int size = Integer.parseInt(digits.toString());
-        final byte[] bytes = new byte[size];
-        request.read(bytes);
-        return bytes;
+        return request.read(size);
     }
 
     private String decode(final Charset charset, final ByteBuffer buffer)
             throws DecodingException {
         try {
-
             final String result = charset.newDecoder().onMalformedInput(
                     CodingErrorAction.REPORT).onUnmappableCharacter(
                     CodingErrorAction.REPORT).decode(buffer).toString();

Added: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/EolInputStream.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/EolInputStream.java?rev=931266&view=auto
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/EolInputStream.java (added)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/EolInputStream.java Tue Apr  6 18:48:14 2010
@@ -0,0 +1,80 @@
+/****************************************************************
+ * 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.decode.base;
+
+import java.io.FileInputStream;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.james.imap.decode.ImapRequestLineReader;
+
+/**
+ * {@link FileInputStream} which call the eol() method of the {@link ImapRequestLineReader} when the end 
+ * of the wrapped {@link InputStream} is reached
+ * 
+ *
+ */
+public class EolInputStream extends FilterInputStream{
+
+    private ImapRequestLineReader reader;
+
+    public EolInputStream(ImapRequestLineReader reader, InputStream in) {
+        super(in);
+        this.reader = reader;
+    }
+
+    @Override
+    public int read() throws IOException {
+        int i = in.read();
+        eol(i);
+        return i;
+    }
+
+    @Override
+    public int read(byte[] b, int off, int len) throws IOException {
+        int i = in.read(b, off, len);
+        eol(i);
+        return i;
+    }
+
+    @Override
+    public int read(byte[] b) throws IOException {
+        int i = in.read(b);
+        eol(i);
+        return i;
+    }
+
+    private void eol(int i ) throws IOException{
+        if (i == -1) {
+            reader.eol();
+        }
+    }
+    
+    /**
+     * Consume the whole stream
+     */
+    public void cosume() { 
+        try {
+            while (read() != -1);
+        } catch (IOException e) {
+            // do nothing here
+        }
+    }
+}

Modified: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/FixedLengthInputStream.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/FixedLengthInputStream.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/FixedLengthInputStream.java (original)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/base/FixedLengthInputStream.java Tue Apr  6 18:48:14 2010
@@ -24,14 +24,13 @@ import java.io.IOException;
 import java.io.InputStream;
 
 /**
- * This class is not yet used in the AppendCommand.
  * 
  * An input stream which reads a fixed number of bytes from the underlying input
  * stream. Once the number of bytes has been read, the FixedLengthInputStream
  * will act as thought the end of stream has been reached, even if more bytes
  * are present in the underlying input stream.
  */
-class FixedLengthInputStream extends FilterInputStream {
+public class FixedLengthInputStream extends FilterInputStream {
     private long pos = 0;
 
     private long length;
@@ -50,22 +49,30 @@ class FixedLengthInputStream extends Fil
     }
 
     public int read(byte b[]) throws IOException {
-        if (pos >= length) {
+
+        if (pos >= length) {   
             return -1;
         }
 
         if (pos + b.length >= length) {
+            int readLimit = (int) length - (int) pos;
             pos = length;
-            return super.read(b, 0, (int) (length - pos));
+
+            return super.read(b, 0, readLimit);
         }
 
         pos += b.length;
+
         return super.read(b);
     }
 
     public int read(byte b[], int off, int len) throws IOException {
-        throw new IOException("Not implemented");
-        // return super.read( b, off, len );
+        byte[] tmpArray = new byte[len]; 
+        int a = in.read(tmpArray);
+        for (int i = 0; i < tmpArray.length; i++) {
+            b[off + i] = tmpArray[i];
+        }
+        return a;
     }
 
     public long skip(long n) throws IOException {
@@ -74,7 +81,7 @@ class FixedLengthInputStream extends Fil
     }
 
     public int available() throws IOException {
-        return super.available();
+        return 0;
     }
 
     public void close() throws IOException {

Modified: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java (original)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java Tue Apr  6 18:48:14 2010
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.james.imap.decode.parser;
 
-import java.io.ByteArrayInputStream;
 import java.util.Date;
 
 import javax.mail.Flags;
@@ -31,6 +30,7 @@ import org.apache.james.imap.api.ImapMes
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.base.AbstractImapCommandParser;
+import org.apache.james.imap.decode.base.EolInputStream;
 
 class AppendCommandParser extends AbstractImapCommandParser {
 
@@ -79,12 +79,12 @@ class AppendCommandParser extends Abstra
             datetime = new Date();
         }
         request.nextWordChar();
-        final byte[] message = consumeLiteral(request);
-        endLine(request);
+        
+        // Use a EolInputStream so it will call eol when the message was read
+        final EolInputStream message = new EolInputStream(request, consumeLiteral(request));
         final ImapMessageFactory factory = getMessageFactory();
-        //TODO: FIX ME
         final ImapMessage result = factory.createAppendMessage(command,
-                mailboxName, flags, datetime, new ByteArrayInputStream(message), tag);
+                mailboxName, flags, datetime, message, tag);
         return result;
     }
 }

Modified: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java (original)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java Tue Apr  6 18:48:14 2010
@@ -43,6 +43,7 @@ class StatusCommandParser extends Abstra
         consumeChar(request, '(');
         CharacterValidator validator = new NoopCharValidator();
         String nextWord = consumeWord(request, validator);
+
         while (!nextWord.endsWith(")")) {
             addItem(nextWord, items);
             nextWord = consumeWord(request, validator);
@@ -57,6 +58,7 @@ class StatusCommandParser extends Abstra
 
     private void addItem(String nextWord, StatusDataItems items)
             throws DecodingException {
+
         if (nextWord.equals(ImapConstants.STATUS_MESSAGES)) {
             items.setMessages(true);
         } else if (nextWord.equals(ImapConstants.STATUS_RECENT)) {
@@ -81,6 +83,7 @@ class StatusCommandParser extends Abstra
         final ImapMessageFactory factory = getMessageFactory();
         final ImapMessage result = factory.createStatusMessage(command,
                 mailboxName, statusDataItems, tag);
+        
         return result;
     }
 }

Modified: james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java (original)
+++ james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java Tue Apr  6 18:48:14 2010
@@ -82,9 +82,10 @@ public class InMemoryStoreMailbox extend
                 out.close();
 
         } catch (Exception e) {
+            e.printStackTrace();
             byteContent = new byte[0];
         }
-        
+        System.out.println("byte=" + new String(byteContent));
         return new SimpleMailboxMembership(internalDate, uid, size, bodyStartOctet, byteContent, flags, headers, propertyBuilder, mailboxId);
 
 

Modified: james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java (original)
+++ james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java Tue Apr  6 18:48:14 2010
@@ -76,6 +76,7 @@ public class SimpleMailboxMembership ext
             Flags flags, List<Header> headers, PropertyBuilder propertyBuilder, final long mailboxId) {
         this.uid = uid;
         this.document = document;
+        
         this.size = size;
         this.bodyStartOctet = bodyStartOctet;
         setFlags(flags);

Modified: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java (original)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java Tue Apr  6 18:48:14 2010
@@ -50,4 +50,5 @@ abstract public class AbstractImapReques
     public final String getTag() {
         return tag;
     }
+    
 }

Modified: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AppendRequest.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AppendRequest.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AppendRequest.java (original)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/AppendRequest.java Tue Apr  6 18:48:14 2010
@@ -18,12 +18,12 @@
  ****************************************************************/
 package org.apache.james.imap.message.request;
 
-import java.io.InputStream;
 import java.util.Date;
 
 import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.decode.base.EolInputStream;
 
 public class AppendRequest extends AbstractImapRequest {
     private final String mailboxName;
@@ -32,10 +32,10 @@ public class AppendRequest extends Abstr
 
     private final Date datetime;
 
-    private final InputStream message;
+    private final EolInputStream message;
 
     public AppendRequest(ImapCommand command, String mailboxName, Flags flags,
-            Date datetime, InputStream message, String tag) {
+            Date datetime, EolInputStream message, String tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.flags = flags;
@@ -55,7 +55,9 @@ public class AppendRequest extends Abstr
         return mailboxName;
     }
 
-    public InputStream getMessage() {
+    public EolInputStream getMessage() {
         return message;
     }
+    
+    
 }

Modified: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java (original)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java Tue Apr  6 18:48:14 2010
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.james.imap.message.request;
 
-import java.io.InputStream;
 import java.util.Date;
 
 import javax.mail.Flags;
@@ -33,6 +32,7 @@ import org.apache.james.imap.api.message
 import org.apache.james.imap.api.message.request.SearchKey;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
+import org.apache.james.imap.decode.base.EolInputStream;
 
 /**
  * Naive, factory creates unpooled instances.
@@ -49,7 +49,7 @@ public class BaseImap4Rev1MessageFactory
 
     public ImapMessage createAppendMessage(ImapCommand command,
             String mailboxName, Flags flags, Date datetime,
-            InputStream message, String tag) {
+            EolInputStream message, String tag) {
         return new AppendRequest(command, mailboxName, flags, datetime,
                 message, tag);
     }

Modified: james/imap/trunk/parent/pom.xml
URL: http://svn.apache.org/viewvc/james/imap/trunk/parent/pom.xml?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/parent/pom.xml (original)
+++ james/imap/trunk/parent/pom.xml Tue Apr  6 18:48:14 2010
@@ -418,7 +418,6 @@
       <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
-        <scope>test</scope>
         <version>1.4</version>
       </dependency>
       <dependency>

Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java Tue Apr  6 18:48:14 2010
@@ -289,6 +289,13 @@ abstract public class AbstractMailboxPro
         responder.respond(response);
     }
 
+    protected void taggedBad(final ImapCommand command, final String tag,
+            final ImapProcessor.Responder responder,
+            final HumanReadableText e) {
+        StatusResponse response = factory.taggedBad(tag, command, e);
+
+        responder.respond(response);
+    }
     protected void bye(final ImapProcessor.Responder responder) {
         final StatusResponse response = factory.bye(HumanReadableText.BYE);
         responder.respond(response);

Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AppendProcessor.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AppendProcessor.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AppendProcessor.java Tue Apr  6 18:48:14 2010
@@ -34,11 +34,13 @@ import org.apache.james.imap.api.message
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.api.process.SelectedMailbox;
+import org.apache.james.imap.decode.base.EolInputStream;
 import org.apache.james.imap.mailbox.Mailbox;
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.MailboxManager;
 import org.apache.james.imap.mailbox.MailboxNotFoundException;
 import org.apache.james.imap.mailbox.MailboxSession;
+import org.apache.james.imap.mailbox.StorageException;
 import org.apache.james.imap.message.request.AppendRequest;
 import org.apache.james.imap.processor.base.ImapSessionUtils;
 
@@ -61,7 +63,7 @@ public class AppendProcessor extends Abs
             String tag, ImapCommand command, Responder responder) {
         final AppendRequest request = (AppendRequest) message;
         final String mailboxName = request.getMailboxName();
-        final InputStream messageIn = request.getMessage();
+        final EolInputStream messageIn = request.getMessage();
         final Date datetime = request.getDatetime();
         final Flags flags = request.getFlags();
         try {
@@ -72,12 +74,18 @@ public class AppendProcessor extends Abs
             appendToMailbox(messageIn, datetime, flags, session, tag,
                     command, mailbox, responder, fullMailboxName);
         } catch (MailboxNotFoundException e) {
+            // consume stream
+            messageIn.cosume();
+            
 //          Indicates that the mailbox does not exist
 //          So TRY CREATE
             tryCreate(session, tag, command, responder, e);
+            
         } catch (MailboxException e) {
+           
 //          Some other issue
             no(command, tag, responder, e, session);
+            
         }
 
     }
@@ -100,9 +108,11 @@ public class AppendProcessor extends Abs
         if (logger.isDebugEnabled()) {
             logger.debug("Cannot open mailbox: ", e);
         }
+        
         no(command, tag, responder,
                 HumanReadableText.FAILURE_NO_SUCH_MAILBOX,
                 StatusResponse.ResponseCode.tryCreate());
+       
     }
 
     private void appendToMailbox(final InputStream message, final Date datetime,
@@ -125,6 +135,8 @@ public class AppendProcessor extends Abs
 //          Indicates that the mailbox does not exist
 //          So TRY CREATE
             tryCreate(session, tag, command, responder, e);
+        } catch (StorageException e) {
+            taggedBad(command, tag, responder, e.getKey());
         } catch (MailboxException e) {
 //          Some other issue
             no(command, tag, responder, e, session);

Modified: james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java (original)
+++ james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java Tue Apr  6 18:48:14 2010
@@ -169,6 +169,7 @@ public final class ImapRequestHandler  {
         final ResponseEncoder responseEncoder = new ResponseEncoder(encoder,
                 response, session);
         processor.process(message, responseEncoder, session);
+        
         final boolean result;
         final IOException failure = responseEncoder.getFailure();
         if (failure == null) {

Modified: james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java?rev=931266&r1=931265&r2=931266&view=diff
==============================================================================
--- james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java (original)
+++ james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java Tue Apr  6 18:48:14 2010
@@ -20,6 +20,9 @@
 package org.apache.james.mailboxmanager.torque;
 
 import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.sql.SQLException;
@@ -37,6 +40,7 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import javax.imageio.stream.FileImageInputStream;
 import javax.mail.Flags;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
@@ -133,6 +137,7 @@ public class TorqueMailbox implements Ma
             final MailboxRow myMailboxRow = reserveNextUid();
 
             if (myMailboxRow != null) {
+                File file = null;
                 try {
                     
                     // To be thread safe, we first get our own copy and the
@@ -150,7 +155,21 @@ public class TorqueMailbox implements Ma
                     messageRow.setMailboxId(getMailboxRow().getMailboxId());
                     messageRow.setUid(uid);
                     messageRow.setInternalDate(internalDate);
-                    final MimeMessage mimeMessage = new MimeMessage(null, messageIn);
+                    // Create a temporary file and copy the message to it. We will work with the file as
+                    // source for the InputStream
+                    file = File.createTempFile("imap", ".msg");
+                    FileOutputStream out = new FileOutputStream(file);
+                    
+                    byte[] buf = new byte[1024];
+                    int i = 0;
+                    while ((i = messageIn.read(buf)) != -1) {
+                        out.write(buf, 0, i);
+                    }
+                    out.flush();
+                    out.close();
+                    
+                    final MimeMessage mimeMessage = new MimeMessage(null, new FileInputStream(file));
+
                     if (isRecent) {
                         mimeMessage.setFlag(Flags.Flag.RECENT, true);
                     }
@@ -174,7 +193,12 @@ public class TorqueMailbox implements Ma
                     getUidChangeTracker().found(messageResult.getUid(), messageResult.getFlags());
                     return messageResult.getUid();
                 } catch (Exception e) {
+                    e.printStackTrace();
                     throw new MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
+                } finally {
+                    if (file != null) {
+                        file.delete();
+                    }
                 }
             } else {
                 // mailboxRow==null



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