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/23 17:55:31 UTC

svn commit: r1304479 - in /openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command: AbstractCommand.java LocalJMXCommand.java

Author: rmannibucau
Date: Fri Mar 23 16:55:31 2012
New Revision: 1304479

URL: http://svn.apache.org/viewvc?rev=1304479&view=rev
Log:
starting to add a command to query jmx

Added:
    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/AbstractCommand.java

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java?rev=1304479&r1=1304478&r2=1304479&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java Fri Mar 23 16:55:31 2012
@@ -26,7 +26,7 @@ import java.util.Properties;
 
 public abstract class AbstractCommand {
     protected StreamManager streamManager;
-    protected  String command;
+    protected String command;
 
     public abstract void execute(final String cmd);
 

Added: 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=1304479&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/LocalJMXCommand.java (added)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/LocalJMXCommand.java Fri Mar 23 16:55:31 2012
@@ -0,0 +1,181 @@
+package org.apache.openejb.server.cli.command;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Set;
+import javax.management.Attribute;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanServer;
+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")
+public class LocalJMXCommand extends AbstractCommand {
+    public static void main(String[] args) {
+        LocalJMXCommand c = new LocalJMXCommand();
+        c.setStreamManager(new StreamManager(System.out, System.err, "\n"));
+        c.execute("jmx set LoggerNames java.util.logging:type=Logging foo");
+    }
+
+    @Override
+    public void execute(final String cmd) {
+        final String jmxCmd = cmd.substring("jmx".length()).trim();
+        if ("list".equals(jmxCmd)) {
+            listMBeans();
+            return;
+        }
+
+        if (!jmxCmd.contains(" ")) {
+            streamManager.writeErr("the command is not correct");
+            return;
+        }
+
+        int space = jmxCmd.indexOf(" ");
+        final String command = jmxCmd.substring(0, space);
+        final String value = jmxCmd.substring(command.length()).trim();
+        if ("get".equals(command)) {
+            get(value);
+        } else if ("set".equals(command)) {
+            set(value);
+        } else if ("invoke".equals(command)) {
+            invoke(value);
+        } else {
+            streamManager.writeOut("unknow command '" + command + "'");
+        }
+    }
+
+    private void invoke(final String value) {
+        // TODO
+        streamManager.writeOut("currently invocation are not supported");
+    }
+
+    private void get(final String cmd) {
+        int space = cmd.indexOf(" ");
+        if (space < 0) {
+            streamManager.writeErr("you need to specify an attribute and an objectname");
+            return;
+        }
+
+        final String attr = cmd.substring(0, space);
+        final String on = cmd.substring(space, cmd.length()).trim();
+
+        final MBeanServer mBeanServer = LocalMBeanServer.get();
+        try {
+            final ObjectName oname = new ObjectName(on);
+            final Object value = mBeanServer.getAttribute(oname, attr);
+            streamManager.writeOut("Attribute [" + on + " -> " + attr + "] = " + stringify(value));
+        } catch (Exception ex) {
+            streamManager.writeErr(ex);
+        }
+    }
+
+    private void set(final String cmd) {
+        final String[] split = cmd.split(" ");
+        if (split.length < 2) {
+            streamManager.writeErr("you need to specify an attribute, an objectname and a value");
+            return;
+        }
+
+        final MBeanServer mBeanServer = LocalMBeanServer.get();
+        final String newValue = cmd.substring(split[0].length() + split[1].length() + 1).trim();
+        try {
+            final ObjectName oname = new ObjectName(split[1]);
+            final MBeanInfo minfo = mBeanServer.getMBeanInfo(oname);
+            final MBeanAttributeInfo attrs[] = minfo.getAttributes();
+
+            String type = String.class.getName();
+            for (int i = 0; i < attrs.length; i++) {
+                if (attrs[i].getName().equals(split[0])) {
+                    type = attrs[i].getType();
+                    break;
+                }
+            }
+
+            final Object valueObj = PropertyEditors.getValue(type, newValue, Thread.currentThread().getContextClassLoader());
+            mBeanServer.setAttribute(oname, new Attribute(split[0], valueObj));
+            streamManager.writeOut("done");
+        } catch (Exception ex) {
+            streamManager.writeOut("Error - " + ex.toString());
+        }
+    }
+
+    private String stringify(final Object value) {
+        if (value == null) {
+            return "<null>";
+        }
+        if (value.getClass().isArray()) {
+            return Arrays.asList((Object[]) value).toString();
+        }
+        return value.toString();
+    }
+
+    private void listMBeans() {
+        final MBeanServer mBeanServer = LocalMBeanServer.get();
+
+        final Set<ObjectName> names;
+        try {
+            names = mBeanServer.queryNames(null, null);
+        } catch (Exception e) {
+            streamManager.writeErr(e);
+            return;
+        }
+
+        final Iterator<ObjectName> it = names.iterator();
+        while (it.hasNext()) {
+            ObjectName oname = it.next();
+            streamManager.writeOut("Name: " + oname.toString());
+
+            try {
+                final MBeanInfo minfo = mBeanServer.getMBeanInfo(oname);
+                String code = minfo.getClassName();
+                if ("org.apache.commons.modeler.BaseModelMBean".equals(code)) {
+                    code = (String) mBeanServer.getAttribute(oname, "modelerType");
+                }
+                streamManager.writeOut("  + modelerType: " + code);
+
+                MBeanAttributeInfo attrs[] = minfo.getAttributes();
+                Object value = null;
+
+                for (int i = 0; i < attrs.length; i++) {
+                    if (!attrs[i].isReadable()) {
+                        continue;
+                    }
+
+                    final String attName = attrs[i].getName();
+                    if ("modelerType".equals(attName)) {
+                        continue;
+                    }
+
+                    if (attName.indexOf("=") >= 0 ||
+                            attName.indexOf(":") >= 0 ||
+                            attName.indexOf(" ") >= 0) {
+                        continue;
+                    }
+
+                    try {
+                        value = mBeanServer.getAttribute(oname, attName);
+                    } catch (RuntimeMBeanException uoe) {
+                        // ignored
+                    } catch (Throwable t) {
+                        streamManager.writeErr(new Exception(t));
+                        continue;
+                    }
+
+                    try {
+                        String valueString = stringify(value);
+                        streamManager.writeOut("  + " + attName + ": " + valueString);
+                    } catch (Throwable t) {
+                        streamManager.writeErr(new Exception(t));
+                    }
+                }
+            } catch (Throwable t) {
+                streamManager.writeErr(new Exception(t));
+            }
+            streamManager.writeOut("");
+        }
+    }
+}