changeset 278:1483094a7c17

6703552: Missing files from changeset for 6701459 Summary: Previous push missed a small number of files. Reviewed-by: dfuchs
author emcmanus
date Fri, 16 May 2008 11:34:34 +0200
parents 94ded5c8cfba
children a36a7f0f11ec d3dfeb4295b3
files src/share/classes/javax/management/openmbean/OpenMBeanOperationInfoSupport.java src/share/classes/javax/management/relation/RelationService.java src/share/classes/javax/management/timer/Timer.java test/javax/management/relation/RelationNotificationSeqNoTest.java
diffstat 4 files changed, 115 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/javax/management/openmbean/OpenMBeanOperationInfoSupport.java	Wed May 14 18:38:14 2008 +0200
+++ b/src/share/classes/javax/management/openmbean/OpenMBeanOperationInfoSupport.java	Fri May 16 11:34:34 2008 +0200
@@ -352,7 +352,7 @@
             value += Arrays.asList(this.getSignature()).hashCode();
             value += this.getReturnOpenType().hashCode();
             value += this.getImpact();
-            myHashCode = new Integer(value);
+            myHashCode = Integer.valueOf(value);
         }
 
         // return always the same hash code for this instance (immutable)
--- a/src/share/classes/javax/management/relation/RelationService.java	Wed May 14 18:38:14 2008 +0200
+++ b/src/share/classes/javax/management/relation/RelationService.java	Fri May 16 11:34:34 2008 +0200
@@ -3221,7 +3221,7 @@
             if (!isReadable) {
                 RELATION_LOGGER.exiting(RelationService.class.getName(),
                         "checkRoleInt");
-                return new Integer(RoleStatus.ROLE_NOT_READABLE);
+                return Integer.valueOf(RoleStatus.ROLE_NOT_READABLE);
             } else {
                 // End of check :)
                 RELATION_LOGGER.exiting(RelationService.class.getName(),
--- a/src/share/classes/javax/management/timer/Timer.java	Wed May 14 18:38:14 2008 +0200
+++ b/src/share/classes/javax/management/timer/Timer.java	Fri May 16 11:34:34 2008 +0200
@@ -455,7 +455,7 @@
 
         // Create and add the timer notification into the timer table.
         //
-        Integer notifID = new Integer(++counterID);
+        Integer notifID = Integer.valueOf(++counterID);
 
         // The sequenceNumber and the timeStamp attributes are updated
         // when the notification is emitted by the timer.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/management/relation/RelationNotificationSeqNoTest.java	Fri May 16 11:34:34 2008 +0200
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2005 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 6701459
+ * @summary Test sequence numbers in RelationService notifications.
+ * @author Eamonn McManus
+ */
+
+/*
+ * Bug 6701459 is for a synchronization problem that is very unlikely to occur
+ * in practice and it would be very hard to test it.  Instead we just check that
+ * the fix has not introduced any obviously-wrong behavior in the sequence
+ * numbers.
+ */
+
+import java.util.Arrays;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import javax.management.JMX;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
+import javax.management.relation.RelationServiceMBean;
+import javax.management.relation.Role;
+import javax.management.relation.RoleInfo;
+import javax.management.relation.RoleList;
+
+public class RelationNotificationSeqNoTest {
+    public static void main(String[] args) throws Exception {
+        MBeanServer mbs = MBeanServerFactory.newMBeanServer();
+        ObjectName relSvcName = new ObjectName("a:type=relationService");
+        RelationServiceMBean relSvc =
+                JMX.newMBeanProxy(mbs, relSvcName, RelationServiceMBean.class);
+        mbs.createMBean("javax.management.relation.RelationService",
+                        relSvcName,
+                        new Object[] {Boolean.TRUE},
+                        new String[] {"boolean"});
+
+        final BlockingQueue<Notification> q =
+                new ArrayBlockingQueue<Notification>(100);
+        NotificationListener qListener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                                           Object handback) {
+                q.add(notification);
+            }
+        };
+        mbs.addNotificationListener(relSvcName, qListener, null, null);
+
+        RoleInfo leftInfo =
+            new RoleInfo("left", "javax.management.timer.TimerMBean");
+        RoleInfo rightInfo =
+            new RoleInfo("right", "javax.management.timer.Timer");
+        relSvc.createRelationType("typeName", new RoleInfo[] {leftInfo, rightInfo});
+        ObjectName timer1 = new ObjectName("a:type=timer,number=1");
+        ObjectName timer2 = new ObjectName("a:type=timer,number=2");
+        mbs.createMBean("javax.management.timer.Timer", timer1);
+        mbs.createMBean("javax.management.timer.Timer", timer2);
+
+        Role leftRole =
+            new Role("left", Arrays.asList(new ObjectName[] {timer1}));
+        Role rightRole =
+            new Role("right", Arrays.asList(new ObjectName[] {timer2}));
+        RoleList roles =
+            new RoleList(Arrays.asList(new Role[] {leftRole, rightRole}));
+
+        final int NREPEAT = 10;
+
+        for (int i = 0; i < NREPEAT; i++) {
+            relSvc.createRelation("relationName", "typeName", roles);
+            relSvc.removeRelation("relationName");
+        }
+
+        Notification firstNotif = q.remove();
+        long seqNo = firstNotif.getSequenceNumber();
+        for (int i = 0; i < NREPEAT * 2 - 1; i++) {
+            Notification n = q.remove();
+            long nSeqNo = n.getSequenceNumber();
+            if (nSeqNo != seqNo + 1) {
+                throw new Exception(
+                        "TEST FAILED: expected seqNo " + (seqNo + 1) + "; got " +
+                        nSeqNo);
+            }
+            seqNo++;
+        }
+        System.out.println("TEST PASSED: got " + (NREPEAT * 2) + " notifications " +
+                "with contiguous sequence numbers");
+    }
+}