1 /*
   2  * Copyright (c) 2003, 2015, 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  * @modules java.management
  31  * @run clean ServerNotifs
  32  * @run build ServerNotifs
  33  * @run main ServerNotifs
  34  */
  35 
  36 // JAVA
  37 import java.io.*;
  38 import java.net.*;
  39 import java.util.*;
  40 
  41 // JMX
  42 import javax.management.*;
  43 
  44 // RJMX
  45 import javax.management.remote.*;
  46 
  47 public class ServerNotifs {
  48 
  49     private static void echo(String msg) {
  50         System.out.println(msg);
  51     }
  52 
  53     public static void main(String[] args) {
  54 
  55         try {
  56             // Create MBeanServer
  57             //
  58             echo("---Create the MBeanServer...");
  59             MBeanServer mbs = MBeanServerFactory.createMBeanServer();
  60 
  61             // Create RMIConnectorServer
  62             //
  63             echo("---Instantiate the RMIConnectorServer...");
  64             JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://");
  65             JMXConnectorServer cs =
  66                 JMXConnectorServerFactory.newJMXConnectorServer(url,
  67                                                                 null,
  68                                                                 mbs);
  69 
  70             echo("---Register the RMIConnectorServer in the MBeanServer...");
  71             ObjectName on =
  72                 new ObjectName("JMXConnectors:name=RMIConnectorServer");
  73             mbs.registerMBean(cs, on);
  74 
  75             echo("---Start the RMIConnectorServer...");
  76             cs.start();
  77             url = cs.getAddress();
  78             echo("---RMIConnectorServer address: " + url);
  79 
  80             echo("---Add a local listener to the RMIConnectorServer...");
  81             mbs.addNotificationListener(on, new MyListener(), null, null);
  82 
  83             // Create RMI connector
  84             //
  85             echo("---Instantiate the RMIConnector...");
  86             JMXConnector c = JMXConnectorFactory.newJMXConnector(url, null);
  87 
  88             // Expect to get a "jmx.remote.connection.opened" notification
  89             //
  90             echo("---Open connection...");
  91             c.connect(null);
  92             Thread.sleep(100);
  93 
  94             // Expect to get a "jmx.remote.connection.closed" notification
  95             //
  96             echo("---Close connection...");
  97             c.close();
  98             Thread.sleep(100);
  99 
 100             // Waiting for all notifications
 101             //
 102             synchronized(waiting) {
 103                 if (!succeeded) {
 104                     final long waitingTime = 10000;
 105                     long remainingTime = waitingTime;
 106                     final long startTime = System.currentTimeMillis();
 107                     while (!succeeded && remainingTime > 0) {
 108                         waiting.wait(remainingTime);
 109                         remainingTime = waitingTime -
 110                             (System.currentTimeMillis() - startTime);
 111                     }
 112                 }
 113             }
 114 
 115             // Stop the RMIConnectorServer
 116             //
 117             echo("---Stop the RMIConnectorServer...");
 118             cs.stop();
 119 
 120             if (!succeeded) {
 121                 System.out.println("Timeout, did not get all notifications!");
 122                 System.exit(1);
 123             }
 124         } catch (MBeanException mbe) {
 125             echo("---Test failed.");
 126             echo("---Got exception: " + mbe);
 127             mbe.getTargetException().printStackTrace();
 128             System.exit(1);
 129         } catch (RuntimeOperationsException roe) {
 130             echo("---Test failed.");
 131             echo("---Got exception: " + roe);
 132             roe.getTargetException().printStackTrace();
 133             System.exit(1);
 134         } catch (Throwable t) {
 135             echo("---Test failed.");
 136             echo("---Got throwable: " + t);
 137             t.printStackTrace();
 138             System.exit(1);
 139         }
 140     }
 141 
 142     private static class MyListener implements NotificationListener {
 143         public void handleNotification(Notification n, Object o) {
 144             if (index == types.length) {
 145                 return;
 146             }
 147             echo("---Got a notification: " + n.getType());
 148             echo(n.getMessage());
 149             if (n instanceof JMXConnectionNotification) {
 150                 if (!n.getType().equals(types[index++])) {
 151                     System.out.println("Waiting to get a notification with " +
 152                                        "type: " + types[index-1] + ", but " +
 153                                        "got one with type: " + n.getType());
 154                     System.exit(1);
 155                 }
 156                 if (index == types.length) {
 157                     synchronized(waiting) {
 158                         succeeded = true;
 159                         waiting.notify();
 160                     }
 161                 }
 162             }
 163         }
 164     }
 165 
 166     private static final String[] types =
 167         new String[] {JMXConnectionNotification.OPENED,
 168                       JMXConnectionNotification.CLOSED};
 169     private static int index = 0;
 170     private static int[] waiting = new int[0];
 171     private static boolean succeeded = false;
 172 }