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]