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    }