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 rd...@apache.org on 2008/03/04 23:02:26 UTC

svn commit: r633666 - in /james/server/trunk: core-library/src/main/java/org/apache/james/mailboxmanager/ torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/ torque-mailboxmanager-function/src/test/java/org/apache/james...

Author: rdonkin
Date: Tue Mar  4 14:02:26 2008
New Revision: 633666

URL: http://svn.apache.org/viewvc?rev=633666&view=rev
Log:
Torque search query.

Added:
    james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java
    james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java
    james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java
Modified:
    james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java

Modified: james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java
URL: http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java?rev=633666&r1=633665&r2=633666&view=diff
==============================================================================
--- james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java (original)
+++ james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java Tue Mar  4 14:02:26 2008
@@ -59,6 +59,16 @@
     }
     
     /**
+     * Creates a filter for message size equal to the given value
+     * @param value messages with size equal to this value will be selected
+     * by the returned criterion
+     * @return <code>Criterion</code>, not null
+     */
+    public static final Criterion sizeEquals(long value) {
+        return new SizeCriterion(new NumericOperator(value, NumericOperator.EQUALS));
+    }
+    
+    /**
      * Creates a filter matching messages with internal date after the given date.
      * @param day one based day of the month
      * @param month one based month of the year

Added: james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java
URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java?rev=633666&view=auto
==============================================================================
--- james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java (added)
+++ james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java Tue Mar  4 14:02:26 2008
@@ -0,0 +1,217 @@
+/****************************************************************
+ * 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.mailboxmanager.torque;
+
+import java.io.StringReader;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.james.mailboxmanager.SearchQuery;
+import org.apache.james.mailboxmanager.torque.om.MessageHeader;
+import org.apache.james.mailboxmanager.torque.om.MessageRow;
+import org.apache.james.mime4j.field.datetime.DateTime;
+import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
+import org.apache.james.mime4j.field.datetime.parser.ParseException;
+import org.apache.torque.TorqueException;
+
+/**
+ * Uility methods to help perform search operations.
+ */
+class SearchUtils {
+    
+    public static boolean matches(SearchQuery.Criterion criterion, MessageRow row) throws TorqueException {
+        final boolean result;
+        if (criterion instanceof SearchQuery.InternalDateCriterion) {
+            result = matches((SearchQuery.InternalDateCriterion) criterion, row);
+        } else if (criterion instanceof SearchQuery.SizeCriterion) {
+            result = matches((SearchQuery.SizeCriterion) criterion, row);
+        } else if (criterion instanceof SearchQuery.HeaderCriterion) {
+            result = matches((SearchQuery.HeaderCriterion) criterion, row);
+        } else {
+            throw new UnsupportedSearchException();
+        }
+        return result;
+    }
+    
+    private static boolean matches(SearchQuery.HeaderCriterion criterion, MessageRow row) throws TorqueException {
+        final SearchQuery.HeaderOperator operator = criterion.getOperator();
+        final String headerName = criterion.getHeaderName();
+        final boolean result;
+        if (operator instanceof SearchQuery.DateOperator) {
+            result = matches((SearchQuery.DateOperator) operator, headerName, row);
+        } else if (operator instanceof SearchQuery.ContainsOperator) {
+            result = matches((SearchQuery.ContainsOperator)operator, headerName, row);
+        } else if (operator instanceof SearchQuery.ExistsOperator) {
+            result = exists(headerName, row);
+        } else {
+            throw new UnsupportedSearchException();
+        }
+        return result;
+    }
+
+    private static boolean exists(String headerName, MessageRow row) throws TorqueException {
+        boolean result = false;
+        final List headers = row.getMessageHeaders();
+        for (Iterator it = headers.iterator(); it.hasNext();) {
+            final MessageHeader header = (MessageHeader) it.next();
+            final String name = header.getField();
+            if (headerName.equalsIgnoreCase(name)) {
+                result = true;
+                break;
+            }
+        }
+        return result;
+    }
+
+    private static boolean matches(final SearchQuery.ContainsOperator operator, final String headerName, final MessageRow row) throws TorqueException {
+        final String text = operator.getValue();
+        boolean result = false;
+        final List headers = row.getMessageHeaders();
+        for (Iterator it = headers.iterator(); it.hasNext();) {
+            final MessageHeader header = (MessageHeader) it.next();
+            final String name = header.getField();
+            if (headerName.equalsIgnoreCase(name)) {
+                final String value = header.getValue();
+                if (value.contains(text)) {
+                    result = true;
+                    break;
+                }
+            }
+        }
+        return result;
+    }
+
+    private static boolean matches(final SearchQuery.DateOperator operator, final String headerName, final MessageRow row) throws TorqueException {
+        final int day = operator.getDay();
+        final int month = operator.getMonth();
+        final int year = operator.getYear();
+        final int iso = toISODate(day, month, year);
+        final String value = headerValue(headerName, row);
+        if (value == null) {
+            return false;
+        } else {
+            try {
+                final int isoFieldValue = toISODate(value);
+                final int type = operator.getType();
+                switch (type) {
+                    case SearchQuery.DateOperator.AFTER: return iso < isoFieldValue; 
+                    case SearchQuery.DateOperator.BEFORE: return iso > isoFieldValue; 
+                    case SearchQuery.DateOperator.ON: return iso == isoFieldValue;
+                    default: throw new UnsupportedSearchException();
+                }
+            } catch (ParseException e) {
+                return false;
+            } 
+        }
+    }
+
+    private static String headerValue(final String headerName, final MessageRow row) throws TorqueException {
+        final List headers = row.getMessageHeaders();
+        String value = null;
+        for (Iterator it = headers.iterator(); it.hasNext();) {
+            final MessageHeader header = (MessageHeader) it.next();
+            final String name = header.getField();
+            if (headerName.equalsIgnoreCase(name)) {
+                value = header.getValue();
+                break;
+            }
+        }
+        return value;
+    }
+
+    private static int 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;
+    }
+    
+    private static boolean matches(SearchQuery.SizeCriterion criterion, MessageRow row) throws UnsupportedSearchException {
+        final SearchQuery.NumericOperator operator = criterion.getOperator();
+        final int size = row.getSize();
+        final long value = operator.getValue();
+        final int type = operator.getType();
+        switch (type) {
+            case SearchQuery.NumericOperator.LESS_THAN: return size < value;
+            case SearchQuery.NumericOperator.GREATER_THAN: return size > value;
+            case SearchQuery.NumericOperator.EQUALS: return size == value;
+            default: throw new UnsupportedSearchException();
+        }
+    }
+    
+    private static boolean matches(SearchQuery.InternalDateCriterion criterion, MessageRow row) throws UnsupportedSearchException {
+        final SearchQuery.DateOperator operator = criterion.getOperator();
+        final boolean result = matchesInternalDate(operator, row);
+        return result;
+    }
+
+    private static boolean matchesInternalDate(final SearchQuery.DateOperator operator, final MessageRow row) throws UnsupportedSearchException {
+        final int day = operator.getDay();
+        final int month = operator.getMonth();
+        final int year = operator.getYear();
+        final Date internalDate = row.getInternalDate();
+        final int type = operator.getType();
+        switch (type) {
+            case SearchQuery.DateOperator.ON: return on(day, month, year, internalDate);
+            case SearchQuery.DateOperator.BEFORE: return before(day, month, year, internalDate);
+            case SearchQuery.DateOperator.AFTER: return after(day, month, year, internalDate);
+            default: throw new UnsupportedSearchException();
+        }
+    }
+    
+    private static 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 static boolean before(final int day, final int month, final int year, final Date date) {
+        return toISODate(date) < toISODate(day, month, year);
+    }
+    
+    private static boolean after(final int day, final int month, final int year, final Date date) {
+        return toISODate(date) > toISODate(day, month, year);
+    }
+    
+    private static 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 static 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;
+    }
+}

