KickJava   Java API By Example, From Geeks To Geeks.

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


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.IOException JavaDoc;
12 import java.lang.reflect.UndeclaredThrowableException JavaDoc;
13 import javax.management.InstanceNotFoundException JavaDoc;
14 import javax.management.ListenerNotFoundException JavaDoc;
15 import javax.management.MBeanException JavaDoc;
16 import javax.management.MBeanNotificationInfo JavaDoc;
17 import javax.management.MBeanServer JavaDoc;
18 import javax.management.MBeanServerConnection JavaDoc;
19 import javax.management.MBeanServerInvocationHandler JavaDoc;
20 import javax.management.Notification JavaDoc;
21 import javax.management.NotificationBroadcaster JavaDoc;
22 import javax.management.NotificationBroadcasterSupport JavaDoc;
23 import javax.management.NotificationEmitter JavaDoc;
24 import javax.management.NotificationFilter JavaDoc;
25 import javax.management.NotificationListener JavaDoc;
26 import javax.management.ObjectName JavaDoc;
27 import javax.management.remote.JMXConnector JavaDoc;
28 import javax.management.remote.JMXConnectorFactory JavaDoc;
29 import javax.management.remote.JMXConnectorServer JavaDoc;
30 import javax.management.remote.JMXConnectorServerFactory JavaDoc;
31 import javax.management.remote.JMXServiceURL JavaDoc;
32 import javax.naming.NamingException JavaDoc;
33
34 import test.MX4JTestCase;
35
36 /**
37  * @version $Revision: 1.8 $
38  */

