/* * JacORB - a free Java ORB * * Copyright (C) 1999-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.jacorb.notification.jmx; import javax.management.Attribute; import javax.management.AttributeChangeNotification; import javax.management.AttributeList; import javax.management.AttributeNotFoundException; import javax.management.DynamicMBean; import javax.management.InvalidAttributeValueException; import javax.management.ListenerNotFoundException; import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.MBeanNotificationInfo; import javax.management.NotCompliantMBeanException; import javax.management.Notification; import javax.management.NotificationBroadcasterSupport; import javax.management.NotificationEmitter; import javax.management.NotificationFilter; import javax.management.NotificationListener; import javax.management.ReflectionException; import javax.management.StandardMBean; import org.jacorb.notification.interfaces.JMXManageable; import org.jacorb.util.ObjectUtil; public class BroadcastSupportMBeanDecorator implements DynamicMBean, NotificationEmitter { private final NotificationBroadcasterSupport broadCaster_ = new NotificationBroadcasterSupport(); private final DynamicMBean delegate_; private final String[] types_; private int notificationSequence_ = 0; public BroadcastSupportMBeanDecorator(JMXManageable manageable) throws NotCompliantMBeanException, ClassNotFoundException { super(); types_ = manageable.getJMXNotificationTypes(); delegate_ = new StandardMBean(manageable, getManagementInterface(manageable.getClass())); manageable.setJMXCallback(new JMXManageable.JMXCallback() { public void sendJMXNotification(String type, String message) { sendNotification(type, message); } public void sendJMXAttributeChanged(String name, Object oldValue, Object newValue) { sendAttributeChanged(name, oldValue, newValue); } public void sendJMXNotification(String type, String message, Object payload) { sendNotification(type, message, payload); } }); } private Class getManagementInterface(Class clazz) throws IllegalArgumentException, ClassNotFoundException { final String managementInterfaceName = clazz.getName() + "MBean"; if (clazz.getClassLoader() != null) { return clazz.getClassLoader().loadClass(managementInterfaceName); } return ObjectUtil.classForName(managementInterfaceName); } public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { return delegate_.getAttribute(attribute); } public AttributeList getAttributes(String[] attributes) { return delegate_.getAttributes(attributes); } public MBeanInfo getMBeanInfo() { MBeanInfo _info = delegate_.getMBeanInfo(); if (types_ != null && types_.length > 0) { return new MBeanInfo(_info.getClassName(), _info.getDescription(), _info .getAttributes(), _info.getConstructors(), _info.getOperations(), getNotificationInfo()); } return _info; } public Object invoke(String method, Object[] arguments, String[] params) throws MBeanException, ReflectionException { return delegate_.invoke(method, arguments, params); } public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { delegate_.setAttribute(attribute); } public AttributeList setAttributes(AttributeList attributes) { return delegate_.setAttributes(attributes); } public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws IllegalArgumentException { broadCaster_.addNotificationListener(listener, filter, handback); } public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException { broadCaster_.removeNotificationListener(listener); } public MBeanNotificationInfo[] getNotificationInfo() { return new MBeanNotificationInfo[] { new MBeanNotificationInfo(types_, Notification.class.getName(), "User Notifications"), new MBeanNotificationInfo(new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE }, AttributeChangeNotification.class.getName(), "User attribute change notification") }; } public void sendNotification(String type, String message, Object payload) { final Notification _jmxNotification = new Notification(type,// type this, // source ++notificationSequence_, // seq. number message // message ); if (payload != null) { _jmxNotification.setUserData(payload); } broadCaster_.sendNotification(_jmxNotification); } public void sendNotification(String type, String message) { final Notification _jmxNotification = new Notification(type,// type this, // source ++notificationSequence_, // seq. number message // message ); broadCaster_.sendNotification(_jmxNotification); } public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws ListenerNotFoundException { broadCaster_.removeNotificationListener(listener, filter, handback); } public void sendAttributeChanged(String name, Object oldValue, Object newValue) { broadCaster_.sendNotification(new AttributeChangeNotification(delegate_, ++notificationSequence_, System.currentTimeMillis(), "Attribute value changed", name, oldValue == null ? null : oldValue.getClass().getName(), oldValue, newValue)); } }