Author: norman
Date: Fri Jan 14 15:16:55 2011
New Revision: 1059039

URL: http://svn.apache.org/viewvc?rev=1059039&view=rev
Log:
Work in progress to move to a push based system as replacement for pull. This 
is still work in progress and does not compile atm

Added:
    
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/encode/ContinuationRequestEncoder.java
    
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/message/request/ContinuationRequest.java
Modified:
    
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
    
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
    
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
    
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java

Modified: 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
URL: 
http://svn.apache.org/viewvc/james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java?rev=1059039&r1=1059038&r2=1059039&view=diff
==============================================================================
--- 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
 (original)
+++ 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
 Fri Jan 14 15:16:55 2011
@@ -20,7 +20,6 @@
 package org.apache.james.imap.decode;
 
 import java.io.IOException;
-import java.io.InputStream;
 
 import org.apache.james.imap.api.ContinuationReader;
 import org.apache.james.imap.api.display.HumanReadableText;
@@ -130,19 +129,7 @@ public abstract class ImapRequestLineRea
         return current;
     }
 
-    /**
-     * Reads and consumes a number of characters from the underlying reader,
-     * filling the char array provided. TODO: remove unnecessary copying of
-     * bits; line reader should maintain an internal ByteBuffer;
-     * 
-     * @param holder
-     *            A char array which will be filled with chars read from the
-     *            underlying reader.
-     * @throws DecodingException
-     *             If a char can't be read into each array element.
-     */
-    public abstract InputStream read(int size) throws DecodingException;
-
+    
 
     /**
      * Consume the rest of the line

Modified: 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
URL: 
http://svn.apache.org/viewvc/james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java?rev=1059039&r1=1059038&r2=1059039&view=diff
==============================================================================
--- 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
 (original)
+++ 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
 Fri Jan 14 15:16:55 2011
@@ -324,7 +324,7 @@ public abstract class AbstractImapComman
         }
     }
 
-    protected InputStream  consumeLiteral(final ImapRequestLineReader request) 
throws DecodingException {
+    protected int  consumeLiteral(final ImapRequestLineReader request) throws 
DecodingException {
         // The 1st character must be '{'
         consumeChar(request, '{');
 
@@ -357,7 +357,7 @@ public abstract class AbstractImapComman
         }
 
         final int size = Integer.parseInt(digits.toString());
-        return request.read(size);
+        return size;
     }
 
     private String decode(final Charset charset, final ByteBuffer buffer)

Modified: 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
URL: 
http://svn.apache.org/viewvc/james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java?rev=1059039&r1=1059038&r2=1059039&view=diff
==============================================================================
--- 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
 (original)
+++ 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
 Fri Jan 14 15:16:55 2011
@@ -18,6 +18,12 @@
  ****************************************************************/
 package org.apache.james.imap.decode.parser;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Date;
 
 import javax.mail.Flags;
@@ -26,18 +32,22 @@ import org.apache.james.imap.api.ImapCom
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.decode.ImapDecoder;
 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;
 import org.apache.james.imap.message.request.AppendRequest;
+import org.apache.james.imap.message.request.ContinuationRequest;
 
 /**
  * Parses APPEND command
  *
  */
 public class AppendCommandParser extends AbstractImapCommandParser {
-
+    
+    public final String BYTES_WRITTEN = AppendCommandParser.class.getName() + 
"_BYTES_WRITTEN";
+    public final static String NEXT_DECODER = "NEXT_DECODER";
+    
     public AppendCommandParser() {
        
super(ImapCommand.authenticatedStateCommand(ImapConstants.APPEND_COMMAND_NAME));
     }
@@ -76,23 +86,88 @@ public class AppendCommandParser extends
      * (non-Javadoc)
      * @see 
org.apache.james.imap.decode.base.AbstractImapCommandParser#decode(org.apache.james.imap.api.ImapCommand,
 org.apache.james.imap.decode.ImapRequestLineReader, java.lang.String, 
org.apache.commons.logging.Log, org.apache.james.imap.api.process.ImapSession)
      */
