jdk-24/jdk/test/javax/management/namespace/LeadingSeparatorsTest.java
2008-12-09 20:20:48 +01:00

239 lines
9.4 KiB
Java

/*
* Copyright 2008 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 LeadingSeparatorsTest.java
* @summary Test that the semantics of a leading // in ObjectName is respected.
* @author Daniel Fuchs
* @bug 5072476 6768935
* @run clean LeadingSeparatorsTest Wombat WombatMBean
* @compile -XDignore.symbol.file=true LeadingSeparatorsTest.java
* @run build LeadingSeparatorsTest Wombat WombatMBean
* @run main LeadingSeparatorsTest
*/
import java.lang.management.ManagementFactory;
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
import java.util.logging.Logger;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.namespace.JMXNamespaces;
import javax.management.namespace.JMXRemoteNamespace;
import javax.management.namespace.JMXNamespace;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
/**
* Class LeadingSeparatorsTest
* @author Sun Microsystems, 2005 - All rights reserved.
*/
public class LeadingSeparatorsTest {
/**
* A logger for this class.
**/
private static final Logger LOG =
Logger.getLogger(LeadingSeparatorsTest.class.getName());
/** Creates a new instance of NullObjectNameTest */
public LeadingSeparatorsTest() {
}
public static interface MyWombatMBean extends WombatMBean {
public Set<ObjectName> untrue(ObjectName pat) throws Exception;
}
public static class MyWombat
extends Wombat implements MyWombatMBean {
public MyWombat() throws NotCompliantMBeanException {
super(MyWombatMBean.class);
}
public Set<ObjectName> untrue(ObjectName pat) throws Exception {
final Set<ObjectName> res=listMatching(pat.withDomain("*"));
final Set<ObjectName> untrue = new HashSet<ObjectName>();
for (ObjectName a:res) {
untrue.add(a.withDomain(pat.getDomain()+"//"+a.getDomain()));
}
return untrue;
}
}
static String failure=null;
public static void testRegister() throws Exception {
final MBeanServer top = ManagementFactory.getPlatformMBeanServer();
final MBeanServer sub = MBeanServerFactory.createMBeanServer();
final JMXServiceURL url = new JMXServiceURL("rmi",null,0);
final JMXConnectorServer srv =
JMXConnectorServerFactory.newJMXConnectorServer(url,null,sub);
srv.start();
try {
// Create a namespace rmi// that points to 'sub' and flows through
// a JMXRemoteNamespace connected to 'srv'
// The namespace rmi// will accept createMBean, but not registerMBean.
//
final JMXRemoteNamespace rmiHandler = JMXRemoteNamespace.
newJMXRemoteNamespace(srv.getAddress(),null);
top.registerMBean(rmiHandler,
JMXNamespaces.getNamespaceObjectName("rmi"));
top.invoke(JMXNamespaces.getNamespaceObjectName("rmi"),
"connect", null, null);
// Create a namespace direct// that points to 'sub' and flows
// through a direct reference to 'sub'.
// The namespace direct// will accept createMBean, and registerMBean.
//
final JMXNamespace directHandler = new JMXNamespace(sub);
top.registerMBean(directHandler,
JMXNamespaces.getNamespaceObjectName("direct"));
final ObjectName n1 = new ObjectName("//direct//w:type=Wombat");
final ObjectName n2 = new ObjectName("direct//w:type=Wombat");
final ObjectName n3 = new ObjectName("//rmi//w:type=Wombat");
final ObjectName n4 = new ObjectName("rmi//w:type=Wombat");
// register wombat using an object name with a leading //
final Object obj = new MyWombat();
// check that returned object name doesn't have the leading //
assertEquals(n2,top.registerMBean(obj, n2).getObjectName());
System.out.println(n1+" registered");
// check that the registered Wombat can be accessed with all its
// names.
System.out.println(n2+" mood is: "+top.getAttribute(n2, "Mood"));
try {
System.out.println(n1+" mood is: "+top.getAttribute(n1, "Mood"));
throw new Exception("Excepected exception not thrown for "+n1);
} catch (InstanceNotFoundException x) {
System.out.println("OK: "+x);
}
System.out.println(n4+" mood is: "+top.getAttribute(n4, "Mood"));
try {
System.out.println(n3+" mood is: "+top.getAttribute(n3, "Mood"));
throw new Exception("Excepected exception not thrown for "+n3);
} catch (InstanceNotFoundException x) {
System.out.println("OK: "+x);
}
// call listMatching. The result should not contain any prefix.
final Set<ObjectName> res = (Set<ObjectName>)
top.invoke(n4, "listMatching",
// remove rmi// from rmi//*:*
JMXNamespaces.deepReplaceHeadNamespace(
new Object[] {ObjectName.WILDCARD.withDomain("rmi//*")},
"rmi", ""), new String[] {ObjectName.class.getName()});
// add rmi// prefix to all names in res.
final Set<ObjectName> res1 =
JMXNamespaces.deepReplaceHeadNamespace(res, "", "rmi");
System.out.println("got: "+res1);
// compute expected result
final Set<ObjectName> res2 = sub.queryNames(null,null);
final Set<ObjectName> res3 = new HashSet<ObjectName>();
for (ObjectName o:res2) {
res3.add(o.withDomain("rmi//"+o.getDomain()));
}
System.out.println("expected: "+res3);
assertEquals(res1, res3);
// invoke "untrue(//niark//niark:*)"
// should return a set were all ObjectNames begin with
// //niark//niark//
//
final Set<ObjectName> res4 = (Set<ObjectName>)
top.invoke(n4, "untrue",
// remove niark//niark : should remove nothing since
// our ObjectName begins with a leading //
JMXNamespaces.deepReplaceHeadNamespace(
new Object[] {
ObjectName.WILDCARD.withDomain("//niark//niark")},
"niark//niark", ""),
new String[] {ObjectName.class.getName()});
System.out.println("got: "+res4);
// add rmi// should add nothing since the returned names have a
// leading //
//
final Set<ObjectName> res5 =
JMXNamespaces.deepReplaceHeadNamespace(res4, "", "rmi");
System.out.println("got#2: "+res5);
// compute expected result
final Set<ObjectName> res6 = new HashSet<ObjectName>();
for (ObjectName o:res2) {
res6.add(o.withDomain("//niark//niark//"+o.getDomain()));
}
System.out.println("expected: "+res6);
// both res4 and res5 should be equals to the expected result.
assertEquals(res4, res6);
assertEquals(res5, res6);
} finally {
srv.stop();
}
if (failure != null)
throw new Exception(failure);
}
private static void assertEquals(Object x, Object y) {
if (!equal(x, y))
failed("expected " + string(x) + "; got " + string(y));
}
private static boolean equal(Object x, Object y) {
if (x == y)
return true;
if (x == null || y == null)
return false;
if (x.getClass().isArray())
return Arrays.deepEquals(new Object[] {x}, new Object[] {y});
return x.equals(y);
}
private static String string(Object x) {
String s = Arrays.deepToString(new Object[] {x});
return s.substring(1, s.length() - 1);
}
private static void failed(String why) {
failure = why;
new Throwable("FAILED: " + why).printStackTrace(System.out);
}
public static void main(String[] args) throws Exception {
testRegister();
}
}