Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

WeavingURLClassLoader.java 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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 v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. *
  9. * Contributors:
  10. * Matthew Webster, Adrian Colyer,
  11. * Martin Lippert initial implementation
  12. * Andy Clement
  13. * Abraham Nevado
  14. * ******************************************************************/
  15. package org.aspectj.weaver.loadtime;
  16. import java.io.File;
  17. import java.io.IOException;
  18. import java.net.MalformedURLException;
  19. import java.net.URL;
  20. import java.security.CodeSource;
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import java.util.List;
  24. import java.util.Map;
  25. import java.util.StringTokenizer;
  26. import org.aspectj.bridge.AbortException;
  27. import org.aspectj.weaver.bcel.ExtensibleURLClassLoader;
  28. import org.aspectj.weaver.tools.Trace;
  29. import org.aspectj.weaver.tools.TraceFactory;
  30. import org.aspectj.weaver.tools.WeavingAdaptor;
  31. import org.aspectj.weaver.tools.WeavingClassLoader;
  32. public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements WeavingClassLoader {
  33. public static final String WEAVING_CLASS_PATH = "aj.class.path";
  34. public static final String WEAVING_ASPECT_PATH = "aj.aspect.path";
  35. private URL[] aspectURLs;
  36. private WeavingAdaptor adaptor;
  37. private boolean initializingAdaptor;
  38. private Map generatedClasses = new HashMap(); /* String -> byte[] */
  39. private static Trace trace = TraceFactory.getTraceFactory().getTrace(WeavingURLClassLoader.class);
  40. /*
  41. * This constructor is needed when using "-Djava.system.class.loader".
  42. */
  43. public WeavingURLClassLoader(ClassLoader parent) {
  44. this(getURLs(getClassPath()), getURLs(getAspectPath()), parent);
  45. // System.out.println("? WeavingURLClassLoader.WeavingURLClassLoader()");
  46. }
  47. public WeavingURLClassLoader(URL[] urls, ClassLoader parent) {
  48. super(urls, parent);
  49. if (trace.isTraceEnabled()) {
  50. trace.enter("<init>", this, new Object[] { urls, parent });
  51. }
  52. // System.out.println("WeavingURLClassLoader.WeavingURLClassLoader()");
  53. if (trace.isTraceEnabled()) {
  54. trace.exit("<init>");
  55. }
  56. }
  57. public WeavingURLClassLoader(URL[] classURLs, URL[] aspectURLs, ClassLoader parent) {
  58. super(classURLs, parent);
  59. // System.out.println(">WIB WeavingURLClassLoader.WeavingURLClassLoader() classURLs=" + Arrays.asList(classURLs));
  60. // System.out.println(">WIB WeavingURLClassLoader.WeavingURLClassLoader() aspectURLs=" + Arrays.asList(aspectURLs));
  61. this.aspectURLs = aspectURLs;
  62. /*
  63. * If either we nor our parent is using an ASPECT_PATH use a new-style adaptor
  64. */
  65. if (this.aspectURLs.length > 0 || getParent() instanceof WeavingClassLoader) {
  66. try {
  67. adaptor = new WeavingAdaptor(this);
  68. } catch (ExceptionInInitializerError ex) {
  69. ex.printStackTrace(System.out);
  70. throw ex;
  71. }
  72. }
  73. // System.out.println("< WeavingURLClassLoader.WeavingURLClassLoader() adaptor=" + adaptor);
  74. }
  75. private static String getAspectPath() {
  76. return System.getProperty(WEAVING_ASPECT_PATH, "");
  77. }
  78. private static String getClassPath() {
  79. return System.getProperty(WEAVING_CLASS_PATH, "");
  80. }
  81. private static URL[] getURLs(String path) {
  82. List<URL> urlList = new ArrayList<>();
  83. for (StringTokenizer t = new StringTokenizer(path, File.pathSeparator); t.hasMoreTokens();) {
  84. File f = new File(t.nextToken().trim());
  85. try {
  86. if (f.exists()) {
  87. URL url = f.toURI().toURL();
  88. urlList.add(url);
  89. }
  90. } catch (MalformedURLException ignored) {}
  91. }
  92. URL[] urls = new URL[urlList.size()];
  93. urlList.toArray(urls);
  94. return urls;
  95. }
  96. protected void addURL(URL url) {
  97. if (adaptor == null) {
  98. createAdaptor();
  99. }
  100. adaptor.addURL(url);
  101. super.addURL(url);
  102. }
  103. /**
  104. * Override to weave class using WeavingAdaptor
  105. */
  106. protected Class defineClass(String name, byte[] b, CodeSource cs) throws IOException {
  107. if (trace.isTraceEnabled()) {
  108. trace.enter("defineClass", this, new Object[] { name, b, cs });
  109. }
  110. // System.err.println("? WeavingURLClassLoader.defineClass(" + name + ", [" + b.length + "])");
  111. byte orig[] = b;
  112. /* Avoid recursion during adaptor initialization */
  113. if (!initializingAdaptor) {
  114. /* Need to defer creation because of possible recursion during constructor execution */
  115. if (adaptor == null && !initializingAdaptor) {
  116. createAdaptor();
  117. }
  118. try {
  119. b = adaptor.weaveClass(name, b, false);
  120. } catch (AbortException ex) {
  121. trace.error("defineClass", ex);
  122. throw ex;
  123. } catch (Throwable th) {
  124. trace.error("defineClass", th);
  125. }
  126. }
  127. Class clazz;
  128. // On error, define the original form of the class and log the issue
  129. try {
  130. clazz= super.defineClass(name, b, cs);
  131. } catch (Throwable th) {
  132. trace.error("Weaving class problem. Original class has been returned. The error was caused because of: " + th, th);
  133. clazz= super.defineClass(name, orig, cs);
  134. }
  135. if (trace.isTraceEnabled()) {
  136. trace.exit("defineClass", clazz);
  137. }
  138. return clazz;
  139. }
  140. private void createAdaptor() {
  141. DefaultWeavingContext weavingContext = new DefaultWeavingContext(this) {
  142. /* Ensures consistent LTW messages for testing */
  143. public String getClassLoaderName() {
  144. ClassLoader loader = getClassLoader();
  145. return loader.getClass().getName();
  146. }
  147. };
  148. ClassLoaderWeavingAdaptor clwAdaptor = new ClassLoaderWeavingAdaptor();
  149. initializingAdaptor = true;
  150. clwAdaptor.initialize(this, weavingContext);
  151. initializingAdaptor = false;
  152. adaptor = clwAdaptor;
  153. }
  154. /**
  155. * Override to find classes generated by WeavingAdaptor
  156. */
  157. protected byte[] getBytes(String name) throws IOException {
  158. byte[] bytes = super.getBytes(name);
  159. if (bytes == null) {
  160. // return adaptor.findClass(name);
  161. return (byte[]) generatedClasses.remove(name);
  162. }
  163. return bytes;
  164. }
  165. /**
  166. * Implement method from WeavingClassLoader
  167. */
  168. public URL[] getAspectURLs() {
  169. return aspectURLs;
  170. }
  171. public void acceptClass (String name, byte[] classBytes, byte[] weavedBytes) {
  172. generatedClasses.put(name, weavedBytes);
  173. }
  174. // protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
  175. // System.err.println("> WeavingURLClassLoader.loadClass() name=" + name);
  176. // Class clazz= super.loadClass(name, resolve);
  177. // System.err.println("< WeavingURLClassLoader.loadClass() clazz=" + clazz + ", loader=" + clazz.getClassLoader());
  178. // return clazz;
  179. // }
  180. // private interface ClassPreProcessorAdaptor extends ClassPreProcessor {
  181. // public void addURL(URL url);
  182. // }
  183. //
  184. // private class WeavingAdaptorPreProcessor implements ClassPreProcessorAdaptor {
  185. //
  186. // private WeavingAdaptor adaptor;
  187. //
  188. // public WeavingAdaptorPreProcessor (WeavingClassLoader wcl) {
  189. // adaptor = new WeavingAdaptor(wcl);
  190. // }
  191. //
  192. // public void initialize() {
  193. // }
  194. //
  195. // public byte[] preProcess(String className, byte[] bytes, ClassLoader classLoader) {
  196. // return adaptor.weaveClass(className,bytes);
  197. // }
  198. //
  199. // public void addURL(URL url) {
  200. //
  201. // }
  202. // }
  203. }