jdk/test/javax/management/MBeanInfo/NotificationInfoTest.java
author emcmanus
Wed, 03 Sep 2008 14:31:17 +0200
changeset 1155 a9a142fcf1b5
parent 2 90ce3da70b43
child 1247 b4c26443dee5
permissions -rw-r--r--
6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java Reviewed-by: dfuchs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
     2
 * Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
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
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
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.security.CodeSource;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
import java.util.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
import java.util.jar.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
import javax.management.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
import javax.management.relation.*;
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    44
import javax.management.remote.*;
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    45
import javax.management.remote.rmi.*;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
 * This test finds all classes in the same code-base as the JMX
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
 * classes that look like Standard MBeans, and checks that if they are
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
 * NotificationBroadcasters they declare existent notification types.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
 * A class looks like a Standard MBean if both Thing and ThingMBean
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
 * classes exist.  So for example javax.management.timer.Timer looks
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
 * like a Standard MBean because javax.management.timer.TimerMBean
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
 * exists.  Timer is instanceof NotificationBroadcaster, so we expect
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
 * that ((NotificationBroadcaster) timer).getNotificationInfo() will
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
 * return an array of MBeanNotificationInfo where each entry has a
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
 * getName() that names an existent Java class that is a Notification.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
 * An MBean is "suspicious" if it is a NotificationBroadcaster but its
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
 * MBeanNotificationInfo[] is empty.  This is legal, but surprising.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
 * In order to call getNotificationInfo(), we need an instance of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
 * class.  We attempt to make one by calling a public no-arg
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
 * constructor.  But the "construct" method below can be extended to
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
 * construct specific MBean classes for which the no-arg constructor
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
 * doesn't exist.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
 * The test is obviously not exhaustive, but does catch the cases that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
 * failed in 5012634.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
