001 package org.shiftone.jrat.util.regex;
002
003
004 import org.shiftone.jrat.util.log.Logger;
005
006 import java.util.ArrayList;
007 import java.util.Collection;
008 import java.util.List;
009 import java.util.StringTokenizer;
010
011
012 /**
013 * OR
014 *
015 * @author jeff@shiftone.org (Jeff Drost)
016 */
017 public class CompositeMatcher implements Matcher {
018
019 private static final Logger LOG = Logger.getLogger(CompositeMatcher.class);
020 private final Matcher[] matchers;
021
022 public static Matcher buildCompositeGlobMatcher(String pattenString) {
023 return (pattenString == null) ? Matcher.ALL : buildCompositeGlobMatcher(pattenString, true);
024 }
025
026
027 public static Matcher buildCompositeGlobMatcher(String pattenString, boolean ignoreCase) {
028
029 Matcher matcher;
030 List matchers = new ArrayList(10);
031
032 if (ignoreCase) {
033 pattenString = pattenString.toLowerCase();
034 }
035
036 StringTokenizer tokenizer = new StringTokenizer(pattenString, ",");
037
038 while (tokenizer.hasMoreTokens()) {
039 String token = tokenizer.nextToken();
040
041 matchers.add(new GlobMatcher(token));
042 }
043
044 if (matchers.size() == 1) {
045 matcher = (Matcher) matchers.get(0);
046 } else {
047 matcher = new CompositeMatcher(matchers);
048 }
049
050 if (ignoreCase) {
051 matcher = new ToLowerMatcher(matcher);
052 }
053
054 return matcher;
055 }
056
057
058 public static Matcher buildCompositeGlobMatcher(String[] pattenStrings) {
059
060 Matcher[] matchers = new Matcher[pattenStrings.length];
061
062 for (int i = 0; i < pattenStrings.length; i++) {
063 matchers[i] = new GlobMatcher(pattenStrings[i]);
064 }
065
066 return new CompositeMatcher(matchers);
067 }
068
069
070 public CompositeMatcher(Matcher[] matchers) {
071 this.matchers = matchers;
072 }
073
074
075 public CompositeMatcher(Collection matchers) {
076 this.matchers = (Matcher[]) matchers.toArray(new Matcher[matchers.size()]);
077 }
078
079
080 public boolean isMatch(String inputString) {
081
082 for (int i = 0; i < matchers.length; i++) {
083 if (matchers[i].isMatch(inputString)) {
084 return true;
085 }
086 }
087
088 return false;
089 }
090
091
092 public String toString() {
093
094 StringBuffer sb = new StringBuffer();
095
096 sb.append("<or-matcher>");
097
098 for (int i = 0; i < matchers.length; i++) {
099 sb.append(matchers[i]);
100 }
101
102 sb.append("</or-matcher>");
103
104 return sb.toString();
105 }
106 }