protected Result describeMbean( @Nonnull MBeanServerConnection mbeanServer, @Nonnull ObjectName objectName) throws IntrospectionException, ReflectionException, InstanceNotFoundException, IOException { MBeanInfo mbeanInfo = mbeanServer.getMBeanInfo(objectName); StringWriter sw = new StringWriter(); PrintWriter out = new PrintWriter(sw); out.println("# MBEAN"); out.println(objectName.toString()); out.println(); out.println("## OPERATIONS"); List<MBeanOperationInfo> operations = Arrays.asList(mbeanInfo.getOperations()); Collections.sort( operations, new Comparator<MBeanOperationInfo>() { @Override public int compare(MBeanOperationInfo o1, MBeanOperationInfo o2) { return o1.getName().compareTo(o1.getName()); } }); for (MBeanOperationInfo opInfo : operations) { out.print("* " + opInfo.getName() + "("); MBeanParameterInfo[] signature = opInfo.getSignature(); for (int i = 0; i < signature.length; i++) { MBeanParameterInfo paramInfo = signature[i]; out.print(paramInfo.getType() + " " + paramInfo.getName()); if (i < signature.length - 1) { out.print(", "); } } out.print("):" + opInfo.getReturnType() /* + " - " + opInfo.getDescription() */); out.println(); } out.println(); out.println("## ATTRIBUTES"); List<MBeanAttributeInfo> attributes = Arrays.asList(mbeanInfo.getAttributes()); Collections.sort( attributes, new Comparator<MBeanAttributeInfo>() { @Override public int compare(MBeanAttributeInfo o1, MBeanAttributeInfo o2) { return o1.getName().compareTo(o2.getName()); } }); for (MBeanAttributeInfo attrInfo : attributes) { out.println( "* " + attrInfo.getName() + ": " + attrInfo.getType() + " - " + (attrInfo.isReadable() ? "r" : "") + (attrInfo.isWritable() ? "w" : "") /* + " - " + attrInfo.getDescription() */); } String description = sw.getBuffer().toString(); return new Result(objectName, description, description); }
/* Check that all descriptors have been returned */ private static void checkDescriptors( ModelMBeanInfo modelMBeanInfo, Descriptor[] descriptors, String string) { int errCount = 0; final ArrayList<Descriptor> list = new ArrayList<Descriptor>(descriptors.length); list.addAll(Arrays.asList(descriptors)); System.out.println("Got " + list.size() + " descriptors for " + string); // checks that MBean's descriptor is returned. // final Descriptor mbd = ((MBeanInfo) modelMBeanInfo).getDescriptor(); if (!mbd.equals(remove(list, mbd))) { System.err.println("modelMBeanInfo.getDescriptor(): not found"); errCount++; } // checks that MBean's attributes descriptors are returned. // final MBeanAttributeInfo[] attrs = modelMBeanInfo.getAttributes(); for (MBeanAttributeInfo att : attrs) { final Descriptor ad = att.getDescriptor(); final String name = att.getName(); if (!ad.equals(remove(list, ad))) { System.err.println("attInfo.getDescriptor(): not found for " + name); errCount++; } } // checks that MBean's operations descriptors are returned. // final MBeanOperationInfo[] ops = modelMBeanInfo.getOperations(); for (MBeanOperationInfo op : ops) { final Descriptor od = op.getDescriptor(); final String name = op.getName(); if (!od.equals(remove(list, od))) { System.err.println("opInfo.getDescriptor(): not found for " + name); errCount++; } } // checks that MBean's notifications descriptors are returned. // final MBeanNotificationInfo[] ntfs = modelMBeanInfo.getNotifications(); for (MBeanNotificationInfo ntf : ntfs) { final Descriptor nd = ntf.getDescriptor(); final String name = ntf.getName(); if (!nd.equals(remove(list, nd))) { System.err.println("notifInfo.getDescriptor(): not found for " + name); errCount++; } } if (errCount > 0) { throw new RuntimeException(string + ": failed with " + errCount + " errors"); } else if (list.size() != 0) { // Check that there are no additional descriptors // throw new RuntimeException(string + ": Unexpected remaining descriptors: " + list); } else System.out.println(string + ": PASSED"); }
/** * Description of the specified attribute name. * * @param attr - the attribute * @return String the description */ protected String describeAttribute(MBeanAttributeInfo attr) { StringBuilder buf = new StringBuilder(); buf.append("("); if (attr.isReadable()) { buf.append("r"); } if (attr.isWritable()) { buf.append("w"); } buf.append(") ").append(attr.getType()).append(" ").append(attr.getName()); return buf.toString(); }
/** * List of the names of each of the attributes on the MBean * * @return list of attribute names */ public Collection<String> listAttributeNames() { List<String> list = new ArrayList<String>(); try { MBeanAttributeInfo[] attrs = beanInfo.getAttributes(); for (MBeanAttributeInfo attr : attrs) { list.add(attr.getName()); } } catch (Exception e) { throwException("Could not list attribute names. Reason: ", e); } return list; }
/** * Description of the specified attribute name. * * @param attributeName - stringified name of the attribute * @return the description */ public String describeAttribute(String attributeName) { String ret = "Attribute not found"; try { MBeanAttributeInfo[] attributes = beanInfo.getAttributes(); for (MBeanAttributeInfo attribute : attributes) { if (attribute.getName().equals(attributeName)) { return describeAttribute(attribute); } } } catch (Exception e) { throwException("Could not describe attribute '" + attributeName + "'. Reason: ", e); } return ret; }
/** * @param mbeanServer * @param objectName * @param attributeName * @param attributeValue if <code>null</code>, this is a read access. * @return if this is a read access, the returned value (may be null); if it is a write access, * return <code>void.class</code>. * @throws IOException * @throws JMException */ public Result invokeAttribute( @Nonnull MBeanServerConnection mbeanServer, @Nonnull ObjectName objectName, @Nonnull String attributeName, @Nullable String attributeValue) throws IOException, JMException { MBeanInfo mbeanInfo = mbeanServer.getMBeanInfo(objectName); MBeanAttributeInfo attributeInfo = null; for (MBeanAttributeInfo mai : mbeanInfo.getAttributes()) { if (mai.getName().equals(attributeName)) { attributeInfo = mai; break; } } if (attributeInfo == null) { throw new IllegalArgumentException( "No attribute '" + attributeName + "' found on '" + objectName + "'. Existing attributes: " + Arrays.asList(mbeanInfo.getAttributes())); } String description; Object resultValue; if (attributeValue == null) { if (attributeInfo.isReadable()) { Object attribute = mbeanServer.getAttribute(objectName, attributeName); logger.info("get attribute value {}:{}:{}", objectName, attributeName, attribute); resultValue = attribute; description = "Get attribute value " + objectName + ":" + attributeName + ": " + resultValue; } else { throw new IllegalArgumentException( "Attribute '" + attributeName + "' is not readable on '" + objectName + "': " + attributeInfo); } } else { if (attributeInfo.isWritable()) { Object value = convertValue(attributeValue, attributeInfo.getType()); mbeanServer.setAttribute(objectName, new Attribute(attributeName, value)); logger.info("set attribute value {}:{}:{}", objectName, attributeName, value); description = "Set attribute value " + objectName + ":" + attributeName + ": " + value; resultValue = void.class; } else { throw new IllegalArgumentException( "Attribute '" + attributeName + "' is not writable on '" + objectName + "': " + attributeInfo); } } return new Result(objectName, resultValue, description); }