You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/04/10 15:50:44 UTC
svn commit: r1090799 - in /james/imap/trunk:
api/src/main/java/org/apache/james/imap/api/message/IdRange.java
processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
Author: norman
Date: Sun Apr 10 13:50:43 2011
New Revision: 1090799
URL: http://svn.apache.org/viewvc?rev=1090799&view=rev
Log:
Correctly parse and handle "*" and "*:*" message ranges. See IMAP-289
Modified:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java?rev=1090799&r1=1090798&r2=1090799&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java Sun Apr 10 13:50:43 2011
@@ -131,18 +131,33 @@ public class IdRange {
public static List<IdRange> mergeRanges(final List<IdRange> ranges) {
List<IdRange> copy = new ArrayList<IdRange>(ranges);
Collections.sort(copy, IdRangeComperator.INSTANCE);
-
+
+ boolean lastUid = false;
+
for (int i = 0; i < copy.size() -1; i++) {
IdRange current = copy.get(i);
IdRange next = copy.get(i +1);
- if (current.getHighVal() >= next.getLowVal() -1) {
- if (next.getHighVal() > current.getHighVal()) {
- current.setHighVal(next.getHighVal());
+ if (next.getLowVal() == Long.MAX_VALUE && next.getHighVal() == Long.MAX_VALUE) {
+ if (lastUid) {
+ copy.remove(next);
+ i--;
+ } else {
+ lastUid = true;
}
- // remove the merged id range and decrease the count
- copy.remove(next);
- i--;
+ } else {
+ // Make sure we handle the "*" and "*:*" correctly and don't remove ranges by error. See IMAP-289
+ if ((current.getLowVal() != Long.MAX_VALUE && current.getHighVal() != Long.MAX_VALUE) && (current.getHighVal() >= next.getLowVal() -1)) {
+ if (next.getHighVal() > current.getHighVal()) {
+ current.setHighVal(next.getHighVal());
+ }
+ // remove the merged id range and decrease the count
+ copy.remove(next);
+ i--;
+ }
}
+
+
+
}
return copy;
@@ -153,7 +168,18 @@ public class IdRange {
private static IdRangeComperator INSTANCE = new IdRangeComperator();
public int compare(IdRange range1, IdRange range2) {
- return (int) (range1.getLowVal() - range2.getLowVal());
+
+ // Correctly sort and respect "*" and "*:*" ranges. See IMAP-289
+ if (range1.getLowVal() == Long.MAX_VALUE && range1.getHighVal() == Long.MAX_VALUE && range2.getLowVal() == Long.MAX_VALUE && range2.getHighVal() == Long.MAX_VALUE) {
+ return 0;
+ }
+ if (range1.getLowVal() == Long.MAX_VALUE && range1.getHighVal() == Long.MAX_VALUE) {
+ return 1;
+ } else if (range2.getLowVal() == Long.MAX_VALUE && range2.getHighVal() == Long.MAX_VALUE) {
+ return -1;
+ } else {
+ return (int) (range1.getLowVal() - range2.getLowVal());
+ }
}
}
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=1090799&r1=1090798&r2=1090799&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 13:50:43 2011
@@ -390,8 +390,7 @@ abstract public class AbstractMailboxPro
if (useUids == false) {
// 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) {
- lowVal = selected.getLastUid();
- highVal = lowVal;
+ return MessageRange.one(selected.getLastUid());
}
if (lowVal != Long.MIN_VALUE) {
@@ -407,8 +406,7 @@ abstract public class AbstractMailboxPro
} else {
// 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) {
- lowVal = selected.getLastUid();
- highVal = lowVal;
+ return MessageRange.one(selected.getLastUid());
}
}
MessageRange mRange = MessageRange.range(lowVal, highVal);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org