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) {