# HG changeset patch # User jjg # Date 1288383158 25200 # Node ID 17f1f2bdcb4636718d06a07af982bb2983e8c28c # Parent 55689b828dc5fa0b7e241795b8682f80c66ed2d0 6994608: javah no longer accepts parameter files as input Reviewed-by: mcimadamore diff -r 55689b828dc5 -r 17f1f2bdcb46 langtools/src/share/classes/com/sun/tools/javah/JavahTask.java --- a/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java Fri Oct 29 12:47:49 2010 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java Fri Oct 29 13:12:38 2010 -0700 @@ -26,6 +26,7 @@ package com.sun.tools.javah; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; @@ -74,6 +75,7 @@ import static javax.tools.Diagnostic.Kind.*; import com.sun.tools.javac.code.Symbol.CompletionFailure; +import com.sun.tools.javac.main.CommandLine; /** * Javah generates support files for native methods. @@ -362,7 +364,7 @@ if (fileManager == null) fileManager = getDefaultFileManager(diagnosticListener, log); - Iterator iter = args.iterator(); + Iterator iter = expandAtArgs(args).iterator(); noArgs = !iter.hasNext(); while (iter.hasNext()) { @@ -416,6 +418,18 @@ throw new BadArgs("err.unknown.option", name).showUsage(true); } + private Iterable expandAtArgs(Iterable args) throws BadArgs { + try { + List l = new ArrayList(); + for (String arg: args) l.add(arg); + return Arrays.asList(CommandLine.parse(l.toArray(new String[l.size()]))); + } catch (FileNotFoundException e) { + throw new BadArgs("at.args.file.not.found", e.getLocalizedMessage()); + } catch (IOException e) { + throw new BadArgs("at.args.io.exception", e.getLocalizedMessage()); + } + } + public Boolean call() { return run(); } @@ -607,8 +621,8 @@ } }; + } - } private String getMessage(String key, Object... args) { return getMessage(task_locale, key, args); } diff -r 55689b828dc5 -r 17f1f2bdcb46 langtools/src/share/classes/com/sun/tools/javah/resources/l10n.properties --- a/langtools/src/share/classes/com/sun/tools/javah/resources/l10n.properties Fri Oct 29 12:47:49 2010 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javah/resources/l10n.properties Fri Oct 29 13:12:38 2010 -0700 @@ -30,6 +30,8 @@ The directory {0} could not be create for output. at.args.cant.read=\ Can''t read command line arguments from file {1}. +at.args.file.not.found=\ + Can''t find file {0}. at.args.io.exception=\ The following I/O problem was encountered when processing an @ \ argument on the command line: {0}. diff -r 55689b828dc5 -r 17f1f2bdcb46 langtools/test/tools/javah/T6994608.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javah/T6994608.java Fri Oct 29 13:12:38 2010 -0700 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2010, 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 6994608 + * @summary javah no longer accepts parameter files as input + */ + +import java.io.*; +import java.util.*; + +public class T6994608 { + public static void main(String... args) throws Exception { + new T6994608().run(); + } + + void run() throws Exception { + Locale prev = Locale.getDefault(); + Locale.setDefault(Locale.ENGLISH); + try { + File f = writeFile(new File("classList"), "java.lang.Object"); + test(Arrays.asList("@" + f.getPath()), 0, null); + test(Arrays.asList("@badfile"), 1, "Can't find file badfile"); + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } finally { + Locale.setDefault(prev); + } + } + + void test(List args, int expectRC, String expectOut) { + System.err.println("Test: " + args + + " rc:" + expectRC + + ((expectOut != null) ? " out:" + expectOut : "")); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javah.Main.run(args.toArray(new String[args.size()]), pw); + pw.close(); + String out = sw.toString(); + if (!out.isEmpty()) + System.err.println(out); + + if (rc != expectRC) + error("Unexpected exit code: " + rc + "; expected: " + expectRC); + if (expectOut != null && !out.contains(expectOut)) + error("Expected string not found: " + expectOut); + + System.err.println(); + } + + File writeFile(File f, String s) throws IOException { + if (f.getParentFile() != null) + f.getParentFile().mkdirs(); + try (FileWriter out = new FileWriter(f)) { + out.write(s); + } + return f; + } + + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors; +} +