Author: tveronezi
Date: Fri Jun 22 19:20:14 2012
New Revision: 1352998

URL: http://svn.apache.org/viewvc?rev=1352998&view=rev
Log:
https://issues.apache.org/jira/browse/TOMEE-256
* add the ability to execute parallel multiple commands in one single ajax call

Modified:
    
openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/CommandExecutor.java
    
openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/Params.java
    
openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationController.js
    
openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationModel.js

Modified: 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/CommandExecutor.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/CommandExecutor.java?rev=1352998&r1=1352997&r2=1352998&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/CommandExecutor.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/CommandExecutor.java
 Fri Jun 22 19:20:14 2012
@@ -27,15 +27,21 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 
 public class CommandExecutor extends HttpServlet {
 
+    private static final int TIMEOUT = 20;
+
     public interface Executor {
         void call(Map<String, Object> json) throws Exception;
     }
 
-    private List<Command> getCommands(final HttpServletRequest req) throws 
ClassNotFoundException, IllegalAccessException, InstantiationException {
-        final String strCmds = req.getParameter("cmd");
+    private List<Command> getCommands(final HttpServletRequest req, String 
key) throws ClassNotFoundException, IllegalAccessException, 
InstantiationException {
+        final String strCmds = req.getParameter(key);
         if (strCmds == null || "".equals(strCmds.trim())) {
             return Collections.emptyList();
         }
@@ -63,13 +69,42 @@ public class CommandExecutor extends Htt
                 gson = new Gson();
             }
 
-            final List<Command> commands = getCommands(req);
+
             final Params params = new Params(req, resp);
+            final Map<String, Object> result = Collections.synchronizedMap(new 
HashMap<String, Object>());
 
-            final Map<String, Object> result = new HashMap<String, Object>();
-            for (Command command : commands) {
-                result.put(command.getClass().getSimpleName(), 
command.execute(params));
+            //execute the commands
+            {
+                final List<Command> commands = getCommands(req, "cmd");
+                for (Command command : commands) {
+                    result.put(command.getClass().getSimpleName(), 
command.execute(params));
+                }
             }
+
+            //execute the async commands
+            {
+                final List<Command> commands = getCommands(req, "asyncCmd");
+                final ExecutorService executor = 
Executors.newCachedThreadPool();
+                final List<Callable<Void>> commandsToRun = new 
ArrayList<Callable<Void>>();
+                for (final Command command : commands) {
+                    final Callable<Void> callMe = new Callable<Void>() {
+                        @Override
+                        public Void call() throws Exception {
+                            result.put(command.getClass().getSimpleName(), 
command.execute(params));
+                            return null;
+                        }
+                    };
+                    commandsToRun.add(callMe);
+                }
+
+                if (params.getInteger("timeout") != null) {
+                    executor.invokeAll(commandsToRun, 
params.getLong("timeout"), TimeUnit.SECONDS);
+                } else {
+                    executor.invokeAll(commandsToRun, TIMEOUT, 
TimeUnit.SECONDS);
+                }
+                executor.shutdown();
+            }
+
             resp.getWriter().write(gson.toJson(result));
 
         } catch (Throwable e) {

Modified: 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/Params.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/Params.java?rev=1352998&r1=1352997&r2=1352998&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/Params.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/command/Params.java
 Fri Jun 22 19:20:14 2012
@@ -62,6 +62,21 @@ public class Params {
         }
     }
 
+    public Long getLong(String key) {
+        final String value = getString(key);
+
+        try {
+            return Long.valueOf(value);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    public boolean getBoolean(String key) {
+        final String value = getString(key);
+        return Boolean.valueOf(value);
+    }
+
     public HttpServletRequest getReq() {
         return req;
     }

Modified: 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationController.js
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationController.js?rev=1352998&r1=1352997&r2=1352998&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationController.js
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationController.js
 Fri Jun 22 19:20:14 2012
@@ -107,7 +107,7 @@ TOMEE.ApplicationController = function (
         });
 
         channel.bind('application.logout', function (params) {
-            model.logout();
+            model.executeCommands(model.logout());
         });
 
         channel.bind('app.logout.bye', function (params) {
@@ -152,11 +152,11 @@ TOMEE.ApplicationController = function (
 
             //params.panelKey, params.bean, params.parentEl
             if (params.panelKey === 'jndi') {
-                model.loadJndi({
+                model.executeCommands(model.loadJndi({
                     path:pathArrayBuilder.build(params.bean),
                     bean:params.bean,
                     parentEl:params.parentEl
-                });
+                }));
             }
         });
 
@@ -179,25 +179,25 @@ TOMEE.ApplicationController = function (
 
         channel.bind('show.class.panel', function (params) {
             var data = params.data;
-            model.loadJndiClass({
+            model.executeCommands(model.loadJndiClass({
                 name:data.name,
                 parent:data.parent,
                 path:pathArrayBuilder.build(data.parent)
-            });
+            }));
         });
 
         channel.bind('lookup.and.save.object', function (params) {
-            model.lookupJndi({
+            model.executeCommands(model.lookupJndi({
                 name:params.showParams.name,
                 path:pathArrayBuilder.build(params.showParams.parent),
                 saveKey:params.saveKey
-            });
+            }));
         });
 
         channel.bind('application.jdni.load', function (params) {
-            model.loadJndi({
+            model.executeCommands(model.loadJndi({
                 path:['']
-            });
+            }));
         });
 
 
@@ -206,7 +206,7 @@ TOMEE.ApplicationController = function (
 
     (function () {
         channel.bind('deploy.file.uploaded', function (params) {
-            model.deployApp(params.file);
+            model.executeCommands(model.deployApp(params.file));
         });
     })();
 
@@ -219,7 +219,7 @@ TOMEE.ApplicationController = function (
 
     (function () {
         channel.bind('trigger.console.exec', function (params) {
-            model.execute(params.codeType, params.codeText);
+            model.executeCommands(model.execute(params.codeType, 
params.codeText));
         });
 
         channel.bind('app.console.executed', function (params) {
@@ -238,14 +238,14 @@ TOMEE.ApplicationController = function (
 
     (function () {
         channel.bind('trigger.log.load', function (params) {
-            model.loadLog(params.file, params.tail);
+            model.executeCommands(model.loadLog(params.file, params.tail));
         });
     })();
 
 
     (function () {
         channel.bind('application.saved.objects.load', function (params) {
-            model.loadSessionData();
+            model.executeCommands(model.loadSessionData());
         });
     })();
 
@@ -262,17 +262,23 @@ TOMEE.ApplicationController = function (
         }, 'home')
     });
 
-    model.loadSystemInfo(function (data) {
-        view.setTomeeVersion(data['GetSystemInfo'].tomee);
-        homeView.setTomeeVersion(data['GetSystemInfo'].tomee);
-        view.render();
-    });
 
-    model.loadLog(null, null);
-    model.loadJndi({
-        path:['']
-    });
-    model.loadDeployedApps();
+    var getAsync = function(obj) {
+        obj.async = true;
+        return obj;
+    }
+    model.executeCommands(
+        getAsync(model.loadLog(null, null)),
+        getAsync(model.loadJndi({
+            path:['']
+        })),
+        getAsync(model.loadDeployedApps()),
+        getAsync(model.loadSystemInfo(function (data) {
+            view.setTomeeVersion(data['GetSystemInfo'].tomee);
+            homeView.setTomeeVersion(data['GetSystemInfo'].tomee);
+            view.render();
+        }))
+    );
 
     return {
 

Modified: 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationModel.js
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationModel.js?rev=1352998&r1=1352997&r2=1352998&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationModel.js
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/webapp/application/js/ApplicationModel.js
 Fri Jun 22 19:20:14 2012
@@ -70,46 +70,113 @@ TOMEE.ApplicationModel = function (cfg) 
         return vars;
     };
 
+    var executeCommands = function () {
+        var myCommands = [];
+        for (var i = 0; i < arguments.length; i++) {
+            var myArg = TOMEE.utils.getArray(arguments[i]);
+            for (var ii = 0; ii < myArg.length; ii++) {
+                myCommands.push(myArg[ii]);
+            }
+        }
+
+        var cmdNames = [];
+        var asyncCmdNames = [];
+
+        var successCallbacks = [];
+        var errorCallbacks = [];
+
+        var executeCallbacks = function (callbacks, data) {
+            for (var i = 0; i < callbacks.length; i++) {
+                callbacks[i](data);
+            }
+        }
+
+        var myFinalCommand = {
+            method:'GET',
+            url:TOMEE.baseURL('command'),
+            data:{},
+            success:function (data) {
+                executeCallbacks(successCallbacks, data);
+            },
+            error:function (data) {
+                executeCallbacks(errorCallbacks, data);
+            }
+        };
+
+        var cmdConfig = null;
+        var paramsData = null;
+        for (var i = 0; i < myCommands.length; i++) {
+            cmdConfig = myCommands[i];
+            if (cmdConfig.cmd) {
+                if (cmdConfig.async) {
+                    asyncCmdNames.push(cmdConfig.cmd);
+                } else {
+                    cmdNames.push(cmdConfig.cmd);
+                }
+            }
+
+            paramsData = TOMEE.utils.getObject(cmdConfig.data);
+            for (var key in paramsData) {
+                myFinalCommand.data[key] = paramsData[key];
+            }
+
+            if (cmdConfig.success) {
+                successCallbacks.push(cmdConfig.success);
+            }
+
+            if (cmdConfig.error) {
+                errorCallbacks.push(cmdConfig.error);
+            }
+        }
+
+        if (cmdNames.length > 0) {
+            myFinalCommand.data.cmd = cmdNames.join(',');
+        }
+
+        if (asyncCmdNames.length > 0) {
+            myFinalCommand.data.asyncCmd = asyncCmdNames.join(',');
+        }
+
+        if(errorCallbacks.length === 0) {
+            delete myFinalCommand.error;
+        }
+
+        request(myFinalCommand);
+    };
+
     return {
         getUrlVars:getUrlVars,
+        executeCommands:executeCommands,
         logout:function () {
-            request({
-                method:'GET',
-                url:TOMEE.baseURL('command'),
-                data:{
-                    cmd:'Logout'
-                },
+            return {
+                cmd:'Logout',
                 success:function () {
                     channel.send('app.logout.bye', {});
                 }
-            });
+            };
         },
         deployApp:function (path) {
-            request({
-                method:'POST',
-                url:TOMEE.baseURL('command'),
-                data:{
-                    cmd:'DeployApplication,GetDeployedApplications',
-                    path:path
+            return [
+                {
+                    cmd:'DeployApplication',
+                    data:{
+                        path:path
+                    }
+
+                },
+                {
+                    cmd:'GetDeployedApplications'
                 }
-            });
+            ];
         },
         loadDeployedApps:function () {
-            request({
-                method:'GET',
-                url:TOMEE.baseURL('command'),
-                data:{
-                    cmd:'GetDeployedApplications'
-                }
-            });
+            return {
+                cmd:'GetDeployedApplications'
+            };
         },
         loadSystemInfo:function (callback) {
-            request({
-                method:'GET',
-                url:TOMEE.baseURL('command'),
-                data:{
-                    cmd:'GetSystemInfo'
-                },
+            return {
+                cmd:'GetSystemInfo',
                 success:function (data) {
                     systemInfo = data;
                     channel.send('app.system.info', data['GetSystemInfo']);
@@ -118,7 +185,7 @@ TOMEE.ApplicationModel = function (cfg) 
                         callback(data);
                     }
                 }
-            });
+            };
         },
         execute:function (codeType, codeText) {
             var executionBean = {
@@ -128,35 +195,28 @@ TOMEE.ApplicationModel = function (cfg) 
             };
             executions.push(executionBean);
 
-            request({
-                method:'POST',
-                url:TOMEE.baseURL('command'),
-                data:{
-                    cmd:'RunScript,GetSessionData',
-                    engineName:codeType,
-                    scriptCode:codeText
-                },
-                success:function (data) {
-                    executionBean.success = true;
-                    executionBean.data = data['GetSystemInfo'];
-                    executionBean.end = (new Date());
-
-                    channel.send('app.console.executed', executionBean);
-                }
-//                ,
-//                error:function (data) {
-//                    executionBean.success = false;
-//                    executionBean.data = data['GetSystemInfo'];
-//                    executionBean.end = (new Date());
-//
-//                    channel.send('app.console.executed.error', 
executionBean);
-//                }
-            });
+            return [
+                {
+                    cmd:'RunScript',
+                    data:{
+                        engineName:codeType,
+                        scriptCode:codeText
+                    },
+                    success:function (data) {
+                        executionBean.success = true;
+                        executionBean.data = data['GetSystemInfo'];
+                        executionBean.end = (new Date());
 
+                        channel.send('app.console.executed', executionBean);
+                    }
+                },
+                {
+                    cmd:'GetSessionData'
+                }
+            ];
         },
         loadLog:function (file, tail) {
             var data = {
-                cmd:'GetLog',
                 escapeHtml:true
             };
 
@@ -168,31 +228,24 @@ TOMEE.ApplicationModel = function (cfg) 
                 data.tail = tail;
             }
 
-            request({
-                method:'GET',
-                url:TOMEE.baseURL('command'),
+            return {
+                cmd:'GetLog',
                 data:data
-            });
+            };
         },
         loadSessionData:function () {
-            request({
-                method:'GET',
-                url:TOMEE.baseURL('command'),
-                data:{
-                    cmd:'GetSessionData'
-                },
+            return {
+                cmd:'GetSessionData',
                 success:function (data) {
                     sessionData = data;
                 }
-            });
+            };
         },
         loadJndi:function (params) {
             //params.path, params.bean, params.parentEl
-            request({
-                method:'GET',
-                url:TOMEE.baseURL('command'),
+            return {
+                cmd:'GetJndiTree',
                 data:{
-                    cmd:'GetJndiTree',
                     path:TOMEE.utils.getSafe(params.path, []).join(',')
                 },
                 success:function (data) {
@@ -213,15 +266,13 @@ TOMEE.ApplicationModel = function (cfg) 
                         parentEl:params.parentEl
                     });
                 }
-            });
+            };
         },
         loadJndiClass:function (params) {
             //params.path, params.bean, params.parentEl
-            request({
-                method:'GET',
-                url:TOMEE.baseURL('command'),
+            return {
+                cmd:'GetJndiTree',
                 data:{
-                    cmd:'GetJndiTree',
                     name:params.name,
                     path:TOMEE.utils.getSafe(params.path, []).join(',')
                 },
@@ -233,15 +284,13 @@ TOMEE.ApplicationModel = function (cfg) 
                         path:params.path
                     });
                 }
-            });
+            };
         },
         lookupJndi:function (params) {
             //params.path, params.bean, params.parentEl
-            request({
-                method:'POST',
-                url:TOMEE.baseURL('command'),
+            return {
+                cmd:'JndiLookup',
                 data:{
-                    cmd:'JndiLookup',
                     name:params.name,
                     path:TOMEE.utils.getSafe(params.path, []).join(','),
                     saveKey:params.saveKey
@@ -253,7 +302,7 @@ TOMEE.ApplicationModel = function (cfg) 
                         saveKey:params.saveKey
                     });
                 }
-            });
+            };
         }
     };
 }
\ No newline at end of file


Reply via email to