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 6328682
27 * @summary Test that MBeanServer.unregisterMBean() correctly unregisters
28 *          the supplied MBean although DynamicMBean.getMBeanInfo() throws
29 *          a runtime exception.
30 * @author Luis-Miguel Alventosa
31 *
32 * @run clean UnregisterMBeanExceptionTest
33 * @run build UnregisterMBeanExceptionTest
34 * @run main UnregisterMBeanExceptionTest
35 */
36
37import javax.management.Attribute;
38import javax.management.AttributeList;
39import javax.management.AttributeNotFoundException;
40import javax.management.DynamicMBean;
41import javax.management.InvalidAttributeValueException;
42import javax.management.MBeanException;
43import javax.management.MBeanInfo;
44import javax.management.MBeanServer;
45import javax.management.MBeanServerFactory;
46import javax.management.ObjectName;
47import javax.management.ReflectionException;
48
49public class UnregisterMBeanExceptionTest {
50
51    public static class TestDynamicMBean implements DynamicMBean {
52
53        public Object getAttribute(String attribute) throws
54            AttributeNotFoundException,
55            MBeanException,
56            ReflectionException {
57            return null;
58        }
59
60        public void setAttribute(Attribute attribute) throws
61            AttributeNotFoundException,
62            InvalidAttributeValueException,
63            MBeanException,
64            ReflectionException {
65        }
66
67        public AttributeList getAttributes(String[] attributes) {
68            return null;
69        }
70
71        public AttributeList setAttributes(AttributeList attributes) {
72            return null;
73        }
74
75        public Object invoke(String op, Object params[], String sign[]) throws
76            MBeanException,
77            ReflectionException {
78            return null;
79        }
80
81        public MBeanInfo getMBeanInfo() {
82            if (throwException)
83                throw new RuntimeException("UnregisterMBeanExceptionTest");
84            else
85                return new MBeanInfo(this.getClass().getName(), "Test",
86                                     null, null, null, null);
87        }
88
89        public boolean throwException;
90    }
91
92    public static void main(String[] args) throws Exception {
93
94        // Instantiate the MBean server
95        //
96        System.out.println("Create the MBean server");
97        MBeanServer mbs = MBeanServerFactory.createMBeanServer();
98
99        // Register the MBean
100        //
101        System.out.println("Create a TestDynamicMBean");
102        TestDynamicMBean obj = new TestDynamicMBean();
103        ObjectName n = new ObjectName("d:k=v");
104        System.out.println("Register a TestDynamicMBean");
105        mbs.registerMBean(obj, n);
106        obj.throwException = true;
107        System.out.println("Unregister a TestDynamicMBean");
108        try {
109            mbs.unregisterMBean(n);
110        } catch (Exception e) {
111            throw new IllegalArgumentException("Test failed", e);
112        }
113        boolean isRegistered = mbs.isRegistered(n);
114        System.out.println("Is MBean Registered? " + isRegistered);
115
116        if (isRegistered) {
117            throw new IllegalArgumentException(
118                "Test failed: the MBean is still registered");
119        } else {
120            System.out.println("Test passed");
121        }
122    }
123}
124