# HG changeset patch # User jjg # Date 1252435437 25200 # Node ID 182e4a28c0ce56fb5a4a3818375345c202c0daa0 # Parent f1aefacd7231a703e75418ed39d62f3c7c22d832 6879371: javap does not close internal default file manager Reviewed-by: darcy diff -r f1aefacd7231 -r 182e4a28c0ce langtools/src/share/classes/com/sun/tools/javap/JavapTask.java --- a/langtools/src/share/classes/com/sun/tools/javap/JavapTask.java Tue Sep 08 11:29:58 2009 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javap/JavapTask.java Tue Sep 08 11:43:57 2009 -0700 @@ -455,8 +455,19 @@ return EXIT_CMDERR; } - boolean ok = run(); - return ok ? EXIT_OK : EXIT_ERROR; + try { + boolean ok = run(); + return ok ? EXIT_OK : EXIT_ERROR; + } finally { + if (defaultFileManager != null) { + try { + defaultFileManager.close(); + defaultFileManager = null; + } catch (IOException e) { + throw new InternalError(e); + } + } + } } catch (BadArgs e) { reportError(e.key, e.args); if (e.showUsage) { @@ -856,7 +867,9 @@ } private JavaFileManager getDefaultFileManager(final DiagnosticListener dl, PrintWriter log) { - return JavapFileManager.create(dl, log); + if (defaultFileManager == null) + defaultFileManager = JavapFileManager.create(dl, log); + return defaultFileManager; } private JavaFileObject getClassFileObject(String className) throws IOException { @@ -1004,6 +1017,7 @@ protected Context context; JavaFileManager fileManager; + JavaFileManager defaultFileManager; PrintWriter log; DiagnosticListener diagnosticListener; List classes; diff -r f1aefacd7231 -r 182e4a28c0ce langtools/test/tools/javap/T6879371.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javap/T6879371.java Tue Sep 08 11:43:57 2009 -0700 @@ -0,0 +1,119 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6879371 + * @summary javap does not close internal default file manager + */ + +import java.io.*; +import java.util.zip.*; + +public class T6879371 { + public static void main(String[] args) throws Exception { + new T6879371().run(); + } + + public void run() throws Exception { + // create a simple test class which we can put into + // a test zip file and know that it will be used by + // javap. + File classDir = new File("classes"); + classDir.mkdir(); + + String className = "Test"; + File javaFile = writeTestFile(className); + compileTestFile(classDir, javaFile); + + test(classDir, className, false); + test(classDir, className, true); + } + + void test(File classDir, String className, boolean useJavaUtilZip) throws Exception { + // javac should really not be using system properties like this + // -- it should really be using (hidden) options -- but until then + // take care to leave system properties as we find them, so as not + // to adversely affect other tests that might follow. + String prev = System.getProperty("useJavaUtilZip"); + setProperty("useJavaUtilZip", (useJavaUtilZip ? "true" : null)); + try { + File zipFile = zip(classDir, new File(classDir + ".zip")); + javap("-classpath", zipFile.getPath(), className); + + if (!zipFile.delete()) + throw new Exception("failed to delete " + zipFile); + } finally { + setProperty("useJavaUtilZip", prev); + } + } + + File writeTestFile(String name) throws IOException { + File f = new File(name + ".java"); + PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(f))); + out.println("class " + name + " { }"); + out.close(); + return f; + } + + void compileTestFile(File classDir, File file) { + int rc = com.sun.tools.javac.Main.compile( + new String[] { "-d", classDir.getPath(), file.getPath() }); + if (rc != 0) + throw new Error("compilation failed. rc=" + rc); + } + + File zip(File dir, File zipFile) throws IOException { + ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); + for (File file: dir.listFiles()) { + if (file.isFile()) { + byte[] data = new byte[(int) file.length()]; + DataInputStream in = new DataInputStream(new FileInputStream(file)); + in.readFully(data); + in.close(); + zipOut.putNextEntry(new ZipEntry(file.getName())); + zipOut.write(data, 0, data.length); + zipOut.closeEntry(); + } + } + zipOut.close(); + return zipFile; + } + + String javap(String... args) { + StringWriter sw = new StringWriter(); + PrintWriter out = new PrintWriter(sw); + int rc = com.sun.tools.javap.Main.run(args, out); + if (rc != 0) + throw new Error("javap failed. rc=" + rc); + out.close(); + return sw.toString(); + } + + void setProperty(String key, String value) { + if (value != null) + System.setProperty(key, value); + else + System.getProperties().remove(key); + } +}