You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by rm...@apache.org on 2013/07/31 13:00:48 UTC

svn commit: r1508808 - in /commons/sandbox/monitoring/trunk: ./ reporting/ reporting/src/main/java/org/apache/commons/monitoring/reporting/format/ reporting/src/main/java/org/apache/commons/monitoring/reporting/template/ reporting/src/main/java/org/apa...

Author: rmannibucau
Date: Wed Jul 31 11:00:47 2013
New Revision: 1508808

URL: http://svn.apache.org/r1508808
Log:
adding jmx plugin + moving format in handler + using resources from classloader instead of sevletcontext to be able to embed the jar easily

Added:
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HandlerRendererAdapter.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/
      - copied from r1508431, commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/format/
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXNode.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/
      - copied from r1508431, commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/template/
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/resources/
      - copied from r1508431, commons/sandbox/monitoring/trunk/reporting/src/main/webapp/resources/
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/error.vm
      - copied, changed from r1508431, commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/main.vm
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/mbean.vm
      - copied, changed from r1508431, commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm
Removed:
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/format/
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/template/
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HtmlHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/WebResourceLoader.java
    commons/sandbox/monitoring/trunk/reporting/src/main/webapp/resources/
Modified:
    commons/sandbox/monitoring/trunk/pom.xml
    commons/sandbox/monitoring/trunk/reporting/pom.xml
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringController.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ClearHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/FilteringHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/Handler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HomeHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/RedirectHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ReportHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ResetHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/CSVFormat.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/Format.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/HTMLFormat.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/JSONFormat.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MapFormat.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MetricData.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/XMLFormat.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginDecoratorHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginRepository.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXHandler.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXPlugin.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/MapBuilder.java
    commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/Templates.java
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/META-INF/NOTICE.txt
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/resources/css/monitoring.css
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/page.vm
    commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm
    commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormatsTest.java

Modified: commons/sandbox/monitoring/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/pom.xml?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/pom.xml (original)
+++ commons/sandbox/monitoring/trunk/pom.xml Wed Jul 31 11:00:47 2013
@@ -88,8 +88,8 @@
             <exclude>**/*/MANIFEST.MF</exclude>
             <exclude>.git</exclude>
             <exclude>.gitignore</exclude>
-            <exclude>**/webapp/resources/js/*.js</exclude>
-            <exclude>**/webapp/resources/css/*.css</exclude>
+            <exclude>**/resources/js/*.js</exclude>
+            <exclude>**/resources/css/*.css</exclude>
             <exclude>**/META-INF/services/*</exclude>
           </excludes>
         </configuration>

Modified: commons/sandbox/monitoring/trunk/reporting/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/pom.xml?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/pom.xml (original)
+++ commons/sandbox/monitoring/trunk/reporting/pom.xml Wed Jul 31 11:00:47 2013
@@ -46,6 +46,11 @@
       <version>3.1</version>
     </dependency>
     <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <version>1.8</version>
+    </dependency>
+    <dependency>
       <groupId>org.apache.velocity</groupId>
       <artifactId>velocity</artifactId>
       <version>1.7</version>

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringController.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringController.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringController.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringController.java Wed Jul 31 11:00:47 2013
@@ -16,8 +16,6 @@
  */
 package org.apache.commons.monitoring.reporting.web;
 
-import org.apache.commons.monitoring.reporting.format.Format;
-import org.apache.commons.monitoring.reporting.template.Templates;
 import org.apache.commons.monitoring.reporting.web.handler.ClearHandler;
 import org.apache.commons.monitoring.reporting.web.handler.FilteringHandler;
 import org.apache.commons.monitoring.reporting.web.handler.Handler;
@@ -25,33 +23,39 @@ import org.apache.commons.monitoring.rep
 import org.apache.commons.monitoring.reporting.web.handler.Renderer;
 import org.apache.commons.monitoring.reporting.web.handler.ReportHandler;
 import org.apache.commons.monitoring.reporting.web.handler.ResetHandler;
+import org.apache.commons.monitoring.reporting.web.handler.format.Format;
 import org.apache.commons.monitoring.reporting.web.plugin.PluginRepository;
+import org.apache.commons.monitoring.reporting.web.template.MapBuilder;
+import org.apache.commons.monitoring.reporting.web.template.Templates;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
 import java.util.HashMap;
 import java.util.Map;
 
 public class MonitoringController implements Filter {
+    private final Map<String, byte[]> cachedResources = new HashMap<String, byte[]>();
     private final Map<String, Handler> handlers = new HashMap<String, Handler>();
     private Handler defaultHandler;
     private String mapping;
-    private ServletContext servletContext;
+    private ClassLoader classloader;
 
     @Override
     public void init(final FilterConfig config) throws ServletException {
-        servletContext = config.getServletContext();
+        classloader = Thread.currentThread().getContextClassLoader();
         initMapping(config);
         initHandlers();
-        initTemplates();
+        Templates.init(config.getServletContext().getContextPath(), mapping);
     }
 
     private void initHandlers() {
@@ -74,10 +78,6 @@ public class MonitoringController implem
         }
     }
 
