001    /**
002     * Implements the CFML Function arrayavg
003     */
004    package railo.runtime.functions.struct;
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.ext.function.Function;
015    import railo.runtime.functions.closure.Each;
016    import railo.runtime.type.Struct;
017    import railo.runtime.type.UDF;
018    
019    
020    public final class StructEach implements Function {
021    
022            private static final long serialVersionUID = 5795152568391831373L;
023    
024            public static String call(PageContext pc , Struct sct, UDF udf) throws PageException {
025                    return _call(pc, sct, udf, false, 20);
026            }
027            public static String call(PageContext pc , Struct sct, UDF udf, boolean parallel) throws PageException {
028                    return _call(pc, sct, udf, parallel, 20);
029            }
030    
031            public static String call(PageContext pc , Struct sct, UDF udf, boolean parallel, double maxThreads) throws PageException {
032                    return _call(pc, sct, udf, parallel, (int)maxThreads);
033            }
034            private static String _call(PageContext pc , Struct sct, UDF udf, boolean parallel, int maxThreads) throws PageException {
035                    ExecutorService execute=null;
036                    List<Future<String>> futures=null;
037                    if(parallel) {
038                            execute = Executors.newFixedThreadPool(maxThreads);
039                            futures=new ArrayList<Future<String>>();
040                    }
041                    Each.invoke(pc, sct, udf,execute,futures);
042                    
043                    if(parallel) Each.afterCall(pc,futures);
044                    
045                    return null;
046            }
047    }