001 /*
002 * Created on Jun 26, 2009
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 *
014 * Copyright @2009-2010 the original author or authors.
015 */
016 package org.fest.swing.util;
017
018 import static org.fest.swing.util.Strings.areEqualOrMatch;
019 import static org.fest.util.Arrays.format;
020 import static org.fest.util.Arrays.isEmpty;
021 import static org.fest.util.Strings.quote;
022
023 /**
024 * Understands matching text to a group of <code>String</code> values. Matching is perform by equality or by regular
025 * expression matching.
026 *
027 * @author Alex Ruiz
028 */
029 public class StringTextMatcher implements TextMatcher {
030
031 private final String[] values;
032
033 /**
034 * Creates a new </code>{@link StringTextMatcher}</code>.
035 * @param values the <code>String</code> values to match. Each value can be a regular expression.
036 * @throws NullPointerException if the array of values is <code>null</code>.
037 * @throws IllegalArgumentException if the array of values is empty.
038 */
039 public StringTextMatcher(String...values) {
040 if (values == null) throw new NullPointerException("The array of values should not be null");
041 if (isEmpty(values)) throw new IllegalArgumentException("The array of values should not be empty");
042 this.values = values;
043 }
044
045 /**
046 * Indicates whether the given text matches the <code>String</code> values in this matcher. Each value can be a
047 * regular expression.
048 * @param text the text to verify.
049 * @return <code>true</code> if the given text matches the <code>String</code> values in this matcher,
050 * <code>false</code> otherwise.
051 */
052 public boolean isMatching(String text) {
053 for (String value : values)
054 if (areEqualOrMatch(value, text)) return true;
055 return false;
056 }
057
058 /**
059 * Returns "value" if this matcher contains only one value, or "values" if this matcher contains more than one
060 * value.
061 * @return "value" if this matcher contains only one value, or "values" if this matcher contains more than one
062 * value.
063 */
064 public String description() {
065 if (onlyOneValue()) return "value";
066 return "values";
067 }
068
069 /**
070 * Returns the <code>String</code> values in this matcher, formatted as a single <code>String</code>.
071 * @return the <code>String</code> values in this matcher, formatted as a single <code>String</code>.
072 */
073 public String formattedValues() {
074 if (onlyOneValue()) return quote(values[0]);
075 return format(values);
076 }
077
078 private boolean onlyOneValue() {
079 return values.length == 1;
080 }
081 }