/** * Implements the CFML Function arrayavg */ package railo.runtime.functions.list; import java.util.Iterator; import railo.commons.lang.CFTypes; import railo.runtime.PageContext; import railo.runtime.exp.ExpressionException; import railo.runtime.exp.PageException; import railo.runtime.ext.function.Function; import railo.runtime.op.Caster; import railo.runtime.type.Array; import railo.runtime.type.FunctionArgument; import railo.runtime.type.UDF; import railo.runtime.type.util.ListUtil; public final class ListFilter implements Function { public static String call(PageContext pc , String list, UDF filter) throws PageException { return call(pc, list, filter,","); } public static String call(PageContext pc , String list, UDF filter, String delimiter) throws PageException { // check UDF return type int type = filter.getReturnType(); if(type!=CFTypes.TYPE_BOOLEAN && type!=CFTypes.TYPE_ANY) throw new ExpressionException("invalid return type ["+filter.getReturnTypeAsString()+"] for UDF Filter, valid return types are [boolean,any]"); // check UDF arguments FunctionArgument[] args = filter.getFunctionArguments(); if(args.length>1) throw new ExpressionException("UDF filter has to many arguments ["+args.length+"], should have at maximum 1 argument"); if(delimiter==null) delimiter=","; Array array = ListUtil.listToArrayRemoveEmpty(list, delimiter); StringBuilder sb=new StringBuilder(); Iterator<Object> it = array.valueIterator(); Object value; while(it.hasNext()){ value=it.next(); if(Caster.toBooleanValue(filter.call(pc, new Object[]{value}, true))){ if(sb.length()>0) sb.append(delimiter); sb.append(value); } } return sb.toString(); } }