Author: norman
Date: Wed Jan 12 20:01:33 2011
New Revision: 1058296

URL: http://svn.apache.org/viewvc?rev=1058296&view=rev
Log:
Add basic support for UIDPLUS. See IMAP-125

Modified:
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java?rev=1058296&r1=1058295&r2=1058296&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java
 Wed Jan 12 20:01:33 2011
@@ -21,31 +21,36 @@ package org.apache.james.imap.decode.par
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.process.ImapSession;
 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.message.request.ExpungeRequest;
 
 /**
  * Parse EXPUNGE commands
  *
  */
-public class ExpungeCommandParser extends AbstractImapCommandParser {
+public class ExpungeCommandParser extends AbstractUidCommandParser {
 
     public ExpungeCommandParser() {
         
super(ImapCommand.selectedStateCommand(ImapConstants.EXPUNGE_COMMAND_NAME));
     }
 
 
+    
     /*
      * (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.james.imap.api.process.ImapSession)
+     * @see 
org.apache.james.imap.decode.parser.AbstractUidCommandParser#decode(org.apache.james.imap.api.ImapCommand,
 org.apache.james.imap.decode.ImapRequestLineReader, java.lang.String, boolean, 
org.apache.james.imap.api.process.ImapSession)
      */
-    protected ImapMessage decode(ImapCommand command,
-            ImapRequestLineReader request, String tag, ImapSession session) 
throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader 
request, String tag, boolean useUids, ImapSession session) throws 
DecodingException {
+        IdRange[] uidSet = null;
+        if (useUids) {
+            uidSet = parseIdRange(request);
+        }
         endLine(request);
-        final ImapMessage result = new ExpungeRequest(command, tag);
+
+        final ImapMessage result = new ExpungeRequest(command, tag, uidSet);
         return result;
     }
 

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java?rev=1058296&r1=1058295&r2=1058296&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java
 Wed Jan 12 20:01:33 2011
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
 /**
@@ -26,8 +27,20 @@ import org.apache.james.imap.api.message
  *
  */
 public class ExpungeRequest extends AbstractImapRequest {
+    private final IdRange[] uidRange;
 
-    public ExpungeRequest(final ImapCommand command, final String tag) {
+    public ExpungeRequest(final ImapCommand command, final String tag, 
IdRange[] uidRange) {
         super(tag, command);
+        this.uidRange = uidRange;
     }
+    
+    /**
+     * Return an Array of {...@link IdRange}  to expunge or null if all should 
get expunged
+     * 
+     * @return range
+     */
+    public final IdRange[] getUidSet() {
+        return uidRange;
+    }
+    
 }

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java?rev=1058296&r1=1058295&r2=1058296&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
 Wed Jan 12 20:01:33 2011
@@ -19,26 +19,32 @@
 
 package org.apache.james.imap.processor;
 
+import java.util.Arrays;
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 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.message.request.ExpungeRequest;
+import org.apache.james.imap.processor.base.MessageRangeException;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageRange;
 
-public class ExpungeProcessor extends AbstractMailboxProcessor {
+public class ExpungeProcessor extends AbstractMailboxProcessor implements 
CapabilityImplementingProcessor{
 
+    private final static List<String> UIDPLUS = Arrays.asList("UIDPLUS");
+    
     public ExpungeProcessor(final ImapProcessor next,
             final MailboxManager mailboxManager,
             final StatusResponseFactory factory) {
@@ -54,24 +60,53 @@ public class ExpungeProcessor extends Ab
         try {
             final MessageManager mailbox = getSelectedMailbox(session);
             final MailboxSession mailboxSession = 
ImapSessionUtils.getMailboxSession(session);
+            final ExpungeRequest request = (ExpungeRequest) message;
             
             if (!mailbox.isWriteable(mailboxSession)) {
                 no(command, tag, responder,
                         HumanReadableText.MAILBOX_IS_READ_ONLY);
             } else {
-                final Iterator<Long> it = mailbox.expunge(MessageRange.all(), 
mailboxSession);
-                final SelectedMailbox selected = session.getSelected();
-                if (mailboxSession != null) {
-                    while (it.hasNext()) {
-                        final long uid = it.next();
-                        selected.removeRecent(uid);
+                IdRange[] ranges = request.getUidSet();
+                if (ranges == null) {
+                    expunge(mailbox, MessageRange.all(), session, 
mailboxSession);
+                } else {
+                    // Handle UID EXPUNGE which is part of UIDPLUS
+                    // See http://tools.ietf.org/html/rfc4315
+                    for (int i = 0; i <ranges.length; i++) {
+                        MessageRange mRange = 
messageRange(session.getSelected(), ranges[i], true);
+                        expunge(mailbox, mRange, session, mailboxSession);
+
                     }
+
                 }
+               
                 unsolicitedResponses(session, responder, false);
                 okComplete(command, tag, responder);
             }
+        } catch (MessageRangeException e) {
+            taggedBad(command, tag, responder, 
HumanReadableText.INVALID_MESSAGESET);
         } catch (MailboxException e) {
             no(command, tag, responder, 
HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
+    
+    private void expunge(MessageManager mailbox, MessageRange range, 
ImapSession session, MailboxSession mailboxSession) throws MailboxException {
+        final Iterator<Long> it = mailbox.expunge(MessageRange.all(), 
mailboxSession);
+        final SelectedMailbox selected = session.getSelected();
+        if (mailboxSession != null) {
+            while (it.hasNext()) {
+                final long uid = it.next();
+                selected.removeRecent(uid);
+            }
+        }
+    }
+
+    
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.imap.processor.CapabilityImplementingProcessor#getImplementedCapabilities(org.apache.james.imap.api.process.ImapSession)
+     */
+    public List<String> getImplementedCapabilities(ImapSession session) {
+        return UIDPLUS;
+    }
 }



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

Reply via email to