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            @Override
046            public boolean accept(String key) {
047                    return matcher.matches(ignoreCase?key.toLowerCase():key, pattern);
048            }
049    
050        @Override
051            public String toString() {
052                    return "Wildcardfilter:"+wildcard;
053            }
054    
055            @Override
056            public String toPattern() {
057                    return wildcard;
058            }
059    
060    }