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          // if no context class loader is set use the classloader of this class
58          if (parent==null) parent= this.getClass().getClassLoader();
59          inner = new InnerLoader();
60          map = new HashMap();
61          //super(EMPTY_URL_ARRAY);
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  }