package org.jolokia.jmx;
/*
* Copyright 2009-2013 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.lang.management.ManagementFactory;
import java.util.HashMap;
import java.util.Map;
import javax.management.*;
import javax.management.modelmbean.*;
import javax.management.openmbean.CompositeData;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.testng.Assert;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
/**
* @author roland
* @since 27.01.13
*/
public class JolokiaMBeanServerTest {
@Test
public void simple() throws NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanException, MalformedObjectNameException, AttributeNotFoundException, ReflectionException, InstanceNotFoundException, ParseException, InvalidTargetObjectTypeException, NoSuchMethodException, IntrospectionException {
JolokiaMBeanServer server = new JolokiaMBeanServer();
ObjectName oName = new ObjectName("test:type=jsonMBean");
server.registerMBean(new JsonAnnoTest(),oName);
CompositeData chiliCD = (CompositeData) server.getAttribute(oName,"Chili");
assertEquals((String) chiliCD.get("name"), "Bhut Jolokia");
assertEquals(chiliCD.get("scoville"), 1000000L);
MBeanServer pServer = ManagementFactory.getPlatformMBeanServer();
String chiliS = (String) pServer.getAttribute(oName,"Chili");
JSONObject chiliJ = (JSONObject) new JSONParser().parse(chiliS);
assertEquals(chiliJ.get("name"), "Bhut Jolokia");
assertEquals(chiliJ.get("scoville"), 1000000L);
server.unregisterMBean(oName);
Assert.assertFalse(pServer.isRegistered(oName));
Assert.assertFalse(server.isRegistered(oName));
}
@Test
public void withConstraint() throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanException, AttributeNotFoundException, ReflectionException, InstanceNotFoundException, ParseException, InvalidTargetObjectTypeException, NoSuchMethodException, IntrospectionException {
JolokiaMBeanServer server = new JolokiaMBeanServer();
ObjectName oName = new ObjectName("test:type=jsonMBean");
server.registerMBean(new JsonAnnoPlainTest(),oName);
MBeanServer plattformServer = ManagementFactory.getPlatformMBeanServer();
String deepDive = (String) plattformServer.getAttribute(oName,"DeepDive");
JSONObject deepDiveS = (JSONObject) new JSONParser().parse(deepDive);
assertEquals(deepDiveS.size(),1);
// Serialization is truncated because of maxDepth = 1
assertTrue(deepDiveS.get("map") instanceof String);
assertTrue(deepDiveS.get("map").toString().matches(".*hot=.*Chili.*"));
server.unregisterMBean(oName);
Assert.assertFalse(plattformServer.isRegistered(oName));
Assert.assertFalse(server.isRegistered(oName));
}
@Test
public void withModelMBean() throws MBeanException, InvalidTargetObjectTypeException, InstanceNotFoundException, InstanceAlreadyExistsException, NotCompliantMBeanException, MalformedObjectNameException, NoSuchMethodException, IntrospectionException {
RequiredModelMBean modelMBean = new RequiredModelMBean();
ModelMBeanInfo mbi = new ModelMBeanInfoSupport(
JsonAnnoPlainTest.class.getName(),
"JsonMBean Test",
new ModelMBeanAttributeInfo[]{
new ModelMBeanAttributeInfo("DeepDive","description",JsonAnnoPlainTest.class.getDeclaredMethod("getDeepDive"),null)
},
new ModelMBeanConstructorInfo[]{},
new ModelMBeanOperationInfo[]{},
new ModelMBeanNotificationInfo[]{}
);
modelMBean.setModelMBeanInfo(mbi);
modelMBean.setManagedResource(new JsonAnnoPlainTest(), "ObjectReference");
JolokiaMBeanServer server = new JolokiaMBeanServer();
ObjectName oName = new ObjectName("test:type=jsonMBean");
server.registerMBean(modelMBean,oName);
MBeanServer plattformServer = ManagementFactory.getPlatformMBeanServer();
Assert.assertTrue(plattformServer.isRegistered(oName));
Assert.assertTrue(server.isRegistered(oName));
server.unregisterMBean(oName);
Assert.assertFalse(plattformServer.isRegistered(oName));
Assert.assertFalse(server.isRegistered(oName));
}
// ============================================================================================
@JsonMBean(maxDepth = 1)
public static class JsonAnnoPlainTest implements JsonAnnoPlainTestMBean {
public DeepDive getDeepDive() {
return new DeepDive();
}
}
public interface JsonAnnoPlainTestMBean {
DeepDive getDeepDive();
}
@JsonMBean()
public static class JsonAnnoTest implements JsonAnnoTestMXBean {
public Chili getChili() {
return new Chili("Bhut Jolokia",1000000);
}
}
public interface JsonAnnoTestMXBean {
Chili getChili();
}
public static class DeepDive {
private Chili chili;
private Map map;
public DeepDive() {
chili = new Chili("Aji",700000);
map = new HashMap();
map.put("hot",chili);
}
public Map getMap() {
return map;
}
}
public static class Chili {
private String name;
private long scoville;
public Chili() {
}
public Chili(String pName, long pScoville) {
name = pName;
scoville = pScoville;
}
public String getName() {
return name;
}
public void setName(String pName) {
name = pName;
}
public long getScoville() {
return scoville;
}
public void setScoville(long pScoville) {
scoville = pScoville;
}
}
}