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 }