-    private void initTemplates() {
-        Templates.init(servletContext, mapping);
-    }
-
     private void initMapping(FilterConfig config) {
         mapping = config.getInitParameter("monitoring-mapping");
         if (mapping == null) {
@@ -99,30 +99,60 @@ public class MonitoringController implem
 
         final HttpServletRequest httpRequest = HttpServletRequest.class.cast(request);
 
-        final Handler handler = findHandler(httpRequest);
-        final String path = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());
-        if (handler == defaultHandler && servletContext.getResourceAsStream(path) != null) {
-            chain.doFilter(request, response);
-            return;
+        String path = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length() + mapping.length());
+        if (!path.startsWith("/")) {
+            path = "/" + path;
         }
 
-        final Renderer renderer = handler.handle(httpRequest, HttpServletResponse.class.cast(response));
-        if (renderer != null) {
-            renderer.render(response.getWriter(), request.getParameterMap());
+        final Handler handler = findHandler(path);
+        if (handler == defaultHandler && !"/".equals(path)){ // resource, they are in the classloader and not in the webapp for embedded case
+            byte[] bytes = cachedResources.get(path);
+            if (bytes == null) {
+                final InputStream is = classloader.getResourceAsStream(path.substring(1));
+                if (is != null) {
+                    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                    int i;
+                    while ((i = is.read()) != -1) {
+                        baos.write(i);
+                    }
+
+                    bytes = baos.toByteArray();
+                    cachedResources.put(path, bytes);
+                }
+            }
+            if (bytes != null) {
+                response.getOutputStream().write(bytes);
+                return;
+            }
         }
-    }
 
-    private Handler findHandler(final HttpServletRequest request) {
-        String path = request.getRequestURI().substring(request.getContextPath().length() + mapping.length());
-        if (!path.startsWith("/")) {
-            path = "/" + path;
+        try {
+            final Renderer renderer = handler.handle(httpRequest, HttpServletResponse.class.cast(response), path);
+            if (renderer != null) {
+                renderer.render(response.getWriter(), request.getParameterMap());
+            }
+        } catch (final Exception e) {
+            final ByteArrayOutputStream err = new ByteArrayOutputStream();
+            e.printStackTrace(new PrintStream(err));
+            Templates.htmlRender(response.getWriter(), "error.vm", new MapBuilder<String, Object>().set("exception", new String(err.toByteArray())).build());
         }
+    }
 
+    private Handler findHandler(final String path) {
         final Handler handler = handlers.get(path);
         if (handler != null) {
             return handler;
         }
 
+        for (final String mapping : handlers.keySet()) {
+            if (mapping.endsWith("/*") && path.startsWith(mapping.substring(0, mapping.length() - "/*".length()))) {
+                return handlers.get(mapping);
+            }
+            if (mapping.endsWith("*") && path.startsWith(mapping.substring(0, mapping.length() - "*".length()))) {
+                return handlers.get(mapping);
+            }
+        }
+
         return defaultHandler;
     }
 

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ClearHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ClearHandler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ClearHandler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ClearHandler.java Wed Jul 31 11:00:47 2013
@@ -18,14 +18,10 @@ package org.apache.commons.monitoring.re
 
 import org.apache.commons.monitoring.repositories.Repository;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 public class ClearHandler extends RedirectHandler {
     @Override
-    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response) {
+    protected void preRedirect() {
         Repository.INSTANCE.clear();
-        return super.handle(request, response);
     }
 
     @Override

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/FilteringHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/FilteringHandler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/FilteringHandler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/FilteringHandler.java Wed Jul 31 11:00:47 2013
@@ -16,7 +16,7 @@
  */
 package org.apache.commons.monitoring.reporting.web.handler;
 
-import org.apache.commons.monitoring.reporting.template.Templates;
+import org.apache.commons.monitoring.reporting.web.template.Templates;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -32,8 +32,8 @@ public class FilteringHandler implements
     }
 
     @Override
-    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response) {
-        return new FilteringRenderer(request.getRequestURI().substring(request.getContextPath().length()));
+    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response, final String path) {
+        return new FilteringRenderer(path);
     }
 
     private static class FilteringRenderer implements Renderer {

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/Handler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/Handler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/Handler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/Handler.java Wed Jul 31 11:00:47 2013
@@ -20,5 +20,5 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 
 public interface Handler {
-    Renderer handle(HttpServletRequest request, HttpServletResponse response);
+    Renderer handle(HttpServletRequest request, HttpServletResponse response, String path);
 }

Added: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HandlerRendererAdapter.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HandlerRendererAdapter.java?rev=1508808&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HandlerRendererAdapter.java (added)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HandlerRendererAdapter.java Wed Jul 31 11:00:47 2013
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.monitoring.reporting.web.handler;
+
+import org.apache.commons.monitoring.reporting.web.template.Templates;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public abstract class HandlerRendererAdapter implements Handler, Renderer {
+    @Override
+    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response, final String path) {
+        return rendererFor(path);
+    }
+
+    @Override
+    public void render(final PrintWriter writer, final Map<String, ?> params) {
+        Templates.htmlRender(writer, getTemplate(), getVariables());
+    }
+
+    protected Renderer rendererFor(final String path) {
+        return this;
+    }
+
+    protected abstract String getTemplate();
+
+    protected abstract Map<String,?> getVariables();
+}

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HomeHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HomeHandler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HomeHandler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/HomeHandler.java Wed Jul 31 11:00:47 2013
@@ -16,7 +16,7 @@
  */
 package org.apache.commons.monitoring.reporting.web.handler;
 
-import org.apache.commons.monitoring.reporting.template.Templates;
+import org.apache.commons.monitoring.reporting.web.template.Templates;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -31,7 +31,7 @@ public class HomeHandler implements Hand
     }
 
     @Override
