001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  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
018package org.apache.commons.text.matcher;
019
020/**
021 * Provides access to matchers defined in this package.
022 *
023 * @since 1.3
024 */
025public final class StringMatcherFactory {
026
027    /**
028     * Defines the singleton for this class.
029     */
030    public static final StringMatcherFactory INSTANCE = new StringMatcherFactory();
031
032    /**
033     * Matches the same characters as StringTokenizer, namely space, tab, newline, form feed.
034     */
035    private static final AbstractStringMatcher.CharSetMatcher SPLIT_MATCHER = new AbstractStringMatcher.CharSetMatcher(
036            " \t\n\r\f".toCharArray());
037
038    /**
039     * Matches the comma character.
040     */
041    private static final AbstractStringMatcher.CharMatcher COMMA_MATCHER = new AbstractStringMatcher.CharMatcher(',');
042
043    /**
044     * Matches the tab character.
045     */
046    private static final AbstractStringMatcher.CharMatcher TAB_MATCHER = new AbstractStringMatcher.CharMatcher('\t');
047
048    /**
049     * Matches the space character.
050     */
051    private static final AbstractStringMatcher.CharMatcher SPACE_MATCHER = new AbstractStringMatcher.CharMatcher(' ');
052
053    /**
054     * Matches the String trim() whitespace characters.
055     */
056    private static final AbstractStringMatcher.TrimMatcher TRIM_MATCHER = new AbstractStringMatcher.TrimMatcher();
057
058    /**
059     * Matches the double quote character.
060     */
061    private static final AbstractStringMatcher.CharMatcher SINGLE_QUOTE_MATCHER = new AbstractStringMatcher.CharMatcher(
062            '\'');
063
064    /**
065     * Matches the double quote character.
066     */
067    private static final AbstractStringMatcher.CharMatcher DOUBLE_QUOTE_MATCHER = new AbstractStringMatcher.CharMatcher(
068            '"');
069
070    /**
071     * Matches the single or double quote character.
072     */
073    private static final AbstractStringMatcher.CharSetMatcher QUOTE_MATCHER = new AbstractStringMatcher.CharSetMatcher(
074            "'\"".toCharArray());
075
076    /**
077     * Matches no characters.
078     */
079    private static final AbstractStringMatcher.NoMatcher NONE_MATCHER = new AbstractStringMatcher.NoMatcher();
080
081    /**
082     * No need to build instances for now.
083     */
084    private StringMatcherFactory() {
085        // empty
086    }
087
088    /**
089     * Constructor that creates a matcher from a character.
090     *
091     * @param ch
092     *            the character to match, must not be null
093     * @return a new Matcher for the given char
094     */
095    public StringMatcher charMatcher(final char ch) {
096        return new AbstractStringMatcher.CharMatcher(ch);
097    }
098
099    /**
100     * Constructor that creates a matcher from a set of characters.
101     *
102     * @param chars
103     *            the characters to match, null or empty matches nothing
104     * @return a new matcher for the given char[]
105     */
106    public StringMatcher charSetMatcher(final char... chars) {
107        if (chars == null || chars.length == 0) {
108            return NONE_MATCHER;
109        }
110        if (chars.length == 1) {
111            return new AbstractStringMatcher.CharMatcher(chars[0]);
112        }
113        return new AbstractStringMatcher.CharSetMatcher(chars);
114    }
115
116    /**
117     * Creates a matcher from a string representing a set of characters.
118     *
119     * @param chars
120     *            the characters to match, null or empty matches nothing
121     * @return a new Matcher for the given characters
122     */
123    public StringMatcher charSetMatcher(final String chars) {
124        if (chars == null || chars.length() == 0) {
125            return NONE_MATCHER;
126        }
127        if (chars.length() == 1) {
128            return new AbstractStringMatcher.CharMatcher(chars.charAt(0));
129        }
130        return new AbstractStringMatcher.CharSetMatcher(chars.toCharArray());
131    }
132
133    /**
134     * Returns a matcher which matches the comma character.
135     *
136     * @return a matcher for a comma
137     */
138    public StringMatcher commaMatcher() {
139        return COMMA_MATCHER;
140    }
141
142    /**
143     * Returns a matcher which matches the double quote character.
144     *
145     * @return a matcher for a double quote
146     */
147    public StringMatcher doubleQuoteMatcher() {
148        return DOUBLE_QUOTE_MATCHER;
149    }
150
151    /**
152     * Matches no characters.
153     *
154     * @return a matcher that matches nothing
155     */
156    public StringMatcher noneMatcher() {
157        return NONE_MATCHER;
158    }
159
160    /**
161     * Returns a matcher which matches the single or double quote character.
162     *
163     * @return a matcher for a single or double quote
164     */
165    public StringMatcher quoteMatcher() {
166        return QUOTE_MATCHER;
167    }
168
169    /**
170     * Returns a matcher which matches the single quote character.
171     *
172     * @return a matcher for a single quote
173     */
174    public StringMatcher singleQuoteMatcher() {
175        return SINGLE_QUOTE_MATCHER;
176    }
177
178    /**
179     * Returns a matcher which matches the space character.
180     *
181     * @return a matcher for a space
182     */
183    public StringMatcher spaceMatcher() {
184        return SPACE_MATCHER;
185    }
186
187    /**
188     * Matches the same characters as StringTokenizer, namely space, tab, newline and form feed.
189     *
190     * @return the split matcher
191     */
192    public StringMatcher splitMatcher() {
193        return SPLIT_MATCHER;
194    }
195
196    /**
197     * Creates a matcher from a string.
198     *
199     * @param str
200     *            the string to match, null or empty matches nothing
201     * @return a new Matcher for the given String
202     */
203    public StringMatcher stringMatcher(final String str) {
204        if (str == null || str.length() == 0) {
205            return NONE_MATCHER;
206        }
207        return new AbstractStringMatcher.StringMatcher(str);
208    }
209
210    /**
211     * Returns a matcher which matches the tab character.
212     *
213     * @return a matcher for a tab
214     */
215    public StringMatcher tabMatcher() {
216        return TAB_MATCHER;
217    }
218
219    /**
220     * Matches the String trim() whitespace characters.
221     *
222     * @return the trim matcher
223     */
224    public StringMatcher trimMatcher() {
225        return TRIM_MATCHER;
226    }
227
228}