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.

ClassLoaderWeavingAdaptorTest.java 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. /*******************************************************************************
  2. * Copyright (c) 2006 IBM Corporation and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors:
  9. * Matthew Webster - initial implementation
  10. *******************************************************************************/
  11. package org.aspectj.weaver.loadtime;
  12. import java.io.File;
  13. import java.lang.ref.Reference;
  14. import java.lang.reflect.Field;
  15. import java.net.URL;
  16. import java.net.URLClassLoader;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.Map;
  20. import org.aspectj.apache.bcel.classfile.JavaClass;
  21. import org.aspectj.apache.bcel.util.ClassPath;
  22. import org.aspectj.apache.bcel.util.SyntheticRepository;
  23. import org.aspectj.weaver.ResolvedType;
  24. import org.aspectj.weaver.World;
  25. import org.aspectj.weaver.World.TypeMap;
  26. import org.aspectj.weaver.bcel.BcelWorld;
  27. import org.aspectj.weaver.loadtime.definition.Definition;
  28. import org.aspectj.weaver.tools.WeavingAdaptor;
  29. import junit.framework.TestCase;
  30. public class ClassLoaderWeavingAdaptorTest extends TestCase {
  31. public void testClassLoaderWeavingAdaptor() {
  32. ClassLoader loader = new URLClassLoader(new URL[] {}, null);
  33. ClassLoaderWeavingAdaptor adaptor = new ClassLoaderWeavingAdaptor();
  34. adaptor.initialize(loader, null);
  35. }
  36. public void testGetNamespace() {
  37. ClassLoader loader = new URLClassLoader(new URL[] {}, null);
  38. ClassLoaderWeavingAdaptor adaptor = new ClassLoaderWeavingAdaptor();
  39. adaptor.initialize(loader, null);
  40. String namespace = adaptor.getNamespace();
  41. assertEquals("Namespace should be empty", "", namespace);
  42. }
  43. public void testGeneratedClassesExistFor() {
  44. ClassLoader loader = new URLClassLoader(new URL[] {}, null);
  45. ClassLoaderWeavingAdaptor adaptor = new ClassLoaderWeavingAdaptor();
  46. adaptor.initialize(loader, null);
  47. boolean exist = adaptor.generatedClassesExistFor("Junk");
  48. assertFalse("There should be no generated classes", exist);
  49. }
  50. public void testFlushGeneratedClasses() {
  51. ClassLoader loader = new URLClassLoader(new URL[] {}, null);
  52. ClassLoaderWeavingAdaptor adaptor = new ClassLoaderWeavingAdaptor();
  53. adaptor.initialize(loader, null);
  54. adaptor.flushGeneratedClasses();
  55. boolean exist = adaptor.generatedClassesExistFor("Junk");
  56. assertFalse("There should be no generated classes", exist);
  57. }
  58. /**
  59. * Testing fast excludes of the pattern "com.foo..*". World should not have any new types in it after rejection.
  60. */
  61. public void testFastExclusionOne() throws Exception {
  62. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(null, "testdata..*");
  63. String orangesSub = "testdata.sub.Oranges";
  64. JavaClass orangesClass = getClassFrom(orangesSub);
  65. byte[] orangesBytes = orangesClass.getBytes();
  66. boolean accepted = adaptor.accept(orangesSub, orangesBytes);
  67. assertFalse("Should not be accepted", accepted);
  68. TypeMap map = accessTypeMap(adaptor);
  69. // The aspect
  70. assertEquals(1, map.getExpendableMap().size());
  71. // primitives, void and jlObject
  72. assertEquals(10, map.getMainMap().size());
  73. // Important thing here is that the rejection of testdata.sub.Oranges did not require it to be loaded into the world at all
  74. }
  75. /**
  76. * Testing fast includes of the pattern "*". World should not have any new types in it after inclusion.
  77. */
  78. public void testFastInclusionOne() throws Exception {
  79. TestClassLoaderWeavingAdaptor adaptor = getAdaptor("*", null);
  80. String orangesSub = "testdata.sub.Oranges";
  81. JavaClass orangesClass = getClassFrom(orangesSub);
  82. byte[] orangesBytes = orangesClass.getBytes();
  83. boolean accepted = adaptor.accept(orangesSub, orangesBytes);
  84. assertTrue("Should be accepted", accepted);
  85. TypeMap map = accessTypeMap(adaptor);
  86. // The aspect
  87. assertEquals(1, map.getExpendableMap().size());
  88. // primitives, void and jlObject
  89. assertEquals(10, map.getMainMap().size());
  90. // Important thing here is that the rejection of testdata.sub.Oranges did not require it to be loaded into the world at all
  91. }
  92. /**
  93. * Testing fast excludes of the pattern "*Oranges". World should not have any new types in it after rejection.
  94. */
  95. public void testFastExclusionTwo() throws Exception {
  96. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(null, "*Oranges");
  97. String oranges = "testdata.Oranges";
  98. JavaClass orangesClass = getClassFrom(oranges);
  99. byte[] orangesBytes = orangesClass.getBytes();
  100. boolean accepted = adaptor.accept(oranges, orangesBytes);
  101. assertFalse("Should not be accepted", accepted);
  102. TypeMap map = accessTypeMap(adaptor);
  103. // The aspect
  104. assertEquals(1, map.getExpendableMap().size());
  105. // primitives, void and jlObject
  106. assertEquals(10, map.getMainMap().size());
  107. String orangesSub = "testdata.sub.Oranges";
  108. JavaClass orangesSubClass = getClassFrom(orangesSub);
  109. byte[] orangesSubBytes = orangesSubClass.getBytes();
  110. accepted = adaptor.accept(orangesSub, orangesSubBytes);
  111. assertFalse("Should not be accepted", accepted);
  112. map = accessTypeMap(adaptor);
  113. // The aspect
  114. assertEquals(1, map.getExpendableMap().size());
  115. // primitives, void and jlObject
  116. assertEquals(10, map.getMainMap().size());
  117. }
  118. /**
  119. * Testing fast excludes of the pattern "*..*Oranges*". World should not have any new types in it after rejection.
  120. */
  121. public void testFastExclusionThree() throws Exception {
  122. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(null, "*..*ran*");
  123. String oranges = "testdata.Oranges";
  124. JavaClass orangesClass = getClassFrom(oranges);
  125. byte[] orangesBytes = orangesClass.getBytes();
  126. boolean accepted = adaptor.accept(oranges, orangesBytes);
  127. assertFalse("Should not be accepted", accepted);
  128. TypeMap map = accessTypeMap(adaptor);
  129. // The aspect
  130. assertEquals(1, map.getExpendableMap().size());
  131. // primitives, void and jlObject
  132. assertEquals(10, map.getMainMap().size());
  133. String orangesSub = "testdata.sub.Oranges";
  134. JavaClass orangesSubClass = getClassFrom(orangesSub);
  135. byte[] orangesSubBytes = orangesSubClass.getBytes();
  136. accepted = adaptor.accept(orangesSub, orangesSubBytes);
  137. assertFalse("Should not be accepted", accepted);
  138. map = accessTypeMap(adaptor);
  139. // The aspect
  140. assertEquals(1, map.getExpendableMap().size());
  141. // primitives, void and jlObject
  142. assertEquals(10, map.getMainMap().size());
  143. String apples = "testdata.Apples";
  144. JavaClass applesClass = getClassFrom(apples);
  145. byte[] applesBytes = applesClass.getBytes();
  146. accepted = adaptor.accept(apples, applesBytes);
  147. assertTrue("Should be accepted", accepted);
  148. map = accessTypeMap(adaptor);
  149. // The aspect and the Apples type
  150. assertEquals(1, map.getExpendableMap().size());
  151. // primitives, void and jlObject
  152. assertEquals(10, map.getMainMap().size());
  153. }
  154. public void testIncludedWhenNonOptimalExclusion() throws Exception {
  155. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(new String[] { "*", "FooBar" }, new String[] { "*..*ran*es*" });
  156. String oranges = "testdata.Oranges";
  157. JavaClass orangesClass = getClassFrom(oranges);
  158. byte[] orangesBytes = orangesClass.getBytes();
  159. boolean accepted = false;
  160. // adaptor.accept(oranges, orangesBytes);
  161. // assertFalse("Should not be accepted", accepted);
  162. TypeMap map = accessTypeMap(adaptor);
  163. // // The aspect
  164. // assertEquals(1, map.getExpendableMap().size());
  165. // primitives, void and jlObject
  166. assertEquals(10, map.getMainMap().size());
  167. String apples = "testdata.Apples";
  168. JavaClass applesClass = getClassFrom(apples);
  169. byte[] applesBytes = applesClass.getBytes();
  170. accepted = adaptor.accept(apples, applesBytes);
  171. assertTrue("Should be accepted", accepted);
  172. map = accessTypeMap(adaptor);
  173. // // The aspect
  174. // assertEquals(1, map.getExpendableMap().size());
  175. // // primitives, void and jlObject
  176. // assertEquals(10, map.getMainMap().size());
  177. //
  178. // String apples = "testdata.Apples";
  179. // JavaClass applesClass = getClassFrom(apples);
  180. // byte[] applesBytes = applesClass.getBytes();
  181. //
  182. // accepted = adaptor.accept(apples, applesBytes);
  183. // assertTrue("Should be accepted", accepted);
  184. // map = accessTypeMap(adaptor);
  185. //
  186. // // The aspect and the Apples type
  187. // assertEquals(1, map.getExpendableMap().size());
  188. // // primitives, void and jlObject
  189. // assertEquals(10, map.getMainMap().size());
  190. }
  191. private void checkAccept(ClassLoaderWeavingAdaptor adaptor, String name) throws Exception {
  192. JavaClass clazz = getClassFrom(name);
  193. byte[] bytes = clazz.getBytes();
  194. boolean accepted = adaptor.accept(name, bytes);
  195. assertTrue("Should be accepted", accepted);
  196. }
  197. private void checkNotAccept(ClassLoaderWeavingAdaptor adaptor, String name) throws Exception {
  198. JavaClass clazz = getClassFrom(name);
  199. byte[] bytes = clazz.getBytes();
  200. boolean accepted = adaptor.accept(name, bytes);
  201. assertFalse("Should not be accepted", accepted);
  202. }
  203. /**
  204. * Test how multiple definitions are merged. Each Definition represents a different aop.xml file.
  205. */
  206. public void testIncludedWhenNonOptimalExclusion2() throws Exception {
  207. Definition aopOne = new Definition();
  208. aopOne.getIncludePatterns().add("*");
  209. Definition aopTwo = new Definition();
  210. aopTwo.getIncludePatterns().add("testdata.Apples+");
  211. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(aopOne, aopTwo);
  212. checkAccept(adaptor, "testdata.Oranges");
  213. checkAccept(adaptor, "testdata.Apples");
  214. adaptor = getAdaptor(aopTwo, aopOne);
  215. checkAccept(adaptor, "testdata.Oranges");
  216. checkAccept(adaptor, "testdata.Apples");
  217. }
  218. public void testIncludedWhenNonOptimalExclusion3() throws Exception {
  219. Definition aopOne = new Definition();
  220. aopOne.getIncludePatterns().add("*");
  221. Definition aopTwo = new Definition();
  222. aopTwo.getIncludePatterns().add("java.sql.Connection+");
  223. aopTwo.getIncludePatterns().add("java.sql.Statement+");
  224. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(aopOne, aopTwo);
  225. checkAccept(adaptor, "testdata.Apples");
  226. checkAccept(adaptor, "testdata.MySqlStatement");
  227. adaptor = getAdaptor(aopTwo, aopOne);
  228. checkAccept(adaptor, "testdata.Apples");
  229. checkAccept(adaptor, "testdata.MySqlStatement");
  230. }
  231. // Some excludes defined and some includes but importantly a star include
  232. public void testIncludedWhenNonOptimalExclusion4() throws Exception {
  233. Definition aopOne = new Definition();
  234. aopOne.getIncludePatterns().add("*");
  235. Definition aopTwo = new Definition();
  236. aopTwo.getIncludePatterns().add("java.sql.Connection+");
  237. aopTwo.getIncludePatterns().add("java.sql.Statement+");
  238. Definition aopThree = new Definition();
  239. aopThree.getExcludePatterns().add("com.jinspired..*");
  240. aopThree.getExcludePatterns().add("$com.jinspired..*");
  241. aopThree.getExcludePatterns().add("com.jinspired.jxinsight.server..*+");
  242. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(aopOne, aopTwo, aopThree);
  243. checkAccept(adaptor, "testdata.Apples");
  244. checkAccept(adaptor, "testdata.MySqlStatement");
  245. adaptor = getAdaptor(aopThree, aopTwo, aopOne);
  246. checkAccept(adaptor, "testdata.Apples");
  247. checkAccept(adaptor, "testdata.MySqlStatement");
  248. }
  249. // Some excludes defined and some includes but importantly an exact includename
  250. public void testIncludedWhenNonOptimalExclusion5() throws Exception {
  251. Definition aopOne = new Definition();
  252. aopOne.getIncludePatterns().add("testdata.Apples");
  253. Definition aopTwo = new Definition();
  254. aopTwo.getIncludePatterns().add("java.sql.Connection+");
  255. aopTwo.getIncludePatterns().add("java.sql.Statement+");
  256. Definition aopThree = new Definition();
  257. aopThree.getExcludePatterns().add("com.jinspired..*");
  258. aopThree.getExcludePatterns().add("$com.jinspired..*");
  259. aopThree.getExcludePatterns().add("com.jinspired.jxinsight.server..*+");
  260. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(aopOne, aopTwo, aopThree);
  261. checkAccept(adaptor, "testdata.Apples");
  262. adaptor = getAdaptor(aopThree, aopTwo, aopOne);
  263. checkAccept(adaptor, "testdata.Apples");
  264. }
  265. public void testIncludedWhenNonOptimalExclusion7() throws Exception {
  266. Definition aopOne = new Definition();
  267. aopOne.getIncludePatterns().add("*");
  268. aopOne.getExcludePatterns().add("*Fun*ky*");
  269. // Definition aopTwo = new Definition();
  270. // aopTwo.getIncludePatterns().add("java.sql.Connection+");
  271. // aopTwo.getIncludePatterns().add("java.sql.Statement+");
  272. //
  273. // Definition aopThree = new Definition();
  274. // aopThree.getExcludePatterns().add("com.jinspired..*");
  275. // aopThree.getExcludePatterns().add("$com.jinspired..*");
  276. // aopThree.getExcludePatterns().add("com.jinspired.jxinsight.server..*+");
  277. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(aopOne);
  278. checkAccept(adaptor, "testdata.Apples");
  279. // adaptor = getAdaptor(aopThree, aopTwo, aopOne);
  280. //
  281. // checkAccept(adaptor, "testdata.Apples");
  282. }
  283. public void testIncludedWhenNonOptimalExclusion6() throws Exception {
  284. Definition aopOne = new Definition();
  285. aopOne.getIncludePatterns().add("testdata..*");
  286. Definition aopTwo = new Definition();
  287. aopTwo.getIncludePatterns().add("java.sql.Connection+");
  288. aopTwo.getIncludePatterns().add("java.sql.Statement+");
  289. Definition aopThree = new Definition();
  290. aopThree.getExcludePatterns().add("com.jinspired..*");
  291. aopThree.getExcludePatterns().add("$com.jinspired..*");
  292. aopThree.getExcludePatterns().add("com.jinspired.jxinsight.server..*+");
  293. TestClassLoaderWeavingAdaptor adaptor = getAdaptor(aopOne, aopTwo, aopThree);
  294. checkAccept(adaptor, "testdata.Apples");
  295. adaptor = getAdaptor(aopThree, aopTwo, aopOne);
  296. checkAccept(adaptor, "testdata.Apples");
  297. }
  298. /**
  299. * Testing fast inclusion checking of exact include names eg. "testdata.sub.Oranges"
  300. */
  301. public void testFastInclusionTwo() throws Exception {
  302. TestClassLoaderWeavingAdaptor adaptor = getAdaptor("testdata.sub.Oranges", null);
  303. String oranges = "testdata.Oranges";
  304. JavaClass orangesClass = getClassFrom(oranges);
  305. byte[] orangesBytes = orangesClass.getBytes();
  306. boolean accepted = adaptor.accept(oranges, orangesBytes);
  307. assertFalse("Should not be accepted", accepted);
  308. TypeMap map = accessTypeMap(adaptor);
  309. // The aspect
  310. assertEquals(1, map.getExpendableMap().size());
  311. // primitives, void and jlObject
  312. assertEquals(10, map.getMainMap().size());
  313. String orangesSub = "testdata.sub.Oranges";
  314. JavaClass orangesSubClass = getClassFrom(orangesSub);
  315. byte[] orangesSubBytes = orangesSubClass.getBytes();
  316. accepted = adaptor.accept(orangesSub, orangesSubBytes);
  317. assertTrue("Should be accepted", accepted);
  318. map = accessTypeMap(adaptor);
  319. // The aspect
  320. assertEquals(1, map.getExpendableMap().size());
  321. // primitives, void and jlObject
  322. assertEquals(10, map.getMainMap().size());
  323. String apples = "testdata.Apples";
  324. JavaClass applesClass = getClassFrom(apples);
  325. byte[] applesBytes = applesClass.getBytes();
  326. accepted = adaptor.accept(apples, applesBytes);
  327. assertFalse("Should not be accepted", accepted);
  328. map = accessTypeMap(adaptor);
  329. // The aspect and the Apples type
  330. assertEquals(1, map.getExpendableMap().size());
  331. // primitives, void and jlObject
  332. assertEquals(10, map.getMainMap().size());
  333. }
  334. /**
  335. * Testing fast excludes of the pattern groovy related pattern -
  336. */
  337. // public void testFastExclusionFour() throws Exception {
  338. // TestClassLoaderWeavingAdaptor adaptor = getAdaptor("*", "testdata..* && !testdata.sub.Oran*");
  339. //
  340. // String oranges = "testdata.Oranges";
  341. // JavaClass orangesClass = getClassFrom(oranges);
  342. // byte[] orangesBytes = orangesClass.getBytes();
  343. //
  344. // boolean accepted = adaptor.accept(oranges, orangesBytes);
  345. // assertFalse("Should not be accepted", accepted);
  346. // TypeMap map = accessTypeMap(adaptor);
  347. //
  348. // // The aspect
  349. // assertEquals(1, map.getExpendableMap().size());
  350. //
  351. // // primitives, void and jlObject
  352. // assertEquals(10, map.getMainMap().size());
  353. //
  354. // String orangesSub = "testdata.sub.Oranges";
  355. // JavaClass orangesSubClass = getClassFrom(orangesSub);
  356. // byte[] orangesSubBytes = orangesSubClass.getBytes();
  357. //
  358. // accepted = adaptor.accept(orangesSub, orangesSubBytes);
  359. // assertTrue("Should be accepted", accepted);
  360. // map = accessTypeMap(adaptor);
  361. //
  362. // // The aspect
  363. // assertEquals(1, map.getExpendableMap().size());
  364. // // primitives, void and jlObject
  365. // assertEquals(10, map.getMainMap().size());
  366. // }
  367. public void testAcceptanceSpeedStarDotDotStar() throws Exception {
  368. URLClassLoader loader = new URLClassLoader(new URL[] { new File("../loadtime/bin").toURI().toURL(),
  369. new File("../loadtime/testdata/anaspect.jar").toURI().toURL() }, null);
  370. JavaClass jc = getClassFrom("../loadtime/bin", "org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest$TestOne");
  371. byte[] bs = jc.getBytes();
  372. jc = getClassFrom("../loadtime/bin", "org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest$TestOneCGLIB");
  373. byte[] bs2 = jc.getBytes();
  374. // InputStream is = loader.getResourceAsStream("org.aspectj.weaver.loadtime.ClassLoaderWeaverAdaptorTests$TestOne");
  375. assertNotNull(bs);
  376. TestWeavingContext wc = new TestWeavingContext(loader);
  377. Definition d = new Definition();
  378. d.getExcludePatterns().add("*..*CGLIB*");
  379. d.getAspectClassNames().add("AnAspect");
  380. wc.addDefinition(d);
  381. ClassLoaderWeavingAdaptor adaptor = new ClassLoaderWeavingAdaptor();
  382. adaptor.initialize(loader, wc);
  383. boolean exist = adaptor.generatedClassesExistFor("Junk");
  384. assertFalse("There should be no generated classes", exist);
  385. // before:
  386. // Acceptance 331ms
  387. // Rejection 3368ms
  388. // after:
  389. // Acceptance 343ms
  390. // Rejection 80ms
  391. long stime = System.currentTimeMillis();
  392. for (int i = 0; i < 100000; i++) {
  393. boolean b = adaptor.accept("org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest$TestOne", bs);
  394. assertTrue("Should be accepted", b);
  395. }
  396. long etime = System.currentTimeMillis();
  397. System.out.println("Acceptance " + (etime - stime) + "ms");
  398. stime = System.currentTimeMillis();
  399. for (int i = 0; i < 100000; i++) {
  400. adaptor.delegateForCurrentClass = null;
  401. boolean b = adaptor.accept("org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest$TestOneCGLIB", bs2);
  402. assertFalse("Should not be accepting CGLIB", b);
  403. }
  404. etime = System.currentTimeMillis();
  405. System.out.println("Rejection " + (etime - stime) + "ms");
  406. jc = getClassFrom("../loadtime/bin", "testdata.MessageService$$EnhancerByCGLIB$$6dd4e683");
  407. byte[] bs3 = jc.getBytes();
  408. boolean b = adaptor.accept("testdata.MessageService$$EnhancerByCGLIB$$6dd4e683", bs3);
  409. assertFalse(b);
  410. }
  411. // TODO
  412. // shouldn't add it to the type patterns if we are going to fast handle it
  413. // include for exact name, what does it mean?
  414. // excludes="!xxxx" should also be fast matched...
  415. public void testAcceptanceSpeedExactName() throws Exception {
  416. URLClassLoader loader = new URLClassLoader(new URL[] { new File("../loadtime/bin").toURI().toURL(),
  417. new File("../loadtime/testdata/anaspect.jar").toURI().toURL() }, null);
  418. JavaClass jc = getClassFrom("../loadtime/bin", "org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest$TestOne");
  419. byte[] bs = jc.getBytes();
  420. jc = getClassFrom("../loadtime/bin", "org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest$TestOneCGLIB");
  421. byte[] bs2 = jc.getBytes();
  422. // InputStream is = loader.getResourceAsStream("org.aspectj.weaver.loadtime.ClassLoaderWeaverAdaptorTests$TestOne");
  423. assertNotNull(bs);
  424. TestWeavingContext wc = new TestWeavingContext(loader);
  425. Definition d = new Definition();
  426. d.getExcludePatterns().add("org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest.TestOneCGLIB");
  427. d.getAspectClassNames().add("AnAspect");
  428. wc.addDefinition(d);
  429. TestClassLoaderWeavingAdaptor adaptor = new TestClassLoaderWeavingAdaptor();
  430. adaptor.initialize(loader, wc);
  431. boolean exist = adaptor.generatedClassesExistFor("Junk");
  432. assertFalse("There should be no generated classes", exist);
  433. // before:
  434. // Acceptance 331ms
  435. // Rejection 3160ms
  436. // after:
  437. // Acceptance 379ms
  438. // Rejection 103ms
  439. long stime = System.currentTimeMillis();
  440. for (int i = 0; i < 100000; i++) {
  441. boolean b = adaptor.accept("org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest$TestOne", bs);
  442. assertTrue("Should be accepted", b);
  443. }
  444. long etime = System.currentTimeMillis();
  445. System.out.println("Acceptance " + (etime - stime) + "ms");
  446. stime = System.currentTimeMillis();
  447. for (int i = 0; i < 100000; i++) {
  448. adaptor.delegateForCurrentClass = null;
  449. boolean b = adaptor.accept("org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest$TestOneCGLIB", bs2);
  450. assertFalse("Should not be accepting CGLIB", b);
  451. }
  452. etime = System.currentTimeMillis();
  453. System.out.println("Rejection " + (etime - stime) + "ms");
  454. BcelWorld world = adaptor.getWorld();
  455. Field f = World.class.getDeclaredField("typeMap");
  456. f.setAccessible(true);
  457. TypeMap typeMap = (TypeMap) f.get(world);
  458. System.out.println(typeMap.getExpendableMap().size());
  459. System.out.println(typeMap.getMainMap().size());
  460. printExpendableMap(typeMap.getExpendableMap());
  461. printMainMap(typeMap.getMainMap());
  462. }
  463. // --- infrastructure ---
  464. private TypeMap accessTypeMap(TestClassLoaderWeavingAdaptor adaptor) {
  465. return adaptor.getWorld().getTypeMap();
  466. }
  467. public TestClassLoaderWeavingAdaptor getAdaptor(String includePattern, String excludePattern) {
  468. return getAdaptor(includePattern == null ? null : new String[] { includePattern }, excludePattern == null ? null
  469. : new String[] { excludePattern });
  470. }
  471. public TestClassLoaderWeavingAdaptor getAdaptor(Definition... definitions) {
  472. try {
  473. URLClassLoader loader = new URLClassLoader(new URL[] { new File("../loadtime/bin").toURI().toURL(),
  474. new File("../loadtime/testdata/anaspect.jar").toURI().toURL() }, null);
  475. TestWeavingContext wc = new TestWeavingContext(loader);
  476. for (Definition definition : definitions) {
  477. // need some random aspect or the weaver will shut down!
  478. definition.getAspectClassNames().add("AnAspect");
  479. wc.addDefinition(definition);
  480. }
  481. TestClassLoaderWeavingAdaptor adaptor = new TestClassLoaderWeavingAdaptor();
  482. adaptor.initialize(loader, wc);
  483. return adaptor;
  484. } catch (Exception e) {
  485. throw new RuntimeException(e);
  486. }
  487. }
  488. public TestClassLoaderWeavingAdaptor getAdaptor(String[] includePatterns, String[] excludePatterns) {
  489. try {
  490. URLClassLoader loader = new URLClassLoader(new URL[] { new File("../loadtime/bin").toURI().toURL(),
  491. new File("../loadtime/testdata/anaspect.jar").toURI().toURL() }, null);
  492. TestWeavingContext wc = new TestWeavingContext(loader);
  493. Definition d = new Definition();
  494. if (includePatterns != null) {
  495. for (String s : includePatterns) {
  496. d.getIncludePatterns().add(s);
  497. }
  498. }
  499. if (excludePatterns != null) {
  500. for (String s : excludePatterns) {
  501. d.getExcludePatterns().add(s);
  502. }
  503. }
  504. // need some random aspect or the weaver will shut down!
  505. d.getAspectClassNames().add("AnAspect");
  506. wc.addDefinition(d);
  507. TestClassLoaderWeavingAdaptor adaptor = new TestClassLoaderWeavingAdaptor();
  508. adaptor.initialize(loader, wc);
  509. return adaptor;
  510. } catch (Exception e) {
  511. throw new RuntimeException(e);
  512. }
  513. }
  514. @SuppressWarnings("unused")
  515. private void printMaps(TypeMap map) {
  516. printExpendableMap(map.getExpendableMap());
  517. printMainMap(map.getMainMap());
  518. }
  519. private void printExpendableMap(Map<String, Reference<ResolvedType>> m) {
  520. for (String sig : m.keySet()) {
  521. System.out.println(sig + "=" + m.get(sig));
  522. }
  523. }
  524. private void printMainMap(Map<String, ResolvedType> m) {
  525. for (Object o : m.keySet()) {
  526. String sig = (String) o;
  527. System.out.println(sig + "=" + m.get(sig));
  528. }
  529. }
  530. static class TestClassLoaderWeavingAdaptor extends ClassLoaderWeavingAdaptor {
  531. public BcelWorld getWorld() {
  532. return bcelWorld;
  533. }
  534. }
  535. public static JavaClass getClassFrom(String clazzname) throws ClassNotFoundException {
  536. return getClassFrom("../loadtime/bin", clazzname);
  537. }
  538. public static JavaClass getClassFrom(String frompath, String clazzname) throws ClassNotFoundException {
  539. SyntheticRepository repos = createRepos(frompath);
  540. return repos.loadClass(clazzname);
  541. }
  542. public static SyntheticRepository createRepos(String cpentry) {
  543. ClassPath cp = new ClassPath(cpentry + File.pathSeparator + System.getProperty("java.class.path"));
  544. return SyntheticRepository.getInstance(cp);
  545. }
  546. //
  547. // @Aspect
  548. // static class AnAspect {
  549. //
  550. // }
  551. class TestOne {
  552. }
  553. class TestOneCGLIB {
  554. }
  555. static class TestWeavingContext extends DefaultWeavingContext {
  556. List<Definition> testList = new ArrayList<>();
  557. public TestWeavingContext(ClassLoader loader) {
  558. super(loader);
  559. }
  560. public void addDefinition(Definition d) {
  561. testList.add(d);
  562. }
  563. @Override
  564. public List<Definition> getDefinitions(final ClassLoader loader, final WeavingAdaptor adaptor) {
  565. return testList;
  566. }
  567. }
  568. }
  569. // --- testclasses and aspects ---