/* * Copyright (c) 2004, 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 5001857 * @summary Test queryNames() and queryMBeans() with a buggy DynamicMBean * @author Daniel Fuchs * @modules java.management * @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); } } }