/**
* Implements the CFML Function arrayavg
*/
package railo.runtime.functions.struct;
import java.util.Iterator;
import java.util.Map.Entry;
import railo.commons.lang.CFTypes;
import railo.runtime.PageContext;
import railo.runtime.exp.ExpressionException;
import railo.runtime.exp.PageException;
import railo.runtime.functions.BIF;
import railo.runtime.op.Caster;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.FunctionArgument;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.UDF;
public final class StructFilter extends BIF {
private static final long serialVersionUID = -91410716194244194L;
public static Struct call(PageContext pc , Struct sct, UDF filter) 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>2)
throw new ExpressionException("UDF filter has to many arguments ["+args.length+"], should have at maximum 2 arguments");
Struct rtn=new StructImpl();
//Key[] keys = sct.keys();
Iterator<Entry<Key, Object>> it = sct.entryIterator();
Object value;
while(it.hasNext()){
Entry<Key, Object> e = it.next();
value=e.getValue();
if(Caster.toBooleanValue(filter.call(pc, new Object[]{e.getKey().getString(),value}, true)))
rtn.set(e.getKey(), value);
}
return rtn;
}
@Override
public Object invoke(PageContext pc, Object[] args) throws PageException {
return call(pc,Caster.toStruct(args[0]),Caster.toFunction(args[1]));
}
}