KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > oddjob > jmx > client > ClientNodeTest


1 /*
2  * (c) Rob Gordon 2005.
3  */

4 package org.oddjob.jmx.client;
5
6 import java.io.Serializable JavaDoc;
7 import java.lang.reflect.Proxy JavaDoc;
8 import java.util.HashMap JavaDoc;
9 import java.util.Map JavaDoc;
10
11 import javax.management.Attribute JavaDoc;
12 import javax.management.AttributeList JavaDoc;
13 import javax.management.AttributeNotFoundException JavaDoc;
14 import javax.management.DynamicMBean JavaDoc;
15 import javax.management.InstanceNotFoundException JavaDoc;
16 import javax.management.IntrospectionException JavaDoc;
17 import javax.management.InvalidAttributeValueException JavaDoc;
18 import javax.management.MBeanAttributeInfo JavaDoc;
19 import javax.management.MBeanConstructorInfo JavaDoc;
20 import javax.management.MBeanException JavaDoc;
21 import javax.management.MBeanInfo JavaDoc;
22 import javax.management.MBeanNotificationInfo JavaDoc;
23 import javax.management.MBeanOperationInfo JavaDoc;
24 import javax.management.MBeanServer JavaDoc;
25 import javax.management.MBeanServerFactory JavaDoc;
26 import javax.management.Notification JavaDoc;
27 import javax.management.NotificationBroadcasterSupport JavaDoc;
28 import javax.management.NotificationEmitter JavaDoc;
29 import javax.management.ObjectName JavaDoc;
30 import javax.management.ReflectionException JavaDoc;
31
32 import junit.framework.TestCase;
33
34 import org.apache.commons.beanutils.BeanUtilsBean;
35 import org.apache.commons.beanutils.DynaBean;
36 import org.apache.commons.beanutils.DynaClass;
37 import org.apache.commons.beanutils.DynaProperty;
38 import org.apache.log4j.Logger;
39 import org.oddjob.Iconic;
40 import org.oddjob.Stateful;
41 import org.oddjob.Structural;
42 import org.oddjob.arooa.reflect.BeanUtilsBeanHelper;
43 import org.oddjob.arooa.reflect.DefaultRegistryLookup;
44 import org.oddjob.arooa.reflect.RegistryLookup;
45 import org.oddjob.arooa.registry.ComponentRegistry;
46 import org.oddjob.images.IconEvent;
47 import org.oddjob.images.IconListener;
48 import org.oddjob.images.IconTip;
49 import org.oddjob.jmx.SharedConstants;
50 import org.oddjob.jmx.WaitForChildren;
51 import org.oddjob.jmx.server.IconicInfo;
52 import org.oddjob.jmx.server.InterfaceManagerFactory;
53 import org.oddjob.jmx.server.OddjobMBean;
54 import org.oddjob.jmx.server.ServerContext;
55 import org.oddjob.jmx.server.ServerInfo;
56 import org.oddjob.jmx.server.ServerModel;
57 import org.oddjob.jmx.server.StatefulInfo;
58 import org.oddjob.jmx.server.StructuralInfo;
59 import org.oddjob.monitor.model.Describer;
60 import org.oddjob.state.JobState;
61 import org.oddjob.state.JobStateEvent;
62 import org.oddjob.state.JobStateListener;
63 import org.oddjob.structural.StructuralEvent;
64 import org.oddjob.structural.StructuralListener;
65 import org.oddjob.util.ThreadManager;
66 import org.oddjob.values.types.MapType;
67
68 /**
69  *
70  */

