1 /*
   2  * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test ServerNotifs.java
  26  * @bug 7654321
  27  * @summary Tests the reception of the notifications for opened and closed
  28  * connections
  29  * @author sjiang
  30  * @run clean ServerNotifs
  31  * @run build ServerNotifs
  32  * @run main ServerNotifs
  33  */
  34 
  35 // JAVA
  36 import java.io.*;
  37 import java.net.*;
  38 import java.util.*;
  39 
  40 // JMX
  41 import javax.management.*;
  42 
  43 // RJMX
  44 import javax.management.remote.*;
  45 
  46 public class ServerNotifs {
  47 
  48     private static void echo(String msg) {
  49         System.out.println(msg);
  50     }
  51 
  52     public static void main(String[] args) {
  53 
  54         try {
  55             // Create MBeanServer
  56             //
  57             echo("---Create the MBeanServer...");
  58             MBeanServer mbs = MBeanServerFactory.createMBeanServer();
  59 
  60             // Create RMIConnectorServer
  61             //
  62             echo("---Instantiate the RMIConnectorServer...");
  63             JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://");
  64             JMXConnectorServer cs =
  65                 JMXConnectorServerFactory.newJMXConnectorServer(url,
  66                                                                 null,
  67                                                                 mbs);
  68 
  69             echo("---Register the RMIConnectorServer in the MBeanServer...");
  70             ObjectName on =
  71                 new ObjectName("JMXConnectors:name=RMIConnectorServer");
  72             mbs.registerMBean(cs, on);
  73 
  74             echo("---Start the RMIConnectorServer...");
  75             cs.start();
  76             url = cs.getAddress();
  77             echo("---RMIConnectorServer address: " + url);
  78 
  79             echo("---Add a local listener to the RMIConnectorServer...");
  80             mbs.addNotificationListener(on, new MyListener(), null, null);
  81 
  82             // Create RMI connector
  83             //
  84             echo("---Instantiate the RMIConnector...");
  85             JMXConnector c = JMXConnectorFactory.newJMXConnector(url, null);
  86 
  87             // Expect to get a "jmx.remote.connection.opened" notification
  88             //
  89             echo("---Open connection...");
  90             c.connect(null);
  91             Thread.sleep(100);
  92 
  93             // Expect to get a "jmx.remote.connection.closed" notification
  94             //
  95             echo("---Close connection...");
  96             c.close();
  97             Thread.sleep(100);
  98 
  99             // Waiting for all notifications
 100             //
 101             synchronized(waiting) {
 102                 if (!succeeded) {
 103                     final long waitingTime = 10000;
 104                     long remainingTime = waitingTime;
 105                     final long startTime = System.currentTimeMillis();
 106                     while (!succeeded && remainingTime > 0) {
 107                         waiting.wait(remainingTime);
 108                         remainingTime = waitingTime -
 109                             (System.currentTimeMillis() - startTime);
 110                     }
 111                 }
 112             }
 113 
 114             // Stop the RMIConnectorServer
 115             //
 116             echo("---Stop the RMIConnectorServer...");
 117             cs.stop();
 118 
 119             if (!succeeded) {
 120                 System.out.println("Timeout, did not get all notifications!");
 121                 System.exit(1);
 122             }
 123         } catch (MBeanException mbe) {
 124             echo("---Test failed.");
 125             echo("---Got exception: " + mbe);
 126             mbe.getTargetException().printStackTrace();
 127             System.exit(1);
 128         } catch (RuntimeOperationsException roe) {
 129             echo("---Test failed.");
 130             echo("---Got exception: " + roe);
 131             roe.getTargetException().printStackTrace();
 132             System.exit(1);
 133         } catch (Throwable t) {
 134             echo("---Test failed.");
 135             echo("---Got throwable: " + t);
 136             t.printStackTrace();
 137             System.exit(1);
 138         }
 139     }
 140 
 141     private static class MyListener implements NotificationListener {
 142         public void handleNotification(Notification n, Object o) {
 143             if (index == types.length) {
 144                 return;
 145             }
 146             echo("---Got a notification: " + n.getType());
 147             echo(n.getMessage());
 148             if (n instanceof JMXConnectionNotification) {
 149                 if (!n.getType().equals(types[index++])) {
 150                     System.out.println("Waiting to get a notification with " +
 151                                        "type: " + types[index-1] + ", but " +
 152                                        "got one with type: " + n.getType());
 153                     System.exit(1);
 154                 }
 155                 if (index == types.length) {
 156                     synchronized(waiting) {
 157                         succeeded = true;
 158                         waiting.notify();
 159                     }
 160                 }
 161             }
 162         }
 163     }
 164 
 165     private static final String[] types =
 166         new String[] {JMXConnectionNotification.OPENED,
 167                       JMXConnectionNotification.CLOSED};
 168     private static int index = 0;
 169     private static int[] waiting = new int[0];
 170     private static boolean succeeded = false;
 171 }