View Javadoc

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                  // we prefer to search on the given paths first
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          inner = new InnerLoader();
58          map = new HashMap();
59          //super(EMPTY_URL_ARRAY);
60      }
61  
62      public void addPath(String path)
63          throws MalformedURLException
64      {
65          inner.addPath(path);
66      }
67      
68      protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
69          return inner.loadClass(name);
70      }
71      
72      public Class loadClass(String name) throws ClassNotFoundException {
73          return loadClass(name,false);
74      }
75      
76      protected Class findClass(String name) throws ClassNotFoundException {
77          return loadClass(name,false);
78      }
79  }