KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > test > javax > management > MBeanServerTest


1 /*
2  * Copyright (C) The MX4J Contributors.
3  * All rights reserved.
4  *
5  * This software is distributed under the terms of the MX4J License version 1.0.
6  * See the terms of the MX4J License in the documentation provided with this software.
7  */

8
9 package test.javax.management;
10
11 import java.io.File JavaDoc;
12 import java.net.URL JavaDoc;
13 import java.util.Arrays JavaDoc;
14 import java.util.Set JavaDoc;
15
16 import javax.management.JMRuntimeException JavaDoc;
17 import javax.management.ListenerNotFoundException JavaDoc;
18 import javax.management.MBeanException JavaDoc;
19 import javax.management.MBeanServer JavaDoc;
20 import javax.management.MBeanServerDelegate JavaDoc;
21 import javax.management.MBeanServerFactory JavaDoc;
22 import javax.management.Notification JavaDoc;
23 import javax.management.NotificationBroadcasterSupport JavaDoc;
24 import javax.management.NotificationListener JavaDoc;
25 import javax.management.ObjectName JavaDoc;
26 import javax.management.RuntimeOperationsException JavaDoc;
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 /**
37  * @version $Revision: 1.12 $
38  */

39 public class MBeanServerTest extends MX4JTestCase
40 {
41    public MBeanServerTest(String JavaDoc s)
42    {
43       super(s);
44    }
45
46    public void testDefaultDomainConversion() throws Exception JavaDoc
47    {
48       String JavaDoc domain = "test";
49       MBeanServer JavaDoc server = MBeanServerFactory.newMBeanServer(domain);
50
51       // Every operation with default domain must match the one with the
52
// explicit domain
53

54       ObjectName JavaDoc defaultName = new ObjectName JavaDoc(":key=value");
55       ObjectName JavaDoc explicitName = new ObjectName JavaDoc(server.getDefaultDomain(), "key", "value");
56
57       // A broadcaster mbean
58
MBeanServerDelegate JavaDoc broadcaster = new MBeanServerDelegate JavaDoc();
59
60       // Register with the explicit object name
61
server.registerMBean(broadcaster, explicitName);
62
63       // Query
64
Set JavaDoc set = server.queryNames(defaultName, null);
65       if (set.size() != 1)
66       {
67          fail("Default domain not handled in ObjectNames");
68       }
69
70       // Register and remove a listener
71
NotificationListener JavaDoc listener = new NotificationListener JavaDoc()
72       {
73          public void handleNotification(Notification JavaDoc notification, Object JavaDoc handback)
74          {
75          }
76       };
77       server.addNotificationListener(defaultName, listener, null, null);
78       // Remove throws if the listener is not found
79
server.removeNotificationListener(defaultName, listener);
80
81       // Invoke operations
82
server.getAttribute(defaultName, "MBeanServerId");
83
84       // Metadata
85
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 JavaDoc
95    {
96       MBeanServer JavaDoc server = MBeanServerFactory.newMBeanServer();
97
98       // Test that MBeans with reserved object names cannot be registered
99
Object JavaDoc mbean = new ComplianceSupport.BasicStandard();
100       ObjectName JavaDoc reserved = new ObjectName JavaDoc("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 JavaDoc ignored)
107       {
108       }
109    }
110
111    public void testDeregistrationOfJMImplementationDomain() throws Exception JavaDoc
112    {
113       MBeanServer JavaDoc server = MBeanServerFactory.newMBeanServer();
114
115       // Test that the delegate MBean cannot be unregistered
116
ObjectName JavaDoc delegate = new ObjectName JavaDoc("JMImplementation:type=MBeanServerDelegate");
117       try
118       {
119          server.unregisterMBean(delegate);
120          fail("Delegate MBean cannot be unregistered");
121       }
122       catch (RuntimeOperationsException JavaDoc ignored)
123       {
124       }
125    }
126
127    public void testDelegateID() throws Exception JavaDoc
128    {
129       ObjectName JavaDoc delegate = new ObjectName JavaDoc("JMImplementation:type=MBeanServerDelegate");
130       MBeanServer JavaDoc server1 = MBeanServerFactory.newMBeanServer();
131       MBeanServer JavaDoc server2 = MBeanServerFactory.newMBeanServer();
132       String JavaDoc id1 = (String JavaDoc)server1.getAttribute(delegate, "MBeanServerId");
133       String JavaDoc id2 = (String JavaDoc)server2.getAttribute(delegate, "MBeanServerId");
134
135       // Be sure they're different
136
if (id1.equals(id2)) fail("MBeanServer ID must differ");
137    }
138
139    public void testAddRemoveListenerOnMultipleMBeans() throws Exception JavaDoc
140    {
141       MBeanServer JavaDoc server = MBeanServerFactory.newMBeanServer();
142
143       ObjectName JavaDoc name1 = new ObjectName JavaDoc("domain:key=mbean1");
144       ObjectName JavaDoc name2 = new ObjectName JavaDoc("domain:key=mbean2");
145
146       NotificationBroadcasterSupport JavaDoc mbean1 = new NotificationSupport.Emitter();
147       NotificationBroadcasterSupport JavaDoc 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 JavaDoc listener = new NotificationListener JavaDoc()
154       {
155          public void handleNotification(Notification JavaDoc notification, Object JavaDoc 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 JavaDoc notification = new Notification JavaDoc("test", mbean1, 1);
165       mbean1.sendNotification(notification);
166
167       // Be sure the listener is called
168
assertEquals("Listener is not called", integer.get(), 1);
169
170       mbean2.sendNotification(notification);
171
172       // Be sure the listener is called
173
assertEquals("Listener is not called", integer.get(), 2);
174
175       // Remove one listener
176
server.removeNotificationListener(name1, listener);
177
178       // Be sure it is not called
179
mbean1.sendNotification(notification);
180       assertEquals("Listener is called", integer.get(), 2);
181
182       // Be sure it is called
183
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 JavaDoc ignored)
192       {
193       }
194
195       // Remove also the second listener
196
server.removeNotificationListener(name2, listener);
197
198       // Be sure it is not called
199
mbean2.sendNotification(notification);
200       assertEquals("Listener is called", integer.get(), 3);
201    }
202
203    public void testAddRemoveMixedListenerOnMultipleMBeans() throws Exception JavaDoc
204    {
205       MBeanServer JavaDoc server = MBeanServerFactory.newMBeanServer();
206
207       ObjectName JavaDoc name1 = new ObjectName JavaDoc("domain:key=mbean1");
208       ObjectName JavaDoc name2 = new ObjectName JavaDoc("domain:key=mbean2");
209
210       NotificationBroadcasterSupport JavaDoc mbean1 = new NotificationSupport.Emitter();
211       NotificationBroadcasterSupport JavaDoc 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 JavaDoc listener = new NotificationListener JavaDoc()
218       {
219          public void handleNotification(Notification JavaDoc notification, Object JavaDoc 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 JavaDoc notification = new Notification JavaDoc("test", mbean1, 1);
230       mbean1.sendNotification(notification);
231
232       // Be sure the listener is called
233
assertEquals("Listener is not called", integer.get(), 1);
234
235       mbean2.sendNotification(notification);
236
237       // Be sure the listeners are called
238
assertEquals("Listeners are not called", integer.get(), 3);
239
240       // Remove one listener
241
server.removeNotificationListener(name2, listener);
242
243       // Be sure the listener is called
244
mbean2.sendNotification(notification);
245       assertEquals("Listener is not called", integer.get(), 4);
246
247       // Be sure it is called
248
mbean1.sendNotification(notification);
249       assertEquals("Listener is not called", integer.get(), 5);
250
251       server.removeNotificationListener(name1, listener);
252
253       // Be sure it is not called
254
mbean1.sendNotification(notification);
255       assertEquals("Listener is called", integer.get(), 5);
256
257       // Be sure it is called
258
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 JavaDoc ignored)
267       {
268       }
269
270       // Remove also the second listener
271
mbean2.removeNotificationListener(listener);
272
273       // Be sure it is not called
274
mbean2.sendNotification(notification);
275       assertEquals("Listener is called", integer.get(), 6);
276    }
277
278    public void testObjectInstanceOnPostRegister() throws Exception JavaDoc
279    {
280       MBeanServer JavaDoc server = MBeanServerFactory.newMBeanServer();
281       PostRegistrationSupport mbean = new PostRegistrationSupport();
282       ObjectName JavaDoc name = new ObjectName JavaDoc(":mbean=postRegistration");
283       server.registerMBean(mbean, name);
284    }
285
286    public void testGetDomains() throws Exception JavaDoc
287    {
288       MBeanServer JavaDoc server = MBeanServerFactory.newMBeanServer();
289
290       String JavaDoc[] 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 JavaDoc mbean = new ComplianceSupport.BasicStandard();
295
296       ObjectName JavaDoc name1 = new ObjectName JavaDoc("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 JavaDoc name2 = new ObjectName JavaDoc("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 JavaDoc
328    {
329       MBeanServer JavaDoc server = newMBeanServer();
330
331       String JavaDoc className = ComplianceSupport.BasicStandard.class.getName();
332       Object JavaDoc mbean1 = server.instantiate(className, null, new Object JavaDoc[0], new String JavaDoc[0]);
333
334       // Register one classloader mbean
335
File JavaDoc file = new File JavaDoc("dist/test/mx4j-tests.jar");
336       ClassLoader JavaDoc parent = getClass().getClassLoader().getParent();
337       ClassLoaderSupport loader = new ClassLoaderSupport(new URL JavaDoc[]{file.toURL()}, parent);
338       ObjectName JavaDoc loaderName = new ObjectName JavaDoc(":type=ClassLoader");
339       server.registerMBean(loader, loaderName);
340
341       Object JavaDoc mbean2 = server.instantiate(className, loaderName, new Object JavaDoc[0], new String JavaDoc[0]);
342
343       // Now mbean1 should be of a different class from mbean2
344
if (mbean1.getClass().equals(mbean2.getClass())) fail("MBean classes should be different");
345
346       Object JavaDoc mbean3 = server.instantiate(className, new Object JavaDoc[0], new String JavaDoc[0]);
347
348       // Since JMX 1.2, the CLR has the cl of the MBeanServer in its classpath.
349
if (!mbean1.getClass().equals(mbean3.getClass())) fail("MBean classes should be equal");
350
351       server.unregisterMBean(loaderName);
352
353       Object JavaDoc mbean4 = server.instantiate(className, new Object JavaDoc[0], new String JavaDoc[0]);
354       if (!mbean1.getClass().equals(mbean4.getClass())) fail("MBean classes should be equal");
355    }
356
357    public void testWrapExceptionsThrownByMBeanMethods() throws Exception JavaDoc
358    {
359       MBeanServer JavaDoc server = newMBeanServer();
360
361       MBeanThrowingExceptions mbean = new MBeanThrowingExceptions();
362       ObjectName JavaDoc 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 JavaDoc x)
371       {
372       }
373    }
374 }
375
Popular Tags