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.ObjectName;
import java.util.Collection;
/**
* Implementation of ClassLoaderDiscovery which uses JMX to obtain the ClassLoaders associated
* with Tomcat web applications.
*/
public class TomcatDiscovery implements ClassLoaderDiscovery {
private final JMXDiscovery jmxDiscovery;
public TomcatDiscovery(ClassLoaderRegistry registry) {
this.jmxDiscovery = new JMXDiscovery(registry, "Catalina:j2eeType=WebModule,*", "loader",
new Function<ClassLoader, Object>() {
public ClassLoader invoke(Object obj) {
ClassLoader classLoader;
try {
classLoader = (ClassLoader) obj.getClass().getMethod("getClassLoader").invoke(obj);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e);
}
return classLoader;
}
},
new Function<String, ObjectName>() {
public String invoke(ObjectName arg) {
String name = arg.getKeyProperty("name");
int pos = name.lastIndexOf('/');
if (pos != -1) name = name.substring(pos);
return name;
}
}, "Tomcat Web Applications");
}
public Collection<ClassLoaderInfo> listClassLoaders() {
return jmxDiscovery.listClassLoaders();
}
public String discoveryName() {
return jmxDiscovery.discoveryName();
}
}