package org.oddjob.jmx.general;
import java.text.ParseException;
import javax.management.ObjectName;
import org.oddjob.arooa.ArooaTools;
import org.oddjob.arooa.convert.ArooaConversionException;
import org.oddjob.arooa.convert.ArooaConverter;
import org.oddjob.arooa.reflect.ArooaPropertyException;
import org.oddjob.arooa.reflect.PropertyAccessor;
import org.oddjob.arooa.registry.BeanDirectory;
/**
* An implementation of an {@link BeanDirectory} for accessing
* {@link MBeanNode}s.
* <p>
* {@link #getIdFor(Object)} and {@link #getAllByType(Class)} are not
* currently supported.
*
* @author rob
*
*/
public class MBeanDirectory implements BeanDirectory {
private final PropertyAccessor accessor;
private final ArooaConverter converter;
private final MBeanCache cache;
public MBeanDirectory(
MBeanSession session) {
ArooaTools tools = session.getArooaSession().getTools();
this.converter = tools.getArooaConverter();
this.accessor = tools.getPropertyAccessor(
).accessorWithConversions(converter);
this.cache = session.getMBeanCache();
}
private Object mBeanLookup(MBeanDirectoryPathParser parser,
String path) throws ArooaPropertyException {
try {
parser.parse(path);
} catch (ParseException e) {
throw new IllegalArgumentException(
"Failed to parse MBean property path" + path, e);
}
if (parser.getName() == null) {
return null;
}
try {
ObjectName objectName = new ObjectName(parser.getName());
return cache.findBean(objectName);
} catch (Exception e) {
throw new ArooaPropertyException(
path, "Failed to find bean.", e);
}
}
@Override
public Object lookup(String path) throws ArooaPropertyException {
MBeanDirectoryPathParser parser = new MBeanDirectoryPathParser();
Object bean = mBeanLookup(parser, path);
if (parser.getProperty() == null) {
return bean;
}
return accessor.getProperty(bean, parser.getProperty());
}
@Override
public <T> T lookup(String path, Class<T> required)
throws ArooaPropertyException, ArooaConversionException {
MBeanDirectoryPathParser parser = new MBeanDirectoryPathParser();
Object bean = mBeanLookup(parser, path);
if (parser.getProperty() == null) {
return converter.convert(bean, required);
}
return accessor.getProperty(bean, parser.getProperty(), required);
}
@Override
public String getIdFor(Object bean) {
return null;
}
@Override
public <T> Iterable<T> getAllByType(Class<T> type) {
throw new UnsupportedOperationException("Can't find all MBeans by type.");
}
}