--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/ObjectInstance/MBeanInfoFailTest.java Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2004 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 5001857
+ * @summary Test queryNames() and queryMBeans() with a buggy DynamicMBean
+ * @author Daniel Fuchs
+ * @run clean MBeanInfoFailTest
+ * @run build MBeanInfoFailTest
+ * @run main MBeanInfoFailTest
+ */
+
+import javax.management.*;
+import java.util.*;
+
+public class MBeanInfoFailTest {
+
+ public static class UnspeakableException extends RuntimeException {
+ public UnspeakableException(String unspeakableMessage) {
+ super(unspeakableMessage);
+ }
+ }
+
+ public interface ThornyDevilMBean {
+ public boolean isDormant();
+ public void setDormant(boolean sleep);
+ }
+
+ public static class ThornyDevil
+ extends StandardMBean implements ThornyDevilMBean {
+ private boolean sleep=true;
+ public ThornyDevil() throws NotCompliantMBeanException {
+ super(ThornyDevilMBean.class);
+ }
+ public boolean isDormant() {
+ return this.sleep;
+ }
+ public void setDormant(boolean sleep) {
+ this.sleep = sleep;
+ }
+ public MBeanInfo getMBeanInfo() {
+ if (isDormant()) return super.getMBeanInfo();
+ throw new UnspeakableException("The Thorny Devil has awoken!");
+ }
+ }
+
+ public static void printInstances(Set instances) {
+ for (Iterator it1 = instances.iterator(); it1.hasNext();) {
+ final ObjectInstance oi = (ObjectInstance)it1.next();
+ final ObjectName on = oi.getObjectName();
+ final String cn = oi.getClassName();
+ System.err.println(String.valueOf(on) + ": class is " + cn);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ System.out.println("Test queryNames() and queryMBeans() with a "+
+ "buggy DynamicMBean");
+ try {
+ final MBeanServer server = MBeanServerFactory.createMBeanServer();
+
+ final ObjectName troubleKeeper =
+ new ObjectName("ThornyDevil:name=TroubleKeeper");
+ final ObjectName troubleMaker =
+ new ObjectName("ThornyDevil:name=TroubleMaker");
+ final ObjectName thornyPattern =
+ new ObjectName("ThornyDevil:*");
+
+ server.createMBean(ThornyDevil.class.getName(),
+ troubleKeeper);
+ server.createMBean(ThornyDevil.class.getName(),
+ troubleMaker);
+
+ final MBeanInfo info1 = server.getMBeanInfo(troubleKeeper);
+ System.out.println(String.valueOf(troubleKeeper)+" is a " +
+ info1.getClassName());
+ final MBeanInfo info2 = server.getMBeanInfo(troubleMaker);
+ System.out.println(String.valueOf(troubleMaker)+" is a " +
+ info2.getClassName());
+ final Set thorny1 = server.queryNames(thornyPattern,null);
+ if (thorny1.size() != 2) {
+ System.err.println("queryNames(): " +
+ "Expected to find 2 ThornyDevils before" +
+ " trouble started! ");
+ System.err.println("Found "+thorny1.size()+" instead: "+
+ thorny1);
+ System.exit(1);
+ }
+ final Set thornyM1 = server.queryMBeans(thornyPattern,null);
+ if (thornyM1.size() != 2) {
+ System.err.println("queryMBeans(): " +
+ "Expected to find 2 ThornyDevils before" +
+ " trouble started! ");
+ System.err.println("Found "+thornyM1.size()+" instead: ");
+ printInstances(thornyM1);
+ System.exit(2);
+ }
+ for (Iterator it1 = thornyM1.iterator(); it1.hasNext();) {
+ final ObjectInstance oi = (ObjectInstance)it1.next();
+ final ObjectName on = oi.getObjectName();
+ final String cn = oi.getClassName();
+ if (cn == null || !ThornyDevil.class.getName().
+ equals(cn)) {
+ System.err.println("Expected no trouble yet!");
+ System.err.println(String.valueOf(on) + ": class is " +
+ cn);
+ System.exit(3);
+ }
+ System.out.println(String.valueOf(on) + ": class is " + cn);
+ }
+
+ System.out.println("Starting trouble with "+troubleMaker+" ...");
+ ThornyDevilMBean troubleMakerproxy =
+ (ThornyDevilMBean) MBeanServerInvocationHandler.
+ newProxyInstance(server, troubleMaker, ThornyDevilMBean.class,
+ false);
+ troubleMakerproxy.setDormant(false);
+
+ try {
+ final MBeanInfo mbi = server.getMBeanInfo(troubleMaker);
+ System.err.println("No trouble started!: " + mbi);
+ System.exit(2);
+ } catch (Exception x) {
+ if (x.getCause() instanceof UnspeakableException)
+ System.out.println("Trouble started as expected: "
+ + x.getCause());
+ else {
+ System.err.println("Unexpected trouble: " + x.getCause());
+ x.printStackTrace();
+ System.exit(3);
+ }
+ }
+
+ final Set thorny2 = server.queryNames(thornyPattern,null);
+ if (thorny2.size() != 2) {
+ System.err.println("Expected to find 2 ThornyDevils after" +
+ " trouble started! ");
+ System.err.println("Found "+thorny2.size()+" instead: "+
+ thorny2);
+ System.exit(4);
+ }
+
+ final Set thornyM2 = server.queryMBeans(thornyPattern,null);
+ if (thornyM2.size() != 2) {
+ System.err.println("queryMBeans(): " +
+ "Expected to find 2 ThornyDevils after" +
+ " trouble started! ");
+ System.err.println("Found "+thornyM2.size()+" instead: ");
+ printInstances(thornyM2);
+ System.exit(5);
+ }
+ for (Iterator it1 = thornyM2.iterator(); it1.hasNext();) {
+ final ObjectInstance oi = (ObjectInstance)it1.next();
+ final ObjectName on = oi.getObjectName();
+ final String cn = oi.getClassName();
+ if (!on.equals(troubleMaker)) {
+ if (cn == null || !ThornyDevil.class.getName().
+ equals(cn)) {
+ System.err.println("Expected no trouble for " + on);
+ System.err.println(String.valueOf(on) + ": class is " +
+ cn);
+ System.exit(6);
+ }
+ } else {
+ if (cn != null) {
+ System.err.println("Expected trouble for " + on);
+ System.err.println(String.valueOf(on) + ": class is " +
+ cn);
+ System.exit(7);
+ }
+ }
+ System.out.println(String.valueOf(on) + ": class is " + cn);
+ }
+
+ System.out.println("Ahahah! " + troubleMaker +
+ " successfully thwarted!");
+ } catch( Exception x) {
+ System.err.println("Unexpected exception: " + x);
+ x.printStackTrace();
+ System.exit(8);
+ }
+ }
+
+}