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]