001    package railo.commons.io.res.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.SystemUtil;
010    import railo.commons.io.res.Resource;
011    import railo.commons.lang.StringUtil;
012    
013    /**
014     * Wildcard Filter
015     */
016    public class WildCardFilter implements ResourceAndResourceNameFilter {
017        
018        private static final String specials="{}[]().+\\^$";
019        private static final boolean IS_WIN=SystemUtil.isWindows();
020        
021            private final Pattern pattern;
022        private final PatternMatcher matcher=new Perl5Matcher();
023            private final String wildcard;
024            private boolean ignoreCase;
025    
026        public WildCardFilter(String wildcard) throws MalformedPatternException {
027            this(wildcard,IS_WIN);
028        }
029            
030        /**
031         * @param wildcard
032         * @throws MalformedPatternException
033         */
034        public WildCardFilter(String wildcard,boolean ignoreCase) throws MalformedPatternException {
035            this.wildcard=wildcard;
036            StringBuilder sb = new StringBuilder(wildcard.length());
037            int len=wildcard.length();
038            
039            for(int i=0;i<len;i++) {
040                char c = wildcard.charAt(i);
041                if(c == '*')sb.append(".*");
042                else if(c == '?') sb.append('.');
043                else if(specials.indexOf(c)!=-1)sb.append('\\').append(c);
044                else sb.append(c);
045            }
046            
047            this.ignoreCase=ignoreCase;
048            pattern=new Perl5Compiler().compile(ignoreCase?StringUtil.toLowerCase(sb.toString()):sb.toString());
049        }
050    
051        @Override
052        public boolean accept(Resource file) {
053            return matcher.matches(ignoreCase?StringUtil.toLowerCase(file.getName()):file.getName(), pattern);
054        }
055    
056            public boolean accept(Resource parent, String name) {
057                    //print.out("accept:"+name);
058            return matcher.matches(ignoreCase?StringUtil.toLowerCase(name):name, pattern);
059            }
060            public boolean accept(String name) {
061                    return matcher.matches(ignoreCase?StringUtil.toLowerCase(name):name, pattern);
062            }
063    
064        @Override
065            public String toString() {
066                    return "Wildcardfilter:"+wildcard;
067            }
068            
069    }