1 8 9 package test.javax.management; 10 11 import java.lang.reflect.Method ; 12 import java.util.HashMap ; 13 import javax.management.AttributeNotFoundException ; 14 import javax.management.InstanceNotFoundException ; 15 import javax.management.MBeanException ; 16 import javax.management.MBeanRegistration ; 17 import javax.management.MBeanServer ; 18 import javax.management.MBeanServerBuilder ; 19 import javax.management.MBeanServerDelegate ; 20 import javax.management.ObjectName ; 21 import javax.management.ReflectionException ; 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 33 public class MBeanServerBuilderTest extends MX4JTestCase 34 { 35 private static final String INITIAL_BUILDER = "javax.management.builder.initial"; 36 37 public MBeanServerBuilderTest(String s) 38 { 39 super(s); 40 } 41 42 public void testDefaultBuilder() throws Exception 43 { 44 System.getProperties().remove(INITIAL_BUILDER); 45 MBeanServer server = newMBeanServer(); 46 if (!(server instanceof MX4JMBeanServer)) 47 fail("Wrong default server implementation"); 48 } 49 50 public void testCustomBuilder() throws Exception 51 { 52 try 53 { 54 System.setProperty(INITIAL_BUILDER, CustomBuilder.class.getName()); 55 MBeanServer server = newMBeanServer(); 56 if (!(server instanceof CustomMBeanServer)) 57 fail("Wrong custom server implementation"); 58 if (!server.isInstanceOf(new ObjectName ("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 68 { 69 ClassLoader jmxriLoader = createJMXRIWithMX4JImplClassLoader(); 70 71 Class jmxri_c_mBeanServerFactory = jmxriLoader.loadClass("javax.management.MBeanServerFactory"); 72 Method jmxri_m_newMBeanServer = jmxri_c_mBeanServerFactory.getMethod("newMBeanServer", new Class [0]); 73 74 System.getProperties().remove(INITIAL_BUILDER); 75 Object jmxri_MBeanServer = jmxri_m_newMBeanServer.invoke(null, new Object [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 oldContextLoader = Thread.currentThread().getContextClassLoader(); 82 try 83 { 84 System.setProperty(INITIAL_BUILDER, MX4JMBeanServerBuilder.class.getName()); 85 Thread.currentThread().setContextClassLoader(jmxriLoader); 86 Object mx4j_MBeanServer = jmxri_m_newMBeanServer.invoke(null, new Object [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 99 { 100 try 101 { 102 System.setProperty(INITIAL_BUILDER, ComplexBuilder.class.getName()); 103 MBeanServer server = newMBeanServer(); 104 if (!(server instanceof LoggingMBeanServer)) fail(); 105 server.registerMBean(new Simple(), new ObjectName (":mbean=simple")); 106 Object vendor = server.getAttribute(new ObjectName ("JMImplementation", "type", "MBeanServerDelegate"), "ImplementationVendor"); 107 if (!(vendor instanceof HashMap )) fail(); 108 if (((HashMap )vendor).size() != 4) fail(); 109 } 110 finally 111 { 112 System.getProperties().remove(INITIAL_BUILDER); 113 } 114 } 115 116 118 122 public static class CustomBuilder extends MBeanServerBuilder 123 { 124 public MBeanServer newMBeanServer(String defaultDomain, MBeanServer outer, MBeanServerDelegate delegate) 125 { 126 return new CustomMBeanServer(defaultDomain, outer, delegate); 127 } 128 129 public MBeanServerDelegate newMBeanServerDelegate() 130 { 131 return new CustomDelegate(); 132 } 133 } 134 135 138 public static class CustomDelegate extends MX4JMBeanServerDelegate 139 { 140 } 141 142 public static class CustomMBeanServer extends MX4JMBeanServer 143 { 144 public CustomMBeanServer(String defaultDomain, MBeanServer outer, MBeanServerDelegate 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 chain) 161 { 162 super(chain); 163 } 164 165 public MBeanServer newMBeanServer(String defaultDomain, MBeanServer outer, MBeanServerDelegate delegate) 166 { 167 LoggingMBeanServer external = new LoggingMBeanServer(); 168 MBeanServer 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 chain) 177 { 178 super(chain); 179 } 180 181 public MBeanServer newMBeanServer(String defaultDomain, MBeanServer outer, MBeanServerDelegate delegate) 182 { 183 TimingMBeanServer external = new TimingMBeanServer(); 184 MBeanServer 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 server) 193 { 194 super.setMBeanServer(server); 195 } 196 197 public Object getAttribute(ObjectName objectName, String attribute) 198 throws MBeanException , AttributeNotFoundException , InstanceNotFoundException , ReflectionException 199 { 200 HashMap map = (HashMap )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 server) 209 { 210 super.setMBeanServer(server); 211 } 212 213 public Object getAttribute(ObjectName objectName, String attribute) 214 throws MBeanException , AttributeNotFoundException , InstanceNotFoundException , ReflectionException 215 { 216 long start = System.currentTimeMillis(); 217 HashMap ret = (HashMap )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 (elapsed)); 222 return ret; 223 } 224 } 225 226 public static class InvocationCounterMBeanServer extends ChainedMBeanServer 227 { 228 private ThreadLocal getAttributeCount = new ThreadLocal () 229 { 230 protected Object initialValue() 231 { 232 return new Long (0); 233 } 234 }; 235 236 public InvocationCounterMBeanServer(MBeanServer server) 237 { 238 super(server); 239 } 240 241 public Object getAttribute(ObjectName objectName, String attribute) 242 throws MBeanException , AttributeNotFoundException , InstanceNotFoundException , ReflectionException 243 { 244 Long count = (Long )getAttributeCount.get(); 245 count = new Long (count.longValue() + 1); 246 getAttributeCount.set(count); 247 System.out.println("Counted: " + count); 248 249 HashMap map = new HashMap (); 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 262 { 263 public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception 264 { 265 if (!(server instanceof LoggingMBeanServer)) fail(); 266 return name; 267 } 268 269 public void postRegister(Boolean registrationDone) 270 { 271 } 272 273 public void preDeregister() throws Exception 274 { 275 } 276 277 public void postDeregister() 278 { 279 } 280 } 281 } 282 | Popular Tags |