1 package org.codehaus.groovy.control;
2
3 import java.io.File;
4 import java.net.URL;
5 import java.net.URLClassLoader;
6 import java.net.MalformedURLException;
7 import java.util.HashMap;
8 import java.util.Map;
9
10 public class CompilerClassLoader extends ClassLoader {
11
12 private static final URL[] EMPTY_URL_ARRAY = new URL[0];
13 private ClassLoader parent;
14 private InnerLoader inner;
15 private Map map;
16
17 private class InnerLoader extends URLClassLoader{
18 public InnerLoader() {
19 super(EMPTY_URL_ARRAY);
20 }
21
22 public void addPath(String path) throws MalformedURLException{
23 addURL( new File( path ).toURL() );
24 }
25
26 protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
27 Class c = (Class) map.get(name);
28 if (c!=null) return c;
29 try {
30
31 c = super.findClass(name);
32 map.put(name,c);
33 return c;
34 } catch (ClassNotFoundException cnfe) {
35 c = parent.loadClass(name);
36 map.put(name,c);
37 return c;
38 }
39 }
40
41 public Class loadClass(String name) throws ClassNotFoundException {
42 return loadClass(name,false);
43 }
44
45 protected Class findClass(String name) throws ClassNotFoundException {
46 return loadClass(name,false);
47 }
48
49 }
50
51
52
53 public CompilerClassLoader()
54 {
55 super(Thread.currentThread().getContextClassLoader());
56 parent = Thread.currentThread().getContextClassLoader();
57
58 if (parent==null) parent= this.getClass().getClassLoader();
59 inner = new InnerLoader();
60 map = new HashMap();
61
62 }
63
64 public void addPath(String path)
65 throws MalformedURLException
66 {
67 inner.addPath(path);
68 }
69
70 protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
71 return inner.loadClass(name);
72 }
73
74 public Class loadClass(String name) throws ClassNotFoundException {
75 return loadClass(name,false);
76 }
77
78 protected Class findClass(String name) throws ClassNotFoundException {
79 return loadClass(name,false);
80 }
81 }