1 8 9 package test.javax.management; 10 11 import java.io.File ; 12 import java.net.URL ; 13 import java.util.Arrays ; 14 import java.util.Set ; 15 16 import javax.management.JMRuntimeException ; 17 import javax.management.ListenerNotFoundException ; 18 import javax.management.MBeanException ; 19 import javax.management.MBeanServer ; 20 import javax.management.MBeanServerDelegate ; 21 import javax.management.MBeanServerFactory ; 22 import javax.management.Notification ; 23 import javax.management.NotificationBroadcasterSupport ; 24 import javax.management.NotificationListener ; 25 import javax.management.ObjectName ; 26 import javax.management.RuntimeOperationsException ; 27 28 import test.MX4JTestCase; 29 import test.MutableInteger; 30 import test.javax.management.support.ClassLoaderSupport; 31 import test.javax.management.support.ComplianceSupport; 32 import test.javax.management.support.MBeanThrowingExceptions; 33 import test.javax.management.support.NotificationSupport; 34 import test.javax.management.support.PostRegistrationSupport; 35 36 39 public class MBeanServerTest extends MX4JTestCase 40 { 41 public MBeanServerTest(String s) 42 { 43 super(s); 44 } 45 46 public void testDefaultDomainConversion() throws Exception 47 { 48 String domain = "test"; 49 MBeanServer server = MBeanServerFactory.newMBeanServer(domain); 50 51 54 ObjectName defaultName = new ObjectName (":key=value"); 55 ObjectName explicitName = new ObjectName (server.getDefaultDomain(), "key", "value"); 56 57 MBeanServerDelegate broadcaster = new MBeanServerDelegate (); 59 60 server.registerMBean(broadcaster, explicitName); 62 63 Set set = server.queryNames(defaultName, null); 65 if (set.size() != 1) 66 { 67 fail("Default domain not handled in ObjectNames"); 68 } 69 70 NotificationListener listener = new NotificationListener () 72 { 73 public void handleNotification(Notification notification, Object handback) 74 { 75 } 76 }; 77 server.addNotificationListener(defaultName, listener, null, null); 78 server.removeNotificationListener(defaultName, listener); 80 81 server.getAttribute(defaultName, "MBeanServerId"); 83 84 server.getMBeanInfo(defaultName); 86 server.getObjectInstance(defaultName); 87 if (!server.isRegistered(defaultName)) 88 { 89 fail("Default domain not handled in ObjectNames"); 90 } 91 server.isInstanceOf(defaultName, "javax.management.MBeanServerDelegateMBean"); 92 } 93 94 public void testRegistrationOfJMImplementationDomain() throws Exception 95 { 96 MBeanServer server = MBeanServerFactory.newMBeanServer(); 97 98 Object mbean = new ComplianceSupport.BasicStandard(); 100 ObjectName reserved = new ObjectName ("JMImplementation:simon=true"); 101 try 102 { 103 server.registerMBean(mbean, reserved); 104 fail("MBeans with reserved object names cannot be registered"); 105 } 106 catch (JMRuntimeException ignored) 107 { 108 } 109 } 110 111 public void testDeregistrationOfJMImplementationDomain() throws Exception 112 { 113 MBeanServer server = MBeanServerFactory.newMBeanServer(); 114 115 ObjectName delegate = new ObjectName ("JMImplementation:type=MBeanServerDelegate"); 117 try 118 { 119 server.unregisterMBean(delegate); 120 fail("Delegate MBean cannot be unregistered"); 121 } 122 catch (RuntimeOperationsException ignored) 123 { 124 } 125 } 126 127 public void testDelegateID() throws Exception 128 { 129 ObjectName delegate = new ObjectName ("JMImplementation:type=MBeanServerDelegate"); 130 MBeanServer server1 = MBeanServerFactory.newMBeanServer(); 131 MBeanServer server2 = MBeanServerFactory.newMBeanServer(); 132 String id1 = (String )server1.getAttribute(delegate, "MBeanServerId"); 133 String id2 = (String )server2.getAttribute(delegate, "MBeanServerId"); 134 135 if (id1.equals(id2)) fail("MBeanServer ID must differ"); 137 } 138 139 public void testAddRemoveListenerOnMultipleMBeans() throws Exception 140 { 141 MBeanServer server = MBeanServerFactory.newMBeanServer(); 142 143 ObjectName name1 = new ObjectName ("domain:key=mbean1"); 144 ObjectName name2 = new ObjectName ("domain:key=mbean2"); 145 146 NotificationBroadcasterSupport mbean1 = new NotificationSupport.Emitter(); 147 NotificationBroadcasterSupport mbean2 = new NotificationSupport.Emitter(); 148 149 server.registerMBean(mbean1, name1); 150 server.registerMBean(mbean2, name2); 151 152 final MutableInteger integer = new MutableInteger(0); 153 NotificationListener listener = new NotificationListener () 154 { 155 public void handleNotification(Notification notification, Object handback) 156 { 157 integer.set(integer.get() + 1); 158 } 159 }; 160 161 server.addNotificationListener(name1, listener, null, null); 162 server.addNotificationListener(name2, listener, null, null); 163 164 Notification notification = new Notification ("test", mbean1, 1); 165 mbean1.sendNotification(notification); 166 167 assertEquals("Listener is not called", integer.get(), 1); 169 170 mbean2.sendNotification(notification); 171 172 assertEquals("Listener is not called", integer.get(), 2); 174 175 server.removeNotificationListener(name1, listener); 177 178 mbean1.sendNotification(notification); 180 assertEquals("Listener is called", integer.get(), 2); 181 182 mbean2.sendNotification(notification); 184 assertEquals("Listener is not called", integer.get(), 3); 185 186 try 187 { 188 server.removeNotificationListener(name1, listener); 189 fail("Listener has been removed"); 190 } 191 catch (ListenerNotFoundException ignored) 192 { 193 } 194 195 server.removeNotificationListener(name2, listener); 197 198 mbean2.sendNotification(notification); 200 assertEquals("Listener is called", integer.get(), 3); 201 } 202 203 public void testAddRemoveMixedListenerOnMultipleMBeans() throws Exception 204 { 205 MBeanServer server = MBeanServerFactory.newMBeanServer(); 206 207 ObjectName name1 = new ObjectName ("domain:key=mbean1"); 208 ObjectName name2 = new ObjectName ("domain:key=mbean2"); 209 210 NotificationBroadcasterSupport mbean1 = new NotificationSupport.Emitter(); 211 NotificationBroadcasterSupport mbean2 = new NotificationSupport.Emitter(); 212 213 server.registerMBean(mbean1, name1); 214 server.registerMBean(mbean2, name2); 215 216 final MutableInteger integer = new MutableInteger(0); 217 NotificationListener listener = new NotificationListener () 218 { 219 public void handleNotification(Notification notification, Object handback) 220 { 221 integer.set(integer.get() + 1); 222 } 223 }; 224 225 server.addNotificationListener(name1, listener, null, null); 226 server.addNotificationListener(name2, listener, null, null); 227 mbean2.addNotificationListener(listener, null, null); 228 229 Notification notification = new Notification ("test", mbean1, 1); 230 mbean1.sendNotification(notification); 231 232 assertEquals("Listener is not called", integer.get(), 1); 234 235 mbean2.sendNotification(notification); 236 237 assertEquals("Listeners are not called", integer.get(), 3); 239 240 server.removeNotificationListener(name2, listener); 242 243 mbean2.sendNotification(notification); 245 assertEquals("Listener is not called", integer.get(), 4); 246 247 mbean1.sendNotification(notification); 249 assertEquals("Listener is not called", integer.get(), 5); 250 251 server.removeNotificationListener(name1, listener); 252 253 mbean1.sendNotification(notification); 255 assertEquals("Listener is called", integer.get(), 5); 256 257 mbean2.sendNotification(notification); 259 assertEquals("Listener is not called", integer.get(), 6); 260 261 try 262 { 263 server.removeNotificationListener(name2, listener); 264 fail("Listener has been removed"); 265 } 266 catch (ListenerNotFoundException ignored) 267 { 268 } 269 270 mbean2.removeNotificationListener(listener); 272 273 mbean2.sendNotification(notification); 275 assertEquals("Listener is called", integer.get(), 6); 276 } 277 278 public void testObjectInstanceOnPostRegister() throws Exception 279 { 280 MBeanServer server = MBeanServerFactory.newMBeanServer(); 281 PostRegistrationSupport mbean = new PostRegistrationSupport(); 282 ObjectName name = new ObjectName (":mbean=postRegistration"); 283 server.registerMBean(mbean, name); 284 } 285 286 public void testGetDomains() throws Exception 287 { 288 MBeanServer server = MBeanServerFactory.newMBeanServer(); 289 290 String [] domains = server.getDomains(); 291 if (domains.length != 1) fail("Fresh new MBeanServer contains MBeans not in the JMImplementation domain"); 292 if (!"JMImplementation".equals(domains[0])) fail("Fresh new MBeanServer contains MBeans not in the JMImplementation domain"); 293 294 Object mbean = new ComplianceSupport.BasicStandard(); 295 296 ObjectName name1 = new ObjectName ("domain1", "mbean", "1"); 297 server.registerMBean(mbean, name1); 298 domains = server.getDomains(); 299 Arrays.sort(domains, null); 300 301 if (domains.length != 2) fail("New MBean domain is not present in getDomains()"); 302 if (!"domain1".equals(domains[1])) fail("New MBean domain is not present in getDomains()"); 303 304 ObjectName name2 = new ObjectName ("domain1", "mbean", "2"); 305 server.registerMBean(mbean, name2); 306 domains = server.getDomains(); 307 Arrays.sort(domains, null); 308 309 if (domains.length != 2) fail("Existing MBean domain should not be duplicated in getDomains()"); 310 if (!"domain1".equals(domains[1])) fail("Existing MBean domain should not be duplicated in getDomains()"); 311 312 server.unregisterMBean(name2); 313 domains = server.getDomains(); 314 Arrays.sort(domains, null); 315 316 if (domains.length != 2) fail("Unregistering still existing MBean domain should not be removed from getDomains()"); 317 if (!"domain1".equals(domains[1])) fail("Unregistering still existing MBean domain should not be removed from getDomains()"); 318 319 server.unregisterMBean(name1); 320 domains = server.getDomains(); 321 Arrays.sort(domains, null); 322 323 if (domains.length != 1) fail("Unregistering MBean domain should be removed from getDomains()"); 324 if (!"JMImplementation".equals(domains[0])) fail("Unregistering MBean domain should be removed from getDomains()"); 325 } 326 327 public void testInstantiate() throws Exception 328 { 329 MBeanServer server = newMBeanServer(); 330 331 String className = ComplianceSupport.BasicStandard.class.getName(); 332 Object mbean1 = server.instantiate(className, null, new Object [0], new String [0]); 333 334 File file = new File ("dist/test/mx4j-tests.jar"); 336 ClassLoader parent = getClass().getClassLoader().getParent(); 337 ClassLoaderSupport loader = new ClassLoaderSupport(new URL []{file.toURL()}, parent); 338 ObjectName loaderName = new ObjectName (":type=ClassLoader"); 339 server.registerMBean(loader, loaderName); 340 341 Object mbean2 = server.instantiate(className, loaderName, new Object [0], new String [0]); 342 343 if (mbean1.getClass().equals(mbean2.getClass())) fail("MBean classes should be different"); 345 346 Object mbean3 = server.instantiate(className, new Object [0], new String [0]); 347 348 if (!mbean1.getClass().equals(mbean3.getClass())) fail("MBean classes should be equal"); 350 351 server.unregisterMBean(loaderName); 352 353 Object mbean4 = server.instantiate(className, new Object [0], new String [0]); 354 if (!mbean1.getClass().equals(mbean4.getClass())) fail("MBean classes should be equal"); 355 } 356 357 public void testWrapExceptionsThrownByMBeanMethods() throws Exception 358 { 359 MBeanServer server = newMBeanServer(); 360 361 MBeanThrowingExceptions mbean = new MBeanThrowingExceptions(); 362 ObjectName objectName = ObjectName.getInstance(":name=exceptions"); 363 server.registerMBean(mbean, objectName); 364 365 try 366 { 367 server.invoke(objectName, "throwReflectionException", null, null); 368 fail(); 369 } 370 catch (MBeanException x) 371 { 372 } 373 } 374 } 375 | Popular Tags |