jdk/test/javax/management/MBeanInfo/NotificationInfoTest.java
author stefank
Fri, 17 Apr 2015 17:10:38 +0000
changeset 30266 ef82cd1f2db3
parent 27034 ac2dd06dba4a
child 30376 2ccf2cf7ea48
permissions -rw-r--r--
Merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1247
diff changeset
     2
 * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
90ce3da70b43 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1247
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1247
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1247
diff changeset
    21
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    22
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    23
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
 * @test
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
 * @bug 5012634
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
 * @summary Test that JMX classes use fully-qualified class names
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
 * in MBeanNotificationInfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
 * @author Eamonn McManus
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
 * @run clean NotificationInfoTest
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
 * @run build NotificationInfoTest
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
 * @run main NotificationInfoTest
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
import java.io.*;
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    36
import java.lang.management.*;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
import java.lang.reflect.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
import java.net.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
import java.util.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
import java.util.jar.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
import javax.management.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
import javax.management.relation.*;
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    43
import javax.management.remote.*;
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    44
import javax.management.remote.rmi.*;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
 * This test finds all classes in the same code-base as the JMX
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
 * classes that look like Standard MBeans, and checks that if they are
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
 * NotificationBroadcasters they declare existent notification types.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
 * A class looks like a Standard MBean if both Thing and ThingMBean
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
 * classes exist.  So for example javax.management.timer.Timer looks
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
 * like a Standard MBean because javax.management.timer.TimerMBean
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
 * exists.  Timer is instanceof NotificationBroadcaster, so we expect
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
 * that ((NotificationBroadcaster) timer).getNotificationInfo() will
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
 * return an array of MBeanNotificationInfo where each entry has a
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
 * getName() that names an existent Java class that is a Notification.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
 * An MBean is "suspicious" if it is a NotificationBroadcaster but its
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
 * MBeanNotificationInfo[] is empty.  This is legal, but surprising.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
 * In order to call getNotificationInfo(), we need an instance of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
 * class.  We attempt to make one by calling a public no-arg
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
 * constructor.  But the "construct" method below can be extended to
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
 * construct specific MBean classes for which the no-arg constructor
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
 * doesn't exist.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
 * The test is obviously not exhaustive, but does catch the cases that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
 * failed in 5012634.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
