0N/A/*
2362N/A * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A/*
0N/A * @test ServerNotifs.java
0N/A * @bug 7654321
0N/A * @summary Tests the reception of the notifications for opened and closed
0N/A * connections
0N/A * @author sjiang
0N/A * @run clean ServerNotifs
0N/A * @run build ServerNotifs
0N/A * @run main ServerNotifs
0N/A */
0N/A
0N/A// JAVA
0N/Aimport java.io.*;
0N/Aimport java.net.*;
0N/Aimport java.util.*;
0N/A
0N/A// JMX
0N/Aimport javax.management.*;
0N/A
0N/A// RJMX
0N/Aimport javax.management.remote.*;
0N/A
0N/Apublic class ServerNotifs {
0N/A
0N/A private static void echo(String msg) {
0N/A System.out.println(msg);
0N/A }
0N/A
0N/A public static void main(String[] args) {
0N/A
0N/A try {
0N/A // Create MBeanServer
0N/A //
0N/A echo("---Create the MBeanServer...");
0N/A MBeanServer mbs = MBeanServerFactory.createMBeanServer();
0N/A
0N/A // Create RMIConnectorServer
0N/A //
0N/A echo("---Instantiate the RMIConnectorServer...");
0N/A JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://");
0N/A JMXConnectorServer cs =
0N/A JMXConnectorServerFactory.newJMXConnectorServer(url,
0N/A null,
0N/A mbs);
0N/A
0N/A echo("---Register the RMIConnectorServer in the MBeanServer...");
0N/A ObjectName on =
0N/A new ObjectName("JMXConnectors:name=RMIConnectorServer");
0N/A mbs.registerMBean(cs, on);
0N/A
0N/A echo("---Start the RMIConnectorServer...");
0N/A cs.start();
0N/A url = cs.getAddress();
0N/A echo("---RMIConnectorServer address: " + url);
0N/A
0N/A echo("---Add a local listener to the RMIConnectorServer...");
0N/A mbs.addNotificationListener(on, new MyListener(), null, null);
0N/A
0N/A // Create RMI connector
0N/A //
0N/A echo("---Instantiate the RMIConnector...");
0N/A JMXConnector c = JMXConnectorFactory.newJMXConnector(url, null);
0N/A
0N/A // Expect to get a "jmx.remote.connection.opened" notification
0N/A //
0N/A echo("---Open connection...");
0N/A c.connect(null);
0N/A Thread.sleep(100);
0N/A
0N/A // Expect to get a "jmx.remote.connection.closed" notification
0N/A //
0N/A echo("---Close connection...");
0N/A c.close();
0N/A Thread.sleep(100);
0N/A
0N/A // Waiting for all notifications
0N/A //
0N/A synchronized(waiting) {
0N/A if (!succeeded) {
0N/A final long waitingTime = 10000;
0N/A long remainingTime = waitingTime;
0N/A final long startTime = System.currentTimeMillis();
0N/A while (!succeeded && remainingTime > 0) {
0N/A waiting.wait(remainingTime);
0N/A remainingTime = waitingTime -
0N/A (System.currentTimeMillis() - startTime);
0N/A }
0N/A }
0N/A }
0N/A
0N/A // Stop the RMIConnectorServer
0N/A //
0N/A echo("---Stop the RMIConnectorServer...");
0N/A cs.stop();
0N/A
0N/A if (!succeeded) {
0N/A System.out.println("Timeout, did not get all notifications!");
0N/A System.exit(1);
0N/A }
0N/A } catch (MBeanException mbe) {
0N/A echo("---Test failed.");
0N/A echo("---Got exception: " + mbe);
0N/A mbe.getTargetException().printStackTrace();
0N/A System.exit(1);
0N/A } catch (RuntimeOperationsException roe) {
0N/A echo("---Test failed.");
0N/A echo("---Got exception: " + roe);
0N/A roe.getTargetException().printStackTrace();
0N/A System.exit(1);
0N/A } catch (Throwable t) {
0N/A echo("---Test failed.");
0N/A echo("---Got throwable: " + t);
0N/A t.printStackTrace();
0N/A System.exit(1);
0N/A }
0N/A }
0N/A
0N/A private static class MyListener implements NotificationListener {
0N/A public void handleNotification(Notification n, Object o) {
0N/A if (index == types.length) {
0N/A return;
0N/A }
0N/A echo("---Got a notification: " + n.getType());
0N/A echo(n.getMessage());
0N/A if (n instanceof JMXConnectionNotification) {
0N/A if (!n.getType().equals(types[index++])) {
0N/A System.out.println("Waiting to get a notification with " +
0N/A "type: " + types[index-1] + ", but " +
0N/A "got one with type: " + n.getType());
0N/A System.exit(1);
0N/A }
0N/A if (index == types.length) {
0N/A synchronized(waiting) {
0N/A succeeded = true;
0N/A waiting.notify();
0N/A }
0N/A }
0N/A }
0N/A }
0N/A }
0N/A
0N/A private static final String[] types =
0N/A new String[] {JMXConnectionNotification.OPENED,
0N/A JMXConnectionNotification.CLOSED};
0N/A private static int index = 0;
0N/A private static int[] waiting = new int[0];
0N/A private static boolean succeeded = false;
0N/A}