/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.mx.mxbean.test;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenMBeanAttributeInfo;
import javax.management.openmbean.OpenMBeanInfo;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.jboss.mx.mxbean.MXBeanUtils;
import org.jboss.test.mx.mxbean.support.CollectionsInterface;
import org.jboss.test.mx.mxbean.support.CollectionsMXBeanSupport;
import org.jboss.test.mx.mxbean.support.CollectionsMXBeanSupportMXBean;
import org.jboss.test.mx.mxbean.support.CompositeInterface;
import org.jboss.test.mx.mxbean.support.CompositeMXBeanSupport;
import org.jboss.test.mx.mxbean.support.CompositeMXBeanSupportMXBean;
import org.jboss.test.mx.mxbean.support.SimpleInterface;
import org.jboss.test.mx.mxbean.support.SimpleMXBeanSupport;
import org.jboss.test.mx.mxbean.support.SimpleMXBeanSupportMXBean;
import org.jboss.test.mx.mxbean.support.SimpleObject;
import org.jboss.test.mx.mxbean.support.TestEnum;
/**
* MXBeanSupportUnitTestCase.
*
* @author <a href="adrian@jboss.com">Adrian Brock</a>
* @version $Revision: 85945 $
*/
public class MXBeanSupportUnitTestCase extends AbstractMXBeanTest
{
private static final TabularType TABLE_STRING_TO_INTEGER = MXBeanUtils.createMapType(String.class, Integer.class);
public static Test suite()
{
return new TestSuite(MXBeanSupportUnitTestCase.class);
}
public MXBeanSupportUnitTestCase(String name)
{
super(name);
}
public void testGetSimpleAttributes() throws Exception
{
MBeanServer server = createMBeanServer();
SimpleMXBeanSupport support = new SimpleMXBeanSupport();
ObjectName objectName = SimpleMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
OpenMBeanInfo info = (OpenMBeanInfo) server.getMBeanInfo(objectName);
OpenType[] types = new OpenType[SimpleInterface.TYPES.length];
for (int i = 0; i < types.length; ++i)
types[i] = MXBeanUtils.getOpenType(SimpleInterface.TYPES[i]);
checkAttributes(server, objectName, SimpleMXBeanSupportMXBean.class, support, SimpleInterface.KEYS, types, SimpleInterface.VALUES, SimpleInterface.VALUES, info);
}
public void testSetSimpleAttributes() throws Exception
{
MBeanServer server = createMBeanServer();
SimpleMXBeanSupport support = new SimpleMXBeanSupport();
ObjectName objectName = SimpleMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
OpenMBeanInfo info = (OpenMBeanInfo) server.getMBeanInfo(objectName);
String[] keys = SimpleInterface.KEYS;
Object[] values = SimpleInterface.VALUES;
Object[] changedValues = SimpleInterface.CHANGED_VALUES;
AttributeList list = new AttributeList(keys.length);
OpenType[] types = new OpenType[SimpleInterface.TYPES.length];
for (int i = 0; i < types.length; ++i)
{
types[i] = MXBeanUtils.getOpenType(SimpleInterface.TYPES[i]);
String name = getUpperName(keys[i]);
server.setAttribute(objectName, new Attribute(name, changedValues[i]));
Attribute attribute = new Attribute(name, values[i]);
list.add(attribute);
}
checkAttributes(server, objectName, SimpleMXBeanSupportMXBean.class, support, keys, types, SimpleInterface.CHANGED_VALUES, SimpleInterface.CHANGED_VALUES, info);
setAttributes(server, objectName, list);
checkAttributes(server, objectName, SimpleMXBeanSupportMXBean.class, support, keys, types, SimpleInterface.VALUES, SimpleInterface.VALUES, info);
}
public void testSimpleInvoke() throws Exception
{
MBeanServer server = createMBeanServer();
SimpleMXBeanSupport support = new SimpleMXBeanSupport();
ObjectName objectName = SimpleMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
assertEquals("olleH", server.invoke(objectName, "echoReverse", new Object[] { "Hello" }, new String[] { String.class.getName() }));
}
public void testGetCompositeAttributes() throws Exception
{
MBeanServer server = createMBeanServer();
SimpleObject composite = new SimpleObject();
CompositeMXBeanSupport support = new CompositeMXBeanSupport("Simple", composite);
ObjectName objectName = CompositeMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
OpenMBeanInfo info = (OpenMBeanInfo) server.getMBeanInfo(objectName);
CompositeData data = createCompositeData(SimpleInterface.class.getName(), SimpleInterface.KEYS, SimpleInterface.VALUES);
Object[] values = { "Simple", data };
Object[] realValues = { "Simple", composite };
checkAttributes(server, objectName, CompositeMXBeanSupportMXBean.class, support, CompositeInterface.KEYS, CompositeInterface.TYPES, values, realValues, info);
}
public void testSetCompositeAttributes() throws Exception
{
MBeanServer server = createMBeanServer();
SimpleObject composite = new SimpleObject();
CompositeMXBeanSupport support = new CompositeMXBeanSupport("Simple", composite);
ObjectName objectName = CompositeMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
OpenMBeanInfo info = (OpenMBeanInfo) server.getMBeanInfo(objectName);
String[] keys = CompositeInterface.KEYS;
CompositeData data = createCompositeData(SimpleInterface.class.getName(), SimpleInterface.KEYS, SimpleInterface.VALUES);
Object[] values = { "Simple", data };
data = createCompositeData(SimpleInterface.class.getName(), SimpleInterface.KEYS, SimpleInterface.CHANGED_VALUES);
Object[] changedValues = { "Changed", data };
AttributeList list = new AttributeList(keys.length);
for (int i = 0; i < keys.length; ++i)
{
String name = getUpperName(keys[i]);
server.setAttribute(objectName, new Attribute(name, changedValues[i]));
Attribute attribute = new Attribute(name, values[i]);
list.add(attribute);
}
SimpleObject changed = new SimpleObject();
changed.setBigDecimal(SimpleInterface.bigDecimalChangedValue);
changed.setBigInteger(SimpleInterface.bigIntegerChangedValue);
changed.setBoolean(SimpleInterface.booleanChangedValue);
changed.setByte(SimpleInterface.byteChangedValue);
changed.setCharacter(SimpleInterface.characterChangedValue);
changed.setDate(SimpleInterface.dateChangedValue);
changed.setDouble(SimpleInterface.doubleChangedValue);
changed.setFloat(SimpleInterface.floatChangedValue);
changed.setInteger(SimpleInterface.integerChangedValue);
changed.setLong(SimpleInterface.longChangedValue);
changed.setObjectName(SimpleInterface.objectNameChangedValue);
changed.setPrimitiveBoolean(SimpleInterface.primitiveBooleanChangedValue);
changed.setPrimitiveByte(SimpleInterface.primitiveByteChangedValue);
changed.setPrimitiveChar(SimpleInterface.primitiveCharChangedValue);
changed.setPrimitiveDouble(SimpleInterface.primitiveDoubleChangedValue);
changed.setPrimitiveFloat(SimpleInterface.primitiveFloatChangedValue);
changed.setPrimitiveInt(SimpleInterface.primitiveIntChangedValue);
changed.setPrimitiveLong(SimpleInterface.primitiveLongChangedValue);
changed.setPrimitiveShort(SimpleInterface.primitiveShortChangedValue);
changed.setShort(SimpleInterface.shortChangedValue);
changed.setString(SimpleInterface.stringChangedValue);
Object[] realChangedValues = { "Changed", changed };
checkAttributes(server, objectName, CompositeMXBeanSupportMXBean.class, support, CompositeInterface.KEYS, CompositeInterface.TYPES, changedValues, realChangedValues, info);
setAttributes(server, objectName, list);
Object[] realValues = { "Simple", composite };
checkAttributes(server, objectName, CompositeMXBeanSupportMXBean.class, support, keys, CompositeInterface.TYPES, values, realValues, info);
}
public void testCompositeInvoke() throws Exception
{
MBeanServer server = createMBeanServer();
SimpleObject composite = new SimpleObject();
CompositeMXBeanSupport support = new CompositeMXBeanSupport("Simple", composite);
ObjectName objectName = CompositeMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
composite = new SimpleObject();
composite.setString("hello");
CompositeData data = (CompositeData) MXBeanUtils.construct(MXBeanUtils.getOpenType(SimpleInterface.class), composite, getName());
Object actual = server.invoke(objectName, "echoReverse", new Object[] { data }, new String[] { SimpleInterface.class.getName() });
composite = new SimpleObject();
composite.setString("olleh");
CompositeData expected = (CompositeData) MXBeanUtils.construct(MXBeanUtils.getOpenType(SimpleInterface.class), composite, getName());
checkValueEquals(expected, actual);
}
public void testGetCollectionAttributes() throws Exception
{
MBeanServer server = createMBeanServer();
String[] array = { "array" };
Collection<String> collection = new ArrayList<String>();
collection.add("collection");
Set<String> set = new LinkedHashSet<String>();
set.add("set");
List<String> list = new ArrayList<String>();
list.add("list");
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("map", 1);
TestEnum enumeration = TestEnum.FIRST;
CollectionsMXBeanSupport support = new CollectionsMXBeanSupport(array, collection, set, list, map, enumeration);
ObjectName objectName = CollectionsMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
OpenMBeanInfo info = (OpenMBeanInfo) server.getMBeanInfo(objectName);
String[] collectionArray = collection.toArray(new String[collection.size()]);
String[] setArray = set.toArray(new String[set.size()]);
String[] listArray = list.toArray(new String[list.size()]);
TabularDataSupport mapData = new TabularDataSupport(TABLE_STRING_TO_INTEGER);
CompositeType entryType = TABLE_STRING_TO_INTEGER.getRowType();
mapData.put(new CompositeDataSupport(entryType, MXBeanUtils.MAP_ITEM_NAMES, new Object[] { "map", 1 }));
Object[] values = { array, collectionArray, setArray, listArray, mapData, TestEnum.FIRST.name() };
Object[] realValues = { array, collection, set, list, map, enumeration };
checkAttributes(server, objectName, CollectionsMXBeanSupportMXBean.class, support, CollectionsInterface.KEYS, CollectionsInterface.TYPES, values, realValues, info);
}
public void testSetCollectionAttributes() throws Exception
{
MBeanServer server = createMBeanServer();
String[] array = { "array" };
Collection<String> collection = new ArrayList<String>();
collection.add("collection");
Set<String> set = new LinkedHashSet<String>();
set.add("set");
List<String> list = new ArrayList<String>();
list.add("list");
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("map", 1);
TestEnum enumeration = TestEnum.FIRST;
CollectionsMXBeanSupport support = new CollectionsMXBeanSupport(array, collection, set, list, map, enumeration);
ObjectName objectName = CollectionsMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
OpenMBeanInfo info = (OpenMBeanInfo) server.getMBeanInfo(objectName);
String[] keys = CollectionsInterface.KEYS;
String[] collectionArray = collection.toArray(new String[collection.size()]);
String[] setArray = set.toArray(new String[set.size()]);
String[] listArray = list.toArray(new String[list.size()]);
TabularDataSupport mapData = new TabularDataSupport(TABLE_STRING_TO_INTEGER);
CompositeType entryType = TABLE_STRING_TO_INTEGER.getRowType();
mapData.put(new CompositeDataSupport(entryType, MXBeanUtils.MAP_ITEM_NAMES, new Object[] { "map", 1 }));
Object[] values = { array, collectionArray, setArray, listArray, mapData, TestEnum.FIRST.name() };
String[] changedArray = { "arrayChanged" };
Collection<String> changedCollection = new ArrayList<String>();
changedCollection.add("collectionChanged");
Set<String> changedSet = new LinkedHashSet<String>();
changedSet.add("setChanged");
List<String> changedList = new ArrayList<String>();
changedList.add("listChanged");
String[] changedCollectionArray = changedCollection.toArray(new String[changedCollection.size()]);
String[] changedSetArray = changedSet.toArray(new String[changedSet.size()]);
String[] changedListArray = changedList.toArray(new String[changedList.size()]);
TabularDataSupport changedMapData = new TabularDataSupport(TABLE_STRING_TO_INTEGER);
changedMapData.put(new CompositeDataSupport(entryType, MXBeanUtils.MAP_ITEM_NAMES, new Object[] { "mapChanged", 2 }));
Object[] changedValues = { changedArray, changedCollectionArray, changedSetArray, changedListArray, changedMapData, TestEnum.SECOND.name() };
AttributeList attributeList = new AttributeList(keys.length);
for (int i = 0; i < keys.length; ++i)
{
String name = getUpperName(keys[i]);
server.setAttribute(objectName, new Attribute(name, changedValues[i]));
Attribute attribute = new Attribute(name, values[i]);
attributeList.add(attribute);
}
Map<String, Integer> changedMap = new LinkedHashMap<String, Integer>();
changedMap.put("mapChanged", 2);
Object[] realChangedValues = { changedArray, changedCollection, changedSet, changedList, changedMap, TestEnum.SECOND };
checkAttributes(server, objectName, CollectionsMXBeanSupportMXBean.class, support, keys, CollectionsInterface.TYPES, changedValues, realChangedValues, info);
setAttributes(server, objectName, attributeList);
Object[] realValues = { array, collection, set, list, map, enumeration };
checkAttributes(server, objectName, CollectionsMXBeanSupportMXBean.class, support, keys, CollectionsInterface.TYPES, values, realValues, info);
}
public void testCollectionInvoke() throws Exception
{
MBeanServer server = createMBeanServer();
CollectionsMXBeanSupport support = new CollectionsMXBeanSupport();
ObjectName objectName = CompositeMXBeanSupportMXBean.REGISTERED_OBJECT_NAME;
server.registerMBean(support, objectName);
String[] list = { "one", "two", "three" };
String[] expected = { "three", "two", "one" };
Object result = server.invoke(objectName, "echoReverse", new Object[] { list }, new String[] { List.class.getName() });
checkArrayEquals(expected, result);
}
private void checkAttributes(MBeanServer server, ObjectName objectName, Class intf, Object mxbean, String[] keys, OpenType[] types, Object[] values, Object[] realValues, OpenMBeanInfo info) throws Exception
{
MBeanAttributeInfo[] attributes = info.getAttributes();
assertEquals(keys.length, values.length);
assertEquals(keys.length, types.length);
assertEquals(keys.length, attributes.length);
Map<String, OpenMBeanAttributeInfo> mapping = new HashMap<String, OpenMBeanAttributeInfo>(attributes.length);
for (int i = 0; i < attributes.length; ++i)
{
OpenMBeanAttributeInfo attribute = (OpenMBeanAttributeInfo) attributes[i];
String name = attribute.getName();
mapping.put(name, attribute);
}
String[] attributeNames = new String[keys.length];
for (int i = 0; i < keys.length; ++i)
{
String name = getUpperName(keys[i]);
OpenMBeanAttributeInfo attribute = mapping.get(name);
assertNotNull("Could not find key " + name + " in " + mapping.keySet(), attribute);
Object value = server.getAttribute(objectName, name);
checkValueEquals(values[i], value);
Method method = MXBeanUtils.getCompositeDataMethod(intf, keys[i], types[i] == SimpleType.BOOLEAN);
value = method.invoke(mxbean, null);
checkValueEquals(realValues[i], value);
assertEquals(types[i], attribute.getOpenType());
attributeNames[i] = name;
}
AttributeList list = server.getAttributes(objectName, attributeNames);
for (int i = 0; i < keys.length; ++i)
{
String name = attributeNames[i];
OpenMBeanAttributeInfo attribute = mapping.get(name);
Attribute attr = (Attribute) list.get(i);
checkValueEquals(values[i], attr.getValue());
assertEquals(types[i], attribute.getOpenType());
}
}
private void setAttributes(MBeanServer server, ObjectName objectName, AttributeList list) throws Exception
{
AttributeList result = server.setAttributes(objectName, list);
for (int i = 0; i < list.size(); ++i)
{
Attribute attribute = (Attribute) list.get(i);
Object expected = attribute.getValue();
attribute = (Attribute) result.get(i);
Object actual = attribute.getValue();
checkValueEquals(expected, actual);
}
}
}