diff options
-rw-r--r-- | src/launch/lombok/launch/ShadowClassLoader.java | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/launch/lombok/launch/ShadowClassLoader.java b/src/launch/lombok/launch/ShadowClassLoader.java index ab36d6b4..985a0a2a 100644 --- a/src/launch/lombok/launch/ShadowClassLoader.java +++ b/src/launch/lombok/launch/ShadowClassLoader.java @@ -57,6 +57,7 @@ import java.util.jar.JarFile; class ShadowClassLoader extends ClassLoader { private static final String SELF_NAME = "lombok/launch/ShadowClassLoader.class"; private final String SELF_BASE; + private final File SELF_BASE_FILE; private final int SELF_BASE_LENGTH; private final List<File> override = new ArrayList<File>(); @@ -92,6 +93,9 @@ class ShadowClassLoader extends ClassLoader { SELF_BASE = sclClassUrl.substring(0, SELF_BASE_LENGTH); } + if (SELF_BASE.startsWith("jar:file:") && SELF_BASE.endsWith("!/")) SELF_BASE_FILE = new File(SELF_BASE.substring(9, SELF_BASE.length() - 2)); + else if (SELF_BASE.startsWith("file:")) SELF_BASE_FILE = new File(SELF_BASE.substring(5)); + else SELF_BASE_FILE = new File(SELF_BASE); String scl = System.getProperty("shadow.override." + sclSuffix); if (scl != null && !scl.isEmpty()) { for (String part : scl.split("\\s*" + (File.pathSeparatorChar == ';' ? ";" : ":") + "\\s*")) { @@ -148,37 +152,38 @@ class ShadowClassLoader extends ClassLoader { return (itemString.length() == SELF_BASE_LENGTH + name.length()) && SELF_BASE.regionMatches(0, itemString, 0, SELF_BASE_LENGTH); } - public Enumeration<URL> getResources(String name) throws IOException { + @Override public Enumeration<URL> getResources(String name) throws IOException { String altName = null; if (name.endsWith(".class")) altName = name.substring(0, name.length() - 6) + ".SCL." + sclSuffix; - List<URL> overrides = null; - for (File ce : override) { - URL url = getResourceFromLocation(name, altName, ce); - if (url != null) { - if (overrides == null) overrides = new ArrayList<URL>(); - overrides.add(url); - } - } - // Vector????!!???WTFBBQ??? Yes, we need one: + // Vector? Yes, we need one: // * We can NOT make inner classes here (this class is loaded with special voodoo magic in eclipse, as a one off, it's not a full loader. // * We need to return an enumeration. // * We can't make one on the fly. // * ArrayList can't make these. - Vector<URL> vector = new Vector<URL>(); - if (overrides != null) vector.addAll(overrides); + + for (File ce : override) { + URL url = getResourceFromLocation(name, altName, ce); + if (url != null) vector.add(url); + } + + if (override.isEmpty()) { + URL fromSelf = getResourceFromLocation(name, altName, SELF_BASE_FILE); + if (fromSelf != null) vector.add(fromSelf); + } + Enumeration<URL> sec = super.getResources(name); while (sec.hasMoreElements()) { URL item = sec.nextElement(); - if (override.isEmpty() || !inOwnBase(item, name)) vector.add(item); + if (!inOwnBase(item, name)) vector.add(item); } if (altName != null) { Enumeration<URL> tern = super.getResources(altName); while (tern.hasMoreElements()) { URL item = tern.nextElement(); - if (override.isEmpty() || !inOwnBase(item, altName)) vector.add(item); + if (!inOwnBase(item, altName)) vector.add(item); } } @@ -213,6 +218,9 @@ class ShadowClassLoader extends ClassLoader { } } + URL url = getResourceFromLocation(name, altName, SELF_BASE_FILE); + if (url != null) return url; + if (altName != null) { URL res = super.getResource(altName); if (res != null && (!noSuper || inOwnBase(res, altName))) return res; @@ -235,7 +243,6 @@ class ShadowClassLoader extends ClassLoader { if (candidate == null) return null; if (!inOwnBase(candidate, name)) return candidate; - Enumeration<URL> en = super.getResources(name); while (en.hasMoreElements()) { candidate = en.nextElement(); |