Author: norman Date: Wed Sep 15 10:31:11 2010 New Revision: 997266 URL: http://svn.apache.org/viewvc?rev=997266&view=rev Log: Correct parsing of sequence-set / id-ranges (IMAP-212)
Added: james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/ james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.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=997266&r1=997265&r2=997266&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 Wed Sep 15 10:31:11 2010 @@ -20,7 +20,7 @@ package org.apache.james.imap.api.message; /** - * Represents a range of UID values. + * Represents a range of UID or MSN values. */ public class IdRange { @@ -46,8 +46,14 @@ public class IdRange { return _highVal; } - public boolean includes(long uid) { - return _lowVal <= uid && uid <= _highVal; + /** + * Return true if the {...@link IdRange} includes the given value + * + * @param value + * @return include + */ + public boolean includes(long value) { + return _lowVal <= value && value <= _highVal; } /** Modified: james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java?rev=997266&r1=997265&r2=997266&view=diff ============================================================================== --- james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java (original) +++ james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java Wed Sep 15 10:31:11 2010 @@ -589,6 +589,13 @@ public abstract class AbstractImapComman return (IdRange[]) rangeList.toArray(new IdRange[rangeList.size()]); } + /** + * Parse a range which use a ":" as delimiter + * + * @param range + * @return idRange + * @throws DecodingException + */ private IdRange parseRange(String range) throws DecodingException { int pos = range.indexOf(':'); try { @@ -596,9 +603,16 @@ public abstract class AbstractImapComman long value = parseLong(range); return new IdRange(value); } else { - long lowVal = parseLong(range.substring(0, pos)); - long highVal = parseLong(range.substring(pos + 1)); - return new IdRange(lowVal, highVal); + + // Make sure we detect the low and high value + // See https://issues.apache.org/jira/browse/IMAP-212 + long val1 = parseLong(range.substring(0, pos)); + long val2 = parseLong(range.substring(pos + 1)); + if (val1 <= val2) { + return new IdRange(val1, val2); + } else { + return new IdRange(val2, val1); + } } } catch (NumberFormatException e) { throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid message set.", e); Added: james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java?rev=997266&view=auto ============================================================================== --- james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java (added) +++ james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java Wed Sep 15 10:31:11 2010 @@ -0,0 +1,82 @@ +/**************************************************************** + * 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.decode.main; + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import org.apache.commons.logging.Log; +import org.apache.james.imap.api.ImapCommand; +import org.apache.james.imap.api.ImapMessage; +import org.apache.james.imap.api.message.IdRange; +import org.apache.james.imap.decode.DecodingException; +import org.apache.james.imap.decode.ImapRequestLineReader; +import org.apache.james.imap.decode.ImapRequestStreamLineReader; +import org.apache.james.imap.decode.base.AbstractImapCommandParser; +import org.junit.Test; + +public class IdRangeParseTest { + + private final AbstractImapCommandParser parser = new AbstractImapCommandParser(null) { + + @Override + protected ImapMessage decode(ImapCommand command, + ImapRequestLineReader request, String tag, Log logger) + throws DecodingException { + return null; + } + + }; + + + /** + * Test for https://issues.apache.org/jira/browse/IMAP-212 + * @throws DecodingException + */ + @Test + public void testRangeInRandomOrder() throws DecodingException { + int val1 = 1; + int val2 = 3; + + IdRange[] ranges1 = ranges(rangeAsString(val1, val2)); + assertEquals(1, ranges1.length); + assertEquals(val1, ranges1[0].getLowVal()); + assertEquals(val2, ranges1[0].getHighVal()); + + IdRange[] ranges2 = ranges(rangeAsString(val2, val1)); + assertEquals(1, ranges2.length); + assertEquals(val1, ranges2[0].getLowVal()); + assertEquals(val2, ranges2[0].getHighVal()); + } + + private String rangeAsString(int val1, int val2) { + return val1 + ":" + val2; + } + + private IdRange[] ranges(String rangesAsString) throws DecodingException { + + ImapRequestLineReader reader = new ImapRequestStreamLineReader( + new ByteArrayInputStream((rangesAsString + "\r\n").getBytes()), + new ByteArrayOutputStream()); + + return parser.parseIdRange(reader); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org