public class NotificationInfoTest {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
    // 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
    73
    private static final Set<String> failed = new TreeSet<String>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
    // 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
    76
    private static final Set<String> suspicious = new TreeSet<String>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
    public static void main(String[] args) throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
        System.out.println("Checking that all known MBeans that are " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
                           "NotificationBroadcasters have sane " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
                           "MBeanInfo.getNotifications()");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
        System.out.println("Checking platform MBeans...");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
        checkPlatformMBeans();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
        CodeSource cs =
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
            javax.management.MBeanServer.class.getProtectionDomain()
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
            .getCodeSource();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
        URL codeBase;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
        if (cs == null) {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    91
            String javaHome = System.getProperty("java.home");
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    92
            String[] candidates = {"/lib/rt.jar", "/classes/"};
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    93
            codeBase = null;
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    94
            for (String candidate : candidates) {
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    95
                File file = new File(javaHome + candidate);
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    96
                if (file.exists()) {
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    97
                    codeBase = file.toURI().toURL();
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    98
                    break;
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
    99
                }
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   100
            }
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   101
            if (codeBase == null) {
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   102
                throw new Exception(
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   103
                        "Could not determine codeBase for java.home=" + javaHome);
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   104
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
        } else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
            codeBase = cs.getLocation();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
        System.out.println();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
        System.out.println("Looking for standard MBeans...");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
        String[] classes = findStandardMBeans(codeBase);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
        System.out.println("Testing standard MBeans...");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
        for (int i = 0; i < classes.length; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
            String name = classes[i];
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   115
            Class<?> c;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
                c = Class.forName(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
            } catch (Throwable e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
                System.out.println(name + ": cannot load (not public?): " + 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
            if (!NotificationBroadcaster.class.isAssignableFrom(c)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
                System.out.println(name + ": not a NotificationBroadcaster");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
            }
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   126
            if (Modifier.isAbstract(c.getModifiers())) {
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   127
                System.out.println(name + ": abstract class");
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   128
                continue;
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   129
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
            NotificationBroadcaster mbean;
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   132
            Constructor<?> constr;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
            try {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   134
                constr = c.getConstructor();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
            } catch (Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
                System.out.println(name + ": no public no-arg constructor: "
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
                                   + e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
            try {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   141
                mbean = (NotificationBroadcaster) constr.newInstance();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
            } catch (Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
                System.out.println(name + ": no-arg constructor failed: " + e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
            check(mbean);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
        System.out.println();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
        System.out.println("Testing some explicit cases...");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
        check(new RelationService(false));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
          We can't do this:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
            check(new RequiredModelMBean());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
          because the Model MBean spec more or less forces us to use the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
          names GENERIC and ATTRIBUTE_CHANGE for its standard notifs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
        */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
        checkRMIConnectorServer();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
        System.out.println();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
        if (!suspicious.isEmpty())
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
            System.out.println("SUSPICIOUS CLASSES: " + suspicious);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
        if (failed.isEmpty())
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
            System.out.println("TEST PASSED");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
            System.out.println("TEST FAILED: " + failed);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
            System.exit(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
    private static void check(NotificationBroadcaster mbean)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
            throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
        System.out.print(mbean.getClass().getName() + ": ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
        check(mbean.getClass().getName(), mbean.getNotificationInfo());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
    private static void checkPlatformMBeans() throws Exception {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   182
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   183
        Set<ObjectName> mbeanNames = mbs.queryNames(null, null);
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   184
        for (ObjectName name : mbeanNames) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
            if (!mbs.isInstanceOf(name,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
                                  NotificationBroadcaster.class.getName())) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
                System.out.println(name + ": not a NotificationBroadcaster");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
                MBeanInfo mbi = mbs.getMBeanInfo(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
                check(name.toString(), mbi.getNotifications());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
    private static void checkRMIConnectorServer() throws Exception {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   196
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://");
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   197
        RMIConnectorServer connector = new RMIConnectorServer(url, null);
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   198
        check(connector);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
    private static void check(String what, MBeanNotificationInfo[] mbnis) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
        System.out.print(what + ": checking notification info: ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
        if (mbnis.length == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
            System.out.println("NONE (suspicious)");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
            suspicious.add(what);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
        // Each MBeanNotificationInfo.getName() should be an existent
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
        // Java class that is Notification or a subclass of it
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
        for (int j = 0; j < mbnis.length; j++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
            String notifClassName = mbnis[j].getName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
                Class notifClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
                try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
                    notifClass = Class.forName(notifClassName);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
                } catch (Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
                    System.out.print("FAILED(" + notifClassName + ": " + e +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
                                     ") ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
                    failed.add(what);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
                if (!Notification.class.isAssignableFrom(notifClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
                    System.out.print("FAILED(" + notifClassName +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
                                     ": not a Notification) ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
                    failed.add(what);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
                System.out.print("OK(" + notifClassName + ") ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
        System.out.println();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
    private static String[] findStandardMBeans(URL codeBase)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
            throws Exception {
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   236
        Set<String> names;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
        if (codeBase.getProtocol().equalsIgnoreCase("file")
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
            && codeBase.toString().endsWith("/"))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
            names = findStandardMBeansFromDir(codeBase);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
        else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
            names = findStandardMBeansFromJar(codeBase);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   243
        Set<String> standardMBeanNames = new TreeSet<String>();
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   244
        for (String name : names) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
            if (name.endsWith("MBean")) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
                String prefix = name.substring(0, name.length() - 5);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
                if (names.contains(prefix))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
                    standardMBeanNames.add(prefix);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
        }
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   251
        return standardMBeanNames.toArray(new String[0]);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   254
    private static Set<String> findStandardMBeansFromJar(URL codeBase)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
            throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
        InputStream is = codeBase.openStream();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
        JarInputStream jis = new JarInputStream(is);
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   258
        Set<String> names = new TreeSet<String>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
        JarEntry entry;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
        while ((entry = jis.getNextJarEntry()) != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
            String name = entry.getName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
            if (!name.endsWith(".class"))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
                continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
            name = name.substring(0, name.length() - 6);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
            name = name.replace('/', '.');
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
            names.add(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
        return names;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   271
    private static Set<String> findStandardMBeansFromDir(URL codeBase)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
            throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
        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
   274
        Set<String> names = new TreeSet<String>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
        scanDir(dir, "", names);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
        return names;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
1155
a9a142fcf1b5 6744132: Spurious failures from test/javax/management/MBeanInfo/NotificationInfoTest.java
emcmanus
parents: 2
diff changeset
   279
    private static void scanDir(File dir, String prefix, Set<String> names)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
            throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
        File[] files = dir.listFiles();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
        if (files == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
        for (int i = 0; i < files.length; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
            File f = files[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
            String name = f.getName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
            String p = (prefix.equals("")) ? name : prefix + "." + name;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
            if (f.isDirectory())
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
                scanDir(f, p, names);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
            else if (name.endsWith(".class")) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
                p = p.substring(0, p.length() - 6);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
                names.add(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
}