39 public class MBeanServerInvocationHandlerTest extends MX4JTestCase
40 {
41    public MBeanServerInvocationHandlerTest(String JavaDoc s)
42    {
43       super(s);
44    }
45
46    public void testBadArguments() throws Exception JavaDoc
47    {
48       MBeanServer JavaDoc server = newMBeanServer();
49       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
50
51       try
52       {
53          MBeanServerInvocationHandler.newProxyInstance(null, name, LocalServiceMBean.class, false);
54          fail("MBeanServerConnection cannot be null");
55       }
56       catch (IllegalArgumentException JavaDoc x)
57       {
58       }
59
60       try
61       {
62          MBeanServerInvocationHandler.newProxyInstance(server, null, LocalServiceMBean.class, false);
63          fail("ObjectName cannot be null");
64       }
65       catch (IllegalArgumentException JavaDoc x)
66       {
67       }
68
69       try
70       {
71          MBeanServerInvocationHandler.newProxyInstance(server, name, null, false);
72          fail("Class cannot be null");
73       }
74       catch (IllegalArgumentException JavaDoc x)
75       {
76       }
77
78       try
79       {
80          MBeanServerInvocationHandler.newProxyInstance(server, name, LocalService.class, false);
81          fail("Class must be an interface");
82       }
83       catch (IllegalArgumentException JavaDoc x)
84       {
85       }
86    }
87
88    public void testMBeanNotAnEmitter() throws Exception JavaDoc
89    {
90       MBeanServer JavaDoc server = newMBeanServer();
91       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
92       LocalService mbean = new LocalService();
93       server.registerMBean(mbean, name);
94
95       NotificationEmitter JavaDoc emitter = (NotificationEmitter JavaDoc)MBeanServerInvocationHandler.newProxyInstance(server, name, LocalServiceMBean.class, true);
96
97       try
98       {
99          emitter.addNotificationListener(new TestListener(), null, null);
100          fail("The MBean is not a NotificationEmitter");
101       }
102       catch (IllegalArgumentException JavaDoc x)
103       {
104       }
105    }
106
107    public void testDeregisteredMBean() throws Exception JavaDoc
108    {
109       MBeanServer JavaDoc server = newMBeanServer();
110       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
111       LocalService mbean = new LocalService();
112       server.registerMBean(mbean, name);
113
114       // Check what the proxy throws if the ObjectName is removed from the server
115
LocalServiceMBean proxy = (LocalServiceMBean)MBeanServerInvocationHandler.newProxyInstance(server, name, LocalServiceMBean.class, false);
116       server.unregisterMBean(name);
117       try
118       {
119          proxy.throwCheckedException();
120          fail();
121       }
122       catch (NamingException JavaDoc x)
123       {
124          fail("Expecting an InstanceNotFoundException");
125       }
126       catch (UndeclaredThrowableException JavaDoc x)
127       {
128          Throwable JavaDoc xx = x.getUndeclaredThrowable();
129          if (!(xx instanceof InstanceNotFoundException JavaDoc))
130             fail("Expecting an InstanceNotFoundException");
131       }
132    }
133
134    public void testCheckedException() throws Exception JavaDoc
135    {
136       MBeanServer JavaDoc server = newMBeanServer();
137       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
138       LocalService mbean = new LocalService();
139       server.registerMBean(mbean, name);
140
141       LocalServiceMBean proxy = (LocalServiceMBean)MBeanServerInvocationHandler.newProxyInstance(server, name, LocalServiceMBean.class, false);
142       try
143       {
144          proxy.throwCheckedException();
145          fail();
146       }
147       catch (NamingException JavaDoc x)
148       {
149       }
150    }
151
152    public void testMBeanException() throws Exception JavaDoc
153    {
154       MBeanServer JavaDoc server = newMBeanServer();
155       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
156       LocalService mbean = new LocalService();
157       server.registerMBean(mbean, name);
158
159       LocalServiceMBean proxy = (LocalServiceMBean)MBeanServerInvocationHandler.newProxyInstance(server, name, LocalServiceMBean.class, false);
160       try
161       {
162          proxy.throwMBeanException();
163          fail();
164       }
165       catch (MBeanException JavaDoc x)
166       {
167       }
168    }
169
170    public void testRuntimeException() throws Exception JavaDoc
171    {
172       MBeanServer JavaDoc server = newMBeanServer();
173       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
174       LocalService mbean = new LocalService();
175       server.registerMBean(mbean, name);
176
177       LocalServiceMBean proxy = (LocalServiceMBean)MBeanServerInvocationHandler.newProxyInstance(server, name, LocalServiceMBean.class, false);
178       try
179       {
180          proxy.throwNullPointerException();
181          fail();
182       }
183       catch (NullPointerException JavaDoc x)
184       {
185       }
186    }
187
188    public void testError() throws Exception JavaDoc
189    {
190       MBeanServer JavaDoc server = newMBeanServer();
191       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
192       LocalService mbean = new LocalService();
193       server.registerMBean(mbean, name);
194
195       LocalServiceMBean proxy = (LocalServiceMBean)MBeanServerInvocationHandler.newProxyInstance(server, name, LocalServiceMBean.class, false);
196       try
197       {
198          proxy.throwError();
199          fail();
200       }
201       catch (Error JavaDoc x)
202       {
203       }
204    }
205
206    public void testNotificationBroadcasterProxy() throws Exception JavaDoc
207    {
208       MBeanServer JavaDoc server = newMBeanServer();
209       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
210       LocalBroadcasterService mbean = new LocalBroadcasterService();
211       server.registerMBean(mbean, name);
212
213       // The returned interface should be NotificationEmitter, even though the MBean only implements NotificationBroadcaster
214
NotificationEmitter JavaDoc proxy = (NotificationEmitter JavaDoc)MBeanServerInvocationHandler.newProxyInstance(server, name, NotificationBroadcaster JavaDoc.class, true);
215       assertNotNull(proxy);
216    }
217
218    public void testAddNotificationListener() throws Exception JavaDoc
219    {
220       MBeanServer JavaDoc server = newMBeanServer();
221       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
222       LocalEmitterService mbean = new LocalEmitterService();
223       server.registerMBean(mbean, name);
224
225       NotificationEmitter JavaDoc proxy = (NotificationEmitter JavaDoc)MBeanServerInvocationHandler.newProxyInstance(server, name, NotificationEmitter JavaDoc.class, true);
226       TestListener listener = new TestListener();
227       proxy.addNotificationListener(listener, null, null);
228       mbean.test();
229       if (!listener.received) fail();
230    }
231
232    public void testGetNotificationInfo() throws Exception JavaDoc
233    {
234       MBeanServer JavaDoc server = newMBeanServer();
235       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
236       LocalEmitterService mbean = new LocalEmitterService();
237       server.registerMBean(mbean, name);
238
239       NotificationEmitter JavaDoc proxy = (NotificationEmitter JavaDoc)MBeanServerInvocationHandler.newProxyInstance(server, name, NotificationEmitter JavaDoc.class, true);
240       MBeanNotificationInfo JavaDoc[] infos = proxy.getNotificationInfo();
241       if (!infos[0].getDescription().equals(LocalEmitterService.DESC)) fail();
242    }
243
244    public void testSimpleRemoveNotificationListener() throws Exception JavaDoc
245    {
246       MBeanServer JavaDoc server = newMBeanServer();
247       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
248       LocalEmitterService mbean = new LocalEmitterService();
249       server.registerMBean(mbean, name);
250
251       NotificationEmitter JavaDoc proxy = (NotificationEmitter JavaDoc)MBeanServerInvocationHandler.newProxyInstance(server, name, NotificationEmitter JavaDoc.class, true);
252       TestListener listener = new TestListener();
253       proxy.addNotificationListener(listener, null, null);
254       proxy.removeNotificationListener(listener);
255       mbean.test();
256       if (listener.received) fail();
257    }
258
259    public void testRemoveNotificationListener() throws Exception JavaDoc
260    {
261       MBeanServer JavaDoc server = newMBeanServer();
262       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
263       LocalEmitterService mbean = new LocalEmitterService();
264       server.registerMBean(mbean, name);
265
266       NotificationEmitter JavaDoc proxy = (NotificationEmitter JavaDoc)MBeanServerInvocationHandler.newProxyInstance(server, name, NotificationEmitter JavaDoc.class, true);
267       TestListener listener = new TestListener();
268       TestFilter filter = new TestFilter();
269       Object JavaDoc handback = new Object JavaDoc();
270       proxy.addNotificationListener(listener, filter, handback);
271       proxy.removeNotificationListener(listener, filter, handback);
272       mbean.test();
273       if (listener.received) fail();
274    }
275
276    public void testRemoveMultiNotificationListener() throws Exception JavaDoc
277    {
278       MBeanServer JavaDoc server = newMBeanServer();
279       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
280       LocalEmitterService mbean = new LocalEmitterService();
281       server.registerMBean(mbean, name);
282
283       NotificationEmitter JavaDoc proxy = (NotificationEmitter JavaDoc)MBeanServerInvocationHandler.newProxyInstance(server, name, NotificationEmitter JavaDoc.class, true);
284       TestListener listener1 = new TestListener();
285       TestFilter filter = new TestFilter();
286       Object JavaDoc handback = new Object JavaDoc();
287       proxy.addNotificationListener(listener1, filter, handback);
288
289       TestListener listener2 = new TestListener();
290       proxy.addNotificationListener(listener2, null, null);
291
292       mbean.test();
293       if (!listener1.received) fail();
294       if (!listener2.received) fail();
295
296       try
297       {
298          proxy.removeNotificationListener(listener2, filter, handback);
299          fail("Listener is not registered");
300       }
301       catch (ListenerNotFoundException JavaDoc x)
302       {
303       }
304
305       proxy.removeNotificationListener(listener2, null, null);
306       listener1.received = false;
307       listener2.received = false;
308
309       mbean.test();
310       if (!listener1.received) fail();
311       if (listener2.received) fail();
312    }
313
314    public void testRemoteExceptionWithRemoteInterface() throws Exception JavaDoc
315    {
316       MBeanServer JavaDoc server = newMBeanServer();
317       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
318       LocalService mbean = new LocalService();
319       server.registerMBean(mbean, name);
320
321       JMXServiceURL JavaDoc url = new JMXServiceURL JavaDoc("service:jmx:rmi://localhost");
322       JMXConnectorServer JavaDoc cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
323       cntorServer.start();
324       JMXConnector JavaDoc cntor = JMXConnectorFactory.connect(cntorServer.getAddress());
325       MBeanServerConnection JavaDoc mbsc = cntor.getMBeanServerConnection();
326
327       RemoteService remoteMBean = (RemoteService)MBeanServerInvocationHandler.newProxyInstance(mbsc, name, RemoteService.class, false);
328
329       // Close everything to get IOException
330
cntor.close();
331       cntorServer.stop();
332
333       try
334       {
335          remoteMBean.throwCheckedException();
336          fail("Must not be able to connect");
337       }
338       catch (IOException JavaDoc x)
339       {
340       }
341    }
342
343    public void testRemoteExceptionWithLocalInterface() throws Exception JavaDoc
344    {
345       MBeanServer JavaDoc server = newMBeanServer();
346       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
347       LocalService mbean = new LocalService();
348       server.registerMBean(mbean, name);
349
350       JMXServiceURL JavaDoc url = new JMXServiceURL JavaDoc("service:jmx:rmi://localhost");
351       JMXConnectorServer JavaDoc cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
352       cntorServer.start();
353       JMXConnector JavaDoc cntor = JMXConnectorFactory.connect(cntorServer.getAddress());
354       MBeanServerConnection JavaDoc mbsc = cntor.getMBeanServerConnection();
355
356       LocalServiceMBean remoteMBean = (LocalServiceMBean)MBeanServerInvocationHandler.newProxyInstance(mbsc, name, LocalServiceMBean.class, false);
357
358       // Close everything to get IOException
359
cntor.close();
360       cntorServer.stop();
361
362       // Now try the local interface
363
try
364       {
365          remoteMBean.throwCheckedException();
366          fail("Must not be able to connect");
367       }
368       catch (UndeclaredThrowableException JavaDoc x)
369       {
370          Throwable JavaDoc xx = x.getUndeclaredThrowable();
371          if (!(xx instanceof IOException JavaDoc)) fail();
372       }
373    }
374
375    public void testRemoteCheckedException() throws Exception JavaDoc
376    {
377       MBeanServer JavaDoc server = newMBeanServer();
378       ObjectName JavaDoc name = new ObjectName JavaDoc("domain:key=value");
379       LocalService mbean = new LocalService();
380       server.registerMBean(mbean, name);
381
382       JMXServiceURL JavaDoc url = new JMXServiceURL JavaDoc("service:jmx:rmi://localhost");
383       JMXConnectorServer JavaDoc cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
384       cntorServer.start();
385       JMXConnector JavaDoc cntor = JMXConnectorFactory.connect(cntorServer.getAddress());
386       MBeanServerConnection JavaDoc mbsc = cntor.getMBeanServerConnection();
387
388       LocalServiceMBean remoteMBean = (LocalServiceMBean)MBeanServerInvocationHandler.newProxyInstance(mbsc, name, LocalServiceMBean.class, false);
389       try
390       {
391          remoteMBean.throwCheckedException();
392          fail();
393       }
394       catch (NamingException JavaDoc x)
395       {
396       }
397    }
398
399    public interface LocalServiceMBean
400    {
401       public void throwCheckedException() throws NamingException JavaDoc;
402
403       public void throwMBeanException() throws MBeanException JavaDoc;
404
405       public void throwNullPointerException();
406
407       public void throwError();
408    }
409
410    public interface RemoteService
411    {
412       public void throwCheckedException() throws NamingException JavaDoc, IOException JavaDoc;
413
414       public void throwMBeanException() throws MBeanException JavaDoc, IOException JavaDoc;
415
416       public void throwNullPointerException() throws IOException JavaDoc;
417
418       public void throwError() throws IOException JavaDoc;
419    }
420
421    public class LocalService implements LocalServiceMBean
422    {
423       public void throwCheckedException() throws NamingException JavaDoc
424       {
425          throw new NamingException JavaDoc();
426       }
427
428       public void throwMBeanException() throws MBeanException JavaDoc
429       {
430          throw new MBeanException JavaDoc(new Exception JavaDoc());
431       }
432
433       public void throwNullPointerException()
434       {
435          throw new NullPointerException JavaDoc();
436       }
437
438       public void throwError()
439       {
440          throw new Error JavaDoc();
441       }
442    }
443
444    public class LocalBroadcasterService extends LocalService implements NotificationBroadcaster JavaDoc
445    {
446       private NotificationBroadcasterSupport JavaDoc support = new NotificationBroadcasterSupport JavaDoc();
447       static final String JavaDoc TYPE = "test.notification";
448       static final String JavaDoc DESC = "Test Notification";
449       private long sequence;
450
451       /**
452        * @see javax.management.NotificationBroadcaster#addNotificationListener(NotificationListener, NotificationFilter, Object)
453        */

454       public void addNotificationListener(NotificationListener JavaDoc listener, NotificationFilter JavaDoc filter, Object JavaDoc handback)
455               throws IllegalArgumentException JavaDoc
456       {
457          support.addNotificationListener(listener, filter, handback);
458       }
459
460       /**
461        * @see javax.management.NotificationBroadcaster#getNotificationInfo()
462        */

463       public MBeanNotificationInfo JavaDoc[] getNotificationInfo()
464       {
465          return new MBeanNotificationInfo JavaDoc[]{
466             new MBeanNotificationInfo JavaDoc(new String JavaDoc[]{TYPE}, Notification JavaDoc.class.getName(), DESC),
467          };
468       }
469
470       /**
471        * @see javax.management.NotificationBroadcaster#removeNotificationListener(NotificationListener)
472        */

473       public void removeNotificationListener(NotificationListener JavaDoc listener) throws ListenerNotFoundException JavaDoc
474       {
475          support.removeNotificationListener(listener);
476       }
477
478       public void test()
479       {
480          Notification JavaDoc notification = new Notification JavaDoc(TYPE, this, ++sequence, System.currentTimeMillis(), DESC);
481          support.sendNotification(notification);
482       }
483    }
484
485    public class LocalEmitterService extends LocalService implements NotificationEmitter JavaDoc
486    {
487       private NotificationBroadcasterSupport JavaDoc support = new NotificationBroadcasterSupport JavaDoc();
488       static final String JavaDoc TYPE = "test.notification";
489       static final String JavaDoc DESC = "Test Notification";
490       private long sequence;
491
492       public void addNotificationListener(NotificationListener JavaDoc listener, NotificationFilter JavaDoc filter, Object JavaDoc handback)
493               throws IllegalArgumentException JavaDoc
494       {
495          support.addNotificationListener(listener, filter, handback);
496       }
497
498       public MBeanNotificationInfo JavaDoc[] getNotificationInfo()
499       {
500          return new MBeanNotificationInfo JavaDoc[]{
501             new MBeanNotificationInfo JavaDoc(new String JavaDoc[]{TYPE}, Notification JavaDoc.class.getName(), DESC),
502          };
503       }
504
505       public void removeNotificationListener(NotificationListener JavaDoc listener) throws ListenerNotFoundException JavaDoc
506       {
507          support.removeNotificationListener(listener);
508       }
509
510       public void removeNotificationListener(NotificationListener JavaDoc listener, NotificationFilter JavaDoc filter, Object JavaDoc handback) throws ListenerNotFoundException JavaDoc
511       {
512          support.removeNotificationListener(listener, filter, handback);
513       }
514
515       public void test()
516       {
517          Notification JavaDoc notification = new Notification JavaDoc(TYPE, this, ++sequence, System.currentTimeMillis(), DESC);
518          support.sendNotification(notification);
519       }
520    }
521
522    public class TestListener implements NotificationListener JavaDoc
523    {
524       boolean received = false;
525
526       public void handleNotification(Notification JavaDoc notification, Object JavaDoc handback)
527       {
528          received = true;
529       }
530    }
531
532    public class TestFilter implements NotificationFilter JavaDoc
533    {
534       public boolean isNotificationEnabled(Notification JavaDoc notification)
535       {
536          return notification.getType().equals(LocalEmitterService.TYPE);
537       }
538    }
539 }
540
Popular Tags