package org.jolokia.it; import java.util.Iterator; import javax.management.*; import javax.management.openmbean.*; /** * @author Dave Messink * @version $ */ public class TabularMBean implements DynamicMBean { private static final String[] COLUMN_NAMES = {"Column1", "Column2", "Column3"}; private static final String[][] TABLE_DATA = {{"Value0.0", "Value0.1", "Value0.2"}, {"Value1.0", "Value1.1", "Value1.2"}, {"Value2.0", "Value2.1", "Value2.2"}}; private final MBeanInfo _mbeanInfo; private final TabularType _table1Type; private final TabularType _table2Type; private final TabularType _updateType; public TabularMBean() throws OpenDataException { MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[2]; String[] columnDescriptions = {"column one", "column two", "column three"}; OpenType[] columnTypes = {SimpleType.STRING, SimpleType.STRING, SimpleType.STRING}; CompositeType compositeType = new CompositeType("SensorMetric", "Sensor metric data", COLUMN_NAMES, columnDescriptions, columnTypes); _table1Type = new TabularType("Table1Type", "table one type", compositeType, new String[]{"Column1"}); attributes[0] = new OpenMBeanAttributeInfoSupport("Table1", "table one", _table1Type, true, false, false); _table2Type = new TabularType("Table2Type", "table two type", compositeType, new String[]{"Column1", "Column2"}); attributes[1] = new OpenMBeanAttributeInfoSupport("Table2", "table two", _table2Type, true, false, false); // "update" method works here, because we use open data. This is contrast to OperationCheckingMBean which is // standard MBean and were TabularData doesnt work without Meta-Data. _updateType = new TabularType("UpdateType","Update data", new CompositeType("updateRow","Row desc", new String[] { "Key", "Value", "Type"}, new String[] { "Key", "Value", "Type"}, new OpenType[] { SimpleType.STRING, SimpleType.STRING, SimpleType.STRING}), new String[] { "Key" }); MBeanOperationInfo[] operations = new MBeanOperationInfo[1]; operations[0] = new OpenMBeanOperationInfoSupport( "update", "Test method for TabularData", new OpenMBeanParameterInfo[] { new OpenMBeanParameterInfoSupport("name","1. param",SimpleType.STRING), new OpenMBeanParameterInfoSupport("data","2. param",_updateType) }, _updateType, MBeanOperationInfo.INFO ); _mbeanInfo = new MBeanInfo(getClass().getName(), "tabular mbean", attributes, null, operations, null); } public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { if (attribute.equals("Table1")) { return getTableData(_table1Type); } else if (attribute.equals("Table2")) { return getTableData(_table2Type); } else { throw new AttributeNotFoundException("MBean attribute " + attribute + " not exposed for " + getClass().getName()); } } private Object getTableData(TabularType tabularType) throws MBeanException { TabularDataSupport tableData = new TabularDataSupport(tabularType); for (String[] rowData : TABLE_DATA) { try { tableData.put(new CompositeDataSupport(tabularType.getRowType(), COLUMN_NAMES, rowData)); } catch (OpenDataException exc) { throw new MBeanException(exc, "Error creating table data"); } } return tableData; } public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { throw new MBeanException( new UnsupportedOperationException("MBean operation setAttribute is not supported for " + getClass().getName())); } public AttributeList getAttributes(String[] attributes) { AttributeList values = new AttributeList(attributes.length); for (String attributeName : attributes) { Object result; try { result = getAttribute(attributeName); } catch (Exception exc) { result = exc; } values.add(new Attribute(attributeName, result)); } return values; } public AttributeList setAttributes(AttributeList attributes) { Iterator iterator = attributes.iterator(); AttributeList newValues = new AttributeList(attributes.size()); while (iterator.hasNext()) { Attribute attribute = (Attribute) iterator.next(); try { setAttribute(attribute); } catch (Exception exc) { attribute = new Attribute(attribute.getName(), exc); } newValues.add(attribute); } return newValues; } public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException { if (actionName.equals("update")) { return params[1]; } else { throw new MBeanException( new UnsupportedOperationException("MBean operation " + actionName + " is not supported for " + getClass().getName())); } } public MBeanInfo getMBeanInfo() { return _mbeanInfo; } }