svn commit: r1231762 - in /tomcat/trunk: java/org/apache/catalina/manager/JMXProxyServlet.java webapps/docs/manager-howto.xml

2012-01-15 Thread markt
Author: markt
Date: Sun Jan 15 21:37:18 2012
New Revision: 1231762

URL: http://svn.apache.org/viewvc?rev=1231762view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=38216
Add the ability to invoke MBean operations through the JMXProxy
Based on a patch by Christopher Hlubek
Also improved error reporting to help debugging.

Modified:
tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java
tomcat/trunk/webapps/docs/manager-howto.xml

Modified: tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java?rev=1231762r1=1231761r2=1231762view=diff
==
--- tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java Sun Jan 
15 21:37:18 2012
@@ -14,16 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-
 package org.apache.catalina.manager;
 
-
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Set;
 
 import javax.management.Attribute;
+import javax.management.MBeanOperationInfo;
+import javax.management.MBeanParameterInfo;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 import javax.servlet.ServletException;
@@ -101,6 +100,19 @@ public class JMXProxyServlet extends Htt
 getAttribute( writer, qry, name );
 return;
 }
+qry = request.getParameter(invoke);
+if(qry != null) {
+String opName=request.getParameter(op);
+String ps = request.getParameter(ps);
+String[] valuesStr;
+if (ps == null) {
+valuesStr = new String[0];
+} else {
+valuesStr = request.getParameter(ps).split(,);
+}
+invokeOperation( writer, qry, opName,valuesStr );
+return;
+}
 qry=request.getParameter(qry);
 if( qry == null ) {
 qry = *:*;
@@ -117,7 +129,8 @@ public class JMXProxyServlet extends Htt
 writer.println(OK - Attribute get ' + onameStr + ' -  + att
 + =  + MBeanDumper.escape(value.toString()));
 } catch (Exception ex) {
-writer.println(Error -  + ex.toString());
+writer.println(Error);
+ex.printStackTrace(writer);
 }
 }
 
@@ -131,7 +144,8 @@ public class JMXProxyServlet extends Htt
 mBeanServer.setAttribute( oname, new Attribute(att, valueObj));
 writer.println(OK - Attribute set);
 } catch( Exception ex ) {
-writer.println(Error -  + ex.toString());
+writer.println(Error);
+ex.printStackTrace(writer);
 }
 }
 
@@ -143,8 +157,9 @@ public class JMXProxyServlet extends Htt
 names=mBeanServer.queryNames(new ObjectName(qry), null);
 writer.println(OK - Number of results:  + names.size());
 writer.println();
-} catch (Exception e) {
-writer.println(Error -  + e.toString());
+} catch (Exception ex) {
+writer.println(Error);
+ex.printStackTrace(writer);
 return;
 }
 
@@ -161,4 +176,38 @@ public class JMXProxyServlet extends Htt
 public boolean isSupported(String type) {
 return true;
 }
+
+
+private void invokeOperation(PrintWriter writer, String onameStr, String 
op,
+String[] valuesStr) {
+try {
+ObjectName oname=new ObjectName( onameStr );
+MBeanOperationInfo methodInfo = registry.getMethodInfo(oname,op);
+MBeanParameterInfo[] signature = methodInfo.getSignature();
+String[] signatureTypes = new String[signature.length];
+Object[] values = new Object[signature.length];
+for (int i = 0; i  signature.length; i++) {
+   MBeanParameterInfo pi = signature[i];
+   signatureTypes[i] = pi.getType();
+   values[i] = registry.convertValue(pi.getType(), valuesStr[i] );
+   }
+
+Object retVal = mBeanServer.invoke(oname,op,values,signatureTypes);
+writer.println(OK - Operation  + op +  returned:);
+output(, writer, retVal);
+} catch( Exception ex ) {
+writer.println(Error);
+ex.printStackTrace(writer);
+}
+}
+
+private void output(String indent, PrintWriter writer, Object result) {
+if (result instanceof Object[]) {
+for (Object obj : (Object[]) result) {
+output(   + indent, writer, obj);
+}
+} else {
+writer.println(indent + result.toString());
+}
+}
 }

Modified: tomcat/trunk/webapps/docs/manager-howto.xml
URL: 

Re: svn commit: r1231762 - in /tomcat/trunk: java/org/apache/catalina/manager/JMXProxyServlet.java webapps/docs/manager-howto.xml

