package net.djpowell.liverepl.discovery.impl; import net.djpowell.liverepl.discovery.ClassLoaderDiscovery; import net.djpowell.liverepl.discovery.ClassLoaderInfo; import net.djpowell.liverepl.discovery.ClassLoaderRegistry; import net.djpowell.liverepl.discovery.Function; import javax.management.*; import java.lang.management.ManagementFactory; import java.util.Collection; import java.util.Set; import java.util.TreeSet; /** * Helper class to return ClassLoaders using JMX */ public class JMXDiscovery implements ClassLoaderDiscovery { private final ClassLoaderRegistry registry; private final MBeanServer mbs; private final String searchName; private final String attributeName; private final Function<ClassLoader, Object> getClassLoader; private final Function<String, ObjectName> getInfo; private final String discoveryName; public JMXDiscovery(ClassLoaderRegistry registry, String searchName, String attributeName, Function<ClassLoader, Object> getClassLoader, Function<String, ObjectName> getInfo, String discoveryName) { this.registry = registry; this.mbs = ManagementFactory.getPlatformMBeanServer(); this.searchName = searchName; this.attributeName = attributeName; this.getClassLoader = getClassLoader; this.getInfo = getInfo; this.discoveryName = discoveryName; } public Collection<ClassLoaderInfo> listClassLoaders() { Set<ClassLoaderInfo> ret = new TreeSet<ClassLoaderInfo>(); Set<ObjectName> names; try { names = mbs.queryNames(new ObjectName(searchName), null); } catch (MalformedObjectNameException e) { throw new RuntimeException(e); } for (ObjectName name : names) { Object obj; try { obj = mbs.getAttribute(name, attributeName); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } ClassLoader classLoader = getClassLoader.invoke(obj); String id = registry.registerClassLoader(classLoader); String info = getInfo.invoke(name); ClassLoaderInfo cli = new ClassLoaderInfo(id, classLoader, info); ret.add(cli); } return ret; } public String discoveryName() { return discoveryName; } }