KickJava   Java API By Example, From Geeks To Geeks.

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


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.lang.reflect.Method JavaDoc;
12 import java.util.HashMap JavaDoc;
13 import javax.management.AttributeNotFoundException JavaDoc;
14 import javax.management.InstanceNotFoundException JavaDoc;
15 import javax.management.MBeanException JavaDoc;
16 import javax.management.MBeanRegistration JavaDoc;
17 import javax.management.MBeanServer JavaDoc;
18 import javax.management.MBeanServerBuilder JavaDoc;
19 import javax.management.MBeanServerDelegate JavaDoc;
20 import javax.management.ObjectName JavaDoc;
21 import javax.management.ReflectionException JavaDoc;
22
23 import mx4j.server.ChainedMBeanServer;
24 import mx4j.server.ChainedMBeanServerBuilder;
25 import mx4j.server.MX4JMBeanServer;
26 import mx4j.server.MX4JMBeanServerBuilder;
27 import mx4j.server.MX4JMBeanServerDelegate;
28 import test.MX4JTestCase;
29
30 /**
31  * @version $Revision: 1.6 $
32  */

33 public class MBeanServerBuilderTest extends MX4JTestCase
34 {
35    private static final String JavaDoc INITIAL_BUILDER = "javax.management.builder.initial";
36
37    public MBeanServerBuilderTest(String JavaDoc s)
38    {
39       super(s);
40    }
41
42    public void testDefaultBuilder() throws Exception JavaDoc
43    {
44       System.getProperties().remove(INITIAL_BUILDER);
45       MBeanServer JavaDoc server = newMBeanServer();
46       if (!(server instanceof MX4JMBeanServer))
47          fail("Wrong default server implementation");
48    }
49
50    public void testCustomBuilder() throws Exception JavaDoc
51    {
52       try
53       {
54          System.setProperty(INITIAL_BUILDER, CustomBuilder.class.getName());
55          MBeanServer JavaDoc server = newMBeanServer();
56          if (!(server instanceof CustomMBeanServer))
57             fail("Wrong custom server implementation");
58          if (!server.isInstanceOf(new ObjectName JavaDoc("JMImplementation", "type", "MBeanServerDelegate"), CustomDelegate.class.getName()))
59             fail("wrong delegate implementation");
60       }
61       finally
62       {
63          System.getProperties().remove(INITIAL_BUILDER);
64       }
65    }
66
67    public void testMX4JunderJMXRI() throws Exception JavaDoc
68    {
69       ClassLoader JavaDoc jmxriLoader = createJMXRIWithMX4JImplClassLoader();
70
71       Class JavaDoc jmxri_c_mBeanServerFactory = jmxriLoader.loadClass("javax.management.MBeanServerFactory");
72       Method JavaDoc jmxri_m_newMBeanServer = jmxri_c_mBeanServerFactory.getMethod("newMBeanServer", new Class JavaDoc[0]);
73
74       System.getProperties().remove(INITIAL_BUILDER);
75       Object JavaDoc jmxri_MBeanServer = jmxri_m_newMBeanServer.invoke(null, new Object JavaDoc[0]);
76
77       boolean isJMXRImBeanServer = jmxri_MBeanServer.getClass().getName().startsWith("com.sun.jmx.");
78       if (!isJMXRImBeanServer)
79          fail("Failed to make use of JMXRI classes");
80
81       final ClassLoader JavaDoc oldContextLoader = Thread.currentThread().getContextClassLoader();
82       try
83       {
84          System.setProperty(INITIAL_BUILDER, MX4JMBeanServerBuilder.class.getName());
85          Thread.currentThread().setContextClassLoader(jmxriLoader);
86          Object JavaDoc mx4j_MBeanServer = jmxri_m_newMBeanServer.invoke(null, new Object JavaDoc[0]);
87          boolean isMX4JMBeanServer = mx4j_MBeanServer.getClass().getName().startsWith("mx4j.server.");
88          if (!isMX4JMBeanServer)
89             fail("Not using MX4J as specified by javax.management.builder.initial");
90       }
91       finally
92       {
93          System.getProperties().remove(INITIAL_BUILDER);
94          Thread.currentThread().setContextClassLoader(oldContextLoader);
95       }
96    }
97
98    public void testChainedMBeanServerBuilder() throws Exception JavaDoc
99    {
100       try
101       {
102          System.setProperty(INITIAL_BUILDER, ComplexBuilder.class.getName());
103          MBeanServer JavaDoc server = newMBeanServer();
104          if (!(server instanceof LoggingMBeanServer)) fail();
105          server.registerMBean(new Simple(), new ObjectName JavaDoc(":mbean=simple"));
106          Object JavaDoc vendor = server.getAttribute(new ObjectName JavaDoc("JMImplementation", "type", "MBeanServerDelegate"), "ImplementationVendor");
107          if (!(vendor instanceof HashMap JavaDoc)) fail();
108          if (((HashMap JavaDoc)vendor).size() != 4) fail();
109       }
110       finally
111       {
112          System.getProperties().remove(INITIAL_BUILDER);
113       }
114    }
115
116    // Support classes
117

118    /**
119     * This is a simple terminal builder, that is a builder that creates a full MBeanServer implementation.
120     * It cannot be used to chain other builders, it can only be used as the last builder in the chain.
121     */

122    public static class CustomBuilder extends MBeanServerBuilder JavaDoc
123    {
124       public MBeanServer JavaDoc newMBeanServer(String JavaDoc defaultDomain, MBeanServer JavaDoc outer, MBeanServerDelegate JavaDoc delegate)
125       {
126          return new CustomMBeanServer(defaultDomain, outer, delegate);
127       }
128
129       public MBeanServerDelegate JavaDoc newMBeanServerDelegate()
130       {
131          return new CustomDelegate();
132       }
133    }
134
135    /**
136     * Custom delegate class, for testing.
137     */

138    public static class CustomDelegate extends MX4JMBeanServerDelegate
139    {
140    }
141
142    public static class CustomMBeanServer extends MX4JMBeanServer
143    {
144       public CustomMBeanServer(String JavaDoc defaultDomain, MBeanServer JavaDoc outer, MBeanServerDelegate JavaDoc delegate)
145       {
146          super(defaultDomain, outer, delegate);
147       }
148    }
149
150    public static class ComplexBuilder extends ChainedMBeanServerBuilder
151    {
152       public ComplexBuilder()
153       {
154          super(new LoggingBuilder(new PerformanceBuilder(new MX4JMBeanServerBuilder())));
155       }
156    }
157
158    public static class LoggingBuilder extends ChainedMBeanServerBuilder
159    {
160       public LoggingBuilder(MBeanServerBuilder JavaDoc chain)
161       {
162          super(chain);
163       }
164
165       public MBeanServer JavaDoc newMBeanServer(String JavaDoc defaultDomain, MBeanServer JavaDoc outer, MBeanServerDelegate JavaDoc delegate)
166       {
167          LoggingMBeanServer external = new LoggingMBeanServer();
168          MBeanServer JavaDoc nested = getMBeanServerBuilder().newMBeanServer(defaultDomain, outer == null ? external : outer, delegate);
169          external.setMBeanServer(nested);
170          return external;
171       }
172    }
173
174    public static class PerformanceBuilder extends ChainedMBeanServerBuilder
175    {
176       public PerformanceBuilder(MBeanServerBuilder JavaDoc chain)
177       {
178          super(chain);
179       }
180
181       public MBeanServer JavaDoc newMBeanServer(String JavaDoc defaultDomain, MBeanServer JavaDoc outer, MBeanServerDelegate JavaDoc delegate)
182       {
183          TimingMBeanServer external = new TimingMBeanServer();
184          MBeanServer JavaDoc nested = getMBeanServerBuilder().newMBeanServer(defaultDomain, outer == null ? external : outer, delegate);
185          external.setMBeanServer(new InvocationCounterMBeanServer(nested));
186          return external;
187       }
188    }
189
190    public static class LoggingMBeanServer extends ChainedMBeanServer
191    {
192       protected void setMBeanServer(MBeanServer JavaDoc server)
193       {
194          super.setMBeanServer(server);
195       }
196
197       public Object JavaDoc getAttribute(ObjectName JavaDoc objectName, String JavaDoc attribute)
198               throws MBeanException JavaDoc, AttributeNotFoundException JavaDoc, InstanceNotFoundException JavaDoc, ReflectionException JavaDoc
199       {
200          HashMap JavaDoc map = (HashMap JavaDoc)super.getAttribute(objectName, attribute);
201          map.put("logged", "logged");
202          return map;
203       }
204    }
205
206    public static class TimingMBeanServer extends ChainedMBeanServer
207    {
208       protected void setMBeanServer(MBeanServer JavaDoc server)
209       {
210          super.setMBeanServer(server);
211       }
212
213       public Object JavaDoc getAttribute(ObjectName JavaDoc objectName, String JavaDoc attribute)
214               throws MBeanException JavaDoc, AttributeNotFoundException JavaDoc, InstanceNotFoundException JavaDoc, ReflectionException JavaDoc
215       {
216          long start = System.currentTimeMillis();
217          HashMap JavaDoc ret = (HashMap JavaDoc)super.getAttribute(objectName, attribute);
218          long end = System.currentTimeMillis();
219          long elapsed = end - start;
220          System.out.println("Elapsed: " + elapsed);
221          ret.put("elapsed", new Long JavaDoc(elapsed));
222          return ret;
223       }
224    }
225
226    public static class InvocationCounterMBeanServer extends ChainedMBeanServer
227    {
228       private ThreadLocal JavaDoc getAttributeCount = new ThreadLocal JavaDoc()
229       {
230          protected Object JavaDoc initialValue()
231          {
232             return new Long JavaDoc(0);
233          }
234       };
235
236       public InvocationCounterMBeanServer(MBeanServer JavaDoc server)
237       {
238          super(server);
239       }
240
241       public Object JavaDoc getAttribute(ObjectName JavaDoc objectName, String JavaDoc attribute)
242               throws MBeanException JavaDoc, AttributeNotFoundException JavaDoc, InstanceNotFoundException JavaDoc, ReflectionException JavaDoc
243       {
244          Long JavaDoc count = (Long JavaDoc)getAttributeCount.get();
245          count = new Long JavaDoc(count.longValue() + 1);
246          getAttributeCount.set(count);
247          System.out.println("Counted: " + count);
248
249          HashMap JavaDoc map = new HashMap JavaDoc();
250          map.put("result", super.getAttribute(objectName, attribute));
251          map.put("count", count);
252
253          return map;
254       }
255    }
256
257    public interface SimpleMBean
258    {
259    }
260
261    public static class Simple implements SimpleMBean, MBeanRegistration JavaDoc
262    {
263       public ObjectName JavaDoc preRegister(MBeanServer JavaDoc server, ObjectName JavaDoc name) throws Exception JavaDoc
264       {
265          if (!(server instanceof LoggingMBeanServer)) fail();
266          return name;
267       }
268
269       public void postRegister(Boolean JavaDoc registrationDone)
270       {
271       }
272
273       public void preDeregister() throws Exception JavaDoc
274       {
275       }
276
277       public void postDeregister()
278       {
279       }
280    }
281 }
282
Popular Tags