Added: james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java
URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java?rev=633666&view=auto
==============================================================================
--- james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java (added)
+++ james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java Tue Mar  4 14:02:26 2008
@@ -0,0 +1,34 @@
+/****************************************************************
+ * 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.mailboxmanager.torque;
+
+import org.apache.torque.TorqueException;
+
+/**
+ * Indicates that the requested search is not supported by this implementation.
+ */
+public class UnsupportedSearchException extends TorqueException {
+
+    private static final long serialVersionUID = -7442949630563672557L;
+
+    public UnsupportedSearchException() {
+        super("Unsupported search.");
+    }
+}

Added: james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java?rev=633666&view=auto
==============================================================================
--- james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java (added)
+++ james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java Tue Mar  4 14:02:26 2008
@@ -0,0 +1,247 @@
+/****************************************************************
+ * 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.mailboxmanager.torque;
+
+import java.util.Date;
+
+import org.apache.james.mailboxmanager.SearchQuery;
+import org.apache.james.mailboxmanager.torque.om.MessageHeader;
+import org.apache.james.mailboxmanager.torque.om.MessageRow;
+import org.apache.mailet.RFC2822Headers;
+import org.apache.torque.TorqueException;
+
+import junit.framework.TestCase;
+
+public class SearchUtilsTest extends TestCase {
+
+    private static final String RHUBARD = "Rhubard";
+    private static final String CUSTARD = "Custard";
+    private static final Date SUN_SEP_9TH_2001 = new Date(1000000000000L);
+    private static final int SIZE = 1729;
+    private static final String DATE_FIELD = RFC2822Headers.DATE;
+    private static final String SUBJECT_FIELD = RFC2822Headers.SUBJECT;
+    private static final String RFC822_SUN_SEP_9TH_2001 = "Sun, 9 Sep 2001 09:10:48 +0000 (GMT)";
+    private static final String TEXT = RHUBARD + RHUBARD + RHUBARD;
+    
+    MessageRow row;
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+        row = new MessageRow();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+    
+    public void testMatchSizeLessThan() throws Exception {
+        row.setSize(SIZE);
+        assertFalse(SearchUtils.matches(SearchQuery.sizeLessThan(SIZE - 1), row));
+        assertFalse(SearchUtils.matches(SearchQuery.sizeLessThan(SIZE), row));
+        assertTrue(SearchUtils.matches(SearchQuery.sizeLessThan(SIZE + 1), row));
+        assertTrue(SearchUtils.matches(SearchQuery.sizeLessThan(Integer.MAX_VALUE), row));
+    }
+    
+    public void testMatchSizeMoreThan() throws Exception {
+        row.setSize(SIZE);
+        assertTrue(SearchUtils.matches(SearchQuery.sizeGreaterThan(SIZE - 1), row));
+        assertFalse(SearchUtils.matches(SearchQuery.sizeGreaterThan(SIZE), row));
+        assertFalse(SearchUtils.matches(SearchQuery.sizeGreaterThan(SIZE + 1), row));
+        assertFalse(SearchUtils.matches(SearchQuery.sizeGreaterThan(Integer.MAX_VALUE), row));
+    }
+    
+    public void testMatchSizeEquals() throws Exception {
+        row.setSize(SIZE);
+        assertFalse(SearchUtils.matches(SearchQuery.sizeEquals(SIZE - 1), row));
+        assertTrue(SearchUtils.matches(SearchQuery.sizeEquals(SIZE), row));
+        assertFalse(SearchUtils.matches(SearchQuery.sizeEquals(SIZE + 1), row));
+        assertFalse(SearchUtils.matches(SearchQuery.sizeEquals(Integer.MAX_VALUE), row));
+    }
+    
+    public void testMatchInternalDateEquals() throws Exception {
+        row.setInternalDate(SUN_SEP_9TH_2001);
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateOn(9, 9, 2000), row));
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateOn(8, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.internalDateOn(9, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateOn(10, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateOn(9, 9, 2002), row));
+    }
+    
+    public void testMatchInternalDateBefore() throws Exception {
+        row.setInternalDate(SUN_SEP_9TH_2001);
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateBefore(9, 9, 2000), row));
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateBefore(8, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateBefore(9, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.internalDateBefore(10, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.internalDateBefore(9, 9, 2002), row));
+    }
+        
+    public void testMatchInternalDateAfter() throws Exception {
+        row.setInternalDate(SUN_SEP_9TH_2001);
+        assertTrue(SearchUtils.matches(SearchQuery.internalDateAfter(9, 9, 2000), row));
+        assertTrue(SearchUtils.matches(SearchQuery.internalDateAfter(8, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateAfter(9, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateAfter(10, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.internalDateAfter(9, 9, 2002), row));
+    }
+    
+    public void testMatchHeaderDateAfter() throws Exception {
+        addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row));
+    }
+    
+    public void testShouldMatchCapsHeaderDateAfter() throws Exception {
+        addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row));
+    }
+    
+    public void testShouldMatchLowersHeaderDateAfter() throws Exception {
+        addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row));
+    }
+    
+    public void testMatchHeaderDateOn() throws Exception {
+        addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row));
+    }
+    
+    public void testShouldMatchCapsHeaderDateOn() throws Exception {
+        addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row));
+     }
+    
+    public void testShouldMatchLowersHeaderDateOn() throws Exception {
+        addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row));
+    }
+    
+    
+    public void testMatchHeaderDateBefore() throws Exception {
+        addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row));
+    }
+    
+    public void testShouldMatchCapsHeaderDateBefore() throws Exception {
+        addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row));
+    }
+    
+    public void testShouldMatchLowersHeaderDateBefore() throws Exception {
+        addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row));
+    }
+    
+    public void testMatchHeaderContains() throws Exception {
+        addHeader(SUBJECT_FIELD, TEXT);
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, TEXT), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); 
+    }
+    
+    public void testShouldMatchLowerHeaderContains() throws Exception {
+        addHeader(SUBJECT_FIELD.toLowerCase(), TEXT);
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, TEXT), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); 
+    }
+    
+    public void testShouldMatchCapsHeaderContains() throws Exception {
+        addHeader(SUBJECT_FIELD.toUpperCase(), TEXT);
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, TEXT), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row));
+        assertFalse(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); 
+    }
+    
+    public void testMatchHeaderExists() throws Exception {
+        addHeader(SUBJECT_FIELD, TEXT);
+        assertFalse(SearchUtils.matches(SearchQuery.headerExists(DATE_FIELD), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerExists(SUBJECT_FIELD), row));
+    }
+
+    public void testShouldMatchLowersHeaderExists() throws Exception {
+        addHeader(SUBJECT_FIELD.toLowerCase(), TEXT);
+        assertFalse(SearchUtils.matches(SearchQuery.headerExists(DATE_FIELD), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerExists(SUBJECT_FIELD), row));
+    }
+    
+    public void testShouldMatchUppersHeaderExists() throws Exception {
+        addHeader(SUBJECT_FIELD.toUpperCase(), TEXT);
+        assertFalse(SearchUtils.matches(SearchQuery.headerExists(DATE_FIELD), row));
+        assertTrue(SearchUtils.matches(SearchQuery.headerExists(SUBJECT_FIELD), row));
+    }
+    
+    private void addHeader(String fieldName, String value) throws TorqueException {
+        final MessageHeader messageHeader = new MessageHeader();
+        messageHeader.setField(fieldName);
+        messageHeader.setValue(value);
+        row.addMessageHeader(messageHeader);
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org