Red Hat Application Migration Toolkit
package com.googlecode.arit.mbeans;
import com.googlecode.arit.Messages;
import com.googlecode.arit.mbeans.MBeanAccessor;
import com.googlecode.arit.mbeans.MBeanServerInspector;
import com.googlecode.arit.resource.CleanerPlugin;
import com.googlecode.arit.resource.ResourceScanner;
import com.googlecode.arit.resource.ResourceType;
import com.googlecode.arit.resource.SimpleResource;
import com.googlecode.arit.resource.ResourceScanner.ResourceListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.QueryExp;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class MBeanScanner implements ResourceScanner, CleanerPlugin {
private static final Log LOG = LogFactory.getLog(MBeanScanner.class);
@Autowired
@Qualifier("mbean")
private ResourceType resourceType;
@Autowired
private MBeanServerInspector mbsInspector;
@Autowired(
required = false
)
private Messages messages;
public boolean isAvailable() {
return this.mbsInspector.isAvailable();
}
public String getDescription() {
return "MBeans";
}
public void scanForResources(ResourceListener resourceEventListener) {
ArrayList mbeanServers = MBeanServerFactory.findMBeanServer((String)null);
Iterator var3 = mbeanServers.iterator();
while(true) {
while(var3.hasNext()) {
MBeanServer mbs = (MBeanServer)var3.next();
MBeanAccessor mbeanAccessor = this.mbsInspector.inspect(mbs);
if(mbeanAccessor == null) {
String mbeans1 = "Unable to inspect MBeanServer of type " + mbs.getClass().getName();
LOG.error(mbeans1);
if(this.messages != null) {
this.messages.addMessage(mbeans1);
}
} else {
Set mbeans;
try {
mbeans = mbs.queryNames(new ObjectName("*:*"), (QueryExp)null);
} catch (MalformedObjectNameException var11) {
throw new Error(var11);
}
Iterator ex = mbeans.iterator();
while(ex.hasNext()) {
ObjectName name = (ObjectName)ex.next();
Object mbean = mbeanAccessor.retrieve(name);
SimpleResource mbeanResource = new SimpleResource(this.resourceType, mbean, "MBean: " + name);
mbeanResource.addClassloaderReference(mbean.getClass().getClassLoader(), "Implementation class: " + mbean.getClass().getName());
resourceEventListener.onResourceFound(mbeanResource);
}
}
}
return;
}
}
public void clean(ClassLoader classLoader) {
ArrayList mbeanServers = MBeanServerFactory.findMBeanServer((String)null);
Iterator var3 = mbeanServers.iterator();
while(true) {
label46:
while(var3.hasNext()) {
MBeanServer mbs = (MBeanServer)var3.next();
MBeanAccessor mbeanAccessor = this.mbsInspector.inspect(mbs);
if(mbeanAccessor == null) {
String mbeans1 = "Unable to inspect MBeanServer of type " + mbs.getClass().getName();
LOG.error(mbeans1);
if(this.messages != null) {
this.messages.addMessage(mbeans1);
}
} else {
Set mbeans;
try {
mbeans = mbs.queryNames(new ObjectName("*:*"), (QueryExp)null);
} catch (MalformedObjectNameException var12) {
throw new Error(var12);
}
Iterator ex = mbeans.iterator();
while(true) {
ObjectName name;
Object mbean;
do {
if(!ex.hasNext()) {
continue label46;
}
name = (ObjectName)ex.next();
mbean = mbeanAccessor.retrieve(name);
} while(!mbean.getClass().getClassLoader().equals(classLoader));
try {
mbs.unregisterMBean(name);
} catch (JMException var13) {
String errorMsg = "Error during cleanup of mbean - unregistration of mbean " + name.toString() + " failed";
LOG.error(errorMsg, var13);
if(this.messages != null) {
this.messages.addMessage(errorMsg);
}
}
}
}
}
return;
}
}
}