001 /**
002 *
003 * Copyright 2003-2004 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package javax.mail.search;
019
020 /**
021 * A Term that provides matching criteria for Strings.
022 *
023 * @version $Rev: 125583 $ $Date: 2005-01-18 19:44:27 -0800 (Tue, 18 Jan 2005) $
024 */
025 public abstract class StringTerm extends SearchTerm {
026 /**
027 * If true, case should be ignored during matching.
028 */
029 protected boolean ignoreCase;
030
031 /**
032 * The pattern associated with this term.
033 */
034 protected String pattern;
035
036 /**
037 * Constructor specifying a pattern.
038 * Defaults to case insensitive matching.
039 * @param pattern the pattern for this term
040 */
041 protected StringTerm(String pattern) {
042 this(pattern, true);
043 }
044
045 /**
046 * Constructor specifying pattern and case sensitivity.
047 * @param pattern the pattern for this term
048 * @param ignoreCase if true, case should be ignored during matching
049 */
050 protected StringTerm(String pattern, boolean ignoreCase) {
051 this.pattern = pattern;
052 this.ignoreCase = ignoreCase;
053 }
054
055 /**
056 * Return the pattern associated with this term.
057 * @return the pattern associated with this term
058 */
059 public String getPattern() {
060 return pattern;
061 }
062
063 /**
064 * Indicate if case should be ignored when matching.
065 * @return if true, case should be ignored during matching
066 */
067 public boolean getIgnoreCase() {
068 return ignoreCase;
069 }
070
071 /**
072 * Determine if the pattern associated with this term is a substring of the
073 * supplied String. If ignoreCase is true then case will be ignored.
074 *
075 * @param match the String to compare to
076 * @return true if this patter is a substring of the supplied String
077 */
078 protected boolean match(String match) {
079 match: for (int length = match.length() - pattern.length(); length > 0; length--) {
080 for (int i = 0; i < pattern.length(); i++) {
081 char c1 = match.charAt(length + i);
082 char c2 = match.charAt(i);
083 if (c1 == c2) {
084 continue;
085 }
086 if (ignoreCase) {
087 if (Character.toLowerCase(c1) == Character.toLowerCase(c2)) {
088 continue;
089 }
090 if (Character.toUpperCase(c1) == Character.toUpperCase(c2)) {
091 continue;
092 }
093 }
094 continue match;
095 }
096 return true;
097 }
098 return false;
099 }
100
101 public boolean equals(Object other) {
102 return super.equals(other)
103 && ((StringTerm) other).pattern.equals(pattern)
104 && ((StringTerm) other).ignoreCase == ignoreCase;
105 }
106
107 public int hashCode() {
108 return super.hashCode() + pattern.hashCode() + (ignoreCase ? 32 : 79);
109 }
110 }