001    package railo.commons.io.res.util;
002    
003    import java.io.File;
004    
005    import railo.commons.io.res.Resource;
006    import railo.runtime.engine.ThreadLocalPageContext;
007    import railo.runtime.exp.ExpressionException;
008    import railo.runtime.exp.PageException;
009    import railo.runtime.exp.PageRuntimeException;
010    import railo.runtime.op.Caster;
011    import railo.runtime.type.UDF;
012    
013    public class UDFFilter extends UDFFilterSupport implements ResourceAndResourceNameFilter {
014    
015            public UDFFilter(UDF udf) throws ExpressionException{
016                    super(udf);
017            }
018            
019        public boolean accept(String path) {
020            args[0]=path;
021            try {
022                            return Caster.toBooleanValue(udf.call(ThreadLocalPageContext.get(), args, true));
023                            
024                    } 
025            catch (PageException e) {
026                            throw new PageRuntimeException(e);
027                    }
028        }
029        
030        
031        public boolean accept(Resource file) {
032            return accept(file.getAbsolutePath());
033        }
034    
035            @Override
036            public boolean accept(Resource parent, String name) {
037                    String path=parent.getAbsolutePath();
038                    if(path.endsWith(File.separator)) path+=name;
039                    else path+=File.separator+name;
040                    return accept(path);
041            }
042            
043        @Override
044            public String toString() {
045                    return "UDFFilter:"+udf;
046            }
047            
048            public static ResourceAndResourceNameFilter createResourceAndResourceNameFilter(Object filter) throws PageException     {
049               if(filter instanceof UDF)
050                       return createResourceAndResourceNameFilter((UDF)filter);
051               return createResourceAndResourceNameFilter(Caster.toString(filter));
052            }
053    
054            
055            public static ResourceAndResourceNameFilter createResourceAndResourceNameFilter(UDF filter) throws PageException        {
056                    return new UDFFilter(filter);
057            }
058            
059            public static ResourceAndResourceNameFilter createResourceAndResourceNameFilter(String pattern) {
060    
061                    if( !pattern.trim().isEmpty() )            
062                    return new WildcardPatternFilter( pattern );
063            
064                return null;
065            }
066    }