1 /*
   2  * Copyright (c) 2005, 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
  26  * @bug 6227124
  27  * @summary Test that setting an MBeanServerForwarder on an already
  28  *          started RMI connector server has the expected behavior.
  29  * @author Luis-Miguel Alventosa
  30  *
  31  * @run clean MBSFPreStartPostStartTest
  32  * @run build MBSFPreStartPostStartTest
  33  * @run main MBSFPreStartPostStartTest
  34  */
  35 
  36 import java.lang.reflect.InvocationHandler;
  37 import java.lang.reflect.Method;
  38 import java.lang.reflect.Proxy;
  39 import javax.management.MBeanServer;
  40 import javax.management.MBeanServerConnection;
  41 import javax.management.MBeanServerFactory;
  42 import javax.management.remote.JMXConnector;
  43 import javax.management.remote.JMXConnectorServer;
  44 import javax.management.remote.JMXConnectorServerFactory;
  45 import javax.management.remote.JMXServiceURL;
  46 import javax.management.remote.MBeanServerForwarder;
  47 
  48 public class MBSFPreStartPostStartTest {
  49 
  50     public static class MBSFInvocationHandler implements InvocationHandler {
  51 
  52         public static MBeanServerForwarder newProxyInstance() {
  53 
  54             final InvocationHandler handler = new MBSFInvocationHandler();
  55 
  56             final Class[] interfaces =
  57                 new Class[] {MBeanServerForwarder.class};
  58 
  59             Object proxy = Proxy.newProxyInstance(
  60                                  MBeanServerForwarder.class.getClassLoader(),
  61                                  interfaces,
  62                                  handler);
  63 
  64             return MBeanServerForwarder.class.cast(proxy);
  65         }
  66 
  67         public Object invoke(Object proxy, Method method, Object[] args)
  68             throws Throwable {
  69 
  70             final String methodName = method.getName();
  71 
  72             if (methodName.equals("getMBeanServer")) {
  73                 return mbs;
  74             }
  75 
  76             if (methodName.equals("setMBeanServer")) {
  77                 if (args[0] == null)
  78                     throw new IllegalArgumentException("Null MBeanServer");
  79                 if (mbs != null)
  80                     throw new IllegalArgumentException("MBeanServer object " +
  81                                                        "already initialized");
  82                 mbs = (MBeanServer) args[0];
  83                 return null;
  84             }
  85 
  86             flag = true;
  87 
  88             return method.invoke(mbs, args);
  89         }
  90 
  91         public boolean getFlag() {
  92             return flag;
  93         }
  94 
  95         public void setFlag(boolean flag) {
  96             this.flag = flag;
  97         }
  98 
  99         private boolean flag;
 100         private MBeanServer mbs;
 101     }
 102 
 103     /**
 104      * Run test
 105      */
 106     public int runTest(boolean setBeforeStart) throws Exception {
 107 
 108         echo("=-=-= MBSFPreStartPostStartTest: Set MBSF " +
 109              (setBeforeStart ? "before" : "after") +
 110              " starting the connector server =-=-=");
 111 
 112         JMXConnectorServer server = null;
 113         JMXConnector client = null;
 114 
 115         // Create a new MBeanServer
 116         //
 117         final MBeanServer mbs = MBeanServerFactory.createMBeanServer();
 118 
 119         try {
 120             // Create the JMXServiceURL
 121             //
 122             final JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://");
 123 
 124             // Create a JMXConnectorServer
 125             //
 126             server = JMXConnectorServerFactory.newJMXConnectorServer(url,
 127                                                                      null,
 128                                                                      mbs);
 129 
 130             // Create MBeanServerForwarder
 131             //
 132             MBeanServerForwarder mbsf =
 133                 MBSFInvocationHandler.newProxyInstance();
 134 
 135             // Set MBeanServerForwarder before start()
 136             //
 137             if (setBeforeStart)
 138                 server.setMBeanServerForwarder(mbsf);
 139 
 140             // Start the JMXConnectorServer
 141             //
 142             server.start();
 143 
 144             // Set MBeanServerForwarder after start()
 145             //
 146             if (!setBeforeStart)
 147                 server.setMBeanServerForwarder(mbsf);
 148 
 149             // Create a JMXConnector
 150             //
 151             client = server.toJMXConnector(null);
 152 
 153             // Connect to the connector server
 154             //
 155             client.connect(null);
 156 
 157             // Get non-secure MBeanServerConnection
 158             //
 159             final MBeanServerConnection mbsc =
 160                 client.getMBeanServerConnection();
 161 
 162             // Run method
 163             //
 164             mbsc.getDefaultDomain();
 165 
 166             // Check flag in MBeanServerForwarder
 167             //
 168             MBSFInvocationHandler mbsfih =
 169                 (MBSFInvocationHandler) Proxy.getInvocationHandler(mbsf);
 170             if (mbsfih.getFlag() == true) {
 171                 echo("OK: Did go into MBeanServerForwarder!");
 172             } else {
 173                 echo("KO: Didn't go into MBeanServerForwarder!");
 174                 return 1;
 175             }
 176         } catch (Exception e) {
 177             echo("Failed to perform operation: " + e);
 178             return 1;
 179         } finally {
 180             // Close the connection
 181             //
 182             if (client != null)
 183                 client.close();
 184 
 185             // Stop the connector server
 186             //
 187             if (server != null)
 188                 server.stop();
 189 
 190             // Release the MBeanServer
 191             //
 192             if (mbs != null)
 193                 MBeanServerFactory.releaseMBeanServer(mbs);
 194         }
 195 
 196         return 0;
 197     }
 198 
 199     /*
 200      * Print message
 201      */
 202     private static void echo(String message) {
 203         System.out.println(message);
 204     }
 205 
 206     /*
 207      * Standalone entry point.
 208      *
 209      * Run the test and report to stdout.
 210      */
 211     public static void main (String args[]) throws Exception {
 212 
 213         int error = 0;
 214 
 215         MBSFPreStartPostStartTest test = new MBSFPreStartPostStartTest();
 216 
 217         // Set MBSF before start()
 218         //
 219         error += test.runTest(true);
 220         // Set MBSF after start()
 221         //
 222         error += test.runTest(false);
 223 
 224         // Check test results
 225         //
 226         if (error > 0) {
 227             echo(">>> Unhappy Bye, Bye!");
 228             throw new IllegalStateException(
 229                 "Test FAILED: Unexpected error!");
 230         } else {
 231             echo(">>> Happy Bye, Bye!");
 232         }
 233     }
 234 }