You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/03/25 19:11:15 UTC
svn commit: r1305081 -
/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/LocalJMXCommand.java
Author: rmannibucau
Date: Sun Mar 25 17:11:15 2012
New Revision: 1305081
URL: http://svn.apache.org/viewvc?rev=1305081&view=rev
Log:
some management of invoke method
Modified:
openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/LocalJMXCommand.java
Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/LocalJMXCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/LocalJMXCommand.java?rev=1305081&r1=1305080&r2=1305081&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/LocalJMXCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/LocalJMXCommand.java Sun Mar 25 17:11:15 2012
@@ -6,19 +6,23 @@ import java.util.Set;
import javax.management.Attribute;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
+import javax.management.MBeanOperationInfo;
import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.RuntimeMBeanException;
import org.apache.openejb.monitoring.LocalMBeanServer;
import org.apache.openejb.server.cli.StreamManager;
import org.apache.xbean.propertyeditor.PropertyEditors;
-@Command(name = "jmx", usage = "jmx <operation> <object-name>", description = "consult/update a jmx information")
+// TODO: maybe find a better way to invoker get/set/invoke because currently we limit a bit possible values
+@Command(name = "jmx", usage = "jmx <operation> <options>", description = "consult/update a jmx information")
public class LocalJMXCommand extends AbstractCommand {
public static void main(String[] args) {
- LocalJMXCommand c = new LocalJMXCommand();
+ final LocalJMXCommand c = new LocalJMXCommand();
c.setStreamManager(new StreamManager(System.out, System.err, "\n"));
- c.execute("jmx set LoggerNames java.util.logging:type=Logging foo");
+ // c.execute("jmx set LoggerNames java.util.logging:type=Logging foo");
+ c.execute("jmx invoke getLoggerLevel(java.awt) java.util.logging:type=Logging");
}
@Override
@@ -44,13 +48,71 @@ public class LocalJMXCommand extends Abs
} else if ("invoke".equals(command)) {
invoke(value);
} else {
- streamManager.writeOut("unknow command '" + command + "'");
+ streamManager.writeOut("unknown command '" + command + "'");
}
}
private void invoke(final String value) {
- // TODO
- streamManager.writeOut("currently invocation are not supported");
+ if (!value.contains("(") || !value.contains(")")) {
+ streamManager.writeErr("method should follow the format: <methoName>(<arg1>,<arg2>,...)");
+ return;
+ }
+
+ int open = value.indexOf("(");
+ int close = value.lastIndexOf(")");
+
+ final String name = value.substring(0, open).trim();
+ final String rawArgs = value.substring(open + 1, close).trim();
+ final ObjectName on;
+ try {
+ on = new ObjectName(value.substring(close + 1).trim());
+ } catch (MalformedObjectNameException e) {
+ streamManager.writeErr(e);
+ return;
+ }
+
+ final MBeanServer server = LocalMBeanServer.get();
+ final String[] args;
+ if (rawArgs == null || rawArgs.isEmpty()) {
+ args = new String[0];
+ } else {
+ args = rawArgs.split(",");
+ }
+
+ try {
+ final MBeanInfo minfo = server.getMBeanInfo(on);
+ final MBeanOperationInfo[] methods = minfo.getOperations();
+
+ MBeanOperationInfo operation = null;
+ for (int i = 0; i < methods.length; i++) {
+ if (methods[i].getName().equals(name)) {
+ operation = methods[i];
+ break;
+ }
+ }
+
+ if (operation == null) {
+ streamManager.writeErr("can't find operation '" + name + "'");
+ return;
+ }
+
+ final Object[] passedArgs = new Object[args.length];
+ final String[] passedArgTypes = new String[args.length];
+ for (int i = 0; i < passedArgs.length; i++) {
+ final String expected = operation.getSignature()[i].getType();
+ if (!String.class.getName().equals(expected)) {
+ passedArgs[i] = PropertyEditors.getValue(expected, args[i], Thread.currentThread().getContextClassLoader());
+ } else {
+ passedArgs[i] = args[i];
+ }
+ passedArgTypes[i] = expected;
+ }
+
+ streamManager.writeOut(stringify(server.invoke(on, name, passedArgs, passedArgTypes)));
+ } catch (Exception e) {
+ streamManager.writeErr(e);
+ return;
+ }
}
private void get(final String cmd) {