-    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response) {
+    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response, final String path) {
         return renderer;
     }
 

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/RedirectHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/RedirectHandler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/RedirectHandler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/RedirectHandler.java Wed Jul 31 11:00:47 2013
@@ -23,7 +23,8 @@ import javax.servlet.http.HttpServletRes
 
 public abstract class RedirectHandler implements Handler {
     @Override
-    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response) {
+    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response, final String path) {
+        preRedirect();
         try {
             response.sendRedirect(request.getRequestURI().substring(0, request.getRequestURI().length() - from().length()) + to());
         } catch (final Exception e) {
@@ -32,6 +33,10 @@ public abstract class RedirectHandler im
         return null;
     }
 
+    protected void preRedirect() {
+        // no-op
+    }
+
     public abstract String from();
     public abstract String to();
 }

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ReportHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ReportHandler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ReportHandler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ReportHandler.java Wed Jul 31 11:00:47 2013
@@ -16,7 +16,7 @@
  */
 package org.apache.commons.monitoring.reporting.web.handler;
 
-import org.apache.commons.monitoring.reporting.format.Format;
+import org.apache.commons.monitoring.reporting.web.handler.format.Format;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -29,7 +29,7 @@ public class ReportHandler implements Ha
     }
 
     @Override
-    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response) {
+    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response, final String path) {
         response.setContentType(format.type());
         return format;
     }

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ResetHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ResetHandler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ResetHandler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/ResetHandler.java Wed Jul 31 11:00:47 2013
@@ -18,14 +18,10 @@ package org.apache.commons.monitoring.re
 
 import org.apache.commons.monitoring.repositories.Repository;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 public class ResetHandler extends RedirectHandler {
     @Override
-    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response) {
+    protected void preRedirect() {
         Repository.INSTANCE.reset();
-        return super.handle(request, response);
     }
 
     @Override

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/CSVFormat.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/CSVFormat.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/CSVFormat.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/CSVFormat.java Wed Jul 31 11:00:47 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.monitoring.reporting.format;
+package org.apache.commons.monitoring.reporting.web.handler.format;
 
 import org.apache.commons.monitoring.configuration.Configuration;
 import org.apache.commons.monitoring.counter.Unit;

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/Format.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/Format.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/Format.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/Format.java Wed Jul 31 11:00:47 2013
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.reporting.format;
+package org.apache.commons.monitoring.reporting.web.handler.format;
 
 import org.apache.commons.monitoring.reporting.web.handler.Renderer;
 

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/HTMLFormat.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/HTMLFormat.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/HTMLFormat.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/HTMLFormat.java Wed Jul 31 11:00:47 2013
@@ -14,11 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.monitoring.reporting.format;
+package org.apache.commons.monitoring.reporting.web.handler.format;
 
 import org.apache.commons.monitoring.counter.Unit;
-import org.apache.commons.monitoring.reporting.template.MapBuilder;
-import org.apache.commons.monitoring.reporting.template.Templates;
+import org.apache.commons.monitoring.reporting.web.template.MapBuilder;
+import org.apache.commons.monitoring.reporting.web.template.Templates;
 
 import java.io.PrintWriter;
 import java.util.Map;

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/JSONFormat.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/JSONFormat.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/JSONFormat.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/JSONFormat.java Wed Jul 31 11:00:47 2013
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.reporting.format;
+package org.apache.commons.monitoring.reporting.web.handler.format;
 
 import org.apache.commons.monitoring.counter.Counter;
 import org.apache.commons.monitoring.monitors.Monitor;

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MapFormat.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MapFormat.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MapFormat.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MapFormat.java Wed Jul 31 11:00:47 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.monitoring.reporting.format;
+package org.apache.commons.monitoring.reporting.web.handler.format;
 
 import org.apache.commons.monitoring.counter.Counter;
 import org.apache.commons.monitoring.counter.Unit;

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MetricData.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MetricData.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MetricData.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/MetricData.java Wed Jul 31 11:00:47 2013
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.reporting.format;
+package org.apache.commons.monitoring.reporting.web.handler.format;
 
 import org.apache.commons.monitoring.counter.Counter;
 

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/XMLFormat.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/XMLFormat.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/XMLFormat.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/handler/format/XMLFormat.java Wed Jul 31 11:00:47 2013
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.monitoring.reporting.format;
+package org.apache.commons.monitoring.reporting.web.handler.format;
 
 import org.apache.commons.monitoring.counter.Counter;
 import org.apache.commons.monitoring.monitors.Monitor;

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginDecoratorHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginDecoratorHandler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginDecoratorHandler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginDecoratorHandler.java Wed Jul 31 11:00:47 2013
@@ -35,8 +35,8 @@ public class PluginDecoratorHandler impl
     }
 
     @Override
