aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java8
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java76
2 files changed, 83 insertions, 1 deletions
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java
index f2410afdba..bda9dad10a 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java
@@ -24,6 +24,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
+import java.net.URL;
+import java.net.URLClassLoader;
import java.nio.ByteBuffer;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
@@ -158,4 +160,10 @@ public class ZipOutputFileManager extends JavacFileManager {
}
});
}
+
+ @Override
+ protected ClassLoader getClassLoader(URL[] urls) {
+ // mask turbine classes from the processor classpath to avoid version skew
+ return new URLClassLoader(urls, null);
+ }
}
diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
index 69c92f1f91..e2e832c39f 100644
--- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
+++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
@@ -47,6 +47,7 @@ import org.objectweb.asm.util.TraceClassVisitor;
import java.io.BufferedInputStream;
import java.io.IOError;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -829,7 +830,7 @@ public class JavacTurbineTest {
assertThat(sw.toString()).contains("error reading");
}
}
-
+
@Test
public void requiredConstructor() throws Exception {
addSourceLines("Super.java", "class Super {", " public Super(int x) {}", "}");
@@ -898,4 +899,77 @@ public class JavacTurbineTest {
};
assertThat(text).isEqualTo(Joiner.on('\n').join(expected));
}
+
+ @SupportedAnnotationTypes("*")
+ public static class HostClasspathProcessor extends AbstractProcessor {
+
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latest();
+ }
+
+ boolean first = true;
+
+ @Override
+ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ if (!first) {
+ return false;
+ }
+ first = false;
+
+ String message;
+ try {
+ JavacTurbine.class.toString();
+ message = "ok";
+ } catch (Throwable e) {
+ StringWriter stringWriter = new StringWriter();
+ e.printStackTrace(new PrintWriter(stringWriter));
+ message = stringWriter.toString();
+ }
+ try {
+ FileObject fileObject =
+ processingEnv
+ .getFiler()
+ .createResource(StandardLocation.CLASS_OUTPUT, "", "result.txt");
+ try (OutputStream os = fileObject.openOutputStream()) {
+ os.write(message.getBytes(StandardCharsets.UTF_8));
+ }
+ } catch (IOException e) {
+ throw new IOError(e);
+ }
+ return false;
+ }
+ }
+
+ @Test
+ public void maskProcessorClasspath() throws Exception {
+ addSourceLines("MyAnnotation.java", "public @interface MyAnnotation {}");
+ addSourceLines("Hello.java", "@MyAnnotation class Hello {}");
+
+ // create a jar containing only HostClasspathProcessor
+ Path processorJar = temp.newFile("libprocessor.jar").toPath();
+ try (OutputStream os = Files.newOutputStream(processorJar);
+ JarOutputStream jos = new JarOutputStream(os)) {
+ String classFileName = HostClasspathProcessor.class.getName().replace('.', '/') + ".class";
+ jos.putNextEntry(new JarEntry(classFileName));
+ try (InputStream is = getClass().getClassLoader().getResourceAsStream(classFileName)) {
+ ByteStreams.copy(is, jos);
+ }
+ }
+
+ optionsBuilder.setProcessors(ImmutableList.of(HostClasspathProcessor.class.getName()));
+ optionsBuilder.addProcessorPathEntries(ImmutableList.of(processorJar.toString()));
+ optionsBuilder.addClassPathEntries(ImmutableList.<String>of());
+
+ compile();
+
+ Map<String, byte[]> outputs = collectOutputs();
+ assertThat(outputs.keySet()).contains("result.txt");
+
+ String text = new String(outputs.get("result.txt"), StandardCharsets.UTF_8);
+ assertThat(text)
+ .contains(
+ "java.lang.NoClassDefFoundError:"
+ + " com/google/devtools/build/java/turbine/javac/JavacTurbine");
+ }
}