001    package railo.runtime.cache.util;
002    
003    import org.apache.oro.text.regex.MalformedPatternException;
004    import org.apache.oro.text.regex.Pattern;
005    import org.apache.oro.text.regex.PatternMatcher;
006    import org.apache.oro.text.regex.Perl5Compiler;
007    import org.apache.oro.text.regex.Perl5Matcher;
008    
009    import railo.commons.io.cache.CacheKeyFilter;
010    
011    /**
012     * Wildcard Filter
013     */
014    public class WildCardFilter implements CacheKeyFilter {
015        
016        private static final String specials="{}[]().+\\^$";
017        
018            private final Pattern pattern;
019        private final PatternMatcher matcher=new Perl5Matcher();
020            private final String wildcard;
021    
022            private boolean ignoreCase;
023    
024    
025        /**
026         * @param wildcard
027         * @throws MalformedPatternException
028         */
029        public WildCardFilter(String wildcard,boolean ignoreCase) throws MalformedPatternException {
030            this.wildcard=wildcard;
031            this.ignoreCase=ignoreCase;
032            StringBuffer sb = new StringBuffer(wildcard.length());
033            int len=wildcard.length();
034            
035            for(int i=0;i<len;i++) {
036                char c = wildcard.charAt(i);
037                if(c == '*')sb.append(".*");
038                else if(c == '?') sb.append('.');
039                else if(specials.indexOf(c)!=-1)sb.append('\\').append(c);
040                else sb.append(c);
041            }
042            pattern=new Perl5Compiler().compile(ignoreCase?sb.toString().toLowerCase():sb.toString());
043        }
044    
045            /**
046             * @see railo.commons.io.cache.CacheKeyFilter#accept(java.lang.String)
047             */
048            public boolean accept(String key) {
049                    return matcher.matches(ignoreCase?key.toLowerCase():key, pattern);
050            }
051    
052        /**
053             *
054             * @see java.lang.Object#toString()
055             */
056            public String toString() {
057                    return "Wildcardfilter:"+wildcard;
058            }
059    
060            /**
061             * @see railo.commons.io.cache.CacheFilter#toPattern()
062             */
063            public String toPattern() {
064                    return wildcard;
065            }
066    
067    }