Author: norman
Date: Sun Apr 10 19:03:16 2011
New Revision: 1090868
URL: http://svn.apache.org/viewvc?rev=1090868&view=rev
Log:
Correctly handle sequence-sets when using SEARCH. See IMAP-292
Modified:
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/SearchProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
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=1090868&r1=1090867&r2=1090868&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
Sun Apr 10 19:03:16 2011
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.MessageM
import org.apache.james.mailbox.MessageRange;
import org.apache.james.mailbox.MessageRangeException;
import org.apache.james.mailbox.MessageResult;
+import org.apache.james.mailbox.MessageRange.Type;
import org.apache.james.mailbox.util.FetchGroupImpl;
abstract public class AbstractMailboxProcessor<M extends ImapRequest> extends
AbstractChainedProcessor<M> {
@@ -407,10 +408,58 @@ abstract public class AbstractMailboxPro
// Take care of "*" and "*:*" values by return the last message in
the mailbox. See IMAP-289
if (lowVal == Long.MAX_VALUE && highVal == Long.MAX_VALUE) {
return MessageRange.one(selected.getLastUid());
+ } else if (highVal == Long.MAX_VALUE && selected.getLastUid() <
lowVal) {
+ // Sequence uid ranges which use *:<uid-higher-then-last-uid>
MUST return at least the highest uid in the mailbox
+ // See IMAP-291
+ return MessageRange.one(selected.getLastUid());
}
}
MessageRange mRange = MessageRange.range(lowVal, highVal);
return mRange;
}
+
+
+ /**
+ * Format MessageRange to RANGE format applying selected folder min & max
UIDs constraints
+ *
+ * @param selected currently selected mailbox
+ * @param range input range
+ * @return normalized message range
+ * @throws MessageRangeException
+ */
+ protected MessageRange normalizeMessageRange(SelectedMailbox selected,
MessageRange range) throws MessageRangeException {
+ Type rangeType = range.getType();
+ long start;
+ long end;
+
+ switch (rangeType) {
+ case ONE:
+ return range;
+ case ALL:
+ start = selected.getFirstUid();
+ end = selected.getLastUid();
+ return MessageRange.range(start, end);
+ case RANGE:
+ start = range.getUidFrom();
+ if (start < 1 || start == Long.MAX_VALUE || start <
selected.getFirstUid()) {
+ start = selected.getFirstUid();
+ }
+ end = range.getUidTo();
+ if (end < 1 || end == Long.MAX_VALUE || end >
selected.getLastUid()) {
+ end = selected.getLastUid();
+ }
+ return MessageRange.range(start, end);
+ case FROM:
+ start = range.getUidFrom();
+ if (start < 1 || start == Long.MAX_VALUE || start <
selected.getFirstUid()) {
+ start = selected.getFirstUid();
+ }
+
+ end = selected.getLastUid();
+ return MessageRange.range(start, end);
+ default:
+ throw new MessageRangeException("Unknown message range type:
"+rangeType);
+ }
+ }
}
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java?rev=1090868&r1=1090867&r2=1090868&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
Sun Apr 10 19:03:16 2011
@@ -43,6 +43,7 @@ import org.apache.james.imap.message.res
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageRange;
import org.apache.james.mailbox.MessageRangeException;
import org.apache.james.mailbox.SearchQuery;
import org.apache.james.mailbox.SearchQuery.Criterion;
@@ -230,45 +231,16 @@ public class SearchProcessor extends Abs
final SearchQuery.NumericRange[] ranges = new
SearchQuery.NumericRange[length];
for (int i = 0; i < length; i++) {
final IdRange range = sequenceNumbers[i];
- long highVal = range.getHighVal();
- long lowVal = range.getLowVal();
- long lowUid;
- long highUid;
- final SelectedMailbox selected = session.getSelected();
-
- if (msn) {
- if (highVal == Long.MAX_VALUE) {
- highUid = Long.MAX_VALUE;
- } else {
- final int highMsn = (int) highVal;
- highUid = selected.uid(highMsn);
-
- if (highUid == SelectedMailbox.NO_SUCH_MESSAGE) highUid =
selected.getLastUid();
- }
- if (lowVal == Long.MIN_VALUE) {
- lowUid = Long.MAX_VALUE;
- } else {
- final int lowMsn = (int) lowVal;
- lowUid = selected.uid(lowMsn);
- if (lowUid == SelectedMailbox.NO_SUCH_MESSAGE) lowUid =
selected.getFirstUid();
- }
- } else {
- lowUid = lowVal;
- highUid = highVal;
-
-
- if (lowVal != Long.MIN_VALUE && lowVal <
selected.getFirstUid()) {
- lowUid = selected.getFirstUid();
- }
-
- if (highVal != Long.MAX_VALUE && highVal >
selected.getLastUid()) {
- highUid = selected.getLastUid();
- }
- }
- ranges[i] = new SearchQuery.NumericRange(lowUid, highUid);
+ // correctly calculate the ranges. See IMAP-292
+ final SelectedMailbox selected = session.getSelected();
+ MessageRange mRange = messageRange(selected, range, !msn);
+ mRange = normalizeMessageRange(selected, mRange);
+ ranges[i] = new SearchQuery.NumericRange(mRange.getUidFrom(),
mRange.getUidTo());
+
}
- return SearchQuery.uid(ranges);
+ Criterion crit = SearchQuery.uid(ranges);
+ return crit;
}
private Criterion or(List<SearchKey> keys, final ImapSession session)
throws MessageRangeException {
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java?rev=1090868&r1=1090867&r2=1090868&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
Sun Apr 10 19:03:16 2011
@@ -33,7 +33,6 @@ import org.apache.james.imap.api.message
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.FetchRequest;
import org.apache.james.imap.message.response.FetchResponse;
import org.apache.james.imap.processor.AbstractMailboxProcessor;
@@ -41,14 +40,13 @@ import org.apache.james.mailbox.MailboxE
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageManager.MessageCallback;
import org.apache.james.mailbox.MessageRange;
import org.apache.james.mailbox.MessageRangeException;
import org.apache.james.mailbox.MessageResult;
-import org.apache.james.mailbox.UnsupportedCriteriaException;
-import org.apache.james.mailbox.MessageManager.MessageCallback;
-import org.apache.james.mailbox.MessageRange.Type;
import org.apache.james.mailbox.MessageResult.FetchGroup;
import org.apache.james.mailbox.MessageResult.MimePath;
+import org.apache.james.mailbox.UnsupportedCriteriaException;
import org.apache.james.mailbox.util.FetchGroupImpl;
import org.apache.james.mime4j.field.address.parser.ParseException;
@@ -145,49 +143,7 @@ public class FetchProcessor extends Abst
}
}
-
- /**
- * Format MessageRange to RANGE format applying selected folder min & max
UIDs constraints
- *
- * @param selected currently selected mailbox
- * @param range input range
- * @return normalized message range
- * @throws MessageRangeException
- */
- private MessageRange normalizeMessageRange(SelectedMailbox selected,
MessageRange range) throws MessageRangeException {
- Type rangeType = range.getType();
- long start;
- long end;
-
- switch (rangeType) {
- case ONE:
- return range;
- case ALL:
- start = selected.getFirstUid();
- end = selected.getLastUid();
- return MessageRange.range(start, end);
- case RANGE:
- start = range.getUidFrom();
- if (start < 1 || start == Long.MAX_VALUE || start <
selected.getFirstUid()) {
- start = selected.getFirstUid();
- }
- end = range.getUidTo();
- if (end < 1 || end == Long.MAX_VALUE || end >
selected.getLastUid()) {
- end = selected.getLastUid();
- }
- return MessageRange.range(start, end);
- case FROM:
- start = range.getUidFrom();
- if (start < 1 || start == Long.MAX_VALUE || start <
selected.getFirstUid()) {
- start = selected.getFirstUid();
- }
-
- end = selected.getLastUid();
- return MessageRange.range(start, end);
- default:
- throw new MessageRangeException("Unknown message range type:
"+rangeType);
- }
- }
+
protected FetchGroup getFetchGroup(FetchData fetch) {
FetchGroupImpl result = new FetchGroupImpl();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]