Fix for "ZIP file closed" errors caused by the postprocessor trying to load more lombok classes to do its job, after javac has already closed the classloader via a hack. We hack the hack to stop javac from closing only _our_ (that is, lombok.jar's) classloader.

Co-Author: Roel
This commit is contained in:
Reinier Zwitserloot committed 2010-10-01 03:19:48 +02:00
1 parent 05c97e8bfa
commit 5a24e6f9f2
1 file changed
+63 -1
+63 -1
View File
@@ -21,8 +21,12 @@
*/
package lombok.javac.apt;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.Enumeration;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Set;
@@ -74,8 +78,10 @@ public class Processor extends AbstractProcessor {
transformer = new JavacTransformer(procEnv.getMessager());
trees = Trees.instance(procEnv);
}
private void placePostCompileHook() {
stopJavacProcessingEnvironmentFromClosingOurClassloader();
Context context = processingEnv.getContext();
try {
@@ -100,6 +106,62 @@ public class Processor extends AbstractProcessor {
}
}
private static class WrappingClassLoader extends ClassLoader {
private final ClassLoader parent;
public WrappingClassLoader(ClassLoader parent) {
this.parent = parent;
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
return parent.loadClass(name);
}
public String toString() {
return parent.toString();
}
public URL getResource(String name) {
return parent.getResource(name);
}
public Enumeration<URL> getResources(String name) throws IOException {
return parent.getResources(name);
}
public InputStream getResourceAsStream(String name) {
return parent.getResourceAsStream(name);
}
public void setDefaultAssertionStatus(boolean enabled) {
parent.setDefaultAssertionStatus(enabled);
}
public void setPackageAssertionStatus(String packageName, boolean enabled) {
parent.setPackageAssertionStatus(packageName, enabled);
}
public void setClassAssertionStatus(String className, boolean enabled) {
parent.setClassAssertionStatus(className, enabled);
}
public void clearAssertionStatus() {
parent.clearAssertionStatus();
}
}
private void stopJavacProcessingEnvironmentFromClosingOurClassloader() {
try {
Field f = JavacProcessingEnvironment.class.getDeclaredField("processorClassLoader");
f.setAccessible(true);
ClassLoader unwrapped = (ClassLoader) f.get(processingEnv);
ClassLoader wrapped = new WrappingClassLoader(unwrapped);
f.set(processingEnv, wrapped);
} catch (Throwable t) {
throw Lombok.sneakyThrow(t);
}
}
/** {@inheritDoc} */
@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
IdentityHashMap<JCCompilationUnit, Void> units = new IdentityHashMap<JCCompilationUnit, Void>();