stevel 2004/10/06 15:41:52 Modified: src/main/org/apache/tools/ant/taskdefs/compilers DefaultCompilerAdapter.java JavacExternal.java src/main/org/apache/tools/ant/taskdefs Execute.java Java.java src/main/org/apache/tools/ant/util FileUtils.java JavaEnvUtils.java Log: Somewhat reworked patch for bug# 31106, submitted by Isao Yanagimachi. Took the opportunity to clean up the tasks slightly, such as removing duplication in various methods. We need a unit test for long command line java, and many parameter java, just to see what breaks. Revision Changes Path 1.49 +7 -7 ant/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java Index: DefaultCompilerAdapter.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java,v retrieving revision 1.48 retrieving revision 1.49 diff -u -r1.48 -r1.49 --- DefaultCompilerAdapter.java 4 Jun 2004 17:51:21 -0000 1.48 +++ DefaultCompilerAdapter.java 6 Oct 2004 22:41:52 -0000 1.49 @@ -31,6 +31,7 @@ import org.apache.tools.ant.types.Path; import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.JavaEnvUtils; +import org.apache.tools.ant.taskdefs.condition.Os; /** * This is the default implementation for the CompilerAdapter interface. @@ -416,13 +417,7 @@ throw new BuildException("Error creating temporary file", e, location); } finally { - if (out != null) { - try { - out.close(); - } catch (Throwable t) { - // ignore - } - } + FileUtils.close(out); } } else { commandArray = args; @@ -433,6 +428,11 @@ new LogStreamHandler(attributes, Project.MSG_INFO, Project.MSG_WARN)); + if (Os.isFamily("openvms")) { + //Use the VM launcher instead of shell launcher on VMS + //for java + exe.setVMLauncher(true); + } exe.setAntRun(project); exe.setWorkingDirectory(project.getBaseDir()); exe.setCommandline(commandArray); 1.16 +39 -4 ant/src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java Index: JavacExternal.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- JavacExternal.java 9 Mar 2004 16:48:13 -0000 1.15 +++ JavacExternal.java 6 Oct 2004 22:41:52 -0000 1.16 @@ -17,9 +17,15 @@ package org.apache.tools.ant.taskdefs.compilers; +import java.io.IOException; +import java.io.File; + import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Commandline; +import org.apache.tools.ant.taskdefs.condition.Os; +import org.apache.tools.ant.util.JavaEnvUtils; +import org.apache.tools.ant.util.FileUtils; /** * Performs a compile using javac externally. @@ -39,11 +45,40 @@ setupModernJavacCommandlineSwitches(cmd); int firstFileName = assumeJava11() ? -1 : cmd.size(); logAndAddFilesToCompile(cmd); - + //On VMS platform, we need to create a special java options file + //containing the arguments and classpath for the javac command. + //The special file is supported by the "-V" switch on the VMS JVM. + if (Os.isFamily("openvms")) { + return execOnVMS(cmd, firstFileName); + } return - executeExternalCompile(cmd.getCommandline(), firstFileName, - true) - == 0; + executeExternalCompile(cmd.getCommandline(), firstFileName, + true) + == 0; + } + + /** + * helper method to execute our command on VMS. + * @param cmd + * @param firstFileName + * @return + */ + private boolean execOnVMS(Commandline cmd, int firstFileName) { + File vmsFile=null; + try { + vmsFile = JavaEnvUtils.createVmsJavaOptionFile(cmd.getArguments()); + String[] commandLine = {cmd.getExecutable(), + "-V", + vmsFile.getPath()}; + return 0==executeExternalCompile(commandLine, + firstFileName, + true); + + } catch (IOException e) { + throw new BuildException("Failed to create a temporary file for \"-V\" switch"); + } finally { + FileUtils.delete(vmsFile); + } } } 1.84 +22 -20 ant/src/main/org/apache/tools/ant/taskdefs/Execute.java Index: Execute.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Execute.java,v retrieving revision 1.83 retrieving revision 1.84 diff -u -r1.83 -r1.84 --- Execute.java 11 Aug 2004 09:37:42 -0000 1.83 +++ Execute.java 6 Oct 2004 22:41:52 -0000 1.84 @@ -33,6 +33,7 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; +import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.taskdefs.condition.Os; import org.apache.tools.ant.types.Commandline; @@ -56,6 +57,9 @@ private File workingDirectory = null; private Project project = null; private boolean newEnvironment = false; + //TODO: nothing appears to read this. + private boolean spawn = false; + /** Controls whether the VM is used to launch commands, where possible */ private boolean useVMLauncher = true; @@ -64,7 +68,6 @@ private static CommandLauncher vmLauncher = null; private static CommandLauncher shellLauncher = null; private static Vector procEnvironment = null; - private boolean spawn = false; /** Used to destroy processes when the VM exits. */ private static ProcessDestroyer processDestroyer = new ProcessDestroyer(); @@ -75,9 +78,7 @@ static { // Try using a JDK 1.3 launcher try { - if (Os.isFamily("openvms")) { - vmLauncher = new VmsCommandLauncher(); - } else if (!Os.isFamily("os/2")) { + if (!Os.isFamily("os/2")) { vmLauncher = new Java13CommandLauncher(); } } catch (NoSuchMethodException exc) { @@ -124,8 +125,12 @@ shellLauncher = new PerlScriptCommandLauncher("bin/antRun.pl", baseLauncher); } else if (Os.isFamily("openvms")) { - // the vmLauncher already uses the shell - shellLauncher = vmLauncher; + // OpenVMS + try { + shellLauncher = new VmsCommandLauncher(); + } catch (NoSuchMethodException exc) { + // Ignore and keep trying + } } else { // Generic shellLauncher = new ScriptCommandLauncher("bin/antRun", @@ -304,6 +309,11 @@ ExecuteWatchdog watchdog) { setStreamHandler(streamHandler); this.watchdog = watchdog; + //By default, use the shell launcher for VMS + // + if (Os.isFamily("openvms")) { + useVMLauncher = false; + } } /** @@ -666,18 +676,9 @@ * @param process the <CODE>Process</CODE>. */ public static void closeStreams(Process process) { - try { - process.getInputStream().close(); - } catch (IOException eyeOhEx) { - } - try { - process.getOutputStream().close(); - } catch (IOException eyeOhEx) { - } - try { - process.getErrorStream().close(); - } catch (IOException eyeOhEx) { - } + FileUtils.close(process.getInputStream()); + FileUtils.close(process.getOutputStream()); + FileUtils.close(process.getErrorStream()); } /** @@ -1151,7 +1152,8 @@ */ private File createCommandFile(String[] cmd, String[] env) throws IOException { - File script = File.createTempFile("ANT", ".COM"); + File script = FileUtils.newFileUtils().createTempFile("ANT", ".COM",null); + //TODO: bind the longevity of the file to the exe script.deleteOnExit(); PrintWriter out = null; try { 1.94 +87 -34 ant/src/main/org/apache/tools/ant/taskdefs/Java.java Index: Java.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Java.java,v retrieving revision 1.93 retrieving revision 1.94 diff -u -r1.93 -r1.94 --- Java.java 23 Apr 2004 10:03:49 -0000 1.93 +++ Java.java 6 Oct 2004 22:41:52 -0000 1.94 @@ -35,6 +35,8 @@ import org.apache.tools.ant.types.Assertions; import org.apache.tools.ant.types.Permissions; import org.apache.tools.ant.types.RedirectorElement; +import org.apache.tools.ant.taskdefs.condition.Os; +import org.apache.tools.ant.util.JavaEnvUtils; /** * Launcher for Java applications. Allows use of @@ -732,29 +734,8 @@ Execute exe = new Execute(redirector.createHandler(), createWatchdog()); - exe.setAntRun(getProject()); - - if (dir == null) { - dir = getProject().getBaseDir(); - } else if (!dir.exists() || !dir.isDirectory()) { - throw new BuildException(dir.getAbsolutePath() - + " is not a valid directory", - getLocation()); - } - - exe.setWorkingDirectory(dir); - - String[] environment = env.getVariables(); - if (environment != null) { - for (int i = 0; i < environment.length; i++) { - log("Setting environment variable: " + environment[i], - Project.MSG_VERBOSE); - } - } - exe.setNewenvironment(newEnvironment); - exe.setEnvironment(environment); + setupExecutable(exe, command); - exe.setCommandline(command); try { int rc = exe.execute(); redirector.complete(); @@ -767,6 +748,8 @@ } } + + /** * Executes the given classname with the given arguments in a separate VM. */ @@ -774,18 +757,33 @@ Execute exe = new Execute(); - exe.setAntRun(getProject()); - - if (dir == null) { - dir = getProject().getBaseDir(); - } else if (!dir.exists() || !dir.isDirectory()) { - throw new BuildException(dir.getAbsolutePath() - + " is not a valid directory", - getLocation()); + setupExecutable(exe, command); + try { + exe.spawn(); + } catch (IOException e) { + throw new BuildException(e, getLocation()); } + } - exe.setWorkingDirectory(dir); + /** + * Do all configuration for an executable that + * is common across the [EMAIL PROTECTED] #fork(String[])} and + * [EMAIL PROTECTED] #spawn(String[])} methods + * @param exe executable + * @param command command to execute + */ + private void setupExecutable(Execute exe, String[] command) { + exe.setAntRun(getProject()); + setupWorkingDir(exe); + setupEnvironment(exe); + setupCommandLine(exe, command); + } + /** + * set up our environment variables + * @param exe + */ + private void setupEnvironment(Execute exe) { String[] environment = env.getVariables(); if (environment != null) { for (int i = 0; i < environment.length; i++) { @@ -795,14 +793,69 @@ } exe.setNewenvironment(newEnvironment); exe.setEnvironment(environment); + } - exe.setCommandline(command); + /** + * set the working dir of the new process + * @param exe + * @throws BuildException if the dir doesn't exist. + */ + private void setupWorkingDir(Execute exe) { + if (dir == null) { + dir = getProject().getBaseDir(); + } else if (!dir.exists() || !dir.isDirectory()) { + throw new BuildException(dir.getAbsolutePath() + + " is not a valid directory", + getLocation()); + } + exe.setWorkingDirectory(dir); + } + + /** + * set the command line for the exe. + * On VMS, hands off to [EMAIL PROTECTED] #setupCommandLineForVMS(Execute, String[])} + * @param exe + * @param command + */ + private void setupCommandLine(Execute exe, String[] command) { + //On VMS platform, we need to create a special java options file + //containing the arguments and classpath for the java command. + //The special file is supported by the "-V" switch on the VMS JVM. + if (Os.isFamily("openvms")) { + setupCommandLineForVMS(exe, command); + } else { + exe.setCommandline(command); + } + } + + /** + * On VMS platform, we need to create a special java options file + * containing the arguments and classpath for the java command. + * The special file is supported by the "-V" switch on the VMS JVM. + * + * @param exe + * @param command + */ + private void setupCommandLineForVMS(Execute exe, String[] command) { + //Use the VM launcher instead of shell launcher on VMS + exe.setVMLauncher(true); + File vmsJavaOptionFile=null; try { - exe.spawn(); + String [] args = new String[command.length-1]; + System.arraycopy(command, 1, args, 0, command.length-1); + vmsJavaOptionFile = JavaEnvUtils.createVmsJavaOptionFile(args); + //we mark the file to be deleted on exit. + //the alternative would be to cache the filename and delete + //after execution finished, which is much better for long-lived runtimes + //though spawning complicates things... + vmsJavaOptionFile.deleteOnExit(); + String [] vmsCmd = {command[0], "-V", vmsJavaOptionFile.getPath()}; + exe.setCommandline(vmsCmd); } catch (IOException e) { - throw new BuildException(e, getLocation()); + throw new BuildException("Failed to create a temporary file for \"-V\" switch"); } } + /** * Executes the given classname with the given arguments as it * was a command line application. 1.71 +11 -1 ant/src/main/org/apache/tools/ant/util/FileUtils.java Index: FileUtils.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/FileUtils.java,v retrieving revision 1.70 retrieving revision 1.71 diff -u -r1.70 -r1.71 --- FileUtils.java 3 Aug 2004 23:18:35 -0000 1.70 +++ FileUtils.java 6 Oct 2004 22:41:52 -0000 1.71 @@ -1449,5 +1449,15 @@ } } + /** + * Delete the file with [EMAIL PROTECTED] File#delete()} if the argument is not null. + * Do nothing on a null argument + * @param file file to delete + */ + public static void delete(File file) { + if(file!=null) { + file.delete(); + } + } } 1.21 +33 -1 ant/src/main/org/apache/tools/ant/util/JavaEnvUtils.java Index: JavaEnvUtils.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/JavaEnvUtils.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- JavaEnvUtils.java 9 Mar 2004 16:48:51 -0000 1.20 +++ JavaEnvUtils.java 6 Oct 2004 22:41:52 -0000 1.21 @@ -17,6 +17,10 @@ package org.apache.tools.ant.util; import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.FileWriter; +import java.io.BufferedWriter; import java.util.Vector; import org.apache.tools.ant.taskdefs.condition.Os; @@ -28,6 +32,9 @@ */ public class JavaEnvUtils { + private JavaEnvUtils() { + } + /** Are we on a DOS-based system */ private static final boolean isDos = Os.isFamily("dos"); /** Are we on Novell NetWare */ @@ -115,7 +122,7 @@ * @since Ant 1.5 */ public static boolean isJavaVersion(String version) { - return javaVersion == version; + return javaVersion.equals(version); } /** @@ -331,5 +338,30 @@ buildJrePackages(); } return jrePackages; + } + + /** + * + * Writes the command into a temporary DCL script and returns the + * corresponding File object. + * It is the job of the caller to delete the file on exit. + * @param cmd + * @return + * @throws IOException + */ + public static File createVmsJavaOptionFile(String[] cmd) + throws IOException { + File script = FileUtils.newFileUtils() + .createTempFile("ANT", ".JAVA_OPTS", null); + PrintWriter out = null; + try { + out = new PrintWriter(new BufferedWriter(new FileWriter(script))); + for (int i = 0; i < cmd.length; i++) { + out.println(cmd[i]); + } + } finally { + FileUtils.close(out); + } + return script; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]