package org.oddjob.jmx.general; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.management.InstanceNotFoundException; import javax.management.IntrospectionException; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.ReflectionException; import org.oddjob.arooa.ClassResolver; /** * A Simple Map based implementation of a {@link MBeanCache}. * * @author rob * */ public class MBeanCacheMap implements MBeanCache { private final MBeanServerConnection mBeanServer; private final ClassResolver classRresolver; private final Map<ObjectName, MBeanNode> beans = new HashMap<ObjectName, MBeanNode>(); public MBeanCacheMap(MBeanServerConnection mBeanServer, ClassResolver classResolver) { this.mBeanServer = mBeanServer; this.classRresolver = classResolver; } public MBeanNode findBean(ObjectName objectName) throws IntrospectionException, InstanceNotFoundException, ReflectionException, IOException { MBeanNode bean = beans.get(objectName); if (bean == null) { MBeanNode[] beans = findBeans(objectName); if (beans.length == 0) { throw new IllegalArgumentException( "No MBean found for " + objectName); } if (beans.length > 1) { throw new IllegalArgumentException( "More than one MBean Found for " + objectName); } bean = beans[0]; } return bean; } public MBeanNode[] findBeans(ObjectName objectName) throws IntrospectionException, InstanceNotFoundException, ReflectionException, IOException { Set<ObjectName> names = mBeanServer.queryNames( objectName, null); MBeanNode[] wrappers = new MBeanNode[names.size()]; int i = 0; for (ObjectName name: names) { MBeanNode wrapper = beans.get(name); if (wrapper == null) { wrapper = new SimpleMBeanNode(name, mBeanServer, classRresolver); beans.put(name, wrapper); } wrappers[i++] = wrapper; } return wrappers; } }