2012-01-15 Thread Konstantin Kolinko
2012/1/16  ma...@apache.org:
 Author: markt
 Date: Sun Jan 15 21:37:18 2012
 New Revision: 1231762

 URL: http://svn.apache.org/viewvc?rev=1231762view=rev
 Log:
 Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=38216
 Add the ability to invoke MBean operations through the JMXProxy
 Based on a patch by Christopher Hlubek
 Also improved error reporting to help debugging.

 Modified:
    tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java
    tomcat/trunk/webapps/docs/manager-howto.xml

 Modified: tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java
 URL: 
 http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java?rev=1231762r1=1231761r2=1231762view=diff
 ==
 --- tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java 
 (original)
 +++ tomcat/trunk/java/org/apache/catalina/manager/JMXProxyServlet.java Sun 
 Jan 15 21:37:18 2012
 @@ -14,16 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 -
 -
  package org.apache.catalina.manager;

 -
  import java.io.IOException;
  import java.io.PrintWriter;
  import java.util.Set;

  import javax.management.Attribute;
 +import javax.management.MBeanOperationInfo;
 +import javax.management.MBeanParameterInfo;
  import javax.management.MBeanServer;
  import javax.management.ObjectName;
  import javax.servlet.ServletException;
 @@ -101,6 +100,19 @@ public class JMXProxyServlet extends Htt
             getAttribute( writer, qry, name );
             return;
         }
 +        qry = request.getParameter(invoke);
 +        if(qry != null) {
 +            String opName=request.getParameter(op);
 +            String ps = request.getParameter(ps);
 +            String[] valuesStr;
 +            if (ps == null) {
 +                valuesStr = new String[0];
 +            } else {
 +                valuesStr = request.getParameter(ps).split(,);

getParameter() has been called already, thus just
 ps.split(,)

 +            }
 +            invokeOperation( writer, qry, opName,valuesStr );
 +            return;
 +        }
         qry=request.getParameter(qry);
         if( qry == null ) {
             qry = *:*;
 @@ -117,7 +129,8 @@ public class JMXProxyServlet extends Htt
             writer.println(OK - Attribute get ' + onameStr + ' -  + att
                     + =  + MBeanDumper.escape(value.toString()));
         } catch (Exception ex) {
 -            writer.println(Error -  + ex.toString());
 +            writer.println(Error);
 +            ex.printStackTrace(writer);

I think it would be better to keep Error -  + message on the first line.
Some scripts might be looking for Error -.

         }
     }

 @@ -131,7 +144,8 @@ public class JMXProxyServlet extends Htt
             mBeanServer.setAttribute( oname, new Attribute(att, valueObj));
             writer.println(OK - Attribute set);
         } catch( Exception ex ) {
 -            writer.println(Error -  + ex.toString());
 +            writer.println(Error);
 +            ex.printStackTrace(writer);
         }
     }

 @@ -143,8 +157,9 @@ public class JMXProxyServlet extends Htt
             names=mBeanServer.queryNames(new ObjectName(qry), null);
             writer.println(OK - Number of results:  + names.size());
             writer.println();
 -        } catch (Exception e) {
 -            writer.println(Error -  + e.toString());
 +        } catch (Exception ex) {
 +            writer.println(Error);
 +            ex.printStackTrace(writer);
             return;
         }

 @@ -161,4 +176,38 @@ public class JMXProxyServlet extends Htt
     public boolean isSupported(String type) {
         return true;
     }
 +
 +
 +    private void invokeOperation(PrintWriter writer, String onameStr, String 
 op,
 +            String[] valuesStr) {
 +        try {
 +            ObjectName oname=new ObjectName( onameStr );
 +            MBeanOperationInfo methodInfo = registry.getMethodInfo(oname,op);
 +            MBeanParameterInfo[] signature = methodInfo.getSignature();
 +            String[] signatureTypes = new String[signature.length];
 +            Object[] values = new Object[signature.length];
 +            for (int i = 0; i  signature.length; i++) {
 +               MBeanParameterInfo pi = signature[i];
 +               signatureTypes[i] = pi.getType();
 +               values[i] = registry.convertValue(pi.getType(), valuesStr[i] 
 );
 +           }
 +
 +            Object retVal = 
 mBeanServer.invoke(oname,op,values,signatureTypes);
 +            writer.println(OK - Operation  + op +  returned:);
 +            output(, writer, retVal);
 +        } catch( Exception ex ) {
 +            writer.println(Error);
 +            ex.printStackTrace(writer);
 +        }
 +    }
 +
 +    private void output(String indent, PrintWriter writer, Object result) {
 +        if (result instanceof Object[])