You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2013/07/24 10:49:53 UTC

svn commit: r1506445 - /sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/RuleDynamicMBean.java

Author: bdelacretaz
Date: Wed Jul 24 08:49:53 2013
New Revision: 1506445

URL: http://svn.apache.org/r1506445
Log:
SLING-2977 - return log data as JMX TabularData

Modified:
    sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/RuleDynamicMBean.java

Modified: sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/RuleDynamicMBean.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/RuleDynamicMBean.java?rev=1506445&r1=1506444&r2=1506445&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/RuleDynamicMBean.java (original)
+++ sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/RuleDynamicMBean.java Wed Jul 24 08:49:53 2013
@@ -18,8 +18,9 @@
 package org.apache.sling.hc.util;
 
 import java.io.Serializable;
-import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.management.Attribute;
 import javax.management.AttributeList;
@@ -30,6 +31,15 @@ import javax.management.MBeanAttributeIn
 import javax.management.MBeanException;
 import javax.management.MBeanInfo;
 import javax.management.ReflectionException;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenMBeanAttributeInfoSupport;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
 
 import org.apache.sling.hc.api.EvaluationResult;
 import org.apache.sling.hc.api.Rule;
@@ -47,6 +57,31 @@ public class RuleDynamicMBean implements
     public static final String RULE_OK_ATTRIBUTE_NAME = "ok";
     public static final String LOG_ATTRIBUTE_NAME = "log";
     
+    private static CompositeType LOG_ROW_TYPE;
+    private static TabularType LOG_TABLE_TYPE;
+    
+    public static final String INDEX_COLUMN = "index";
+    public static final String LEVEL_COLUMN = "level";
+    public static final String MESSAGE_COLUMN = "message";
+    
+    static {
+        try {
+            // Define the log row and table types
+            LOG_ROW_TYPE = new CompositeType(
+                    "LogLine",
+                    "A line in the Rule log",
+                    new String [] { INDEX_COLUMN, LEVEL_COLUMN, MESSAGE_COLUMN },
+                    new String [] { "log line index", "log level", "log message"},
+                    new OpenType[] { SimpleType.INTEGER, SimpleType.STRING, SimpleType.STRING }
+                    );
+            final String [] indexes = { INDEX_COLUMN };
+            LOG_TABLE_TYPE = new TabularType("LogTable", "Rule log messages", LOG_ROW_TYPE, indexes);
+        } catch(Exception ignore) {
+            // row or table type will be null if this happens
+        }
+    }
+
+    
     public RuleDynamicMBean(Rule r) {
         beanName = r.toString();
         rule = r;
@@ -58,7 +93,7 @@ public class RuleDynamicMBean implements
         if(RULE_OK_ATTRIBUTE_NAME.equals(attribute)) {
             return !rule.evaluate().anythingToReport();
         } else if(LOG_ATTRIBUTE_NAME.equals(attribute)) {
-            return logList(rule.evaluate());
+            return logData(rule.evaluate());
         } else {
             final Object o = rule.getInfo().get(attribute);
             if(o == null) {
@@ -68,12 +103,21 @@ public class RuleDynamicMBean implements
         }
     }
     
-    private List<String> logList(EvaluationResult result) {
-        final List<String> list = new ArrayList<String>();
-        for(EvaluationResult.LogMessage msg : result.getLogMessages()) {
-            list.add(msg.getLevel() + " " + msg.getMessage());
+    private TabularData logData(EvaluationResult er) {
+        final TabularDataSupport result = new TabularDataSupport(LOG_TABLE_TYPE);
+        int i=0;
+        for(EvaluationResult.LogMessage msg : er.getLogMessages()) {
+            final Map<String, Object> data = new HashMap<String, Object>();
+            data.put(INDEX_COLUMN, i++);
+            data.put(LEVEL_COLUMN, msg.getLevel().toString());
+            data.put(MESSAGE_COLUMN, msg.getMessage());
+            try {
+                result.put(new CompositeDataSupport(LOG_ROW_TYPE, data));
+            } catch(OpenDataException ode) {
+                throw new IllegalStateException("OpenDataException while creating log data", ode);
+            }
         }
-        return list;
+        return result;
     }
 
     @Override
@@ -94,7 +138,8 @@ public class RuleDynamicMBean implements
         final MBeanAttributeInfo[] attrs = new MBeanAttributeInfo[rule.getInfo().size() + 2];
         int i=0;
         attrs[i++] = new MBeanAttributeInfo(RULE_OK_ATTRIBUTE_NAME, Boolean.class.getName(), "The rule value", true, false, false);
-        attrs[i++] = new MBeanAttributeInfo(LOG_ATTRIBUTE_NAME, String[][].class.getName(), "The rule log", true, false, false);
+        attrs[i++] = new OpenMBeanAttributeInfoSupport(LOG_ATTRIBUTE_NAME, "The rule log", LOG_TABLE_TYPE, true, false, false);
+        
         for(String key : rule.getInfo().keySet()) {
             attrs[i++] = new MBeanAttributeInfo(key, List.class.getName(), "Description of " + key, true, false, false);
         }