You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

WeavingURLClassLoaderTest.java 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. /* *******************************************************************
  2. * Copyright (c) 2004 IBM Corporation
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * Matthew Webster initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.loadtime;
  13. import java.io.File;
  14. import java.lang.reflect.InvocationTargetException;
  15. import java.lang.reflect.Method;
  16. import java.net.URL;
  17. import java.util.Enumeration;
  18. import java.util.Properties;
  19. import org.aspectj.bridge.AbortException;
  20. import org.aspectj.testing.util.TestUtil.TestError;
  21. import org.aspectj.util.FileUtil;
  22. import org.aspectj.weaver.tools.WeavingAdaptor;
  23. import junit.framework.TestCase;
  24. /**
  25. * @author websterm
  26. *
  27. */
  28. public class WeavingURLClassLoaderTest extends TestCase {
  29. private final static String TESTDATA_PATH = "../weaver/testdata";
  30. private final static String ASPECTJRT = "../runtime/target/classes";
  31. private final static String CLASSES_JAR = TESTDATA_PATH + "/ltw-classes.jar";
  32. private final static String WOVEN_JAR = TESTDATA_PATH + "/ltw-woven.jar";
  33. private final static String JUNK_JAR = TESTDATA_PATH + "/ltw-junk.jar";
  34. private final static String ADVICE_ASPECTS = TESTDATA_PATH + "/ltw-aspects.jar";
  35. private final static String DW_ADVICE_ASPECTS = TESTDATA_PATH + "/ltw-dwaspects.jar";
  36. private final static String DE_ADVICE_ASPECTS = TESTDATA_PATH + "/ltw-deaspects.jar";
  37. private final static String AROUNDCLOSURE_ASPECTS = TESTDATA_PATH + "/ltw-acaspects.jar";
  38. private final static String ITD_ASPECTS = TESTDATA_PATH + "/ltw-itdaspects.jar";
  39. private final static String PER_ASPECTS = TESTDATA_PATH + "/ltw-peraspects.jar";
  40. private final static String TEST_BASE = TESTDATA_PATH + "/WeavingURLClassLoaderTest/builtLibs";
  41. private final static String NULL = "null";
  42. private Properties savedProperties;
  43. public WeavingURLClassLoaderTest(String name) {
  44. super(name);
  45. }
  46. public void testLoadClass() {
  47. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, "");
  48. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, CLASSES_JAR);
  49. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  50. try {
  51. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  52. invokeMain(clazz, new String[] {});
  53. } catch (Exception ex) {
  54. fail(ex.toString());
  55. }
  56. }
  57. /*
  58. * We won't get an exception because the aspect path is empty and there is no aop.xml file so the weaver will be disabled and no
  59. * reweaving will take place
  60. */
  61. public void testLoadWovenClass() {
  62. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, "");
  63. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, WOVEN_JAR);
  64. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  65. try {
  66. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  67. invokeMain(clazz, new String[] { "LTWAspect" });
  68. } catch (Exception ex) {
  69. fail(ex.toString());
  70. }
  71. }
  72. public void testGarbageName() {
  73. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, "");
  74. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, WOVEN_JAR);
  75. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  76. try {
  77. loader.loadClass("[Lorg.springframework.webflow.config.FlowLocation;Editor");
  78. } catch (ClassNotFoundException cnfe) {
  79. // success!
  80. } catch (Exception ex) {
  81. fail(ex.toString());
  82. }
  83. }
  84. /*
  85. * We get an exception because the class was not built reweavable
  86. */
  87. public void testWeaveWovenClass() {
  88. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  89. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, ADVICE_ASPECTS + File.pathSeparator + WOVEN_JAR);
  90. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  91. try {
  92. loader.loadClass("LTWHelloWorld");
  93. fail("Expecting org.aspectj.bridge.AbortException");
  94. } catch (Exception ex) {
  95. assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex, (ex instanceof AbortException));
  96. }
  97. }
  98. public void testWeavingURLClassLoader() {
  99. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  100. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  101. URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS));
  102. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  103. URL[] aspectURLs = new URL[] { aspects };
  104. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  105. try {
  106. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  107. invokeMain(clazz, new String[] { "LTWAspect" });
  108. } catch (Exception ex) {
  109. fail(ex.toString());
  110. }
  111. }
  112. public void testWeaveAdvice() {
  113. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  114. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR
  115. + File.pathSeparator + ASPECTJRT);
  116. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  117. try {
  118. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  119. invokeMain(clazz, new String[] { "LTWAspect" });
  120. } catch (Exception ex) {
  121. fail(ex.toString());
  122. }
  123. }
  124. public void testWeaveAdviceWithVerbose() {
  125. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  126. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR
  127. + File.pathSeparator + ASPECTJRT);
  128. setSystemProperty(WeavingAdaptor.WEAVING_ADAPTOR_VERBOSE, "true");
  129. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  130. try {
  131. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  132. invokeMain(clazz, new String[] { "LTWAspect" });
  133. } catch (Exception ex) {
  134. fail(ex.toString());
  135. }
  136. }
  137. public void testWeaveAdviceWithWeaveInfo() {
  138. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  139. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR
  140. + File.pathSeparator + ASPECTJRT);
  141. setSystemProperty(WeavingAdaptor.SHOW_WEAVE_INFO_PROPERTY, "true");
  142. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  143. try {
  144. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  145. invokeMain(clazz, new String[] { "LTWAspect" });
  146. } catch (Exception ex) {
  147. fail(ex.toString());
  148. }
  149. }
  150. public void testWeaveDeclareWarningAdvice() {
  151. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, DW_ADVICE_ASPECTS);
  152. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, DW_ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR);
  153. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  154. try {
  155. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  156. invokeMain(clazz, new String[] {});
  157. } catch (Exception ex) {
  158. fail(ex.toString());
  159. }
  160. }
  161. public void testWeaveDeclareErrorAdvice() {
  162. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, DE_ADVICE_ASPECTS);
  163. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, DE_ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR);
  164. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  165. try {
  166. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  167. invokeMain(clazz, new String[] {});
  168. fail("Expecting org.aspectj.bridge.AbortException");
  169. } catch (Exception ex) {
  170. assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex, (ex instanceof AbortException));
  171. }
  172. }
  173. public void testWeaveAroundClosure() {
  174. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, AROUNDCLOSURE_ASPECTS);
  175. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, AROUNDCLOSURE_ASPECTS + File.pathSeparator + CLASSES_JAR
  176. + File.pathSeparator + ASPECTJRT);
  177. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  178. try {
  179. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  180. invokeMain(clazz, new String[] { "LTWAroundClosure" });
  181. } catch (Exception ex) {
  182. fail(ex.toString());
  183. }
  184. }
  185. public void testWeavingITD() {
  186. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  187. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  188. URL aspects = FileUtil.getFileURL(new File(ITD_ASPECTS));
  189. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  190. URL[] aspectURLs = new URL[] { aspects };
  191. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  192. try {
  193. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  194. invokeMain(clazz, new String[] { "LTWInterfaceITD", "LTWFieldITD", "LTWMethodITD" });
  195. } catch (Exception ex) {
  196. ex.printStackTrace();
  197. // throw new RuntimeException("Failed!", ex);
  198. fail(ex.toString());
  199. // } finally {
  200. // System.exit(0);
  201. }
  202. }
  203. public void testWeavingPer() {
  204. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  205. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  206. URL aspects = FileUtil.getFileURL(new File(PER_ASPECTS));
  207. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  208. URL[] aspectURLs = new URL[] { aspects };
  209. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  210. try {
  211. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  212. invokeMain(clazz, new String[] { "LTWPerthis" });
  213. } catch (Exception ex) {
  214. fail(ex.toString());
  215. }
  216. }
  217. public void testWeavingAspects() {
  218. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  219. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  220. URL aspects1 = FileUtil.getFileURL(new File(ADVICE_ASPECTS));
  221. URL aspects2 = FileUtil.getFileURL(new File(AROUNDCLOSURE_ASPECTS));
  222. URL aspects3 = FileUtil.getFileURL(new File(ITD_ASPECTS));
  223. URL aspects4 = FileUtil.getFileURL(new File(PER_ASPECTS));
  224. URL[] classURLs = new URL[] { aspects1, aspects2, aspects3, aspects4, classes, aspectjrt };
  225. URL[] aspectURLs = new URL[] { aspects1, aspects2, aspects3, aspects4 };
  226. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  227. try {
  228. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  229. invokeMain(clazz, new String[] { "LTWAspect", "LTWAroundClosure", "LTWPerthis", "LTWInterfaceITD", "LTWFieldITD",
  230. "LTWMethodITD", "LTWPerthis" });
  231. } catch (Exception ex) {
  232. fail(ex.toString());
  233. }
  234. }
  235. public void testJunkJar() {
  236. File junkJar = new File(JUNK_JAR);
  237. assertFalse(junkJar + " should not exist", junkJar.exists());
  238. URL classes = FileUtil.getFileURL(junkJar);
  239. URL[] classURLs = new URL[] { classes };
  240. URL[] aspectURLs = new URL[] {};
  241. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  242. try {
  243. loader.loadClass("LTWHelloWorld");
  244. fail("Expecting java.lang.ClassNotFoundException");
  245. } catch (Exception ex) {
  246. assertTrue("Expecting java.lang.ClassNotFoundException caught " + ex, (ex instanceof ClassNotFoundException));
  247. }
  248. }
  249. public void testJunkAspectJar() {
  250. File junkJar = new File(JUNK_JAR);
  251. assertFalse(junkJar + " should not exist", junkJar.exists());
  252. URL aspects = FileUtil.getFileURL(junkJar);
  253. URL[] classURLs = new URL[] { aspects };
  254. URL[] aspectURLs = new URL[] { aspects };
  255. try {
  256. new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  257. fail("Expecting org.aspectj.bridge.AbortException");
  258. } catch (Exception ex) {
  259. assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex,
  260. (ex instanceof org.aspectj.bridge.AbortException));
  261. }
  262. }
  263. public void testAddURL() {
  264. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  265. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  266. URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS));
  267. URL[] classURLs = new URL[] { aspects, aspectjrt };
  268. URL[] aspectURLs = new URL[] { aspects };
  269. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  270. loader.addURL(classes);
  271. try {
  272. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  273. invokeMain(clazz, new String[] { "LTWAspect" });
  274. } catch (Exception ex) {
  275. fail(ex.toString());
  276. }
  277. }
  278. public void testParentChild() {
  279. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  280. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  281. URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS));
  282. URL[] classURLs = new URL[] { aspects, aspectjrt };
  283. URL[] aspectURLs = new URL[] { aspects };
  284. WeavingURLClassLoader parent = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  285. classURLs = new URL[] { classes };
  286. aspectURLs = new URL[] {};
  287. WeavingURLClassLoader child = new WeavingURLClassLoader(classURLs, aspectURLs, parent);
  288. try {
  289. Class<?> clazz = child.loadClass("LTWHelloWorld");
  290. invokeMain(clazz, new String[] { "LTWAspect" });
  291. } catch (Exception ex) {
  292. fail(ex.toString());
  293. }
  294. }
  295. /*
  296. * Aspects on ASPECTPATH but missing from CLASSPATH
  297. */
  298. public void testIncompletePath() {
  299. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS+File.pathSeparator+new File(ASPECTJRT).toString());
  300. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, CLASSES_JAR);
  301. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  302. try {
  303. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  304. invokeMain(clazz, new String[] { "LTWAspect" });
  305. fail("Expecting java.lang.NoClassDefFoundError");
  306. } catch (Exception ex) {
  307. // Expecting: java.lang.NoClassDefFoundError: LTWAspect
  308. String m = ex.getMessage();
  309. if (!m.contains("java.lang.NoClassDefFoundError")) {
  310. fail("Expecting java.lang.NoClassDefFoundError but caught " + ex);
  311. }
  312. }
  313. }
  314. /*
  315. * Ensure package object is correct
  316. */
  317. public void testPackage() {
  318. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, "");
  319. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, CLASSES_JAR);
  320. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  321. try {
  322. Class<?> clazz = loader.loadClass("ltw.LTWPackageTest");
  323. invokeMain(clazz, new String[] {});
  324. Package pakkage = clazz.getPackage();
  325. assertTrue("Expected 'ltw' got " + pakkage, (pakkage != null));
  326. } catch (Exception ex) {
  327. fail(ex.toString());
  328. }
  329. }
  330. public void testZipAspects() {
  331. try {
  332. doTestZipAspects(TEST_BASE + "/aspect.zip");
  333. } catch (Error ex) {
  334. failWithException(ex);
  335. } catch (Exception ex) {
  336. failWithException(ex);
  337. }
  338. }
  339. public void testJarAspects() {
  340. try {
  341. doTestZipAspects(TEST_BASE + "/aspect.jar");
  342. } catch (Error ex) {
  343. failWithException(ex);
  344. } catch (Exception ex) {
  345. failWithException(ex);
  346. }
  347. }
  348. /** PR#106736 */
  349. public void testClassAspects() {
  350. try {
  351. doTestZipAspects(TEST_BASE + "/classes");
  352. } catch (Error ex) {
  353. failWithException(ex);
  354. } catch (Exception ex) {
  355. failWithException(ex);
  356. }
  357. }
  358. public void testZipJarAspectsTest() {
  359. try {
  360. doTestZipAspectsTest();
  361. // bug: doTestZipAspects("") attempts to load packag.Aspect?
  362. fail("expected error to be thrown");
  363. } catch (InvocationTargetException ex) {
  364. // expecting error
  365. assertTrue(ex.getTargetException() instanceof Error);
  366. } catch (RuntimeException ex) {
  367. // expecting error
  368. String message = ex.getMessage();
  369. // expecting error - seems to be wrapped wrong
  370. if (!message.contains("around advice")) {
  371. failWithException(ex);
  372. }
  373. } catch (Error ex) {
  374. failWithException(ex);
  375. } catch (Exception ex) {
  376. failWithException(ex);
  377. }
  378. }
  379. public void testWeavingURLClassLoaderOddJars() throws Exception {
  380. URL classes = FileUtil.getFileURL(new File(TEST_BASE + "/test.jar/main.file"));
  381. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  382. URL aspects = FileUtil.getFileURL(new File(TEST_BASE + "/aspectNoExt"));
  383. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  384. URL[] aspectURLs = new URL[] { aspects };
  385. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  386. Class<?> clazz = loader.loadClass("packag.Main");
  387. invokeMain(clazz, new String[] {});
  388. }
  389. public void testWeavingURLClassLoaderMissingJars() throws Exception {
  390. try {
  391. URL classes = FileUtil.getFileURL(new File(TEST_BASE + "/test.jar/main.file"));
  392. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  393. URL aspects = FileUtil.getFileURL(new File(TEST_BASE + "/MissingFile"));
  394. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  395. URL[] aspectURLs = new URL[] { aspects };
  396. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  397. Class<?> clazz = loader.loadClass("packag.Main");
  398. invokeMain(clazz, new String[] {});
  399. fail("Should reject bad aspect MissingFile");
  400. } catch (AbortException ae) {
  401. assertTrue("Unexpected cause: " + ae.getMessage(), ae.getMessage().contains("bad aspect library"));
  402. }
  403. }
  404. private void doTestZipAspects(String aspectLib) throws Exception {
  405. File classZip = new File(TEST_BASE + "/main.zip");
  406. File zipLib = new File(aspectLib);
  407. URL classes = FileUtil.getFileURL(classZip);
  408. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  409. URL aspects = FileUtil.getFileURL(zipLib);
  410. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  411. URL[] aspectURLs = new URL[] { aspects };
  412. ClassLoader parent = getClass().getClassLoader();
  413. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, parent);
  414. Class<?> clazz = loader.loadClass("packag.Main");
  415. invokeMain(clazz, new String[] {});
  416. // throws Error unless advice applies
  417. }
  418. private void doTestZipAspectsTest() throws Exception {
  419. URL classes = FileUtil.getFileURL(new File(TEST_BASE + "/main.zip"));
  420. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  421. URL[] classURLs = new URL[] { classes, aspectjrt };
  422. ClassLoader parent = getClass().getClassLoader();
  423. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, new URL[] {}, parent);
  424. Class<?> clazz = loader.loadClass("packag.Main");
  425. invokeMain(clazz, new String[] {});
  426. // throws Error because advice does not apply
  427. }
  428. private void failWithException(Throwable t) {
  429. throw new TestError(t.getMessage(), t);
  430. }
  431. public static void invokeMain(Class clazz, String[] args) {
  432. Class<?>[] paramTypes = new Class[1];
  433. paramTypes[0] = args.getClass();
  434. try {
  435. Method method = clazz.getDeclaredMethod("main", paramTypes);
  436. Object[] params = new Object[1];
  437. params[0] = args;
  438. method.invoke(null, params);
  439. } catch (InvocationTargetException ex) {
  440. Throwable targetException = ex.getTargetException();
  441. if (targetException instanceof RuntimeException) {
  442. throw (RuntimeException) ex.getTargetException();
  443. } else {
  444. throw new RuntimeException(ex.getTargetException().toString());
  445. }
  446. } catch (Exception ex) {
  447. throw new RuntimeException(ex.toString());
  448. }
  449. }
  450. private void setSystemProperty(String key, String value) {
  451. Properties systemProperties = System.getProperties();
  452. copyProperty(key, systemProperties, savedProperties);
  453. systemProperties.setProperty(key, value);
  454. }
  455. private static void copyProperty(String key, Properties from, Properties to) {
  456. String value = from.getProperty(key, NULL);
  457. to.setProperty(key, value);
  458. }
  459. protected void setUp() throws Exception {
  460. super.setUp();
  461. savedProperties = new Properties();
  462. }
  463. protected void tearDown() throws Exception {
  464. super.tearDown();
  465. /* Restore system properties */
  466. Properties systemProperties = System.getProperties();
  467. for (Enumeration<Object> enu = savedProperties.keys(); enu.hasMoreElements();) {
  468. String key = (String) enu.nextElement();
  469. String value = savedProperties.getProperty(key);
  470. if (value == NULL) {
  471. systemProperties.remove(key);
  472. } else {
  473. systemProperties.setProperty(key, value);
  474. }
  475. }
  476. }
  477. }