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/15 19:20:35 UTC
svn commit: r1092767 - in /james/mailbox/trunk:
api/src/main/java/org/apache/james/mailbox/ store/
store/src/main/java/org/apache/james/mailbox/store/
store/src/main/java/org/apache/james/mailbox/store/lucene/
store/src/test/java/org/apache/james/mailb...
Author: norman
Date: Fri Apr 15 17:20:35 2011
New Revision: 1092767
URL: http://svn.apache.org/viewvc?rev=1092767&view=rev
Log:
SearchQuery should support to search by different Date resolutions. See MAILBOX-55
Modified:
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/SearchQuery.java
james/mailbox/trunk/store/pom.xml
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MessageSearches.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndex.java
james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java
james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java
Modified: james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/SearchQuery.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/SearchQuery.java?rev=1092767&r1=1092766&r2=1092767&view=diff
==============================================================================
--- james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/SearchQuery.java (original)
+++ james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/SearchQuery.java Fri Apr 15 17:20:35 2011
@@ -21,7 +21,9 @@ package org.apache.james.mailbox;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
import java.util.Collection;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -43,6 +45,50 @@ import javax.mail.Flags.Flag;
public class SearchQuery {
/**
+ * The Resolution which should get used for {@link Date} searches
+ *
+ *
+ */
+ public static enum DateResolution {
+ Second,
+ Minute,
+ Hour,
+ Day,
+ Month,
+ Year
+
+
+ }
+
+ public static int toCalendarType(DateResolution res) {
+ int type;
+ switch (res) {
+ case Year:
+ type = Calendar.YEAR;
+ break;
+ case Month:
+ type = Calendar.MONTH;
+ break;
+ case Day:
+ type = Calendar.DAY_OF_MONTH;
+ break;
+ case Hour:
+ type = Calendar.HOUR_OF_DAY;
+ break;
+ case Minute:
+ type = Calendar.MINUTE;
+ break;
+ case Second:
+ type = Calendar.SECOND;
+ break;
+ default:
+ type = Calendar.MILLISECOND;
+ break;
+ }
+ return type;
+ }
+
+ /**
* Creates a filter for message size less than the given value
*
* @param value
@@ -90,8 +136,8 @@ public class SearchQuery {
* year
* @return <code>Criterion</code>, not null
*/
- public static final Criterion internalDateAfter(int day, int month, int year) {
- return new InternalDateCriterion(new DateOperator(DateComparator.AFTER, day, month, year));
+ public static final Criterion internalDateAfter(Date date, DateResolution res) {
+ return new InternalDateCriterion(new DateOperator(DateComparator.AFTER, date, res));
}
/**
@@ -105,8 +151,8 @@ public class SearchQuery {
* year
* @return <code>Criterion</code>, not null
*/
- public static final Criterion internalDateOn(int day, int month, int year) {
- return new InternalDateCriterion(new DateOperator(DateComparator.ON, day, month, year));
+ public static final Criterion internalDateOn(Date date, DateResolution res) {
+ return new InternalDateCriterion(new DateOperator(DateComparator.ON, date, res));
}
/**
@@ -121,8 +167,8 @@ public class SearchQuery {
* year
* @return <code>Criterion</code>, not null
*/
- public static final Criterion internalDateBefore(int day, int month, int year) {
- return new InternalDateCriterion(new DateOperator(DateComparator.BEFORE, day, month, year));
+ public static final Criterion internalDateBefore(Date date, DateResolution res) {
+ return new InternalDateCriterion(new DateOperator(DateComparator.BEFORE, date, res));
}
/**
@@ -140,8 +186,8 @@ public class SearchQuery {
* year
* @return <code>Criterion</code>, not null
*/
- public static final Criterion headerDateAfter(String headerName, int day, int month, int year) {
- return new HeaderCriterion(headerName, new DateOperator(DateComparator.AFTER, day, month, year));
+ public static final Criterion headerDateAfter(String headerName, Date date, DateResolution res) {
+ return new HeaderCriterion(headerName, new DateOperator(DateComparator.AFTER, date, res));
}
/**
@@ -159,8 +205,8 @@ public class SearchQuery {
* year
* @return <code>Criterion</code>, not null
*/
- public static final Criterion headerDateOn(String headerName, int day, int month, int year) {
- return new HeaderCriterion(headerName, new DateOperator(DateComparator.ON, day, month, year));
+ public static final Criterion headerDateOn(String headerName, Date date, DateResolution res) {
+ return new HeaderCriterion(headerName, new DateOperator(DateComparator.ON, date, res));
}
/**
@@ -178,8 +224,8 @@ public class SearchQuery {
* year
* @return <code>Criterion</code>, not null
*/
- public static final Criterion headerDateBefore(String headerName, int day, int month, int year) {
- return new HeaderCriterion(headerName, new DateOperator(DateComparator.BEFORE, day, month, year));
+ public static final Criterion headerDateBefore(String headerName, Date date, DateResolution res) {
+ return new HeaderCriterion(headerName, new DateOperator(DateComparator.BEFORE, date, res));
}
/**
@@ -1540,38 +1586,24 @@ public class SearchQuery {
private final DateComparator type;
- private final int day;
+ private final Date date;
- private final int month;
+ private final DateResolution res;
- private final int year;
-
- public DateOperator(final DateComparator type, final int day, final int month, final int year) {
+ public DateOperator(final DateComparator type, final Date date, final DateResolution res) {
super();
this.type = type;
- this.day = day;
- this.month = month;
- this.year = year;
+ this.date = date;
+ this.res = res;
}
- /**
- * Gets the day-of-the-month.
- *
- * @return the day, one based
- */
- public int getDay() {
- return day;
+ public Date getDate() {
+ return date;
}
-
- /**
- * Gets the month-of-the-year.
- *
- * @return the month, one based
- */
- public int getMonth() {
- return month;
+
+ public DateResolution getDateResultion() {
+ return res;
}
-
/**
* Gets the operator type.
*
@@ -1583,24 +1615,14 @@ public class SearchQuery {
}
/**
- * Gets the year.
- *
- * @return the year
- */
- public int getYear() {
- return year;
- }
-
- /**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
- result = PRIME * result + day;
- result = PRIME * result + month;
- result = PRIME * result + year;
+ result = PRIME * result + (int)date.getTime();
+ result = PRIME * result + type.hashCode();
return result;
}
@@ -1616,14 +1638,12 @@ public class SearchQuery {
if (getClass() != obj.getClass())
return false;
final DateOperator other = (DateOperator) obj;
- if (day != other.day)
+ if (date != other.date)
return false;
- if (month != other.month)
+ if (res != other.res)
return false;
if (type != other.type)
return false;
- if (year != other.year)
- return false;
return true;
}
@@ -1638,7 +1658,7 @@ public class SearchQuery {
StringBuffer retValue = new StringBuffer();
- retValue.append("DateOperator ( ").append("day = ").append(this.day).append(TAB).append("month = ").append(this.month).append(TAB).append("type = ").append(this.type).append(TAB).append("year = ").append(this.year).append(TAB).append(" )");
+ retValue.append("DateOperator ( ").append("date = ").append(date.toString()).append(TAB).append("res = ").append(this.res.name()).append(TAB).append("type = ").append(this.type).append(TAB).append(TAB).append(" )");
return retValue.toString();
}
Modified: james/mailbox/trunk/store/pom.xml
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/pom.xml?rev=1092767&r1=1092766&r2=1092767&view=diff
==============================================================================
--- james/mailbox/trunk/store/pom.xml (original)
+++ james/mailbox/trunk/store/pom.xml Fri Apr 15 17:20:35 2011
@@ -53,6 +53,10 @@
<artifactId>lucene-analyzers</artifactId>
</dependency>
<dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ </dependency>
+ <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MessageSearches.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MessageSearches.java?rev=1092767&r1=1092766&r2=1092767&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MessageSearches.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MessageSearches.java Fri Apr 15 17:20:35 2011
@@ -32,8 +32,10 @@ import java.util.TimeZone;
import javax.mail.Flags;
+import org.apache.commons.lang.time.DateUtils;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.SearchQuery.DateResolution;
import org.apache.james.mailbox.UnsupportedSearchException;
import org.apache.james.mailbox.SearchQuery.NumericRange;
import org.apache.james.mailbox.store.mail.model.Header;
@@ -324,24 +326,23 @@ public class MessageSearches {
private boolean matches(final SearchQuery.DateOperator operator,
final String headerName, final MailboxMembership<?> message) throws UnsupportedSearchException {
- final int day = operator.getDay();
- final int month = operator.getMonth();
- final int year = operator.getYear();
- final int iso = toISODate(day, month, year);
+
+ final Date date = operator.getDate();
+ final DateResolution res = operator.getDateResultion();
final String value = headerValue(headerName, message);
if (value == null) {
return false;
} else {
try {
- final int isoFieldValue = toISODate(value);
+ final Date isoFieldValue = toISODate(value);
final SearchQuery.DateComparator type = operator.getType();
switch (type) {
case AFTER:
- return iso < isoFieldValue;
+ return after(isoFieldValue, date, res);
case BEFORE:
- return iso > isoFieldValue;
+ return before(isoFieldValue, date, res);
case ON:
- return iso == isoFieldValue;
+ return on(isoFieldValue, date, res);
default:
throw new UnsupportedSearchException();
}
@@ -364,12 +365,10 @@ public class MessageSearches {
return value;
}
- private int toISODate(String value) throws ParseException {
+ private Date toISODate(String value) throws ParseException {
final StringReader reader = new StringReader(value);
final DateTime dateTime = new DateTimeParser(reader).parseAll();
- final int isoFieldValue = toISODate(dateTime.getDay(), dateTime
- .getMonth(), dateTime.getYear());
- return isoFieldValue;
+ return dateTime.getDate();
}
private boolean matches(SearchQuery.SizeCriterion criterion, MailboxMembership<?> message)
@@ -399,58 +398,60 @@ public class MessageSearches {
private boolean matchesInternalDate(
final SearchQuery.DateOperator operator, final MailboxMembership<?> message)
throws UnsupportedSearchException {
- final int day = operator.getDay();
- final int month = operator.getMonth();
- final int year = operator.getYear();
+ final Date date = operator.getDate();
+ final DateResolution res = operator.getDateResultion();
final Date internalDate = message.getInternalDate();
final SearchQuery.DateComparator type = operator.getType();
switch (type) {
case ON:
- return on(day, month, year, internalDate);
+ return on(internalDate, date, res);
case BEFORE:
- return before(day, month, year, internalDate);
+ return before(internalDate, date, res);
case AFTER:
- return after(day, month, year, internalDate);
+ return after(internalDate, date, res);
default:
throw new UnsupportedSearchException();
}
}
- private boolean on(final int day, final int month, final int year,
- final Date date) {
- final Calendar gmt = getGMT();
- gmt.setTime(date);
- return day == gmt.get(Calendar.DAY_OF_MONTH)
- && month == (gmt.get(Calendar.MONTH) + 1)
- && year == gmt.get(Calendar.YEAR);
- }
-
- private boolean before(final int day, final int month, final int year,
- final Date date) {
- return toISODate(date) < toISODate(day, month, year);
- }
-
- private boolean after(final int day, final int month, final int year,
- final Date date) {
- return toISODate(date) > toISODate(day, month, year);
- }
-
- private int toISODate(final Date date) {
- final Calendar gmt = getGMT();
- gmt.setTime(date);
- final int day = gmt.get(Calendar.DAY_OF_MONTH);
- final int month = (gmt.get(Calendar.MONTH) + 1);
- final int year = gmt.get(Calendar.YEAR);
- final int result = toISODate(day, month, year);
- return result;
+ private boolean on(Date date1,
+ final Date date2, DateResolution res) {
+ int type = SearchQuery.toCalendarType(res);
+ final Calendar gmt1 = getGMT();
+ gmt1.setTime(date1);
+
+ final Calendar gmt2 = getGMT();
+ gmt2.setTime(date2);
+
+ return DateUtils.truncate(gmt1, type).getTimeInMillis() == (DateUtils.truncate(gmt2, type)).getTimeInMillis();
+ }
+
+ private boolean before(Date date1,
+ final Date date2, DateResolution res) {
+ int type = SearchQuery.toCalendarType(res);
+ final Calendar gmt1 = getGMT();
+ gmt1.setTime(date1);
+
+ final Calendar gmt2 = getGMT();
+ gmt2.setTime(date2);
+
+ return DateUtils.truncate(gmt1, type).before(DateUtils.truncate(gmt2, type));
+ }
+
+ private boolean after(Date date1,
+ final Date date2, DateResolution res) {
+ int type = SearchQuery.toCalendarType(res);
+ final Calendar gmt1 = getGMT();
+ gmt1.setTime(date1);
+
+ final Calendar gmt2 = getGMT();
+ gmt2.setTime(date2);
+
+ return DateUtils.truncate(gmt1, type).after(DateUtils.truncate(gmt2, type));
}
+
private Calendar getGMT() {
return Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.UK);
}
-
- private static int toISODate(final int day, final int month, final int year) {
- final int result = (year * 10000) + (month * 100) + day;
- return result;
- }
}
Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndex.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndex.java?rev=1092767&r1=1092766&r2=1092767&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndex.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndex.java Fri Apr 15 17:20:35 2011
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
@@ -30,6 +31,7 @@ import java.util.Locale;
import javax.mail.Flags;
import javax.mail.Flags.Flag;
+import org.apache.commons.lang.time.DateUtils;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageRange;
@@ -38,6 +40,7 @@ import org.apache.james.mailbox.SearchQu
import org.apache.james.mailbox.SearchQuery.ContainsOperator;
import org.apache.james.mailbox.SearchQuery.Criterion;
import org.apache.james.mailbox.SearchQuery.DateOperator;
+import org.apache.james.mailbox.SearchQuery.DateResolution;
import org.apache.james.mailbox.SearchQuery.FlagCriterion;
import org.apache.james.mailbox.SearchQuery.HeaderCriterion;
import org.apache.james.mailbox.SearchQuery.HeaderOperator;
@@ -54,7 +57,6 @@ import org.apache.james.mime4j.message.S
import org.apache.james.mime4j.parser.MimeStreamParser;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.PerFieldAnalyzerWrapper;
-import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
@@ -123,11 +125,16 @@ public class LuceneMessageSearchIndex<Id
*/
public final static String HEADERS_FIELD ="headers";
- /**
- * {@link Field} which will contain the internalDate of the {@link MailboxMembership}
- */
- public final static String INTERNAL_DATE_FIELD ="internaldate";
+
+ public final static String INTERNAL_DATE_FIELD_YEAR_RESOLUTION ="internaldateYearResolution";
+ public final static String INTERNAL_DATE_FIELD_MONTH_RESOLUTION ="internaldateMonthResolution";
+ public final static String INTERNAL_DATE_FIELD_DAY_RESOLUTION ="internaldateDayResolution";
+ public final static String INTERNAL_DATE_FIELD_HOUR_RESOLUTION ="internaldateHourResolution";
+ public final static String INTERNAL_DATE_FIELD_MINUTE_RESOLUTION ="internaldateMinuteResolution";
+ public final static String INTERNAL_DATE_FIELD_SECOND_RESOLUTION ="internaldateSecondResolution";
+ public final static String INTERNAL_DATE_FIELD_MILLISECOND_RESOLUTION ="internaldateMillisecondResolution";
+
/**
* {@link Field} which will contain the id of the {@link Mailbox}
*/
@@ -225,8 +232,14 @@ public class LuceneMessageSearchIndex<Id
// add flags
indexFlags(membership.createFlags(), doc);
- // store the internal date with resulution of a DAY
- doc.add(new NumericField(INTERNAL_DATE_FIELD,Store.NO, true).setLongValue(DateTools.round(membership.getInternalDate().getTime(),DateTools.Resolution.DAY)));
+ doc.add(new NumericField(INTERNAL_DATE_FIELD_YEAR_RESOLUTION,Store.NO, true).setLongValue(DateUtils.truncate(membership.getInternalDate(),Calendar.YEAR).getTime()));
+ doc.add(new NumericField(INTERNAL_DATE_FIELD_MONTH_RESOLUTION,Store.NO, true).setLongValue(DateUtils.truncate(membership.getInternalDate(),Calendar.MONTH).getTime()));
+ doc.add(new NumericField(INTERNAL_DATE_FIELD_DAY_RESOLUTION,Store.NO, true).setLongValue(DateUtils.truncate(membership.getInternalDate(),Calendar.DAY_OF_MONTH).getTime()));
+ doc.add(new NumericField(INTERNAL_DATE_FIELD_HOUR_RESOLUTION,Store.NO, true).setLongValue(DateUtils.truncate(membership.getInternalDate(),Calendar.HOUR_OF_DAY).getTime()));
+ doc.add(new NumericField(INTERNAL_DATE_FIELD_MINUTE_RESOLUTION,Store.NO, true).setLongValue(DateUtils.truncate(membership.getInternalDate(),Calendar.MINUTE).getTime()));
+ doc.add(new NumericField(INTERNAL_DATE_FIELD_SECOND_RESOLUTION,Store.NO, true).setLongValue(DateUtils.truncate(membership.getInternalDate(),Calendar.SECOND).getTime()));
+ doc.add(new NumericField(INTERNAL_DATE_FIELD_MILLISECOND_RESOLUTION,Store.NO, true).setLongValue(DateUtils.truncate(membership.getInternalDate(),Calendar.MILLISECOND).getTime()));
+
doc.add(new NumericField(SIZE_FIELD,Store.NO, true).setLongValue(membership.getMessage().getFullContentOctets()));
// content handler which will index the headers and the body of the message
@@ -273,7 +286,7 @@ public class LuceneMessageSearchIndex<Id
MimeStreamParser parser = new MimeStreamParser();
parser.setContentHandler(handler);
try {
- // paese the message to index headers and body
+ // parse the message to index headers and body
parser.parse(membership.getMessage().getFullContent());
} catch (MimeException e) {
// This should never happen as it was parsed before too without problems.
@@ -305,6 +318,34 @@ public class LuceneMessageSearchIndex<Id
}
+
+ private static String toInteralDateField(DateResolution res) {
+ String field;
+ switch (res) {
+ case Year:
+ field = INTERNAL_DATE_FIELD_YEAR_RESOLUTION;
+ break;
+ case Month:
+ field = INTERNAL_DATE_FIELD_MONTH_RESOLUTION;
+ break;
+ case Day:
+ field = INTERNAL_DATE_FIELD_DAY_RESOLUTION;
+ break;
+ case Hour:
+ field = INTERNAL_DATE_FIELD_HOUR_RESOLUTION;
+ break;
+ case Minute:
+ field = INTERNAL_DATE_FIELD_MINUTE_RESOLUTION;
+ break;
+ case Second:
+ field = INTERNAL_DATE_FIELD_SECOND_RESOLUTION;
+ break;
+ default:
+ field = INTERNAL_DATE_FIELD_MILLISECOND_RESOLUTION;
+ break;
+ }
+ return field;
+ }
/**
* Return a {@link Query} which is build based on the given {@link SearchQuery.InternalDateCriterion}
@@ -315,17 +356,18 @@ public class LuceneMessageSearchIndex<Id
*/
public static Query createInternalDateQuery(SearchQuery.InternalDateCriterion crit) throws UnsupportedSearchException {
DateOperator op = crit.getOperator();
- Calendar cal = Calendar.getInstance();
- cal.set(op.getYear(), op.getMonth() - 1, op.getDay());
- long value = DateTools.round(cal.getTimeInMillis(), DateTools.Resolution.DAY);
+ DateResolution res = op.getDateResultion();
+ Date date = op.getDate();
+ long value = DateUtils.truncate(date, SearchQuery.toCalendarType(res)).getTime();
+ String field = toInteralDateField(res);
switch(op.getType()) {
case ON:
- return NumericRangeQuery.newLongRange(INTERNAL_DATE_FIELD ,value, value, true, true);
+ return NumericRangeQuery.newLongRange(field ,value, value, true, true);
case BEFORE:
- return NumericRangeQuery.newLongRange(INTERNAL_DATE_FIELD ,0L, value, true, false);
+ return NumericRangeQuery.newLongRange(field ,0L, value, true, false);
case AFTER:
- return NumericRangeQuery.newLongRange(INTERNAL_DATE_FIELD ,value, Long.MAX_VALUE, false, true);
+ return NumericRangeQuery.newLongRange(field ,value, Long.MAX_VALUE, false, true);
default:
throw new UnsupportedSearchException();
}
Modified: james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java?rev=1092767&r1=1092766&r2=1092767&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java (original)
+++ james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java Fri Apr 15 17:20:35 2011
@@ -22,12 +22,16 @@ package org.apache.james.mailbox.store;
import static org.junit.Assert.*;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
import javax.mail.Flags;
import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.SearchQuery.DateResolution;
import org.apache.james.mailbox.store.MessageSearches;
import org.apache.james.mailbox.store.mail.model.MailboxMembership;
import org.junit.Before;
@@ -57,6 +61,15 @@ public class SearchUtilsTest {
Collection<Long> recent;
+ private Calendar getGMT() {
+ return Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.UK);
+ }
+
+ private Date getDate(int day, int month, int year) {
+ Calendar cal = getGMT();
+ cal.set(year, month -1, day);
+ return cal.getTime();
+ }
@Before
public void setUp() throws Exception {
recent = new ArrayList<Long>();
@@ -110,31 +123,32 @@ public class SearchUtilsTest {
public void testMatchInternalDateEquals() throws Exception {
builder.internalDate = SUN_SEP_9TH_2001;
MailboxMembership<Long> row = builder.build();
- assertFalse(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2000),
+ assertFalse(searches.isMatch(SearchQuery.internalDateOn(getDate(9, 9, 2000), DateResolution.Day),
row, recent));
- assertFalse(searches.isMatch(SearchQuery.internalDateOn(8, 9, 2001),
+ assertFalse(searches.isMatch(SearchQuery.internalDateOn(getDate(8, 9, 2001), DateResolution.Day),
row, recent));
- assertTrue(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2001),
+ assertTrue(searches.isMatch(SearchQuery.internalDateOn(getDate(9, 9, 2001), DateResolution.Day),
row, recent));
- assertFalse(searches.isMatch(SearchQuery.internalDateOn(10, 9, 2001),
+ assertFalse(searches.isMatch(SearchQuery.internalDateOn(getDate(10, 9, 2001), DateResolution.Day),
row, recent));
- assertFalse(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2002),
+ assertFalse(searches.isMatch(SearchQuery.internalDateOn(getDate(9, 9, 2002), DateResolution.Day),
row, recent));
}
+
@Test
public void testMatchInternalDateBefore() throws Exception {
builder.internalDate = SUN_SEP_9TH_2001;
MailboxMembership<Long> row = builder.build();
assertFalse(searches.isMatch(
- SearchQuery.internalDateBefore(9, 9, 2000), row, recent));
+ SearchQuery.internalDateBefore(getDate(9, 9, 2000), DateResolution.Day), row, recent));
assertFalse(searches.isMatch(
- SearchQuery.internalDateBefore(8, 9, 2001), row, recent));
+ SearchQuery.internalDateBefore(getDate(8, 9, 2001), DateResolution.Day), row, recent));
assertFalse(searches.isMatch(
- SearchQuery.internalDateBefore(9, 9, 2001), row, recent));
+ SearchQuery.internalDateBefore(getDate(9, 9, 2001), DateResolution.Day), row, recent));
assertTrue(searches.isMatch(
- SearchQuery.internalDateBefore(10, 9, 2001), row, recent));
- assertTrue(searches.isMatch(SearchQuery.internalDateBefore(9, 9, 2002),
+ SearchQuery.internalDateBefore(getDate(10, 9, 2001), DateResolution.Day), row, recent));
+ assertTrue(searches.isMatch(SearchQuery.internalDateBefore(getDate(9, 9, 2002), DateResolution.Day),
row, recent));
}
@@ -142,15 +156,15 @@ public class SearchUtilsTest {
public void testMatchInternalDateAfter() throws Exception {
builder.internalDate = SUN_SEP_9TH_2001;
MailboxMembership<Long> row = builder.build();
- assertTrue(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2000),
+ assertTrue(searches.isMatch(SearchQuery.internalDateAfter(getDate(9, 9, 2000), DateResolution.Day),
row, recent));
- assertTrue(searches.isMatch(SearchQuery.internalDateAfter(8, 9, 2001),
+ assertTrue(searches.isMatch(SearchQuery.internalDateAfter(getDate(8, 9, 2001), DateResolution.Day),
row, recent));
- assertFalse(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2001),
+ assertFalse(searches.isMatch(SearchQuery.internalDateAfter(getDate(9, 9, 2001), DateResolution.Day),
row, recent));
assertFalse(searches.isMatch(
- SearchQuery.internalDateAfter(10, 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2002),
+ SearchQuery.internalDateAfter(getDate(10, 9, 2001), DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.internalDateAfter(getDate(9, 9, 2002), DateResolution.Day),
row, recent));
}
@@ -158,108 +172,108 @@ public class SearchUtilsTest {
public void testMatchHeaderDateAfter() throws Exception {
builder.header(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
- assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2000), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 8,
- 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2001), row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2000), DateResolution.Day), row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(8,
+ 9, 2001), DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2001), DateResolution.Day), row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,
- 10, 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS", 9, 9,
- 2001), row, recent));
+ getDate(10, 9, 2001), DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2002), DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS", getDate(9, 9,
+ 2001), DateResolution.Day), row, recent));
}
@Test
public void testShouldMatchCapsHeaderDateAfter() throws Exception {
builder.header(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
- assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2000), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 8,
- 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2001), row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2000), DateResolution.Day), row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(8,
+ 9, 2001), DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2001), DateResolution.Day), row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,
- 10, 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS", 9, 9,
- 2001), row, recent));
+ getDate(10, 9, 2001), DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2002), DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS", getDate(9, 9,
+ 2001), DateResolution.Day), row, recent));
}
@Test
public void testShouldMatchLowersHeaderDateAfter() throws Exception {
builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
- assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2000), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 8,
- 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2001), row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2000), DateResolution.Day), row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(8,
+ 9, 2001),DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2001), DateResolution.Day),row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,
- 10, 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9,
- 9, 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS", 9, 9,
- 2001), row, recent));
+ getDate(10, 9, 2001), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
+ 9, 2002), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS", getDate(9, 9,
+ 2001), DateResolution.Day),row, recent));
}
@Test
public void testMatchHeaderDateOn() throws Exception {
builder.header(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2000), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 8, 9,
- 2001), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 10,
- 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS", 9, 9,
- 2001), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2000), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(8, 9,
+ 2001), DateResolution.Day),row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2001), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(10,
+ 9, 2001), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2002), DateResolution.Day), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS", getDate(9, 9,
+ 2001), DateResolution.Day), row, recent));
}
@Test
public void testShouldMatchCapsHeaderDateOn() throws Exception {
builder.header(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2000), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 8, 9,
- 2001), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 10,
- 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS", 9, 9,
- 2001), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2000), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(8, 9,
+ 2001), DateResolution.Day),row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2001), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(10,
+ 9, 2001), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2002), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS", getDate(9, 9,
+ 2001), DateResolution.Day),row, recent));
}
@Test
public void testShouldMatchLowersHeaderDateOn() throws Exception {
builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2000), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 8, 9,
- 2001), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 10,
- 9, 2001), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9,
- 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS", 9, 9,
- 2001), row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2000), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(8, 9,
+ 2001), DateResolution.Day),row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2001), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(10,
+ 9, 2001), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
+ 2002), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS", getDate(9, 9,
+ 2001), DateResolution.Day),row, recent));
}
@Test
@@ -267,17 +281,17 @@ public class SearchUtilsTest {
builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 9, 9, 2000), row, recent));
+ getDate(9, 9, 2000), DateResolution.Day),row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 8, 9, 2001), row, recent));
+ getDate(8, 9, 2001), DateResolution.Day),row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 9, 9, 2001), row, recent));
+ getDate(9, 9, 2001), DateResolution.Day),row, recent));
assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 10, 9, 2001), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9,
- 9, 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS", 9,
- 9, 2001), row, recent));
+ getDate(10, 9, 2001), DateResolution.Day),row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(9,
+ 9, 2002), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS", getDate(9,
+ 9, 2001), DateResolution.Day),row, recent));
}
@Test
@@ -285,17 +299,17 @@ public class SearchUtilsTest {
builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 9, 9, 2000), row, recent));
+ getDate(9, 9, 2000), DateResolution.Day),row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 8, 9, 2001), row, recent));
+ getDate(8, 9, 2001), DateResolution.Day),row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 9, 9, 2001), row, recent));
+ getDate(9, 9, 2001), DateResolution.Day),row, recent));
assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 10, 9, 2001), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9,
- 9, 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS", 9,
- 9, 2001), row, recent));
+ getDate(10, 9, 2001), DateResolution.Day),row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(9,
+ 9, 2002), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS", getDate(9,
+ 9, 2001), DateResolution.Day),row, recent));
}
@Test
@@ -303,17 +317,17 @@ public class SearchUtilsTest {
builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
MailboxMembership<Long> row = builder.build();
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 9, 9, 2000), row, recent));
+ getDate(9, 9, 2000), DateResolution.Day),row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 8, 9, 2001), row, recent));
+ getDate(8, 9, 2001), DateResolution.Day),row, recent));
assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 9, 9, 2001), row, recent));
+ getDate(9, 9, 2001), DateResolution.Day),row, recent));
assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
- 10, 9, 2001), row, recent));
- assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9,
- 9, 2002), row, recent));
- assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS", 9,
- 9, 2001), row, recent));
+ getDate(10, 9, 2001), DateResolution.Day),row, recent));
+ assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(9,
+ 9, 2002), DateResolution.Day),row, recent));
+ assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS", getDate(9,
+ 9, 2001), DateResolution.Day),row, recent));
}
@Test
Modified: james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java?rev=1092767&r1=1092766&r2=1092767&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java (original)
+++ james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java Fri Apr 15 17:20:35 2011
@@ -32,6 +32,7 @@ import javax.mail.Flags;
import javax.mail.Flags.Flag;
import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.SearchQuery.DateResolution;
import org.apache.james.mailbox.store.MessageSearchIndex;
import org.apache.james.mailbox.store.SimpleHeader;
import org.apache.james.mailbox.store.SimpleMailboxMembership;
@@ -160,7 +161,7 @@ public class LuceneMessageSearchIndexTes
SearchQuery q2 = new SearchQuery();
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
- q2.andCriteria(SearchQuery.internalDateBefore(cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.MONTH) +1 , cal.get(Calendar.YEAR)));
+ q2.andCriteria(SearchQuery.internalDateBefore(cal.getTime(), DateResolution.Day));
Iterator<Long> it4 = index.search(null, mailbox, q2);
assertEquals(2, it4.next().longValue(), 1);
@@ -173,7 +174,7 @@ public class LuceneMessageSearchIndexTes
SearchQuery q2 = new SearchQuery();
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
- q2.andCriteria(SearchQuery.internalDateAfter(cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.MONTH) +1, cal.get(Calendar.YEAR)));
+ q2.andCriteria(SearchQuery.internalDateAfter(cal.getTime(), DateResolution.Day));
Iterator<Long> it4 = index.search(null, mailbox, q2);
assertEquals(3, it4.next().longValue(), 1);
assertFalse(it4.hasNext());
@@ -186,7 +187,7 @@ public class LuceneMessageSearchIndexTes
SearchQuery q2 = new SearchQuery();
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
- q2.andCriteria(SearchQuery.internalDateOn(cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.MONTH) +1, cal.get(Calendar.YEAR)));
+ q2.andCriteria(SearchQuery.internalDateOn(cal.getTime(), DateResolution.Day));
Iterator<Long> it4 = index.search(null, mailbox, q2);
assertEquals(1, it4.next().longValue(), 1);
assertFalse(it4.hasNext());
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org