/* * Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sf.antcontrib.platform; import java.io.File; import java.io.FileOutputStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.taskdefs.ExecTask; import org.apache.tools.ant.types.Commandline; import org.apache.tools.ant.util.FileUtils; /** * A generic front-end for passing "shell lines" to any application which can * accept a filename containing script input (bash, perl, csh, tcsh, etc.). * see antcontrib doc for useage * * @author stephan beal *@author peter reilly */ public class ShellScriptTask extends ExecTask { private StringBuffer script = new StringBuffer(); private String shell = null; private File tmpFile; private String tmpSuffix = null; /** * Adds s to the lines of script code. */ public void addText(String s) { script.append(getProject().replaceProperties(s)); } /** * Sets script code to s. */ public void setInputString(String s) { script.append(s); } /** * Sets the shell used to run the script. * @param shell the shell to use (bash is default) */ public void setShell(String shell) { this.shell = shell; } /** * Sets the shell used to run the script. * @param shell the shell to use (bash is default) */ public void setExecutable(String shell) { this.shell = shell; } /** * Disallow the command attribute of parent class ExecTask. * ant.attribute ignore="true" * @param notUsed not used * @throws BuildException if called */ public void setCommand(Commandline notUsed) { throw new BuildException("Attribute command is not supported"); } /** * Sets the suffix for the tmp file used to * contain the script. * This is useful for cmd.exe as one can * use cmd /c call x.bat * @param tmpSuffix the suffix to use */ public void setTmpSuffix(String tmpSuffix) { this.tmpSuffix = tmpSuffix; } /** * execute the task */ public void execute() throws BuildException { // Remove per peter's comments. Makes sense. /* if (shell == null) { // Get the default shell shell = Platform.getDefaultShell(); // Get the default shell arguments String args[] = Platform.getDefaultShellArguments(); for (int i=args.length-1;i>=0;i--) this.cmdl.createArgument(true).setValue(args[i]); // Get the default script suffix if (tmpSuffix == null) tmpSuffix = Platform.getDefaultScriptSuffix(); } */ if (shell == null) throw new BuildException("You must specify a shell to run."); try { /* // The following may be used when ant 1.6 is used. if (tmpSuffix == null) super.setInputString(script.toString()); else */ { writeScript(); super.createArg().setValue(tmpFile.getAbsolutePath()); } super.setExecutable(shell); super.execute(); } finally { if (tmpFile != null) { if (! tmpFile.delete()) { log("Non-fatal error: could not delete temporary file " + tmpFile.getAbsolutePath()); } } } } /** * Writes the script lines to a temp file. */ protected void writeScript() throws BuildException { FileOutputStream os = null; try { FileUtils fileUtils = FileUtils.newFileUtils(); // NB: use File.io.createTempFile whenever jdk 1.2 is allowed tmpFile = fileUtils.createTempFile("script", tmpSuffix, null); os = new java.io.FileOutputStream(tmpFile); String string = script.toString(); os.write(string.getBytes(), 0, string.length()); os.close(); } catch (Exception e) { throw new BuildException(e); } finally { try {os.close();} catch (Throwable t) {} } } }