-    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response) {
-        return new PluginDecoratorRenderer(delegate.handle(request, response), plugin);
+    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response, final String path) {
+        return new PluginDecoratorRenderer(delegate.handle(request, response, path), plugin);
     }
 
     private static class PluginDecoratorRenderer implements Renderer {

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginRepository.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginRepository.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginRepository.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/PluginRepository.java Wed Jul 31 11:00:47 2013
@@ -56,11 +56,17 @@ public class PluginRepository {
         private final String url;
         private final Handler handler;
         private final String name;
+        private final String rootUrl;
 
         public PluginInfo(final String url, final Handler handler, final String name) {
             this.url = url;
             this.handler = handler;
             this.name = name;
+            if (!url.endsWith("/*")) {
+                rootUrl = url;
+            } else {
+                rootUrl = url.substring(0, url.length() - "/*".length());
+            }
         }
 
         public String getUrl() {
@@ -74,5 +80,9 @@ public class PluginRepository {
         public String getName() {
             return name;
         }
+
+        public String getRootUrl() {
+            return rootUrl;
+        }
     }
 }

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXHandler.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXHandler.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXHandler.java Wed Jul 31 11:00:47 2013
@@ -16,22 +16,219 @@
  */
 package org.apache.commons.monitoring.reporting.web.plugin.jmx;
 
-import org.apache.commons.monitoring.reporting.web.handler.Handler;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.monitoring.MonitoringException;
+import org.apache.commons.monitoring.reporting.web.handler.HandlerRendererAdapter;
 import org.apache.commons.monitoring.reporting.web.handler.Renderer;
+import org.apache.commons.monitoring.reporting.web.template.MapBuilder;
+import org.apache.commons.monitoring.reporting.web.template.Templates;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import javax.management.AttributeNotFoundException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.ReflectionException;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.TabularData;
 import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
+
+public class JMXHandler extends HandlerRendererAdapter {
+    private static final MBeanServer SERVER = ManagementFactory.getPlatformMBeanServer();
+
+    @Override
+    protected Renderer rendererFor(final String path) {
+        if ("/jmx".endsWith(path) || "/jmx/".equals(path)) {
+            return this;
+        }
+
+        try {
+            return new MBeanRenderer(new ObjectName(new String(Base64.decodeBase64(path.substring("/jmx/".length())))));
+        } catch (final MalformedObjectNameException e) {
+            throw new MonitoringException(e);
+        }
+    }
 
-public class JMXHandler implements Handler {
     @Override
-    public Renderer handle(final HttpServletRequest request, final HttpServletResponse response) {
-        return new Renderer() {
-            @Override
-            public void render(final PrintWriter writer, final Map<String, ?> params) {
-                writer.write("TODO");
+    protected String getTemplate() {
+        return "jmx/main.vm";
+    }
+
+    @Override
+    protected Map<String, ?> getVariables() {
+        return new MapBuilder<String, Object>().set("jmxTree", buildJmxTree()).build();
+    }
+
+    private static JMXNode buildJmxTree() {
+        final JMXNode root = new JMXNode("/");
+
+        for (final ObjectInstance instance : SERVER.queryMBeans(null, null)) {
+            final ObjectName objectName = instance.getObjectName();
+            JMXNode.addNode(root, objectName.getDomain(), objectName.getKeyPropertyListString());
+        }
+
+        return root;
+    }
+
+    private static class MBeanRenderer implements Renderer {
+        private final ObjectName name;
+
+        private MBeanRenderer(final ObjectName objectName) {
+            this.name = objectName;
+        }
+
+        @Override
+        public void render(final PrintWriter writer, final Map<String, ?> params) {
+            try {
+                final MBeanInfo info = SERVER.getMBeanInfo(name);
+                Templates.render(writer, "templates/jmx/mbean.vm",
+                    new MapBuilder<String, Object>()
+                        .set("objectname", name.toString())
+                        .set("classname", info.getClassName())
+                        .set("description", info.getDescription())
+                        .set("attributes", attributes(info))
+                        .build());
+            } catch (final Exception e) {
+                throw new MonitoringException(e);
             }
-        };
+        }
+
+        private Collection<MBeanAttribute> attributes(final MBeanInfo info) {
+            final Collection<MBeanAttribute> list = new LinkedList<MBeanAttribute>();
+            for (final MBeanAttributeInfo attribute : info.getAttributes()) {
+                Object value;
+                try {
+                    value = SERVER.getAttribute(name, attribute.getName());
+                } catch (final Exception e) {
+                    value = "<div class=\"alert-error\">" + e.getMessage() + "</div>";
+                }
+                list.add(new MBeanAttribute(attribute.getName(), attribute.getType(), attribute.getDescription(), value(value)));
+            }
+            return list;
+        }
+
+        private static String value(final Object value) {
+            try {
+                if (value == null) {
+                    return "";
+                }
+
+                if (value.getClass().isArray()) {
+                    final int length = Array.getLength(value);
+                    if (length == 0) {
+                        return "";
+                    }
+
+                    final StringBuilder builder = new StringBuilder().append("<ul>");
+                    for (int i = 0; i < length; i++) {
+                        builder.append("<li>").append(value(Array.get(value, i))).append("</li>");
+                    }
+                    builder.append("</ul>");
+                    return builder.toString();
+                }
+
+                if (Collection.class.isInstance(value)) {
+                    final StringBuilder builder = new StringBuilder().append("<ul>");
+                    for (final Object o : Collection.class.cast(value)) {
+                        builder.append("<li>").append(value(o)).append("</li>");
+                    }
+                    builder.append("</ul>");
+                    return builder.toString();
+                }
+
+                if (TabularData.class.isInstance(value)) {
+                    final TabularData td = TabularData.class.cast(value);
+                    final List<String> keys = td.getTabularType().getIndexNames();
+                    final int number = keys.size();
+
+                    final StringBuilder builder = new StringBuilder().append("<table class=\"table table-condensed\">");
+                    for (final Object type : td.keySet()) {
+                        final List<?> values = (List<?>) type;
+                        for (int i = 0; i < number; i++) {
+                            builder.append("<tr>")
+                                    .append("<td>").append(value(keys.get(i))).append("</td>")
+                                    .append("<td>").append(value(values.get(i))).append("</td>")
+                                .append("</tr>");
+                        }
+
+                    }
+                    builder.append("</table>");
+
+                    return builder.toString();
+                }
+
+                if (CompositeData.class.isInstance(value)) {
+                    final CompositeData cd = CompositeData.class.cast(value);
+                    final Set<String> keys = cd.getCompositeType().keySet();
+
+                    final StringBuilder builder = new StringBuilder().append("<table class=\"table table-condensed\">");
+                    for (final String type : keys) {
+                        builder.append("<tr><td>").append(type).append("</td><td>").append(value(cd.get(type))).append("</td></tr>");
+                    }
+                    builder.append("</table>");
+
+                    return builder.toString();
+
+                }
+
+                if (Map.class.isInstance(value)) {
+                    final Map<?, ?> map = Map.class.cast(value);
+
+                    final StringBuilder builder = new StringBuilder().append("<table class=\"table table-condensed\">");
+                    for (final Map.Entry<?, ?> entry : map.entrySet()) {
+                        builder.append("<tr><tr>").append(value(entry.getKey())).append("</td><td>").append(value(entry.getValue())).append("</td></tr>");
+                    }
+                    builder.append("</table>");
+
+                    return builder.toString();
+
+                }
+
+                return value.toString();
+            } catch (final Exception e) {
+                throw new MonitoringException(e);
+            }
+        }
+    }
+
+    public static class MBeanAttribute {
+        private final String name;
+        private final String type;
+        private final String description;
+        private final String value;
+
+        public MBeanAttribute(final String name, final String type, final String description, final String value) {
+            this.name = name;
+            this.type = type;
+            this.description = description;
+            this.value = value;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getValue() {
+            return value;
+        }
     }
 }

Added: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXNode.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXNode.java?rev=1508808&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXNode.java (added)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXNode.java Wed Jul 31 11:00:47 2013
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.monitoring.reporting.web.plugin.jmx;
+
+import org.apache.commons.codec.binary.Base64;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class JMXNode {
+    private final String name;
+    private final Map<Key, JMXNode> children = new TreeMap<Key, JMXNode>();
+    private String base64 = null;
+
+    public JMXNode(final String name) {
+        this.name = name;
+    }
+
+    public static void addNode(final JMXNode rootNode, final String domain, final String props) {
+        final Map<String, String> properties = new TreeMap<String, String>(new JMXPropertiesComparator(props));
+        for (final String k : props.split(",")) {
+            final String[] kv = k.split("=");
+            if (kv.length < 2) {
+                properties.put(kv[0], "");
+            } else {
+                properties.put(kv[0], kv[1]);
+            }
+        }
+
+        final Key rootKey = new Key("domain", domain);
+        JMXNode node = rootNode.children.get(rootKey);
+        if (node == null) {
+            node = new JMXNode(domain);
+            rootNode.children.put(rootKey, node);
+        }
+
+        for (final Map.Entry<String, String> entry : properties.entrySet()) {
+            final Key key = new Key(entry.getKey(), entry.getValue());
+            final String value = entry.getValue();
+
+            JMXNode child = node.children.get(key);
+            if (child == null) {
+                child = new JMXNode(value);
+                node.children.put(key, child);
+            }
+
+            node = child;
+        }
+
+        node.base64 = Base64.encodeBase64String((domain + ":" + props).getBytes());
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public boolean isLeaf() {
+        return base64 != null;
+    }
+
+    public String getBase64() {
+        return base64;
+    }
+
+    public Collection<JMXNode> getChildren() {
+        return Collections.unmodifiableCollection(children.values());
+    }
+
+    protected static class Key implements Comparable<Key> {
+        private final String key;
+        private final String value;
+
+        public Key(final String key, final String value) {
+            this.key = key;
+            this.value = value;
+        }
+
+        @Override
+        public boolean equals(final Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || Key.class != o.getClass()) {
+                return false;
+            }
+
+            final Key key1 = Key.class.cast(o);
+            return key.equals(key1.key) && value.equals(key1.value);
+        }
+
+        @Override
+        public int hashCode() {
+            int result = key.hashCode();
+            result = 31 * result + value.hashCode();
+            return result;
+        }
+
+        @Override
+        public int compareTo(final Key o) {
+            if (equals(o)) {
+                return 0;
+            }
+
+            final int keys = key.compareTo(o.key);
+            if (keys != 0) {
+                return keys;
+            }
+            return value.compareTo(o.value);
+        }
+
+        @Override
+        public String toString() {
+            return "{" + key + " = " + value + '}';
+        }
+    }
+
+    protected static class JMXPropertiesComparator implements Comparator<String> {
+        private final String properties;
+
+        protected JMXPropertiesComparator(final String props) {
+            properties = props;
+        }
+
+        @Override
+        public int compare(final String o1, final String o2) {
+            if (o1.equals(o2)) {
+                return 0;
+            }
+
+            if ("type".equals(o1)) {
+                return -1;
+            }
+            if ("type".equals(o2)) {
+                return 1;
+            }
+            if ("j2eeType".equals(o1)) {
+                return -1;
+            }
+            if ("j2eeType".equals(o2)) {
+                return 1;
+            }
+
+            return properties.indexOf(o1 + "=") - properties.indexOf(o2 + "=");
+        }
+    }
+}

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXPlugin.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXPlugin.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXPlugin.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/plugin/jmx/JMXPlugin.java Wed Jul 31 11:00:47 2013
@@ -32,6 +32,6 @@ public class JMXPlugin implements Plugin
 
     @Override
     public String[] mappings() {
-        return new String[] { "jmx" };
+        return new String[] { "jmx/*" };
     }
 }

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/MapBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/MapBuilder.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/MapBuilder.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/MapBuilder.java Wed Jul 31 11:00:47 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.monitoring.reporting.template;
+package org.apache.commons.monitoring.reporting.web.template;
 
 import java.util.HashMap;
 import java.util.Map;

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/Templates.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/Templates.java?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/Templates.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/java/org/apache/commons/monitoring/reporting/web/template/Templates.java Wed Jul 31 11:00:47 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.monitoring.reporting.template;
+package org.apache.commons.monitoring.reporting.web.template;
 
 import org.apache.commons.monitoring.reporting.web.plugin.PluginRepository;
 import org.apache.velocity.Template;
@@ -22,20 +22,16 @@ import org.apache.velocity.VelocityConte
 import org.apache.velocity.app.Velocity;
 import org.apache.velocity.runtime.RuntimeConstants;
 import org.apache.velocity.runtime.log.JdkLogChute;
+import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
 
-import javax.servlet.ServletContext;
 import java.io.PrintWriter;
 import java.util.Map;
 import java.util.Properties;
 
 public final class Templates {
-    private static String base;
     private static String mapping;
-    private static ServletContext servletContext;
-
-    public static void init(final ServletContext context, final String filterMapping) {
-        servletContext = context;
 
+    public static void init(final String context, final String filterMapping) {
         final Properties velocityConfiguration = new Properties();
         velocityConfiguration.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, JdkLogChute.class.getName());
         velocityConfiguration.setProperty(RuntimeConstants.ENCODING_DEFAULT, "UTF-8");
@@ -44,24 +40,18 @@ public final class Templates {
         velocityConfiguration.setProperty(RuntimeConstants.RUNTIME_REFERENCES_STRICT, Boolean.TRUE.toString());
         velocityConfiguration.setProperty(RuntimeConstants.RUNTIME_REFERENCES_STRICT_ESCAPE, Boolean.TRUE.toString());
         velocityConfiguration.setProperty(RuntimeConstants.RESOURCE_LOADER, "monitoring");
-        velocityConfiguration.setProperty("monitoring." + RuntimeConstants.RESOURCE_LOADER + ".class", WebResourceLoader.class.getName());
+        velocityConfiguration.setProperty("monitoring." + RuntimeConstants.RESOURCE_LOADER + ".class", ClasspathResourceLoader.class.getName());
         Velocity.init(velocityConfiguration);
 
-        base = context.getContextPath();
         if (filterMapping.isEmpty()) {
-            mapping = context.getContextPath();
+            mapping = context;
         } else {
-            mapping = context.getContextPath() + filterMapping;
+            mapping = context + filterMapping;
         }
     }
 
-    public static ServletContext getServletContext() {
-        return servletContext;
-    }
-
     public static void htmlRender(final PrintWriter writer, final String template, final Map<String, ?> variables) {
         final VelocityContext context = newVelocityContext(variables);
-        context.put("base", base);
         context.put("mapping", mapping);
         context.put("currentTemplate", template);
         context.put("plugins", PluginRepository.PLUGIN_INFO);
@@ -75,7 +65,7 @@ public final class Templates {
 
     public static void render(final PrintWriter writer, final String template, final Map<String, ?> variables) {
         final VelocityContext context = newVelocityContext(variables);
-        context.put("base", base);
+        context.put("mapping", mapping);
         final Template velocityTemplate = Velocity.getTemplate(template, "UTF-8");
         velocityTemplate.merge(context, writer);
     }

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/resources/META-INF/NOTICE.txt
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/resources/META-INF/NOTICE.txt?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/resources/META-INF/NOTICE.txt (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/resources/META-INF/NOTICE.txt Wed Jul 31 11:00:47 2013
@@ -1,11 +1,18 @@
 Table sorter
 
 website: https://github.com/Mottie/tablesorter
-licence: MIT
+license: MIT
+
+------------------------
+
+Jstree
+
+website: http://www.jstree.com/
+license: MIT
 
 ------------------------
 
 Bootswatch
 
 website: http://bootswatch.com/
-licence: Apache v2
\ No newline at end of file
+license: Apache v2
\ No newline at end of file

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/resources/resources/css/monitoring.css
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/resources/resources/css/monitoring.css?rev=1508808&r1=1508431&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/resources/resources/css/monitoring.css (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/resources/resources/css/monitoring.css Wed Jul 31 11:00:47 2013
@@ -18,20 +18,45 @@ table .blue {
     color: #049cdb;
     border-bottom-color: #049cdb;
 }
+
 th#report-table {
     text-align: center;
 }
+
 .tablesorter-headerAsc {
-    background-image: url('$base/resources/images/asc.gif');
+    background-image: url('$mapping/resources/images/asc.gif');
     background-repeat: no-repeat;
     background-position: right;
 }
 
 .tablesorter-headerDesc {
-    background-image: url('$base/resources/images/desc.gif');
+    background-image: url('$mapping/resources/images/desc.gif');
     background-repeat: no-repeat;
     background-position: right;
 }
-.timeUnit {
-    width: 5em;
+
+ul {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+li {
+    /*
+    background-image: url(page.png);
+    background-position: 0 1px;
+    background-repeat: no-repeat;
+    */
+    padding-left: 20px;
+}
+li.node {
+    /*background-image: url(folder.png);*/
+}
+
+a.nodeText {
+    color: #000000;
+    cursor: pointer;
+    text-decoration: none;
 }
+a.nodeText:hover {
+    text-decoration: underline;
+}
\ No newline at end of file

Copied: commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/error.vm (from r1508431, commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/error.vm?p2=commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/error.vm&p1=commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm&r1=1508431&r2=1508808&rev=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/error.vm Wed Jul 31 11:00:47 2013
@@ -14,18 +14,13 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 *#
-<div class=""container>
-    <h1>Home</h1>
+<div class="container">
+    <h1>Error</h1>
 
-    <div>
-        Welcome to the Commons Monitoring Webapp. here is the list of available pages:
+    <div class="alert alert-error">
+        An error occured.
     </div>
     <div>
-        <ul>
-            <li><a href="$mapping/report">Report</a> (<a href="$mapping/report.xml">xml</a>, <a href="$mapping/report.json">json</a>, <a href="$mapping/report.csv">csv</a>)</li>
-            #foreach ( $plugin in $plugins )
-                <li><a href="$mapping/$plugin.url">$plugin.name</a></li>
-            #end
-        </ul>
+        $exception
     </div>
-</div>
\ No newline at end of file
+</div>

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/home.vm Wed Jul 31 11:00:47 2013
@@ -14,18 +14,16 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 *#
-<div class=""container>
-    <h1>Home</h1>
+<h1>Home</h1>
 
-    <div>
-        Welcome to the Commons Monitoring Webapp. here is the list of available pages:
-    </div>
-    <div>
-        <ul>
-            <li><a href="$mapping/report">Report</a> (<a href="$mapping/report.xml">xml</a>, <a href="$mapping/report.json">json</a>, <a href="$mapping/report.csv">csv</a>)</li>
-            #foreach ( $plugin in $plugins )
-                <li><a href="$mapping/$plugin.url">$plugin.name</a></li>
-            #end
-        </ul>
-    </div>
+<div>
+    Welcome to the Commons Monitoring Webapp. here is the list of available pages:
+</div>
+<div>
+    <ul>
+        <li><a href="$mapping/report">Report</a> (<a href="$mapping/report.xml">xml</a>, <a href="$mapping/report.json">json</a>, <a href="$mapping/report.csv">csv</a>)</li>
+        #foreach ( $plugin in $plugins )
+            <li><a href="$mapping/$plugin.rootUrl">$plugin.name</a></li>
+        #end
+    </ul>
 </div>
\ No newline at end of file

Added: commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/main.vm
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/main.vm?rev=1508808&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/main.vm (added)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/main.vm Wed Jul 31 11:00:47 2013
@@ -0,0 +1,64 @@
+#*
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+*#
+#macro ( tree $tree )
+    <ul>
+        #foreach( $node in $tree.children )
+            #if ( $node.isLeaf() )
+                <li id="$node.base64" class="leaf">
+            #else
+                <li>
+            #end
+                $node.name
+                #tree ( $node )
+            </li>
+        #end
+    </ul>
+#end
+
+<div class="container-fluid">
+    <div class="row-fluid">
+        <div id="jmx-tree" class="span2">
+            #tree ( $jmxTree )
+        </div>
+        <div id="jmx-info" class="span10">
+            TODO
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    $(function() {
+        $('li > ul').each(function (i) {
+            var parent_li = $(this).parent('li');
+            parent_li.addClass('node');
+
+            var sub_ul = $(this).remove();
+            parent_li.wrapInner('<a class="nodeText" />').find('a').click(function() {
+                sub_ul.toggle();
+            });
+            parent_li.append(sub_ul);
+        });
+        $('ul ul').hide();
+
+        $('.leaf').click(function () {
+            var url = '$mapping/jmx/' + $(this).attr("id");
+            $.get(url, function(data) {
+                $("#jmx-info").html(data);
+            });
+        });
+    });
+</script>

Copied: commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/mbean.vm (from r1508431, commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/mbean.vm?p2=commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/mbean.vm&p1=commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm&r1=1508431&r2=1508808&rev=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/jmx/mbean.vm Wed Jul 31 11:00:47 2013
@@ -14,36 +14,38 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 *#
-<h1>Report</h1>
+<div class="page-header">
+    <h1><small>$objectname</small></h1>
+    <h2><small>$classname</small></h2>
+</div>
 
-<ul class="breadcrumb">
-    <li><a href="$mapping/clear">Clear</a> <span class="divider">/</span></li>
-    <li><a href="$mapping/reset">Reset</a> </li>
+<div class="alert alert-info">
+    $description
+</div>
 
-    <li class="pull-right"><a href="$mapping/report?unit=s">s</a></li>
-    <li class="pull-right"><a href="$mapping/report?unit=ms">ms</a> <span class="divider">/</span></li>
-    <li class="pull-right"><a href="$mapping/report?unit=ns">ns</a> <span class="divider">/</span></li>
-</ul>
-
-<table id="report-table" class="table table-bordered table-striped table-hover">
+<table id="mbean-table" class="table table-bordered table-striped table-hover">
     <thead>
         <tr>
-            #foreach( $header in $headers )
-                <th>$header</th>
-            #end
+            <th>Name</th>
+            <th>Description</th>
+            <th>Value</th>
+            <th>Type</th>
         </tr>
     </thead>
     <tbody>
-        #foreach( $line in $data )
+        #foreach( $attribute in $attributes )
             <tr>
-                #foreach( $item in $line )
-                    <td>$item</td>
-                #end
+                <td>$attribute.name</td>
+                <td>$attribute.description</td>
+                <td>$attribute.value</td>
+                <td>$attribute.type</td>
             </tr>
         #end
     </tbody>
 </table>
 
+<script type="text/javascript" src="$mapping/resources/js/jquery.tablesorter.js"></script>
+<script type="text/javascript" src="$mapping/resources/js/jquery.tablesorter.widgets.js"></script>
 <script type="text/javascript">
     $(function() {
         $("table#report-table").tablesorter({

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/page.vm
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/page.vm?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/page.vm (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/page.vm Wed Jul 31 11:00:47 2013
@@ -22,51 +22,49 @@
 
     <title>Monitoring HTML Report</title>
 
-    <link rel="stylesheet" href="$base/resources/css/bootstrap.min.css">
-    <link rel="stylesheet" href="$base/resources/css/monitoring.css">
-
-    <script type="text/javascript" src="$base/resources/js/jquery.min.js"></script>
-    <script type="text/javascript" src="$base/resources/js/jquery.tablesorter.js"></script>
-    <script type="text/javascript" src="$base/resources/js/jquery.tablesorter.widgets.js"></script>
+    <link rel="stylesheet" href="$mapping/resources/css/bootstrap.min.css">
+    <link rel="stylesheet" href="$mapping/resources/css/monitoring.css">
   </head>
   <body>
-  <div class="navbar navbar-inverse">
-      <div class="navbar-inner">
-          <div class="container">
-              <a class="brand" href="http://commons.apache.org/sandbox/commons-monitoring/">Commons Monitoring</a>
-              <div class="nav-collapse">
-                  <ul class="nav">
-                      #if ( $templateId == "home")
-                        <li class="active">
-                      #else
-                        <li>
-                      #end
-                          <a href="$mapping/">Home</a>
-                      </li>
-                      #if ( $templateId == "report")
-                        <li class="active">
-                      #else
-                        <li>
-                      #end
-                          <a href="$mapping/report">Report</a>
-                      </li>
-                      #foreach ( $plugin in $plugins )
-                          #if ( $templateId == $plugin.name )
+      <div class="navbar navbar-inverse">
+          <div class="navbar-inner">
+              <div class="container">
+                  <a class="brand" href="http://commons.apache.org/sandbox/commons-monitoring/">Commons Monitoring</a>
+                  <div class="nav-collapse">
+                      <ul class="nav">
+                          #if ( $templateId == "home")
+                            <li class="active">
+                          #else
+                            <li>
+                          #end
+                              <a href="$mapping/">Home</a>
+                          </li>
+                          #if ( $templateId == "report")
                             <li class="active">
                           #else
                             <li>
                           #end
-                              <a href="$mapping/$plugin.url">$plugin.name</a>
+                              <a href="$mapping/report">Report</a>
                           </li>
-                      #end
-                  </ul>
-                  <ul class="nav pull-right">
-                      <li><a href="http://www.apache.org/">ASF</a></li>
-                  </ul>
+                          #foreach ( $plugin in $plugins )
+                              #if ( $templateId == $plugin.name )
+                                <li class="active">
+                              #else
+                                <li>
+                              #end
+                                  <a href="$mapping/$plugin.rootUrl">$plugin.name</a>
+                              </li>
+                          #end
+                      </ul>
+                      <ul class="nav pull-right">
+                          <li><a href="http://www.apache.org/">ASF</a></li>
+                      </ul>
+                  </div>
               </div>
           </div>
       </div>
-  </div>
+
+      <script type="text/javascript" src="$mapping/resources/js/jquery.min.js"></script>
 
       #parse( "/templates/$currentTemplate" )
   </body>

Modified: commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/main/resources/templates/report.vm Wed Jul 31 11:00:47 2013
@@ -44,6 +44,8 @@
     </tbody>
 </table>
 
+<script type="text/javascript" src="$mapping/resources/js/jquery.tablesorter.js"></script>
+<script type="text/javascript" src="$mapping/resources/js/jquery.tablesorter.widgets.js"></script>
 <script type="text/javascript">
     $(function() {
         $("table#report-table").tablesorter({

Modified: commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormatsTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormatsTest.java?rev=1508808&r1=1508807&r2=1508808&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormatsTest.java (original)
+++ commons/sandbox/monitoring/trunk/reporting/src/test/java/org/apache/commons/monitoring/reporting/FormatsTest.java Wed Jul 31 11:00:47 2013
@@ -19,8 +19,8 @@ package org.apache.commons.monitoring.re
 
 import org.apache.commons.monitoring.Role;
 import org.apache.commons.monitoring.monitors.Monitor;
-import org.apache.commons.monitoring.reporting.format.CSVFormat;
-import org.apache.commons.monitoring.reporting.format.Format;
+import org.apache.commons.monitoring.reporting.web.handler.format.CSVFormat;
+import org.apache.commons.monitoring.reporting.web.handler.format.Format;
 import org.apache.commons.monitoring.repositories.Repository;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;