-    protected ImapMessage decode(ImapCommand command,
-            ImapRequestLineReader request, String tag, ImapSession session) 
throws DecodingException {
-        String mailboxName = mailbox(request);
+    protected ImapMessage decode(final ImapCommand command,
+            ImapRequestLineReader request, final String tag, ImapSession 
session) throws DecodingException {
+        final String mailboxName = mailbox(request);
         Flags flags = optionalAppendFlags(request);
         if (flags == null) {
             flags = new Flags();
         }
+        final Flags f = flags;
+        
         Date datetime = optionalDateTime(request);
         if (datetime == null) {
             datetime = new Date();
         }
+        final Date dt = datetime;
         request.nextWordChar();
         
+        try {
+            final File file = File.createTempFile("imap-append", ".m64");
+            final FileOutputStream out = new FileOutputStream(file);
+            final int size = consumeLiteral(request);
+            session.setAttribute(BYTES_WRITTEN, 0);
+            
+            ImapDecoder nextDecoder = new ImapDecoder() {
+                
+                public ImapMessage decode(ImapRequestLineReader request, 
ImapSession session) {
+                    int bytes = (Integer)session.getAttribute(BYTES_WRITTEN);
+                    try {
+                        while(bytes < size) {
+                            out.write((byte)request.consume());
+                            bytes++;
+                        }
+                        if (bytes == size) {
+                            request.eol();
+                            session.setAttribute(NEXT_DECODER, null);
+                            return new AppendRequest(command, mailboxName, f, 
dt, new DeleteOnCloseInputStream(new FileInputStream(file), file) , tag);
+                        }
+                        
+                    } catch (DecodingException e) {
+                       // expected on end of line
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                    return null;
+                }
+            };
+            session.setAttribute(NEXT_DECODER, nextDecoder);
+
+            
+            return new ContinuationRequest(command, tag, nextDecoder); 
+            
+        } catch (IOException e1) {
+            // TODO Auto-generated catch block
+            e1.printStackTrace();
+        }
+
+       
+        /*
         // Use a EolInputStream so it will call eol when the message was read
         final EolInputStream message = new EolInputStream(request, 
consumeLiteral(request));
         final ImapMessage result = new AppendRequest(command,
                 mailboxName, flags, datetime, message, tag);
         return result;
+        */
+        
+        //TODO: fix me!
+        return null;
+    }
+    
+    private class DeleteOnCloseInputStream extends FilterInputStream {
+
+        private File f;
+
+        protected DeleteOnCloseInputStream(InputStream in, File f) {
+            super(in);
+            this.f = f;
+        }
+
+        @Override
+        public void close() throws IOException {
+            super.close();
+            f.delete();
+        }
+        
     }
 }

Added: 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/encode/ContinuationRequestEncoder.java
URL: 
http://svn.apache.org/viewvc/james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/encode/ContinuationRequestEncoder.java?rev=1059039&view=auto
==============================================================================
--- 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/encode/ContinuationRequestEncoder.java
 (added)
+++ 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/encode/ContinuationRequestEncoder.java
 Fri Jan 14 15:16:55 2011
@@ -0,0 +1,45 @@
+/****************************************************************
+ * 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.encode;
+
+import java.io.IOException;
+
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
+import org.apache.james.imap.message.request.ContinuationRequest;
+
+public class ContinuationRequestEncoder extends AbstractChainedImapEncoder {
+    
+    public ContinuationRequestEncoder(ImapEncoder next) {
+        super(next);
+    }
+
+    protected void doEncode(ImapMessage acceptableMessage,
+            ImapResponseComposer composer, ImapSession session) throws 
IOException {
+        composer.commandContinuationRequest();        
+    }
+
+
+    protected boolean isAcceptable(ImapMessage message) {
+        return (message instanceof ContinuationRequest);
+    }
+
+}

Modified: 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java
URL: 
http://svn.apache.org/viewvc/james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java?rev=1059039&r1=1059038&r2=1059039&view=diff
==============================================================================
--- 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java
 (original)
+++ 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java
 Fri Jan 14 15:16:55 2011
@@ -30,6 +30,7 @@ import org.apache.james.imap.api.process
 import org.apache.james.imap.api.process.ImapProcessor.Responder;
 import org.apache.james.imap.decode.ImapDecoder;
 import org.apache.james.imap.decode.ImapRequestLineReader;
+import org.apache.james.imap.decode.parser.AppendCommandParser;
 import org.apache.james.imap.encode.ImapEncoder;
 import org.apache.james.imap.encode.ImapResponseComposer;
 
@@ -59,26 +60,38 @@ public abstract class AbstractImapReques
     
     protected boolean doProcessRequest(ImapRequestLineReader request,
             ImapResponseComposer response, ImapSession session) {
-        ImapMessage message = decoder.decode(request, session);
-        final ResponseEncoder responseEncoder = new ResponseEncoder(encoder,
-                response, session);
-        processor.process(message, responseEncoder, session);
-        
-        final boolean result;
-        final IOException failure = responseEncoder.getFailure();
-        if (failure == null) {
-            result = true;
-        } else {
-            result = false;
-            final Log logger = session.getLog();
-            logger.info(failure.getMessage());
-            if (logger.isDebugEnabled()) {
-                logger.debug("Failed to write " + message, failure);
+        ImapDecoder nextDecoder = getDecoder(session);
+        ImapMessage message = nextDecoder.decode(request, session);
+        if (message != null) {
+            final ResponseEncoder responseEncoder = new 
ResponseEncoder(encoder, response, session);
+            processor.process(message, responseEncoder, session);
+
+            final boolean result;
+            final IOException failure = responseEncoder.getFailure();
+            if (failure == null) {
+                result = true;
+            } else {
+                result = false;
+                final Log logger = session.getLog();
+                logger.info(failure.getMessage());
+                if (logger.isDebugEnabled()) {
+                    logger.debug("Failed to write " + message, failure);
+                }
             }
+            return result;
         }
-        return result;
+        return true;
+        
     }
 
+    private ImapDecoder getDecoder(ImapSession session) {
+        ImapDecoder nextDecoder = (ImapDecoder) 
session.getAttribute(AppendCommandParser.NEXT_DECODER);
+        if (nextDecoder == null) {
+            return this.decoder;
+        } else {
+            return nextDecoder;
+        }
+    }
 
     protected boolean isSelectedMailboxDeleted(ImapSession session) {
         final boolean selectedMailboxIsDeleted;

Added: 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/message/request/ContinuationRequest.java
URL: 
http://svn.apache.org/viewvc/james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/message/request/ContinuationRequest.java?rev=1059039&view=auto
==============================================================================
--- 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/message/request/ContinuationRequest.java
 (added)
+++ 
james/imap/branches/nio-refactoring/message/src/main/java/org/apache/james/imap/message/request/ContinuationRequest.java
 Fri Jan 14 15:16:55 2011
@@ -0,0 +1,18 @@
+package org.apache.james.imap.message.request;
+
+import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.decode.ImapDecoder;
+
+public class ContinuationRequest extends AbstractImapRequest {
+
+    private ImapDecoder decoder;
+
+    public ContinuationRequest(final ImapCommand command, final String tag, 
final ImapDecoder decoder) {
+        super(tag, command);
+        this.decoder = decoder;
+    }
+    
+    public ImapDecoder getDecoder() {
+        return decoder;
+    }
+}



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

Reply via email to