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