001    /**
002     * Implements the CFML Function arrayavg
003     */
004    package railo.runtime.functions.arrays;
005    
006    import java.util.ArrayList;
007    import java.util.List;
008    import java.util.concurrent.ExecutorService;
009    import java.util.concurrent.Executors;
010    import java.util.concurrent.Future;
011    
012    import railo.runtime.PageContext;
013    import railo.runtime.exp.PageException;
014    import railo.runtime.functions.BIF;
015    import railo.runtime.functions.closure.Each;
016    import railo.runtime.op.Caster;
017    import railo.runtime.type.Array;
018    import railo.runtime.type.UDF;
019    
020    
021    public final class ArrayEach extends BIF {
022            
023            private static final long serialVersionUID = -2271260656749514177L;
024    
025    
026            public static String call(PageContext pc , Array array, UDF udf) throws PageException {
027                    return _call(pc, array, udf, false, 20);
028            }
029            public static String call(PageContext pc , Array array, UDF udf, boolean parallel) throws PageException {
030                    return _call(pc, array, udf, parallel, 20);
031            }
032    
033            public static String call(PageContext pc , Array array, UDF udf, boolean parallel, double maxThreads) throws PageException {
034                    return _call(pc, array, udf, parallel, (int)maxThreads);
035            }
036            private static String _call(PageContext pc , Array array, UDF udf, boolean parallel, int maxThreads) throws PageException {
037                    ExecutorService execute=null;
038                    List<Future<String>> futures=null;
039                    if(parallel) {
040                            execute = Executors.newFixedThreadPool(maxThreads);
041                            futures=new ArrayList<Future<String>>();
042                    }
043                    Each.invoke(pc, array, udf,execute,futures);
044                    
045                    if(parallel) Each.afterCall(pc,futures);
046                    
047                    return null;
048            }
049            
050            @Override
051            public Object invoke(PageContext pc, Object[] args) throws PageException {
052                    if(args.length==2)return call(pc,Caster.toArray(args[0]),Caster.toFunction(args[1]));
053                    if(args.length==3)return call(pc,Caster.toArray(args[0]),Caster.toFunction(args[1]),Caster.toBooleanValue(args[2]));
054                    return call(pc,Caster.toArray(args[0]),Caster.toFunction(args[1]),Caster.toBooleanValue(args[2]),Caster.toDoubleValue(args[3]));
055            }
056    }