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 }