71 public class ClientNodeTest extends TestCase {
72     public static final Logger logger = Logger.getLogger(ClientNodeTest.class);
73
74     
75     public interface OJMBeanInternals {
76         public String JavaDoc toString();
77         public void resync();
78         public Class JavaDoc[] interfaces();
79         public ServerInfo serverInfo();
80     }
81     
82     public abstract class BaseMockOJMBean extends NotificationBroadcasterSupport JavaDoc
83     implements OJMBeanInternals {
84         public void resync() {
85             sendNotification(new Notification JavaDoc(OddjobMBean.RESYNC_STARTED_NOTIF_TYPE, this, 0));
86             sendNotification(new Notification JavaDoc(OddjobMBean.RESYNC_FINISHED_NOTIF_TYPE, this, 0));
87         }
88         public ServerInfo serverInfo() {
89             return new ServerInfo(id(), url(), consoleId(),
90                     interfaces(), false, null);
91         }
92         public Class JavaDoc[] interfaces() {
93             return new Class JavaDoc[0];
94         }
95         public String JavaDoc consoleId() {
96             return "test";
97         }
98         public String JavaDoc url() {
99             return "//test";
100         }
101         public String JavaDoc id() {
102             return null;
103         }
104         public String JavaDoc toString() {
105             return "MockOJMBean.";
106         }
107     }
108
109     ///////////////////// simplest bean possible /////////////////
110

111     public interface SimpleMBean extends OJMBeanInternals { }
112     
113     public class Simple extends BaseMockOJMBean
114     implements SimpleMBean {
115         public String JavaDoc toString() { return "test"; }
116     }
117     
118     public void testSimple() throws Exception JavaDoc {
119         Simple mb = new Simple();
120         
121         MBeanServer JavaDoc mbs = MBeanServerFactory.createMBeanServer();
122         ObjectName JavaDoc on = new ObjectName JavaDoc("oddjob:name=whatever");
123         mbs.registerMBean(mb, on);
124         
125         Object JavaDoc proxy = ClientNode.createProxyFor(on, mbs, this, cr,
126                 new DummyNP());
127         assertEquals("test", proxy.toString());
128     }
129     
130     //////////////////////// interfaces ////////////////////////////
131

132     public interface MockRunnableMBean extends Runnable JavaDoc, OJMBeanInternals {
133     }
134     
135     public class MockRunnable extends BaseMockOJMBean
136     implements MockRunnableMBean {
137         boolean ran;
138         public MockRunnable() {}
139         public void run() {
140             ran = true;
141         }
142         public Class JavaDoc[] interfaces() {
143             return new Class JavaDoc[] { Runnable JavaDoc.class };
144         }
145     }
146     
147     public interface MockStatefulMBean extends NotificationEmitter JavaDoc, OJMBeanInternals {
148     }
149     
150     public class MockStateful extends BaseMockOJMBean
151     implements MockStatefulMBean {
152         public MBeanNotificationInfo JavaDoc[] getNotificationInfo() {
153             return new MBeanNotificationInfo JavaDoc[] {
154                     new MBeanNotificationInfo JavaDoc(new String JavaDoc[] { StatefulInfo.STATE_CHANGE_NOTIF_TYPE },
155                             Notification JavaDoc.class.getName(), "Dummy") };
156         }
157         
158         public void foo() {
159             Notification JavaDoc n = new Notification JavaDoc(StatefulInfo.STATE_CHANGE_NOTIF_TYPE,
160                     this, 0);
161             n.setUserData(new JobStateEvent(this, JobState.COMPLETE, null));
162             sendNotification(n);
163         }
164         public Class JavaDoc[] interfaces() {
165             return new Class JavaDoc[] { Stateful.class };
166         }
167     }
168     
169     public interface MockStructuralMBean extends NotificationEmitter JavaDoc, OJMBeanInternals {
170     }
171     
172     public class MockStructural extends BaseMockOJMBean
173     implements MockStructuralMBean {
174         public MBeanNotificationInfo JavaDoc[] getNotificationInfo() {
175             return new MBeanNotificationInfo JavaDoc[] {
176                     new MBeanNotificationInfo JavaDoc(new String JavaDoc[] { StructuralInfo.CHILD_ADDED_NOTIF_TYPE,
177                             StructuralInfo.CHILD_REMOVED_NOTIF_TYPE },
178                             Notification JavaDoc.class.getName(), "Dummy") };
179         }
180         public void ac(ObjectName JavaDoc c) {
181             Notification JavaDoc n = new Notification JavaDoc(StructuralInfo.CHILD_ADDED_NOTIF_TYPE,
182                     this, 2);
183             n.setUserData(new StructuralEvent(this, c, 0));
184             sendNotification(n);
185         }
186         public void rc(ObjectName JavaDoc c) {
187             Notification JavaDoc n = new Notification JavaDoc(StructuralInfo.CHILD_REMOVED_NOTIF_TYPE,
188                     this, 3);
189             n.setUserData(new StructuralEvent(this, c, 0));
190             sendNotification(n);
191         }
192         public Class JavaDoc[] interfaces() {
193             return new Class JavaDoc[] { Structural.class };
194         }
195     };
196     
197     public interface MockIconicMBean extends NotificationEmitter JavaDoc, OJMBeanInternals {
198         public IconTip iconForId(String JavaDoc iconId);
199     }
200     
201     public class MockIconic extends BaseMockOJMBean
202     implements MockIconicMBean {
203         public MBeanNotificationInfo JavaDoc[] getNotificationInfo() {
204             return new MBeanNotificationInfo JavaDoc[] {
205                     new MBeanNotificationInfo JavaDoc(new String JavaDoc[] { IconicInfo.ICON_CHANGED_NOTIF_TYPE },
206                             Notification JavaDoc.class.getName(), "Dummy") };
207         }
208         public IconTip iconForId(String JavaDoc iconId) {
209             return new IconTip(new byte[0], "foo");
210         }
211         public void foo() {
212             Notification JavaDoc n = new Notification JavaDoc(IconicInfo.ICON_CHANGED_NOTIF_TYPE,
213                     this, 0);
214             n.setUserData(new IconEvent(this, "foo"));
215             sendNotification(n);
216         }
217         public Class JavaDoc[] interfaces() {
218             return new Class JavaDoc[] { Iconic.class };
219         }
220     }
221     
222     private ComponentRegistry cr;
223     
224     public void setUp() {
225         logger.debug("================== Running " + getName() + "================");
226         System.setProperty("mx4j.log.priority", "trace");
227         cr = new ComponentRegistry();
228         cr.register("this", this);
229     }
230     
231     public void testRunnable()
232     throws Exception JavaDoc {
233         MockRunnable mb = new MockRunnable();
234         
235         MBeanServer JavaDoc mbs = MBeanServerFactory.createMBeanServer();
236         ObjectName JavaDoc on = new ObjectName JavaDoc("oddjob:name=whatever");
237         mbs.registerMBean(mb, on);
238         
239         Object JavaDoc proxy = ClientNode.createProxyFor(on, mbs, this, cr,
240                 new DummyNP());
241         assertTrue("Runnable", proxy instanceof Runnable JavaDoc);
242         
243         ((Runnable JavaDoc)proxy).run();
244         assertTrue("Ran", mb.ran);
245     }
246     
247     public void testStateful()
248     throws Exception JavaDoc {
249         class MyStateListener implements JobStateListener {
250             JobStateEvent se;
251             public void jobStateChange(JobStateEvent event) {
252                 se = event;
253             }
254         };
255         MyStateListener ml = new MyStateListener();
256         
257         MockStateful mb = new MockStateful();
258         
259         MBeanServer JavaDoc mbs = MBeanServerFactory.createMBeanServer();
260         ObjectName JavaDoc on = new ObjectName JavaDoc("oddjob:name=whatever");
261         mbs.registerMBean(mb, on);
262
263         Object JavaDoc proxy = ClientNode.createProxyFor(on, mbs, this, cr,
264                 new DummyNP());
265         assertNotNull(proxy);
266         assertTrue("Stateful", proxy instanceof Stateful);
267
268         ((Stateful)proxy).addJobStateListener(ml);
269         mb.foo();
270                 
271         assertEquals("source", proxy, ml.se.getSource());
272         assertEquals("state", JobState.COMPLETE, ml.se.getJobState());
273     }
274
275     public void testStructural()
276     throws Exception JavaDoc {
277         MockRunnable myChild = new MockRunnable();
278         
279         class MyStructuralListener implements StructuralListener {
280             StructuralEvent se;
281             public void childAdded(StructuralEvent event) {
282                 se = event;
283             }
284             public void childRemoved(StructuralEvent event) {
285                 se = event;
286             }
287         };
288         MyStructuralListener ml = new MyStructuralListener();
289         
290         MockStructural mb = new MockStructural();
291         
292         MBeanServer JavaDoc mbs = MBeanServerFactory.createMBeanServer();
293         ObjectName JavaDoc on = new ObjectName JavaDoc("oddjob:name=whatever");
294         mbs.registerMBean(mb, on);
295
296         Object JavaDoc proxy = ClientNode.createProxyFor(on, mbs, this, cr,
297                 new DummyNP());
298         assertTrue("Structural", proxy instanceof Structural);
299
300         ((Structural)proxy).addStructuralListener(ml);
301
302         ObjectName JavaDoc cName = new ObjectName JavaDoc("oddjob:name=child");
303         mbs.registerMBean(myChild, cName);
304         
305         // add child
306
mb.ac(cName);
307         
308         // give the notifications time.
309
WaitForChildren w = new WaitForChildren(proxy);
310         w.waitFor(1);
311         
312         assertEquals("source", proxy, ml.se.getSource());
313
314         // can't get hold of child proxy but compare toString
315
// to make sure proxy is doing it's job.
316
assertEquals("child", /* Real value */ myChild.toString(), /* Proxy Value */ ml.se.getChild().toString());
317         assertEquals("index", 0, ml.se.getIndex());
318         
319         mb.rc(cName);
320         
321         // wait for notifications
322
w.waitFor(0);
323         
324         assertEquals("source", proxy, ml.se.getSource());
325         assertEquals("child", myChild.toString(), ml.se.getChild().toString());
326         assertEquals("index", 0, ml.se.getIndex());
327     }
328
329     public void testIconic()
330     throws Exception JavaDoc {
331         class MyIconListener implements IconListener {
332             IconEvent ie;
333             public void iconEvent(IconEvent event) {
334                 ie = event;
335             }
336         };
337         MyIconListener ml = new MyIconListener();
338         
339         MockIconic mb = new MockIconic();
340         
341         MBeanServer JavaDoc mbs = MBeanServerFactory.createMBeanServer();
342         ObjectName JavaDoc on = new ObjectName JavaDoc("oddjob:name=whatever");
343         mbs.registerMBean(mb, on);
344
345         Object JavaDoc proxy = ClientNode.createProxyFor(on, mbs, this, cr,
346                 new DummyNP());
347         assertTrue("Iconic", proxy instanceof Iconic);
348
349         ((Iconic)proxy).addIconListener(ml);
350         mb.foo();
351                 
352         assertEquals("source", proxy, ml.ie.getSource());
353         assertEquals("id", "foo", ml.ie.getIconId());
354         assertEquals("tool tip", "foo", ((Iconic)proxy).iconForId("foo").getToolTip());
355     }
356
357     ///////////////// MBean getter setter tests //////////////////
358

359     // a bean with a property.
360
public static class Fred implements Serializable JavaDoc {
361         private static final long serialVersionUID = 20051117;
362         public String JavaDoc getFruit() {
363             return "apples";
364         }
365     }
366     
367     // a dyna class with one property but supports adding any.
368
public class MyDC implements DynaClass, Serializable JavaDoc {
369         private static final long serialVersionUID = 20051117;
370         public DynaProperty[] getDynaProperties() {
371             return new DynaProperty[] {
372                     new DynaProperty("fred", Fred.class),
373                 // new DynaProperty("description", Map.class)
374
};
375         }
376         public DynaProperty getDynaProperty(String JavaDoc arg0) {
377             return new DynaProperty(arg0);
378         }
379         public String JavaDoc getName() {
380             return "MyDynaClass";
381         }
382         public DynaBean newInstance() throws IllegalAccessException JavaDoc, InstantiationException JavaDoc {
383             throw new UnsupportedOperationException JavaDoc("newInstance");
384         }
385     }
386     
387     public class Bean implements DynaBean {
388         public boolean contains(String JavaDoc name, String JavaDoc key) {
389             logger.debug("contains(" + name + ", " + key + ")");
390             return false;
391         }
392         public Object JavaDoc get(String JavaDoc name) {
393             logger.debug("get(" + name + ")");
394             if ("fred".equals(name)) {
395                 return new Fred();
396             }
397             else if ("description".equals(name)) {
398                 Map JavaDoc m = new HashMap JavaDoc();
399                 m.put("fooled", "you");
400                 return m;
401             }
402             return null;
403         }
404         public Object JavaDoc get(String JavaDoc name, int index) {
405             logger.debug("get(" + name + ", " + index + ")");
406             return null;
407         }
408         public Object JavaDoc get(String JavaDoc name, String JavaDoc key) {
409             logger.debug("get(" + name + ", " + key + ")");
410             return null;
411         }
412         public DynaClass getDynaClass() {
413             logger.debug("getDynaClass");
414             return new MyDC();
415         }
416         public void remove(String JavaDoc name, String JavaDoc key) {
417             logger.debug("remove(" + name + ", " + key + ")");
418         }
419         public void set(String JavaDoc name, int index, Object JavaDoc value) {
420             logger.debug("set(" + name + ", " + index + ", " + value + ")");
421         }
422         
423         public void set(String JavaDoc name, Object JavaDoc value) {
424             logger.debug("set(" + name + ", " + value + ")");
425         }
426         
427         public void set(String JavaDoc name, String JavaDoc key, Object JavaDoc value) {
428             logger.debug("set(" + name + ", " + key + ", " + value + ")");
429         }
430     }
431     
432     public class MyDynamicMBean extends NotificationBroadcasterSupport JavaDoc implements DynamicMBean JavaDoc {
433         public Object JavaDoc getAttribute(String JavaDoc attribute) throws AttributeNotFoundException JavaDoc, MBeanException JavaDoc, ReflectionException JavaDoc {
434             logger.debug("MyDynamicMBean getting attribute [" + attribute + "]");
435             throw new UnsupportedOperationException JavaDoc();
436         }
437         public AttributeList JavaDoc getAttributes(String JavaDoc[] attributes) {
438             return null;
439         }
440         public MBeanInfo JavaDoc getMBeanInfo() {
441             return new MBeanInfo JavaDoc(this.getClass().getName(),
442                     "Test MBean",
443                     new MBeanAttributeInfo JavaDoc[0],
444                     new MBeanConstructorInfo JavaDoc[0],
445                     new MBeanOperationInfo JavaDoc[0],
446                     new MBeanNotificationInfo JavaDoc[0]);
447         }
448         public Object JavaDoc invoke(String JavaDoc actionName, Object JavaDoc[] arguments, String JavaDoc[] signature) throws MBeanException JavaDoc, ReflectionException JavaDoc {
449             logger.debug("MyDynamicMBean invoking [" + actionName + "]");
450             if ("toString".equals(actionName)) {
451                 return "MyDynamicMBean";
452             } else if ("resync".equals(actionName)){
453                 sendNotification(new Notification JavaDoc(OddjobMBean.RESYNC_STARTED_NOTIF_TYPE, this, 0));
454                 sendNotification(new Notification JavaDoc(OddjobMBean.RESYNC_FINISHED_NOTIF_TYPE, this, 0));
455                 return null;
456             } else if (SharedConstants.SERVER_INFO_METHOD.equals(actionName)){
457                 return new ServerInfo("foo",
458                         "//foo/", "foo",
459                         new Class JavaDoc[] { DynaBean.class },
460                         true, "foo2");
461             } else if ("toString".equals(actionName)){
462                 return "MyDynamicMBean";
463             } else if ("getDynaClass".equals(actionName)) {
464                 return new MyDC();
465             } else if ("get".equals(actionName)) {
466                 return new Fred();
467             } else {
468                 throw new MBeanException JavaDoc(
469                         new UnsupportedOperationException JavaDoc("Unsupported Method [" + actionName + "]"));
470             }
471         }
472         public void setAttribute(Attribute JavaDoc attribute) throws AttributeNotFoundException JavaDoc, InvalidAttributeValueException JavaDoc, MBeanException JavaDoc, ReflectionException JavaDoc {
473             throw new UnsupportedOperationException JavaDoc();
474         }
475         public AttributeList JavaDoc setAttributes(AttributeList JavaDoc attributes) {
476             throw new UnsupportedOperationException JavaDoc();
477         }
478         
479     }
480
481     // this test uses a dyna bean get
482
public void testSimpleGet() throws Exception JavaDoc {
483         MyDynamicMBean mb = new MyDynamicMBean();
484         MBeanServer JavaDoc mbs = MBeanServerFactory.createMBeanServer();
485         ObjectName JavaDoc on = new ObjectName JavaDoc("oddjob:name=whatever");
486         mbs.registerMBean(mb, on);
487
488         Object JavaDoc proxy = ClientNode.createProxyFor(on, mbs, this, cr,
489                 new DummyNP());
490         
491         BeanUtilsBeanHelper bubh = new BeanUtilsBeanHelper(
492                 BeanUtilsBean.getInstance());
493
494         String JavaDoc fruit = (String JavaDoc) bubh.getProperty(proxy, "fred.fruit");
495         assertEquals("apples", fruit);
496         
497         // test a component regsitry lookup
498
RegistryLookup lookup = new DefaultRegistryLookup(cr);
499         Object JavaDoc result;
500         // simple lookup
501
result = lookup.getProperty("this/foo.fred.fruit");
502         fruit = (String JavaDoc) result;
503         assertEquals("apples", fruit);
504         
505         // test a component regsitry nested lookup
506
// need to add a new level to create the new registry
507
ObjectName JavaDoc on2 = new ObjectName JavaDoc("oddjob:name=whatever2");
508         mbs.registerMBean(mb, on2);
509         ClientNode.createProxyFor(on2, (ClientNode)
510                 Proxy.getInvocationHandler(proxy));
511         fruit = (String JavaDoc) lookup.getProperty("this/foo/foo2.fred.fruit");
512         assertEquals("apples", fruit);
513     }
514
515     // and this test uses an OddjobMBean get.
516
public void testBean() throws Exception JavaDoc {
517         Object JavaDoc o = new Bean JavaDoc();
518         ServerModel sm = new ServerModel(
519                 "//whatever",
520                 new ThreadManager(),
521                 new InterfaceManagerFactory());
522         sm.setRoot(o);
523         ServerContext srvcon = new ServerContext(sm);
524         OddjobMBean mb = new OddjobMBean(o, null, srvcon);
525         
526         MBeanServer JavaDoc mbs = MBeanServerFactory.createMBeanServer();
527         ObjectName JavaDoc on = new ObjectName JavaDoc("oddjob:name=whatever");
528         mbs.registerMBean(mb, on);
529
530         Object JavaDoc proxy = ClientNode.createProxyFor(on, mbs, this, cr,
531                 new DummyNP());
532         assertNotNull(proxy);
533         
534         Map JavaDoc map = Describer.describe(proxy);
535         assertNotNull(map);
536         
537         logger.debug("Describe:\n" + MapType.propertiesFrom(map));
538         
539         BeanUtilsBeanHelper bubh = new BeanUtilsBeanHelper(
540                 BeanUtilsBean.getInstance());
541         
542         Object JavaDoc gotten = bubh.getProperty(proxy, "fred.fruit", String JavaDoc.class);
543         assertEquals("apples", gotten);
544     }
545     
546     ///////////////////////////////////////////
547

548     static void beanDump(MBeanServer JavaDoc mbs, ObjectName JavaDoc on)
549     throws ReflectionException JavaDoc, InstanceNotFoundException JavaDoc, IntrospectionException JavaDoc {
550         MBeanInfo JavaDoc info = mbs.getMBeanInfo(on);
551         MBeanOperationInfo JavaDoc[] opInfo = info.getOperations();
552         for (int i = 0; i < opInfo.length; ++i) {
553             logger.debug("Op: " + opInfo[i].getName());
554         }
555         MBeanAttributeInfo JavaDoc[] atInfo = info.getAttributes();
556         for (int i = 0; i < opInfo.length; ++i) {
557             logger.debug("At: " + atInfo[i].getName());
558         }
559     }
560 }
561
Popular Tags