KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > test > javax > management > remote > rmi > RMIInteroperabilityTest


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.remote.rmi;
10
11 import java.lang.reflect.Constructor JavaDoc;
12 import java.lang.reflect.Method JavaDoc;
13 import java.util.Map JavaDoc;
14 import javax.management.MBeanInfo JavaDoc;
15 import javax.management.MBeanServer JavaDoc;
16 import javax.management.MBeanServerConnection JavaDoc;
17 import javax.management.MBeanServerFactory JavaDoc;
18 import javax.management.Notification JavaDoc;
19 import javax.management.NotificationFilter JavaDoc;
20 import javax.management.NotificationListener JavaDoc;
21 import javax.management.ObjectName JavaDoc;
22 import javax.management.loading.MLet JavaDoc;
23 import javax.management.remote.JMXConnector JavaDoc;
24 import javax.management.remote.JMXConnectorFactory JavaDoc;
25 import javax.management.remote.JMXConnectorServer JavaDoc;
26 import javax.management.remote.JMXConnectorServerFactory JavaDoc;
27 import javax.management.remote.JMXServiceURL JavaDoc;
28
29 import test.MX4JTestCase;
30 import test.MutableObject;
31
32 /**
33  * @version $Revision: 1.4 $
34  */

35 public class RMIInteroperabilityTest extends MX4JTestCase
36 {
37    public RMIInteroperabilityTest(String JavaDoc s)
38    {
39       super(s);
40    }
41
42    private Object JavaDoc startJMXRIRMIConnectorServer() throws Exception JavaDoc
43    {
44       ClassLoader JavaDoc ri = createRemoteJMXRIWithTestsClassLoader();
45
46       Class JavaDoc mbeanServerFactoryClass = ri.loadClass(MBeanServerFactory JavaDoc.class.getName());
47       Method JavaDoc method = mbeanServerFactoryClass.getMethod("newMBeanServer", new Class JavaDoc[0]);
48       Object JavaDoc mbeanServer = method.invoke(null, new Object JavaDoc[0]);
49       if (!mbeanServer.getClass().getName().startsWith("com.sun")) fail();
50       Class JavaDoc mbeanServerClass = ri.loadClass(MBeanServer JavaDoc.class.getName());
51
52       Class JavaDoc serviceURLClass = ri.loadClass(JMXServiceURL JavaDoc.class.getName());
53       Constructor JavaDoc constructor = serviceURLClass.getConstructor(new Class JavaDoc[]{String JavaDoc.class});
54       Object JavaDoc serviceURL = constructor.newInstance(new Object JavaDoc[]{"service:jmx:rmi://localhost"});
55       Class JavaDoc cntorServerFactoryClass = ri.loadClass(JMXConnectorServerFactory JavaDoc.class.getName());
56       method = cntorServerFactoryClass.getMethod("newJMXConnectorServer", new Class JavaDoc[]{serviceURLClass, Map JavaDoc.class, mbeanServerClass});
57       Object JavaDoc cntorServer = method.invoke(null, new Object JavaDoc[]{serviceURL, null, mbeanServer});
58
59       method = cntorServer.getClass().getMethod("start", new Class JavaDoc[0]);
60       method.invoke(cntorServer, new Object JavaDoc[0]);
61
62       return cntorServer;
63    }
64
65    public void testJMXRIOnServerMX4JOnClientGetMBeanInfo() throws Exception JavaDoc
66    {
67       Object JavaDoc cntorServer = startJMXRIRMIConnectorServer();
68       Method JavaDoc method = cntorServer.getClass().getMethod("getAddress", new Class JavaDoc[0]);
69       Object JavaDoc address = method.invoke(cntorServer, new Object JavaDoc[0]);
70       String JavaDoc url = address.toString();
71
72       JMXConnector JavaDoc cntor = JMXConnectorFactory.connect(new JMXServiceURL JavaDoc(url));
73       MBeanServerConnection JavaDoc cntion = cntor.getMBeanServerConnection();
74
75       MBeanInfo JavaDoc info = cntion.getMBeanInfo(ObjectName.getInstance("JMImplementation", "type", "MBeanServerDelegate"));
76       assertNotNull(info);
77
78       cntor.close();
79
80       method = cntorServer.getClass().getMethod("stop", new Class JavaDoc[0]);
81       method.invoke(cntorServer, new Object JavaDoc[0]);
82       sleep(2000);
83    }
84
85    public void testJMXRIOnServerMX4JOnClientNotificationReceiving() throws Exception JavaDoc
86    {
87       Object JavaDoc cntorServer = startJMXRIRMIConnectorServer();
88       Method JavaDoc method = cntorServer.getClass().getMethod("getAddress", new Class JavaDoc[0]);
89       Object JavaDoc address = method.invoke(cntorServer, new Object JavaDoc[0]);
90       String JavaDoc url = address.toString();
91
92       JMXConnector JavaDoc cntor = JMXConnectorFactory.connect(new JMXServiceURL JavaDoc(url));
93       MBeanServerConnection JavaDoc cntion = cntor.getMBeanServerConnection();
94
95       InteroperabilityListener listener = new InteroperabilityListener();
96       ObjectName JavaDoc delegateName = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate");
97       cntion.addNotificationListener(delegateName, listener, null, null);
98       sleep(1000);
99
100       ObjectName JavaDoc name = ObjectName.getInstance(":mbean=mlet");
101       cntion.createMBean(MLet JavaDoc.class.getName(), name, null);
102       sleep(1000);
103       Notification JavaDoc notification = (Notification JavaDoc)listener.get();
104       assertNotNull(notification);
105       listener.reset();
106
107       cntion.removeNotificationListener(delegateName, listener);
108
109       cntion.unregisterMBean(name);
110       sleep(1000);
111
112       notification = (Notification JavaDoc)listener.get();
113       assertNull(notification);
114
115       cntor.close();
116
117       method = cntorServer.getClass().getMethod("stop", new Class JavaDoc[0]);
118       method.invoke(cntorServer, new Object JavaDoc[0]);
119       sleep(2000);
120    }
121
122    private Object JavaDoc connectJMXRIConnector(ClassLoader JavaDoc ri, String JavaDoc url) throws Exception JavaDoc
123    {
124       Class JavaDoc serviceURLClass = ri.loadClass(JMXServiceURL JavaDoc.class.getName());
125       Constructor JavaDoc constructor = serviceURLClass.getConstructor(new Class JavaDoc[]{String JavaDoc.class});
126       Object JavaDoc serviceURL = constructor.newInstance(new Object JavaDoc[]{url});
127       Class JavaDoc cntorFactoryClass = ri.loadClass(JMXConnectorFactory JavaDoc.class.getName());
128       Method JavaDoc method = cntorFactoryClass.getMethod("connect", new Class JavaDoc[]{serviceURLClass});
129       return method.invoke(null, new Object JavaDoc[]{serviceURL});
130    }
131
132    public void testMX4JOnServerJMXRIOnClientGetMBeanInfo() throws Exception JavaDoc
133    {
134       MBeanServer JavaDoc server = newMBeanServer();
135       JMXServiceURL JavaDoc url = new JMXServiceURL JavaDoc("service:jmx:rmi://localhost");
136       JMXConnectorServer JavaDoc cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
137       cntorServer.start();
138       url = cntorServer.getAddress();
139
140       ClassLoader JavaDoc ri = createRemoteJMXRIWithTestsClassLoader();
141       ClassLoader JavaDoc tccl = Thread.currentThread().getContextClassLoader();
142       Thread.currentThread().setContextClassLoader(ri);
143       Object JavaDoc cntor = connectJMXRIConnector(ri, url.toString());
144
145       Method JavaDoc method = cntor.getClass().getMethod("getMBeanServerConnection", new Class JavaDoc[0]);
146       Object JavaDoc cntion = method.invoke(cntor, new Object JavaDoc[0]);
147       Class JavaDoc cntionClass = ri.loadClass(MBeanServerConnection JavaDoc.class.getName());
148
149       Class JavaDoc objectNameClass = ri.loadClass(ObjectName JavaDoc.class.getName());
150       method = objectNameClass.getMethod("getInstance", new Class JavaDoc[]{String JavaDoc.class});
151       Object JavaDoc objectName = method.invoke(null, new Object JavaDoc[]{"JMImplementation:type=MBeanServerDelegate"});
152       method = cntionClass.getMethod("getMBeanInfo", new Class JavaDoc[]{objectNameClass});
153       Object JavaDoc info = method.invoke(cntion, new Object JavaDoc[]{objectName});
154       assertNotNull(info);
155
156       method = cntor.getClass().getMethod("close", new Class JavaDoc[0]);
157       method.invoke(cntor, new Object JavaDoc[0]);
158
159       Thread.currentThread().setContextClassLoader(tccl);
160       cntorServer.stop();
161       sleep(2000);
162    }
163
164    public void testMX4JOnServerJMXRIOnClientNotificationReceiving() throws Exception JavaDoc
165    {
166       MBeanServer JavaDoc server = newMBeanServer();
167       JMXServiceURL JavaDoc url = new JMXServiceURL JavaDoc("service:jmx:rmi://localhost");
168       JMXConnectorServer JavaDoc cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
169       cntorServer.start();
170       url = cntorServer.getAddress();
171
172       ClassLoader JavaDoc ri = createRemoteJMXRIWithTestsClassLoader();
173       ClassLoader JavaDoc tccl = Thread.currentThread().getContextClassLoader();
174       Thread.currentThread().setContextClassLoader(ri);
175       Object JavaDoc cntor = connectJMXRIConnector(ri, url.toString());
176
177       Method JavaDoc method = cntor.getClass().getMethod("getMBeanServerConnection", new Class JavaDoc[0]);
178       Object JavaDoc cntion = method.invoke(cntor, new Object JavaDoc[0]);
179       Class JavaDoc cntionClass = ri.loadClass(MBeanServerConnection JavaDoc.class.getName());
180
181       Class JavaDoc objectNameClass = ri.loadClass(ObjectName JavaDoc.class.getName());
182       method = objectNameClass.getMethod("getInstance", new Class JavaDoc[]{String JavaDoc.class});
183       Object JavaDoc delegateName = method.invoke(null, new Object JavaDoc[]{"JMImplementation:type=MBeanServerDelegate"});
184       Class JavaDoc notificationListenerClass = ri.loadClass(NotificationListener JavaDoc.class.getName());
185       Class JavaDoc notificationFilterClass = ri.loadClass(NotificationFilter JavaDoc.class.getName());
186       Object JavaDoc listener = ri.loadClass(InteroperabilityListener.class.getName()).newInstance();
187       method = cntionClass.getMethod("addNotificationListener", new Class JavaDoc[]{objectNameClass, notificationListenerClass, notificationFilterClass, Object JavaDoc.class});
188       method.invoke(cntion, new Object JavaDoc[]{delegateName, listener, null, null});
189       sleep(1000);
190
191       method = objectNameClass.getMethod("getInstance", new Class JavaDoc[]{String JavaDoc.class});
192       Object JavaDoc mletName = method.invoke(null, new Object JavaDoc[]{":mbean=mlet"});
193
194       method = cntionClass.getMethod("createMBean", new Class JavaDoc[]{String JavaDoc.class, objectNameClass, objectNameClass});
195       method.invoke(cntion, new Object JavaDoc[]{MLet JavaDoc.class.getName(), mletName, null});
196       sleep(1000);
197
198       method = listener.getClass().getMethod("get", new Class JavaDoc[0]);
199       Object JavaDoc notification = method.invoke(listener, new Object JavaDoc[0]);
200       assertNotNull(notification);
201
202       method = listener.getClass().getMethod("reset", new Class JavaDoc[0]);
203       method.invoke(listener, new Object JavaDoc[0]);
204
205       method = cntionClass.getMethod("removeNotificationListener", new Class JavaDoc[]{objectNameClass, notificationListenerClass});
206       method.invoke(cntion, new Object JavaDoc[]{delegateName, listener});
207
208       method = cntionClass.getMethod("unregisterMBean", new Class JavaDoc[]{objectNameClass});
209       method.invoke(cntion, new Object JavaDoc[]{mletName});
210       sleep(1000);
211
212       method = listener.getClass().getMethod("get", new Class JavaDoc[0]);
213       notification = method.invoke(listener, new Object JavaDoc[0]);
214       assertNull(notification);
215
216       method = cntor.getClass().getMethod("close", new Class JavaDoc[0]);
217       method.invoke(cntor, new Object JavaDoc[0]);
218
219       Thread.currentThread().setContextClassLoader(tccl);
220       cntorServer.stop();
221       sleep(2000);
222    }
223
224    public static class InteroperabilityListener implements NotificationListener JavaDoc
225    {
226       private final MutableObject holder;
227
228       public InteroperabilityListener()
229       {
230          this.holder = new MutableObject(null);
231       }
232
233       public void handleNotification(Notification JavaDoc notification, Object JavaDoc handback)
234       {
235          holder.set(notification);
236       }
237
238       public void reset()
239       {
240          holder.set(null);
241       }
242
243       public Object JavaDoc get()
244       {
245          return holder.get();
246       }
247    }
248 }
249
Popular Tags