public class NotificationInfoTest {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
    // class or object names where the test failed
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    72
    private static final Set<String> failed = new TreeSet<String>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
    // class or object names where there were no MBeanNotificationInfo entries
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    75
    private static final Set<String> suspicious = new TreeSet<String>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
    public static void main(String[] args) throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
        System.out.println("Checking that all known MBeans that are " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
                           "NotificationBroadcasters have sane " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
                           "MBeanInfo.getNotifications()");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
        System.out.println("Checking platform MBeans...");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
        checkPlatformMBeans();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
27034
ac2dd06dba4a 8060166: javax/management/MBeanInfo/NotificationInfoTest.java fails with modular image
alanb
parents: 5506
diff changeset
    85
        URL codeBase = ClassLoader.getSystemResource("javax/management/MBeanServer.class");
ac2dd06dba4a 8060166: javax/management/MBeanInfo/NotificationInfoTest.java fails with modular image
alanb
parents: 5506
diff changeset
    86
        if (codeBase == null) {
ac2dd06dba4a 8060166: javax/management/MBeanInfo/NotificationInfoTest.java fails with modular image
alanb
parents: 5506
diff changeset
    87
            throw new Exception("Could not determine codeBase for " + MBeanServer.class);
ac2dd06dba4a 8060166: javax/management/MBeanInfo/NotificationInfoTest.java fails with modular image
alanb
parents: 5506
diff changeset
    88
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
        System.out.println();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
        System.out.println("Looking for standard MBeans...");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
        String[] classes = findStandardMBeans(codeBase);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
        System.out.println("Testing standard MBeans...");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
        for (int i = 0; i < classes.length; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
            String name = classes[i];
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    97
            Class<?> c;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
                c = Class.forName(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
            } catch (Throwable e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
                System.out.println(name + ": cannot load (not public?): " + e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
            if (!NotificationBroadcaster.class.isAssignableFrom(c)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
                System.out.println(name + ": not a NotificationBroadcaster");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
            }
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   108
            if (Modifier.isAbstract(c.getModifiers())) {
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   109
                System.out.println(name + ": abstract class");
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   110
                continue;
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   111
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
            NotificationBroadcaster mbean;
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   114
            Constructor<?> constr;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
            try {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   116
                constr = c.getConstructor();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
            } catch (Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
                System.out.println(name + ": no public no-arg constructor: "
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
                                   + e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
            try {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   123
                mbean = (NotificationBroadcaster) constr.newInstance();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
            } catch (Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
                System.out.println(name + ": no-arg constructor failed: " + e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
            check(mbean);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
        System.out.println();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
        System.out.println("Testing some explicit cases...");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
        check(new RelationService(false));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
          We can't do this:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
            check(new RequiredModelMBean());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
          because the Model MBean spec more or less forces us to use the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
          names GENERIC and ATTRIBUTE_CHANGE for its standard notifs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
        */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
        checkRMIConnectorServer();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
        System.out.println();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
        if (!suspicious.isEmpty())
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
            System.out.println("SUSPICIOUS CLASSES: " + suspicious);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
        if (failed.isEmpty())
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
            System.out.println("TEST PASSED");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
            System.out.println("TEST FAILED: " + failed);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
            System.exit(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
    private static void check(NotificationBroadcaster mbean)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
            throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
        System.out.print(mbean.getClass().getName() + ": ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
        check(mbean.getClass().getName(), mbean.getNotificationInfo());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
    private static void checkPlatformMBeans() throws Exception {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   164
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   165
        Set<ObjectName> mbeanNames = mbs.queryNames(null, null);
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   166
        for (ObjectName name : mbeanNames) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
            if (!mbs.isInstanceOf(name,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
                                  NotificationBroadcaster.class.getName())) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
                System.out.println(name + ": not a NotificationBroadcaster");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
                MBeanInfo mbi = mbs.getMBeanInfo(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
                check(name.toString(), mbi.getNotifications());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
    private static void checkRMIConnectorServer() throws Exception {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   178
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://");
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   179
        RMIConnectorServer connector = new RMIConnectorServer(url, null);
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   180
        check(connector);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
    private static void check(String what, MBeanNotificationInfo[] mbnis) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
        System.out.print(what + ": checking notification info: ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
        if (mbnis.length == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
            System.out.println("NONE (suspicious)");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
            suspicious.add(what);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
        // Each MBeanNotificationInfo.getName() should be an existent
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
        // Java class that is Notification or a subclass of it
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
        for (int j = 0; j < mbnis.length; j++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
            String notifClassName = mbnis[j].getName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
                Class notifClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
                try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
                    notifClass = Class.forName(notifClassName);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
                } catch (Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
                    System.out.print("FAILED(" + notifClassName + ": " + e +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
                                     ") ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
                    failed.add(what);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
                if (!Notification.class.isAssignableFrom(notifClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
                    System.out.print("FAILED(" + notifClassName +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
                                     ": not a Notification) ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
                    failed.add(what);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
                System.out.print("OK(" + notifClassName + ") ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
        System.out.println();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
    private static String[] findStandardMBeans(URL codeBase)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
            throws Exception {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   218
        Set<String> names;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
        if (codeBase.getProtocol().equalsIgnoreCase("file")
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
            && codeBase.toString().endsWith("/"))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
            names = findStandardMBeansFromDir(codeBase);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
        else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
            names = findStandardMBeansFromJar(codeBase);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   225
        Set<String> standardMBeanNames = new TreeSet<String>();
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   226
        for (String name : names) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
            if (name.endsWith("MBean")) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
                String prefix = name.substring(0, name.length() - 5);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
                if (names.contains(prefix))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
                    standardMBeanNames.add(prefix);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
        }
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   233
        return standardMBeanNames.toArray(new String[0]);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   236
    private static Set<String> findStandardMBeansFromJar(URL codeBase)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
            throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
        InputStream is = codeBase.openStream();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
        JarInputStream jis = new JarInputStream(is);
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   240
        Set<String> names = new TreeSet<String>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
        JarEntry entry;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
        while ((entry = jis.getNextJarEntry()) != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
            String name = entry.getName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
            if (!name.endsWith(".class"))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
            name = name.substring(0, name.length() - 6);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
            name = name.replace('/', '.');
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
            names.add(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
        return names;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   253
    private static Set<String> findStandardMBeansFromDir(URL codeBase)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
            throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
        File dir = new File(new URI(codeBase.toString()));
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   256
        Set<String> names = new TreeSet<String>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
        scanDir(dir, "", names);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
        return names;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   261
    private static void scanDir(File dir, String prefix, Set<String> names)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
            throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
        File[] files = dir.listFiles();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
        if (files == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
        for (int i = 0; i < files.length; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
            File f = files[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
            String name = f.getName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
            String p = (prefix.equals("")) ? name : prefix + "." + name;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
            if (f.isDirectory())
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
                scanDir(f, p, names);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
            else if (name.endsWith(".class")) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
                p = p.substring(0, p.length() - 6);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
                names.add(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
}