de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper/*
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * This code is free software; you can redistribute it and/or modify it
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * under the terms of the GNU General Public License version 2 only, as
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * published by the Free Software Foundation. Oracle designates this
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * particular file as subject to the "Classpath" exception as provided
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * by Oracle in the LICENSE file that accompanied this code.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * This code is distributed in the hope that it will be useful, but WITHOUT
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * version 2 for more details (a copy is included in the LICENSE file that
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * accompanied this code).
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * You should have received a copy of the GNU General Public License version
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * 2 along with this work; if not, write to the Free Software Foundation,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * or visit www.oracle.com if you need additional information or have any
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * questions.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper */
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeperpackage javax.management;
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper/**
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>An MBean whose management interface is determined by reflection
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * on a Java interface, and that emits notifications.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>The following example shows how to use the public constructor
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@link #StandardEmitterMBean(Object, Class, NotificationEmitter)
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * StandardEmitterMBean(implementation, mbeanInterface, emitter)} to
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * create an MBean emitting notifications with any
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * implementation class name <i>Impl</i>, with a management
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * interface defined (as for current Standard MBeans) by any interface
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <i>Intf</i>, and with any implementation of the interface
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@link NotificationEmitter}. The example uses the class
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@link NotificationBroadcasterSupport} as an implementation
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * of the interface {@link NotificationEmitter}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <pre>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * MBeanServer mbs;
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * ...
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * final String[] types = new String[] {"sun.disc.space","sun.disc.alarm"};
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * final MBeanNotificationInfo info = new MBeanNotificationInfo(
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * types,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * Notification.class.getName(),
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * "Notification about disc info.");
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * final NotificationEmitter emitter =
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * new NotificationBroadcasterSupport(info);
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * final Intf impl = new Impl(...);
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * final Object mbean = new StandardEmitterMBean(
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * impl, Intf.class, emitter);
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * mbs.registerMBean(mbean, objectName);
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * </pre>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @see StandardMBean
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @since 1.6
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper */
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeperpublic class StandardEmitterMBean extends StandardMBean
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper implements NotificationEmitter {
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper private static final MBeanNotificationInfo[] NO_NOTIFICATION_INFO =
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper new MBeanNotificationInfo[0];
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper private final NotificationEmitter emitter;
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper private final MBeanNotificationInfo[] notificationInfo;
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper /**
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>Make an MBean whose management interface is specified by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code mbeanInterface}, with the given implementation and
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * where notifications are handled by the given {@code NotificationEmitter}.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * The resultant MBean implements the {@code NotificationEmitter} interface
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * by forwarding its methods to {@code emitter}. It is legal and useful
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * for {@code implementation} and {@code emitter} to be the same object.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>If {@code emitter} is an instance of {@code
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * NotificationBroadcasterSupport} then the MBean's {@link #sendNotification
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * sendNotification} method will call {@code emitter.}{@link
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * NotificationBroadcasterSupport#sendNotification sendNotification}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>The array returned by {@link #getNotificationInfo()} on the
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * new MBean is a copy of the array returned by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code emitter.}{@link NotificationBroadcaster#getNotificationInfo
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * getNotificationInfo()} at the time of construction. If the array
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * returned by {@code emitter.getNotificationInfo()} later changes,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * that will have no effect on this object's
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code getNotificationInfo()}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param implementation the implementation of the MBean interface.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param mbeanInterface a Standard MBean interface.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param emitter the object that will handle notifications.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @throws IllegalArgumentException if the {@code mbeanInterface}
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * does not follow JMX design patterns for Management Interfaces, or
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * if the given {@code implementation} does not implement the
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * specified interface, or if {@code emitter} is null.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper */
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper public <T> StandardEmitterMBean(T implementation, Class<T> mbeanInterface,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper NotificationEmitter emitter) {
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper this(implementation, mbeanInterface, false, emitter);
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper }
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper /**
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>Make an MBean whose management interface is specified by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code mbeanInterface}, with the given implementation and where
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * notifications are handled by the given {@code
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * NotificationEmitter}. This constructor can be used to make
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * either Standard MBeans or MXBeans. The resultant MBean
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * implements the {@code NotificationEmitter} interface by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * forwarding its methods to {@code emitter}. It is legal and
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * useful for {@code implementation} and {@code emitter} to be the
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * same object.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>If {@code emitter} is an instance of {@code
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * NotificationBroadcasterSupport} then the MBean's {@link #sendNotification
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * sendNotification} method will call {@code emitter.}{@link
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * NotificationBroadcasterSupport#sendNotification sendNotification}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>The array returned by {@link #getNotificationInfo()} on the
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * new MBean is a copy of the array returned by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code emitter.}{@link NotificationBroadcaster#getNotificationInfo
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * getNotificationInfo()} at the time of construction. If the array
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * returned by {@code emitter.getNotificationInfo()} later changes,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * that will have no effect on this object's
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code getNotificationInfo()}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param implementation the implementation of the MBean interface.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param mbeanInterface a Standard MBean interface.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param isMXBean If true, the {@code mbeanInterface} parameter
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * names an MXBean interface and the resultant MBean is an MXBean.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param emitter the object that will handle notifications.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @throws IllegalArgumentException if the {@code mbeanInterface}
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * does not follow JMX design patterns for Management Interfaces, or
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * if the given {@code implementation} does not implement the
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * specified interface, or if {@code emitter} is null.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper */
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper public <T> StandardEmitterMBean(T implementation, Class<T> mbeanInterface,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper boolean isMXBean,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper NotificationEmitter emitter) {
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper super(implementation, mbeanInterface, isMXBean);
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper if (emitter == null)
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper throw new IllegalArgumentException("Null emitter");
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper this.emitter = emitter;
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper MBeanNotificationInfo[] infos = emitter.getNotificationInfo();
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper if (infos == null || infos.length == 0) {
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper this.notificationInfo = NO_NOTIFICATION_INFO;
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper } else {
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper this.notificationInfo = infos.clone();
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper }
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper }
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper /**
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>Make an MBean whose management interface is specified by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code mbeanInterface}, and
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * where notifications are handled by the given {@code NotificationEmitter}.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * The resultant MBean implements the {@code NotificationEmitter} interface
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * by forwarding its methods to {@code emitter}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>If {@code emitter} is an instance of {@code
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * NotificationBroadcasterSupport} then the MBean's {@link #sendNotification
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * sendNotification} method will call {@code emitter.}{@link
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * NotificationBroadcasterSupport#sendNotification sendNotification}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>The array returned by {@link #getNotificationInfo()} on the
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * new MBean is a copy of the array returned by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code emitter.}{@link NotificationBroadcaster#getNotificationInfo
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * getNotificationInfo()} at the time of construction. If the array
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * returned by {@code emitter.getNotificationInfo()} later changes,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * that will have no effect on this object's
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code getNotificationInfo()}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>This constructor must be called from a subclass that implements
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * the given {@code mbeanInterface}.</p>
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param mbeanInterface a StandardMBean interface.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @param emitter the object that will handle notifications.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper *
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * @throws IllegalArgumentException if the {@code mbeanInterface}
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * does not follow JMX design patterns for Management Interfaces, or
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * if {@code this} does not implement the specified interface, or
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * if {@code emitter} is null.
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper */
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper protected StandardEmitterMBean(Class<?> mbeanInterface,
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper NotificationEmitter emitter) {
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper this(mbeanInterface, false, emitter);
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper }
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper /**
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * <p>Make an MBean whose management interface is specified by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * {@code mbeanInterface}, and where notifications are handled by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * the given {@code NotificationEmitter}. This constructor can be
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * used to make either Standard MBeans or MXBeans. The resultant
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * MBean implements the {@code NotificationEmitter} interface by
de47fb992b4c3414ac5b445d5cab364b0b8b8b43Mark de Reeper * forwarding its methods to {@code emitter}.</p>
*
* <p>If {@code emitter} is an instance of {@code
* NotificationBroadcasterSupport} then the MBean's {@link #sendNotification
* sendNotification} method will call {@code emitter.}{@link
* NotificationBroadcasterSupport#sendNotification sendNotification}.</p>
*
* <p>The array returned by {@link #getNotificationInfo()} on the
* new MBean is a copy of the array returned by
* {@code emitter.}{@link NotificationBroadcaster#getNotificationInfo
* getNotificationInfo()} at the time of construction. If the array
* returned by {@code emitter.getNotificationInfo()} later changes,
* that will have no effect on this object's
* {@code getNotificationInfo()}.</p>
*
* <p>This constructor must be called from a subclass that implements
* the given {@code mbeanInterface}.</p>
*
* @param mbeanInterface a StandardMBean interface.
* @param isMXBean If true, the {@code mbeanInterface} parameter
* names an MXBean interface and the resultant MBean is an MXBean.
* @param emitter the object that will handle notifications.
*
* @throws IllegalArgumentException if the {@code mbeanInterface}
* does not follow JMX design patterns for Management Interfaces, or
* if {@code this} does not implement the specified interface, or
* if {@code emitter} is null.
*/
protected StandardEmitterMBean(Class<?> mbeanInterface, boolean isMXBean,
NotificationEmitter emitter) {
super(mbeanInterface, isMXBean);
if (emitter == null)
throw new IllegalArgumentException("Null emitter");
this.emitter = emitter;
MBeanNotificationInfo[] infos = emitter.getNotificationInfo();
if (infos == null || infos.length == 0) {
this.notificationInfo = NO_NOTIFICATION_INFO;
} else {
this.notificationInfo = infos.clone();
}
}
public void removeNotificationListener(NotificationListener listener)
throws ListenerNotFoundException {
emitter.removeNotificationListener(listener);
}
public void removeNotificationListener(NotificationListener listener,
NotificationFilter filter,
Object handback)
throws ListenerNotFoundException {
emitter.removeNotificationListener(listener, filter, handback);
}
public void addNotificationListener(NotificationListener listener,
NotificationFilter filter,
Object handback) {
emitter.addNotificationListener(listener, filter, handback);
}
public MBeanNotificationInfo[] getNotificationInfo() {
// this getter might get called from the super constructor
// when the notificationInfo has not been properly set yet
if (notificationInfo == null) {
return NO_NOTIFICATION_INFO;
}
if (notificationInfo.length == 0) {
return notificationInfo;
} else {
return notificationInfo.clone();
}
}
/**
* <p>Sends a notification.</p>
*
* <p>If the {@code emitter} parameter to the constructor was an
* instance of {@code NotificationBroadcasterSupport} then this
* method will call {@code emitter.}{@link
* NotificationBroadcasterSupport#sendNotification
* sendNotification}.</p>
*
* @param n the notification to send.
*
* @throws ClassCastException if the {@code emitter} parameter to the
* constructor was not a {@code NotificationBroadcasterSupport}.
*/
public void sendNotification(Notification n) {
if (emitter instanceof NotificationBroadcasterSupport)
((NotificationBroadcasterSupport) emitter).sendNotification(n);
else {
final String msg =
"Cannot sendNotification when emitter is not an " +
"instance of NotificationBroadcasterSupport: " +
emitter.getClass().getName();
throw new ClassCastException(msg);
}
}
/**
* <p>Get the MBeanNotificationInfo[] that will be used in the
* MBeanInfo returned by this MBean.</p>
*
* <p>The default implementation of this method returns
* {@link #getNotificationInfo()}.</p>
*
* @param info The default MBeanInfo derived by reflection.
* @return the MBeanNotificationInfo[] for the new MBeanInfo.
*/
@Override
MBeanNotificationInfo[] getNotifications(MBeanInfo info) {
return getNotificationInfo();
}
}