001 package org.codehaus.groovy.control;
002
003 import java.io.File;
004 import java.net.URL;
005 import java.net.URLClassLoader;
006 import java.net.MalformedURLException;
007 import java.util.HashMap;
008 import java.util.Map;
009
010 public class CompilerClassLoader extends ClassLoader {
011
012 private static final URL[] EMPTY_URL_ARRAY = new URL[0];
013 private ClassLoader parent;
014 private InnerLoader inner;
015 private Map map;
016
017 private class InnerLoader extends URLClassLoader{
018 public InnerLoader() {
019 super(EMPTY_URL_ARRAY);
020 }
021
022 public void addPath(String path) throws MalformedURLException{
023 addURL( new File( path ).toURL() );
024 }
025
026 protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
027 Class c = (Class) map.get(name);
028 if (c!=null) return c;
029 try {
030 // we prefer to search on the given paths first
031 c = super.findClass(name);
032 map.put(name,c);
033 return c;
034 } catch (ClassNotFoundException cnfe) {
035 c = parent.loadClass(name);
036 map.put(name,c);
037 return c;
038 }
039 }
040
041 public Class loadClass(String name) throws ClassNotFoundException {
042 return loadClass(name,false);
043 }
044
045 protected Class findClass(String name) throws ClassNotFoundException {
046 return loadClass(name,false);
047 }
048
049 }
050
051
052
053 public CompilerClassLoader()
054 {
055 super(Thread.currentThread().getContextClassLoader());
056 parent = Thread.currentThread().getContextClassLoader();
057 // if no context class loader is set use the classloader of this class
058 if (parent==null) parent= this.getClass().getClassLoader();
059 inner = new InnerLoader();
060 map = new HashMap();
061 //super(EMPTY_URL_ARRAY);
062 }
063
064 public void addPath(String path)
065 throws MalformedURLException
066 {
067 inner.addPath(path);
068 }
069
070 protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
071 return inner.loadClass(name);
072 }
073
074 public Class loadClass(String name) throws ClassNotFoundException {
075 return loadClass(name,false);
076 }
077
078 protected Class findClass(String name) throws ClassNotFoundException {
079 return loadClass(name,false);
080 }
081 }