test/jdk/javax/management/mxbean/PreRegisterNameTest.java
changeset 47216 71c04702a3d5
parent 44423 306c020eb154
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javax/management/mxbean/PreRegisterNameTest.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6448042
+ * @summary Test that MXBeans can define their own names in preRegister
+ * @author Eamonn McManus
+ */
+
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.Constructor;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.StandardMBean;
+
+/*
+ * Test that an MXBean can decide its name by returning a value from
+ * the preRegister method.  Also test the same thing for Standard MBeans
+ * for good measure.
+ */
+public class PreRegisterNameTest {
+    public static interface SpumeMXBean {}
+
+    public static class Spume implements SpumeMXBean, MBeanRegistration {
+        private ObjectName realName;
+
+        public Spume(ObjectName realName) {
+            this.realName = realName;
+        }
+
+        public void preDeregister() throws Exception {
+        }
+
+        public void postDeregister() {
+        }
+
+        public void postRegister(Boolean registrationDone) {
+        }
+
+        public ObjectName preRegister(MBeanServer server, ObjectName name) {
+            return realName;
+        }
+    }
+
+    public static interface ThingMBean {
+        public boolean getNoddy();
+    }
+
+    public static class Thing implements ThingMBean, MBeanRegistration {
+        private ObjectName realName;
+
+        public Thing(ObjectName realName) {
+            this.realName = realName;
+        }
+
+        public ObjectName preRegister(MBeanServer mbs, ObjectName name) {
+            return realName;
+        }
+
+        public void postRegister(Boolean done) {}
+
+        public void preDeregister() {}
+
+        public void postDeregister() {}
+
+        public boolean getNoddy() {
+            return true;
+        }
+    }
+
+    public static class XThing extends StandardMBean implements ThingMBean {
+        private ObjectName realName;
+
+        public XThing(ObjectName realName) {
+            super(ThingMBean.class, false);
+            this.realName = realName;
+        }
+
+        @Override
+        public ObjectName preRegister(MBeanServer server, ObjectName name) {
+            return realName;
+        }
+
+        public boolean getNoddy() {
+            return false;
+        }
+    }
+
+    public static class XSpume extends StandardMBean implements SpumeMXBean {
+        private ObjectName realName;
+
+        public XSpume(ObjectName realName) {
+            super(SpumeMXBean.class, true);
+            this.realName = realName;
+        }
+
+        @Override
+        public ObjectName preRegister(MBeanServer server, ObjectName name)
+        throws Exception {
+            super.preRegister(server, realName);
+            return realName;
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        for (Class<?> c : new Class<?>[] {
+                Spume.class, Thing.class, XSpume.class, XThing.class
+             }) {
+            for (ObjectName n : new ObjectName[] {null, new ObjectName("a:b=c")}) {
+                System.out.println("Class " + c.getName() + " with name " + n +
+                        "...");
+                ObjectName realName = new ObjectName("a:type=" + c.getName());
+                Constructor<?> constr = c.getConstructor(ObjectName.class);
+                Object mbean = constr.newInstance(realName);
+                ObjectInstance oi;
+                String what =
+                    "Registering MBean of type " + c.getName() + " under name " +
+                    "<" + n + ">: ";
+                try {
+                    oi = mbs.registerMBean(mbean, n);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    fail(what + " got " + e);
+                    continue;
+                }
+                ObjectName registeredName = oi.getObjectName();
+                if (!registeredName.equals(realName))
+                    fail(what + " registered as " + registeredName);
+                if (!mbs.isRegistered(realName)) {
+                    fail(what + " not registered as expected");
+                }
+                mbs.unregisterMBean(registeredName);
+            }
+        }
+        System.err.flush();
+        if (failures == 0)
+            System.out.println("TEST PASSED");
+        else
+            throw new Exception("TEST FAILED: " + failure);
+    }
+
+    private static void fail(String msg) {
+        System.err.println("FAILED: " + msg);
+        failure = msg;
+        failures++;
+    }
+
+    private static int failures;
+    private static String failure;
+}