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 }