/*_##########################################################################
_##
_## Copyright (C) 2011 Kaito Yamada
_##
_##########################################################################
*/
package com.github.kaitoy.sneo.jmx;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import javax.management.DynamicMBean;
public final class DynamicMBeanFactory {
private static final String DYNAMIC_MBEAN_SUFFIX = "DynamicMBean";
private DynamicMBeanFactory() { throw new AssertionError(); }
public static Class<?> getClassOfManagedBy(
Class<? extends DynamicMBean> dynamicMBeanClass
) throws ClassNotFoundException {
return Class.forName(
dynamicMBeanClass.getName()
.replaceFirst(DYNAMIC_MBEAN_SUFFIX + "\\z", "")
);
}
public static
Class<? extends DynamicMBean> getClassOfMBeanThatManages(Class<?> moClass)
throws ClassNotFoundException {
Class<?> dynamicMBeanClass
= Class.forName(
moClass.getName() + DYNAMIC_MBEAN_SUFFIX
);
if (!DynamicMBean.class.isAssignableFrom(dynamicMBeanClass)) {
throw new ClassNotFoundException(
moClass.getName() + DYNAMIC_MBEAN_SUFFIX
+ " doesn't implement DynamicMBean."
);
}
@SuppressWarnings("unchecked")
Class<? extends DynamicMBean> clazz
= (Class<? extends DynamicMBean>)dynamicMBeanClass;
return clazz;
}
public static DynamicMBean newDynamicMBean(Object mo) {
try {
Constructor<? extends DynamicMBean> constructor
= getClassOfMBeanThatManages(mo.getClass())
.getConstructor(mo.getClass());
DynamicMBean mbean
= constructor.newInstance(mo.getClass().cast(mo));
return mbean;
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException(
"Can not create Dynamic MBean of " + mo.getClass().getName(),
e
);
} catch (SecurityException e) {
throw new IllegalArgumentException(
"Can not create Dynamic MBean of " + mo.getClass().getName(),
e
);
} catch (NoSuchMethodException e) {
throw new IllegalArgumentException(
"Can not create Dynamic MBean of " + mo.getClass().getName(),
e
);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException(
"Can not create Dynamic MBean of " + mo.getClass().getName(),
e
);
} catch (InstantiationException e) {
throw new IllegalArgumentException(
"Can not create Dynamic MBean of " + mo.getClass().getName(),
e
);
} catch (IllegalAccessException e) {
throw new IllegalArgumentException(
"Can not create Dynamic MBean of " + mo.getClass().getName(),
e
);
} catch (InvocationTargetException e) {
throw new IllegalArgumentException(
"Can not create Dynamic MBean of " + mo.getClass().getName(),
e
);
}
}
}