Author: bdelacretaz Date: Mon Jul 29 14:32:26 2013 New Revision: 1508081 URL: http://svn.apache.org/r1508081 Log: SLING-2983 - jmx binding for easy access to jmx attributes in scripted rules
Added: sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/JmxBinding.java Modified: sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/ScriptableRuleBuilder.java sling/trunk/contrib/extensions/healthcheck/hc-rules/src/test/java/org/apache/sling/hc/rules/impl/ScriptableRuleBuilderTest.java Added: sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/JmxBinding.java URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/JmxBinding.java?rev=1508081&view=auto ============================================================================== --- sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/JmxBinding.java (added) +++ sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/JmxBinding.java Mon Jul 29 14:32:26 2013 @@ -0,0 +1,57 @@ +/* + * 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 SF 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.sling.hc.rules.scriptable; + +import java.lang.management.ManagementFactory; + +import javax.management.AttributeNotFoundException; +import javax.management.InstanceNotFoundException; +import javax.management.MBeanException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import javax.management.ReflectionException; + +import org.slf4j.Logger; + +/** The JmxBinding is meant to be bound as "jmx" global variables + * in scripted rules, to allow for writing scripted expressions + * like jmx.attribute("java.lang:type=ClassLoading", "LoadedClassCount") > 100 + */ +public class JmxBinding { + private MBeanServer jmxServer = ManagementFactory.getPlatformMBeanServer(); + private final Logger logger; + + JmxBinding(Logger logger) { + this.logger = logger; + } + + public Object attribute(String objectNameString, String attributeName) + throws MalformedObjectNameException, AttributeNotFoundException, InstanceNotFoundException, MBeanException, ReflectionException { + final ObjectName name = new ObjectName(objectNameString); + if(jmxServer.queryNames(name, null).size() == 0) { + final String msg = "JMX object name not found: [" + objectNameString + "]"; + logger.warn(msg); + throw new IllegalStateException(msg); + } + logger.debug("Got JMX Object [{}]", name); + final Object value = jmxServer.getAttribute(name, attributeName); + logger.debug("JMX Object [{}] Attribute [{}] = [{}]", new Object[] { name, attributeName, value }); + return value; + } +} \ No newline at end of file Modified: sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/ScriptableRuleBuilder.java URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/ScriptableRuleBuilder.java?rev=1508081&r1=1508080&r2=1508081&view=diff ============================================================================== --- sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/ScriptableRuleBuilder.java (original) +++ sling/trunk/contrib/extensions/healthcheck/hc-rules/src/main/java/org/apache/sling/hc/rules/scriptable/ScriptableRuleBuilder.java Mon Jul 29 14:32:26 2013 @@ -17,6 +17,7 @@ */ package org.apache.sling.hc.rules.scriptable; +import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; @@ -83,9 +84,11 @@ public class ScriptableRuleBuilder imple logger.error("Cannot evaluate: {}", scriptEngineMsg); } else { try { - return scriptEngine.eval(expression); + final Bindings b = scriptEngine.createBindings(); + b.put("jmx", new JmxBinding(logger)); + return scriptEngine.eval(expression, b); } catch(ScriptException e) { - logger.error("Script evaluation error (" + expression + ")", e); + logger.error("Script evaluation error [" + expression + "]: " + e, e); } } return null; Modified: sling/trunk/contrib/extensions/healthcheck/hc-rules/src/test/java/org/apache/sling/hc/rules/impl/ScriptableRuleBuilderTest.java URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-rules/src/test/java/org/apache/sling/hc/rules/impl/ScriptableRuleBuilderTest.java?rev=1508081&r1=1508080&r2=1508081&view=diff ============================================================================== --- sling/trunk/contrib/extensions/healthcheck/hc-rules/src/test/java/org/apache/sling/hc/rules/impl/ScriptableRuleBuilderTest.java (original) +++ sling/trunk/contrib/extensions/healthcheck/hc-rules/src/test/java/org/apache/sling/hc/rules/impl/ScriptableRuleBuilderTest.java Mon Jul 29 14:32:26 2013 @@ -17,9 +17,10 @@ */ package org.apache.sling.hc.rules.impl; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; @@ -61,7 +62,8 @@ public class ScriptableRuleBuilderTest { serviceReference = Mockito.mock(ServiceReference.class); scriptEngine = Mockito.mock(ScriptEngine.class); - Mockito.when(scriptEngine.eval(Matchers.same(CODE))).thenReturn("true"); + Mockito.when(scriptEngine.eval(Matchers.same(CODE), Matchers.isA(Bindings.class))).thenReturn("true"); + Mockito.when(scriptEngine.createBindings()).thenReturn(Mockito.mock(Bindings.class)); scriptEngineManager = Mockito.mock(ScriptEngineManager.class); Mockito.when(