From 80ba84596e7927249fbfd6f73f7084d8f393b1ef Mon Sep 17 00:00:00 2001 From: jjg Date: Thu, 13 Jan 2011 11:48:10 -0800 Subject: [PATCH] 6430241: Hard to disable symbol file feature through API Reviewed-by: mcimadamore --- .../tools/javac/file/JavacFileManager.java | 4 +- .../com/sun/tools/javac/file/Paths.java | 16 +- test/tools/javac/api/T6430241.java | 237 ++++++++++++++++++ 3 files changed, 248 insertions(+), 9 deletions(-) create mode 100644 test/tools/javac/api/T6430241.java diff --git a/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java b/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java index 230509bf..335ded62 100644 --- a/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java +++ b/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -472,7 +472,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil */ protected Archive openArchive(File zipFileName) throws IOException { File origZipFileName = zipFileName; - if (!ignoreSymbolFile && paths.isBootClassPathRtJar(zipFileName)) { + if (!ignoreSymbolFile && paths.isDefaultBootClassPathRtJar(zipFileName)) { File file = zipFileName.getParentFile().getParentFile(); // ${java.home} if (new File(file.getName()).equals(new File("jre"))) file = file.getParentFile(); diff --git a/src/share/classes/com/sun/tools/javac/file/Paths.java b/src/share/classes/com/sun/tools/javac/file/Paths.java index 67904f59..7cb36003 100644 --- a/src/share/classes/com/sun/tools/javac/file/Paths.java +++ b/src/share/classes/com/sun/tools/javac/file/Paths.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -112,7 +112,7 @@ public class Paths { * rt.jar as found on the default bootclass path. If the user specified a * bootclasspath, null is used. */ - private File bootClassPathRtJar = null; + private File defaultBootClassPathRtJar = null; /** * Is bootclasspath the default? @@ -143,8 +143,10 @@ public class Paths { // no defaults for other paths p = null; } else { - if (location == PLATFORM_CLASS_PATH) + if (location == PLATFORM_CLASS_PATH) { + defaultBootClassPathRtJar = null; isDefaultBootClassPath = false; + } p = new Path(); for (File f: path) p.addFile(f, warn); // TODO: is use of warn appropriate? @@ -185,8 +187,8 @@ public class Paths { : Collections.unmodifiableCollection(p); } - boolean isBootClassPathRtJar(File file) { - return file.equals(bootClassPathRtJar); + boolean isDefaultBootClassPathRtJar(File file) { + return file.equals(defaultBootClassPathRtJar); } /** @@ -355,7 +357,7 @@ public class Paths { } private Path computeBootClassPath() { - bootClassPathRtJar = null; + defaultBootClassPathRtJar = null; Path path = new Path(); String bootclasspathOpt = options.get(BOOTCLASSPATH); @@ -380,7 +382,7 @@ public class Paths { File rt_jar = new File("rt.jar"); for (File file : getPathEntries(files)) { if (new File(file.getName()).equals(rt_jar)) - bootClassPathRtJar = file; + defaultBootClassPathRtJar = file; } } diff --git a/test/tools/javac/api/T6430241.java b/test/tools/javac/api/T6430241.java new file mode 100644 index 00000000..8916d3d3 --- /dev/null +++ b/test/tools/javac/api/T6430241.java @@ -0,0 +1,237 @@ + /* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + /* + * @test + * @bug 6430241 + * @summary Hard to disable symbol file feature through API + */ + + import java.io.*; + import java.util.*; + import javax.tools.*; + + import com.sun.source.util.JavacTask; + import com.sun.tools.javac.api.JavacTool; + + public class T6430241 { + public static void main(String... args) throws Exception { + new T6430241().run(); + } + + void run() throws Exception { + setup(); + testCommandLine(); + testSimpleAPI(); + testTaskAPI(); + + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + void setup() throws Exception { + classesDir = new File("classes"); + classesDir.mkdirs(); + + emptyDir = new File("empty"); + emptyDir.mkdirs(); + + bootClassPath = System.getProperty("sun.boot.class.path"); + + File srcDir = new File("src"); + String test = "import sun.misc.Unsafe; class Test { }"; + testFile = writeFile(srcDir, "Test.java", test); + } + + //----- tests for command line invocation + + void testCommandLine() throws Exception { + testCommandLine(true); + testCommandLine(true, "-Xbootclasspath/p:" + emptyDir); + testCommandLine(false, "-Xbootclasspath:" + bootClassPath); + testCommandLine(true, "-Xbootclasspath/a:" + emptyDir); + testCommandLine(false, "-XDignore.symbol.file"); + System.err.println(); + } + + void testCommandLine(boolean expectWarnings, String... opts) throws Exception { + System.err.println("test command line: " + Arrays.asList(opts)); + + String[] args = initArgs(opts); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javac.Main.compile(args, pw); + String out = showOutput(sw.toString()); + + checkCompilationOK(rc); + checkOutput(out, expectWarnings); + } + + //----- tests for simple API invocation + + void testSimpleAPI() { + testSimpleAPI(true); + testSimpleAPI(true, "-Xbootclasspath/p:" + emptyDir); + testSimpleAPI(false, "-Xbootclasspath:" + bootClassPath); + testSimpleAPI(true, "-Xbootclasspath/a:" + emptyDir); + testSimpleAPI(false, "-XDignore.symbol.file"); + System.err.println(); + } + + void testSimpleAPI(boolean expectWarnings, String... opts) { + System.err.println("test simple API: " + Arrays.asList(opts)); + + String[] args = initArgs(opts); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(baos); + + JavacTool tool = JavacTool.create(); + int rc = tool.run(null, null, ps, args); + + String out = showOutput(baos.toString()); + + checkCompilationOK(rc); + checkOutput(out, expectWarnings); + } + + //----- tests for CompilationTask API invocation + + void testTaskAPI() throws Exception { + List bcp = new ArrayList(); + for (String f: bootClassPath.split(File.pathSeparator)) { + if (!f.isEmpty()) + bcp.add(new File(f)); + } + + testTaskAPI(true, null); + testTaskAPI(false, bcp); + System.err.println(); + } + + void testTaskAPI(boolean expectWarnings, Iterable pcp) throws Exception { + System.err.println("test task API: " + pcp); + + JavacTool tool = JavacTool.create(); + StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); + + if (pcp != null) + fm.setLocation(StandardLocation.PLATFORM_CLASS_PATH, pcp); + + Iterable files = fm.getJavaFileObjects(testFile); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + JavacTask task = tool.getTask(pw, fm, null, null, null, files); + boolean ok = task.call(); + String out = showOutput(sw.toString()); + + checkCompilationOK(ok); + checkOutput(out, expectWarnings); + } + + //----- utility methods + + /** + * Create a file with given content. + */ + File writeFile(File dir, String path, String content) throws IOException { + File f = new File(dir, path); + f.getParentFile().mkdirs(); + FileWriter out = new FileWriter(f); + try { + out.write(content); + } finally { + out.close(); + } + return f; + } + + /** + * Initialize args for compilation with given opts. + * @return opts -d classesDir testFile + */ + String[] initArgs(String[] opts) { + List args = new ArrayList(); + args.addAll(Arrays.asList(opts)); + args.add("-d"); + args.add(classesDir.getPath()); + args.add(testFile.getPath()); + return args.toArray(new String[args.size()]); + } + + /** + * Show output from compilation if non empty. + */ + String showOutput(String out) { + if (!out.isEmpty()) + System.err.println(out); + return out; + } + + /** + * Verify compilation succeeeded. + */ + void checkCompilationOK(boolean ok) { + if (!ok) + error("compilation failed"); + } + + /** + * Verify compilation succeeeded. + */ + void checkCompilationOK(int rc) { + if (rc != 0) + error("compilation failed, rc: " + rc); + } + + /** + * Check whether output contains warnings if and only if warnings + * are expected. + */ + void checkOutput(String out, boolean expectWarnings) { + boolean foundWarnings = out.contains("warning"); + if (foundWarnings) { + if (!expectWarnings) + error("unexpected warnings found"); + } else { + if (expectWarnings) + error("expected warnings not found"); + } + } + + /** + * Report an error. + */ + void error(String msg) { + System.err.println("error: " + msg); + errors++; + } + + String bootClassPath; + File classesDir; + File emptyDir; + File testFile; + int errors; + } -- GitLab