package org.jolokia.backend;/* * * Copyright 2014 Roland Huss * * Licensed 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. */ import java.io.IOException; import java.util.*; import javax.management.*; import javax.management.openmbean.CompositeData; import org.jolokia.backend.executor.MBeanServerExecutor; import org.jolokia.backend.plugin.MBeanPlugin; import org.jolokia.backend.plugin.MBeanPluginContext; import static org.testng.Assert.*; /** * @author roland * @since 13/01/15 */ public class TestMBeanPlugin implements MBeanPlugin { private static boolean initCalled = false; public void init(MBeanPluginContext ctx, Map map) throws JMException { assertNotNull(ctx); if (map != null) { assertEquals(map.size(), 1); assertEquals(map.get("path"), "/tmp"); } ctx.registerMBean(new Test(ctx), "jolokia:type=plugin,name=test"); initCalled = true; } private void checkJmx(MBeanPluginContext ctx) throws MalformedObjectNameException, InstanceAlreadyExistsException, NotCompliantMBeanException { ctx.registerMBean(new Test(ctx),"jolokia:type=plugin,name=test"); } public static boolean isInitCalled() { return initCalled; } public String getId() { return "test"; } public interface TestMBean { int convert(String arg); void error() throws Exception; long getMemoryUsed() throws MalformedObjectNameException, IOException, ReflectionException, MBeanException, AttributeNotFoundException, InstanceNotFoundException; long getMemoryMax() throws MalformedObjectNameException, MBeanException, IOException, ReflectionException; } public class Test implements TestMBean { MBeanPluginContext ctx; public Test(MBeanPluginContext ctx) { this.ctx = ctx; } public int convert(String arg) { return Integer.parseInt(arg); } public void error() throws Exception { throw new Exception(); } public long getMemoryUsed() throws MalformedObjectNameException, IOException, ReflectionException, MBeanException, AttributeNotFoundException, InstanceNotFoundException { Set<ObjectName> names = ctx.queryNames(new ObjectName("java.lang:type=Memory")); ObjectName memName = names.iterator().next(); assertEquals(names.size(),1); return ctx.call(memName, new MBeanServerExecutor.MBeanAction<Long>() { public Long execute(MBeanServerConnection pConn, ObjectName pName, Object... extraArgs) throws ReflectionException, InstanceNotFoundException, IOException, MBeanException, AttributeNotFoundException { CompositeData data = (CompositeData) pConn.getAttribute(pName,"HeapMemoryUsage"); return (Long) data.get("used"); } }); } public long getMemoryMax() throws MalformedObjectNameException, MBeanException, IOException, ReflectionException { final List<Long> mems = new ArrayList<Long>(); ctx.each(new ObjectName("java.lang:type=Memory"), new MBeanServerExecutor.MBeanEachCallback() { public void callback(MBeanServerConnection pConn, ObjectName pName) throws ReflectionException, InstanceNotFoundException, IOException, MBeanException { CompositeData cd = null; try { cd = (CompositeData) pConn.getAttribute(pName,"HeapMemoryUsage"); mems.add((Long) cd.get("max")); } catch (AttributeNotFoundException e) { // Ignore it ... } } }); assertEquals(mems.size(), 1); return mems.get(0); } } }