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    }