package com.claudeduguay.mbeans.spring; import Java.lang.reflect.*; import javax.management.*; import javax.management.modelmbean.*; public class ModelMBeanExtension extends RequiredModelMBean { protected NotificationInfoMap notificationInfoMap; protected ModelMBeanInfo modelMBeanInfo; protected Object managedBean; public ModelMBeanExtension() throws MBeanException {} public ModelMBeanExtension(ModelMBeanInfo modelMBeanInfo) throws MBeanException { super(modelMBeanInfo); this.modelMBeanInfo = modelMBeanInfo; notificationInfoMap = new NotificationInfoMap(modelMBeanInfo); } public void setModelMBeanInfo(ModelMBeanInfo modelMBeanInfo) throws MBeanException { this.modelMBeanInfo = modelMBeanInfo; notificationInfoMap = new NotificationInfoMap(modelMBeanInfo); super.setModelMBeanInfo(modelMBeanInfo); } public MBeanNotificationInfo[] getNotificationInfo() { return modelMBeanInfo.getNotifications(); } public void setManagedResource(Object managedBean, String type) throws MBeanException, RuntimeOperationsException, InstanceNotFoundException, InvalidTargetObjectTypeException { super.setManagedResource(managedBean, type); this.managedBean = managedBean; } protected void maybeSendMethodNotification( String type, String name) throws MBeanException { MBeanNotificationInfo info = notificationInfoMap. findNotificationInfo(type, name); if (info != null) { long timeStamp = System.currentTimeMillis(); String notificationType = ModelMBeanUtil. matchType(info, '.' + type + '.' + name); sendNotification(new Notification( notificationType, this, timeStamp, info.getDescription())); } } protected void maybeSendAttributeNotification( Attribute attribute) throws MBeanException, AttributeNotFoundException, InvalidAttributeValueException, ReflectionException { String name = attribute.getName(); MBeanNotificationInfo info = notificationInfoMap. findNotificationInfo('set', attribute.getName()); if (info != null) { Object oldValue = getAttribute(name); Object newValue = attribute.getValue(); long timeStamp = System.currentTimeMillis(); String notificationType = ModelMBeanUtil. matchType(info, '.set.' + name); sendNotification(new AttributeChangeNotification( this, timeStamp, timeStamp, info.getDescription(), info.getName(), notificationType, oldValue, newValue)); } } public Object invoke( String name, Object[] args, String[] signature) throws MBeanException, ReflectionException { maybeSendMethodNotification('before', name); Object returnValue = super.invoke(name, args, signature); maybeSendMethodNotification('after', name); return returnValue; } public Object getAttribute(String name) throws MBeanException, AttributeNotFoundException, ReflectionException { try { Method method = ModelMBeanUtil.findGetMethod( modelMBeanInfo, managedBean, name); return method.invoke(managedBean, new Object[] {}); } catch (IllegalAccessException e) { throw new MBeanException(e); } catch (InvocationTargetException e) { throw new MBeanException(e); } } public void setAttribute(Attribute attribute) throws MBeanException, AttributeNotFoundException, InvalidAttributeValueException, ReflectionException { try { Method method = ModelMBeanUtil.findSetMethod( modelMBeanInfo, managedBean, attribute.getName()); method.invoke(managedBean, attribute.getValue()); maybeSendAttributeNotification(attribute); } catch (InvocationTargetException e) { throw new MBeanException(e); } catch (IllegalAccessException e) { throw new MBeanException(e); } } } |