changeset 468:7622f1de1486

6689505: Improve MBeanServerNotification.toString Reviewed-by: emcmanus
author dfuchs
date Thu, 31 Jul 2008 14:20:11 +0200
parents 914370f03119
children 8f52c4d1d934
files src/share/classes/javax/management/MBeanServerNotification.java test/javax/management/MBeanServer/MBeanServerNotificationTest.java
diffstat 2 files changed, 185 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/javax/management/MBeanServerNotification.java	Thu Jul 31 12:41:35 2008 +0200
+++ b/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   {
+public class MBeanServerNotification extends Notification {
 
 
-     /* Serial version */
-     private static final long serialVersionUID = 2876477500475969677L;
+    /* 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;
 
-     /**
-      * Notification type denoting that an MBean has been registered. Value is "JMX.mbean.registered".
-      */
-     public static final String REGISTRATION_NOTIFICATION = "JMX.mbean.registered" ;
+    /**
+     * 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;
+    }
 
-     /**
-      * Notification type denoting that an MBean has been unregistered. Value is "JMX.mbean.unregistered".
-      */
-     public static final String UNREGISTRATION_NOTIFICATION = "JMX.mbean.unregistered" ;
+    /**
+     * 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 + "]";
 
-     /**
-      * @serial The object names of the MBeans concerned by this notification
-      */
-     private final ObjectName 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 ;
-     }
+    }
 
  }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/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 {}
+
+}