1 22 package org.jboss.test.classloader.circularity.test; 23 24 import java.lang.reflect.Method ; 25 import java.lang.reflect.Constructor ; 26 import java.lang.reflect.UndeclaredThrowableException ; 27 import java.net.URL ; 28 29 import org.jboss.logging.Logger; 30 import org.jboss.mx.loading.UnifiedClassLoader; 31 import org.jboss.mx.loading.UnifiedClassLoader3; 32 import org.jboss.mx.loading.UnifiedLoaderRepository3; 33 34 import EDU.oswego.cs.dl.util.concurrent.CyclicBarrier; 35 36 45 public class CircularLoadTests 46 { 47 private static Logger log = Logger.getLogger(CircularLoadTests.class); 48 49 private CyclicBarrier setupBarrier = new CyclicBarrier(3); 50 51 public CircularLoadTests() 52 { 53 } 54 55 77 public void testLinkageError() throws Exception 78 { 79 log.info("Begin testLinkageError"); 80 UnifiedLoaderRepository3 repository = new UnifiedLoaderRepository3(); 81 Class thisClass = getClass(); 82 UnifiedClassLoader thisUCL = (UnifiedClassLoader) thisClass.getClassLoader(); 83 URL origURL = thisUCL.getOrigURL(); 84 log.info("Service origURL="+origURL); 85 URL j0 = new URL (origURL, "le0.jar"); 86 log.info("j0 = "+j0); 87 URL j1 = new URL (origURL, "le1.jar"); 88 log.info("j1 = "+j1); 89 final UnifiedClassLoader3 ucl0 = new UnifiedClassLoader3(j0); 90 final UnifiedClassLoader3 ucl1 = new UnifiedClassLoader3(j1); 91 final UnifiedClassLoader3 ucl2 = new UnifiedClassLoader3(origURL); 92 repository.addClassLoader(ucl0); 93 repository.addClassLoader(ucl1); 94 repository.addClassLoader(ucl2); 95 96 try 97 { 98 Class baseClass = ucl2.loadClass("org.jboss.test.classloader.circularity.support.Base"); 100 log.info("Base.CS: "+baseClass.getClass().getProtectionDomain().getCodeSource()); 101 102 Class userOfBaseClass = ucl0.loadClass("org.jboss.test.classloader.circularity.support.UserOfBase"); 104 Class [] noSig = {}; 105 Constructor ctor0 = userOfBaseClass.getConstructor(noSig); 106 Object [] noArgs = {}; 107 Object userOfBase = ctor0.newInstance(noArgs); 108 log.info("UserOfBase.CS: "+userOfBase.getClass().getProtectionDomain().getCodeSource()); 109 110 Class supportClass = ucl1.loadClass("org.jboss.test.classloader.circularity.support.Support"); 112 Constructor ctor1 = supportClass.getConstructor(noSig); 113 Object support = ctor1.newInstance(noArgs); 114 log.info("Support.CS: "+support.getClass().getProtectionDomain().getCodeSource()); 115 116 Class [] sig = {supportClass}; 118 Method testBase = userOfBaseClass.getMethod("testBase", sig); 119 log.info(testBase.toString()); 120 Object [] args = {support}; 121 testBase.invoke(userOfBase, args); 122 } 123 catch(Exception e) 124 { 125 log.error("Failed", e); 126 throw e; 127 } 128 catch(Throwable e) 129 { 130 log.error("Failed", e); 131 throw new UndeclaredThrowableException (e); 132 } 133 log.info("End testLinkageError"); 134 } 135 136 144 public void testPackageProtected() throws Exception 145 { 146 log.info("Begin testPackageProtected"); 147 UnifiedLoaderRepository3 repository = new UnifiedLoaderRepository3(); 148 Class thisClass = getClass(); 149 UnifiedClassLoader thisUCL = (UnifiedClassLoader) thisClass.getClassLoader(); 150 URL origURL = thisUCL.getOrigURL(); 151 log.info("Service origURL="+origURL); 152 URL j0 = new URL (origURL, "login.jar"); 153 log.info("j0 = "+j0); 154 URL j1 = new URL (origURL, "usrmgr.jar"); 155 log.info("j1 = "+j1); 156 URL util = new URL (origURL, "cl-util.jar"); 157 log.info("util = "+j1); 158 final UnifiedClassLoader3 libs = new UnifiedClassLoader3(origURL); 159 final UnifiedClassLoader3 ucl0 = libs; 160 final UnifiedClassLoader3 ucl1 = libs; 161 repository.addClassLoader(libs); 162 libs.addURL(util); 163 libs.addURL(j0); 164 libs.addURL(j1); 165 166 try 167 { 168 Class c0 = ucl0.loadClass("org.jboss.test.classloader.circularity.support.UserOfLoginInfo"); 170 Class [] ctorsig0 = {String .class, String .class}; 171 Constructor ctor0 = c0.getConstructor(ctorsig0); 172 Object [] args0 = {"jduke", "theduke"}; 173 Object o0 = ctor0.newInstance(args0); 174 log.info("UserOfLoginInfo.CS: "+o0.getClass().getProtectionDomain().getCodeSource()); 175 176 Class c1 = ucl1.loadClass("org.jboss.test.classloader.circularity.support.UserOfUsrMgr"); 178 Class [] ctorsig1 = {String .class, String .class}; 179 Constructor ctor1 = c1.getConstructor(ctorsig1); 180 Object [] args1 = {"jduke", "theduke"}; 181 Object o1 = ctor1.newInstance(args1); 182 log.info("UserOfUsrMgr.CS: "+o1.getClass().getProtectionDomain().getCodeSource()); 183 184 char[] password = "theduke2".toCharArray(); 186 Class [] sig = {password.getClass()}; 187 Method changePassword = c1.getMethod("changePassword", sig); 188 log.info(changePassword.toString()); 189 Object [] args = {password}; 190 changePassword.invoke(o1, args); 191 } 192 catch(Exception e) 193 { 194 log.error("Failed", e); 195 throw e; 196 } 197 log.info("End testPackageProtected"); 198 } 199 200 205 public void testDuplicateClass() throws Exception 206 { 207 log.info("Begin testDuplicateClass"); 208 UnifiedLoaderRepository3 repository = new UnifiedLoaderRepository3(); 209 Class thisClass = getClass(); 210 UnifiedClassLoader thisUCL = (UnifiedClassLoader) thisClass.getClassLoader(); 211 URL origURL = thisUCL.getOrigURL(); 212 log.info("Service origURL="+origURL); 213 URL j0 = new URL (origURL, "any0.jar"); 214 log.info("j0 = "+j0); 215 URL j1 = new URL (origURL, "any1.jar"); 216 log.info("j1 = "+j1); 217 final UnifiedClassLoader3 ucl0 = new UnifiedClassLoader3(j0); 218 final UnifiedClassLoader3 ucl1 = new UnifiedClassLoader3(j1); 219 repository.addClassLoader(ucl0); 220 repository.addClassLoader(ucl1); 221 222 Class c0 = ucl0.loadClass("org.jboss.test.classloader.circularity.support.Class0"); 223 log.info("Class0.CS: "+c0.getProtectionDomain().getCodeSource()); 224 Class c2 = ucl1.loadClass("org.jboss.test.classloader.circularity.support.Class2"); 225 log.info("Class2.CS: "+c2.getProtectionDomain().getCodeSource()); 226 Class base = ucl0.loadClass("org.jboss.test.classloader.circularity.support.Base"); 227 Class [] sig = {}; 228 Method run = base.getMethod("run", sig); 229 Object [] empty = {}; 230 run.invoke(null, empty); 231 log.info("End testDuplicateClass"); 232 } 233 234 243 public void testUCLOwner() throws Exception 244 { 245 UnifiedLoaderRepository3 repository = new UnifiedLoaderRepository3(); 246 Class thisClass = getClass(); 247 UnifiedClassLoader thisUCL = (UnifiedClassLoader) thisClass.getClassLoader(); 248 URL origURL = thisUCL.getOrigURL(); 249 log.info("Service origURL="+origURL); 250 URL j0 = new URL (origURL, "j0.jar"); 251 log.info("j0 = "+j0); 252 URL j1 = new URL (origURL, "j2.jar"); 253 log.info("j1 = "+j1); 254 final UnifiedClassLoader3 ucl0 = new UnifiedClassLoader3(j0); 255 final UnifiedClassLoader3 ucl1 = new UnifiedClassLoader3(j1); 256 repository.addClassLoader(ucl0); 257 repository.addClassLoader(ucl1); 258 259 LoadThread t0 = new LoadThread("org.jboss.test.classloader.circularity.supportx.Class2", 261 ucl0, "testUCLOwner.T0"); 262 t0.start(); 263 t0.join(5000); 265 if( t0.loadedClass != null || t0.loadError == null ) 266 { 267 log.error("T0 failed as no class should have been found, loadedClass="+t0.loadedClass); 268 throw new IllegalStateException ("T0 failed as no class should have been found"); 269 } 270 271 LoadThread t1 = new LoadThread("org.jboss.test.classloader.circularity.support.Class2", 272 ucl1, "testUCLOwner.T1"); 273 t1.start(); 274 t1.join(5000); 276 if( t1.loadedClass == null || t1.loadError != null ) 277 { 278 log.error("T1 failed to load Class2", t1.loadError); 279 throw new IllegalStateException ("T1 failed to load Class2"); 280 } 281 } 282 283 288 public void testMissingSuperClass() throws Exception 289 { 290 UnifiedLoaderRepository3 repository = new UnifiedLoaderRepository3(); 291 Class thisClass = getClass(); 292 UnifiedClassLoader thisUCL = (UnifiedClassLoader) thisClass.getClassLoader(); 293 URL origURL = thisUCL.getOrigURL(); 294 log.info("Service origURL="+origURL); 295 URL j0 = new URL (origURL, "j0.jar"); 296 log.info("j0 = "+j0); 297 URL j3 = new URL (origURL, "j3.jar"); 298 log.info("j3 = "+j3); 299 final UnifiedClassLoader3 ucl0 = new UnifiedClassLoader3(j0); 300 final UnifiedClassLoader3 ucl1 = new UnifiedClassLoader3(j3); 301 repository.addClassLoader(ucl0); 302 repository.addClassLoader(ucl1); 303 304 LoadThread t0 = new LoadThread("org.jboss.test.classloader.circularity.support.Derived", 305 ucl0, "testMissingSuperClass.T0"); 306 t0.start(); 307 t0.join(5000); 309 if( t0.loadedClass != null || t0.loadError == null ) 310 { 311 log.error("T0 failed as no class should have been found"); 312 throw new IllegalStateException ("T0 failed as no class should have been found"); 313 } 314 log.debug("Load of Derivied failed as expected", t0.loadError); 315 } 316 317 327 public void testLoading() throws Exception 328 { 329 UnifiedLoaderRepository3 repository = new UnifiedLoaderRepository3(); 330 Class thisClass = getClass(); 331 UnifiedClassLoader thisUCL = (UnifiedClassLoader) thisClass.getClassLoader(); 332 URL origURL = thisUCL.getOrigURL(); 333 log.info("Service origURL="+origURL); 334 URL j0 = new URL (origURL, "j0.jar"); 335 log.info("j0 = "+j0); 336 URL j1 = new URL (origURL, "j1.jar"); 337 log.info("j1 = "+j1); 338 URL j2 = new URL (origURL, "j2.jar"); 339 log.info("j2 = "+j2); 340 final UnifiedLoader ucl0 = new UnifiedLoader(j0); 341 final UnifiedLoader ucl1 = new UnifiedLoader(j1); 342 final UnifiedLoader ucl2 = new UnifiedLoader(j2); 343 repository.addClassLoader(ucl0); 344 repository.addClassLoader(ucl1); 345 repository.addClassLoader(ucl2); 346 347 LoadThread t0 = new LoadThread("org.jboss.test.classloader.circularity.support.Class2", 348 ucl0, "testLoading.T0"); 349 LoadThread t1 = new LoadThread("org.jboss.test.classloader.circularity.support.Class0", 350 ucl1, "testLoading.T1"); 351 LoadThread t2 = new LoadThread("org.jboss.test.classloader.circularity.support.Class1", 352 ucl2, "testLoading.T2"); 353 t0.start(); 354 t1.start(); 355 t2.start(); 356 boolean ok = true; 358 t0.join(5000); 359 if( t0.loadedClass == null || t0.loadError != null ) 360 { 361 log.error("T0 failed", t0.loadError); 362 ok = false; 363 } 364 t1.join(5000); 365 if( t1.loadedClass == null || t1.loadError != null ) 366 { 367 log.error("T1 failed", t1.loadError); 368 ok = false; 369 } 370 t2.join(5000); 371 if( t2.loadedClass == null || t2.loadError != null ) 372 { 373 log.error("T2 failed", t2.loadError); 374 ok = false; 375 } 376 if( ok == false ) 377 throw new IllegalStateException ("Failed to load Class0..Class2"); 378 } 379 380 static class LoadThread extends Thread 381 { 382 String classname; 383 ClassLoader loader; 384 Class loadedClass; 385 Throwable loadError; 386 387 LoadThread(String classname, ClassLoader loader, String name) 388 { 389 super(name); 390 this.classname = classname; 391 this.loader = loader; 392 } 393 394 public void run() 395 { 396 try 397 { 398 loadedClass = loader.loadClass(classname); 399 } 400 catch(Throwable t) 401 { 402 loadError = t; 403 } 404 } 405 } 406 407 public class UnifiedLoader extends UnifiedClassLoader3 408 { 409 private boolean enteredBarrier; 410 public UnifiedLoader(URL url) 411 { 412 super(url); 413 } 414 415 public synchronized Class loadClass(String name, boolean resolve) 416 throws ClassNotFoundException 417 { 418 try 419 { 420 if( enteredBarrier == false ) 422 setupBarrier.barrier(); 423 enteredBarrier = true; 424 } 425 catch(InterruptedException e) 426 { 427 throw new ClassNotFoundException ("Failed due to InterruptedException"); 428 } 429 return super.loadClass(name, false); 430 } 431 432 } 433 } 434 | Popular Tags |