--- a/jdk/src/share/classes/javax/management/MBeanServerNotification.java Thu Jul 31 12:41:35 2008 +0200
+++ b/jdk/src/share/classes/javax/management/MBeanServerNotification.java Thu Jul 31 14:20:11 2008 +0200
@@ -38,56 +38,64 @@
*
* @since 1.5
*/
- public class MBeanServerNotification extends Notification {
-
-
- /* Serial version */
- private static final long serialVersionUID = 2876477500475969677L;
-
- /**
- * Notification type denoting that an MBean has been registered. Value is "JMX.mbean.registered".
- */
- public static final String REGISTRATION_NOTIFICATION = "JMX.mbean.registered" ;
-
- /**
- * Notification type denoting that an MBean has been unregistered. Value is "JMX.mbean.unregistered".
- */
- public static final String UNREGISTRATION_NOTIFICATION = "JMX.mbean.unregistered" ;
-
-
- /**
- * @serial The object names of the MBeans concerned by this notification
- */
- private final ObjectName objectName;
+public class MBeanServerNotification extends Notification {
- /**
- * Creates an MBeanServerNotification object specifying object names of
- * the MBeans that caused the notification and the specified notification type.
- *
- * @param type A string denoting the type of the
- * notification. Set it to one these values: {@link
- * #REGISTRATION_NOTIFICATION}, {@link
- * #UNREGISTRATION_NOTIFICATION}.
- * @param source The MBeanServerNotification object responsible
- * for forwarding MBean server notification.
- * @param sequenceNumber A sequence number that can be used to order
- * received notifications.
- * @param objectName The object name of the MBean that caused the notification.
- *
- */
- public MBeanServerNotification(String type, Object source, long sequenceNumber, ObjectName objectName ) {
- super (type,source,sequenceNumber) ;
- this.objectName = objectName ;
- }
+ /* Serial version */
+ private static final long serialVersionUID = 2876477500475969677L;
+ /**
+ * Notification type denoting that an MBean has been registered.
+ * Value is "JMX.mbean.registered".
+ */
+ public static final String REGISTRATION_NOTIFICATION =
+ "JMX.mbean.registered";
+ /**
+ * Notification type denoting that an MBean has been unregistered.
+ * Value is "JMX.mbean.unregistered".
+ */
+ public static final String UNREGISTRATION_NOTIFICATION =
+ "JMX.mbean.unregistered";
+ /**
+ * @serial The object names of the MBeans concerned by this notification
+ */
+ private final ObjectName objectName;
- /**
- * Returns the object name of the MBean that caused the notification.
- *
- * @return the object name of the MBean that caused the notification.
- */
- public ObjectName getMBeanName() {
- return objectName ;
- }
+ /**
+ * Creates an MBeanServerNotification object specifying object names of
+ * the MBeans that caused the notification and the specified notification
+ * type.
+ *
+ * @param type A string denoting the type of the
+ * notification. Set it to one these values: {@link
+ * #REGISTRATION_NOTIFICATION}, {@link
+ * #UNREGISTRATION_NOTIFICATION}.
+ * @param source The MBeanServerNotification object responsible
+ * for forwarding MBean server notification.
+ * @param sequenceNumber A sequence number that can be used to order
+ * received notifications.
+ * @param objectName The object name of the MBean that caused the
+ * notification.
+ *
+ */
+ public MBeanServerNotification(String type, Object source,
+ long sequenceNumber, ObjectName objectName) {
+ super(type, source, sequenceNumber);
+ this.objectName = objectName;
+ }
+
+ /**
+ * Returns the object name of the MBean that caused the notification.
+ *
+ * @return the object name of the MBean that caused the notification.
+ */
+ public ObjectName getMBeanName() {
+ return objectName;
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + "[mbeanName=" + objectName + "]";
+
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/MBeanServer/MBeanServerNotificationTest.java Thu Jul 31 14:20:11 2008 +0200
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6689505
+ * @summary Checks that MBeanServerNotification.toString contains the
+ * MBean name.
+ * @author Daniel Fuchs
+ * @compile MBeanServerNotificationTest.java
+ * @run main MBeanServerNotificationTest
+ */
+
+import com.sun.jmx.mbeanserver.Util;
+import javax.management.*;
+import java.util.concurrent.*;
+
+public class MBeanServerNotificationTest {
+ final static String[] names = {
+ ":type=Wombat", "wombat:type=Wombat",null,
+ };
+ public static void main(String[] args) throws Exception {
+ System.out.println("Test that MBeanServerNotification.toString " +
+ "contains the name of the MBean being registered " +
+ "or unregistered.");
+ int failures = 0;
+ final MBeanServer mbs = MBeanServerFactory.createMBeanServer();
+ for (String str:names) {
+ try {
+ final ObjectName name = (str==null)?null:new ObjectName(str);
+ failures+=test(mbs, name, name!=null);
+ } catch(Exception x) {
+ x.printStackTrace(System.out);
+ System.out.println("Test failed for: "+str);
+ failures++;
+ }
+ }
+ if (failures == 0)
+ System.out.println("Test passed");
+ else {
+ System.out.println("TEST FAILED: " + failures + " failure(s)");
+ System.exit(1);
+ }
+ }
+
+ private static enum Registration {
+ REGISTER(MBeanServerNotification.REGISTRATION_NOTIFICATION),
+ UNREGISTER(MBeanServerNotification.UNREGISTRATION_NOTIFICATION);
+ final String type;
+ private Registration(String type) {this.type = type;}
+ public int test(MBeanServerNotification n, ObjectName name) {
+ int failures = 0;
+ System.out.println("Testing: "+n);
+ if (!n.toString().endsWith("[type="+type+
+ "][message="+n.getMessage()+
+ "][mbeanName="+name+"]")) {
+ System.err.println("Test failed for "+ type+
+ " ["+name+"]: "+n);
+ failures++;
+ }
+ return failures;
+ }
+ public MBeanServerNotification create(ObjectName name) {
+ return new MBeanServerNotification(type,
+ MBeanServerDelegate.DELEGATE_NAME, next(), name);
+ }
+ private static long next = 0;
+ private static synchronized long next() {return next++;}
+
+ }
+
+ private static int test(MBeanServer mbs, ObjectName name,
+ boolean register)
+ throws Exception {
+ System.out.println("--------" + name + "--------");
+
+ int failures = 0;
+ for (Registration reg : Registration.values()) {
+ failures = reg.test(reg.create(name), name);
+ }
+ if (!register) return failures;
+
+ final ArrayBlockingQueue<Notification> queue =
+ new ArrayBlockingQueue<Notification>(10);
+ final NotificationListener listener = new NotificationListener() {
+ public void handleNotification(Notification notification,
+ Object handback) {
+ try {
+ queue.put(notification);
+ } catch(Exception x) {
+ x.printStackTrace(System.out);
+ }
+ }
+ };
+ mbs.addNotificationListener(MBeanServerDelegate.DELEGATE_NAME,
+ listener, null, name);
+ final ObjectInstance oi = mbs.registerMBean(new Wombat(), name);
+ try {
+ failures+=Registration.REGISTER.test((MBeanServerNotification)
+ queue.poll(2, TimeUnit.SECONDS), oi.getObjectName());
+ } finally {
+ mbs.unregisterMBean(oi.getObjectName());
+ failures+=Registration.UNREGISTER.test((MBeanServerNotification)
+ queue.poll(2, TimeUnit.SECONDS), oi.getObjectName());
+ }
+ return failures;
+ }
+
+ public static interface WombatMBean {}
+ public static class Wombat implements WombatMBean {}
+
+}