diff --git a/WHATSNEW b/WHATSNEW
index 12c69046a..6d2d0dd4d 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -63,7 +63,7 @@ Other changes:
* Added support for specifying CVS_RSH in the task
* New tasks bzip2 and bunzip2 to pack and unpack files using the
- BZip2 alogrithm, replaceregexp, checksum, translate, waitfor
+ BZip2 alogrithm, replaceregexp, checksum, translate, waitfor, input
* The attributes zipfile, jarfile, warfile and earfile (from the Zip,
Jar, War and Ear tasks) have been deprecated and superseded by a
diff --git a/docs/manual/CoreTasks/input.html b/docs/manual/CoreTasks/input.html
new file mode 100644
index 000000000..43d98eb59
--- /dev/null
+++ b/docs/manual/CoreTasks/input.html
@@ -0,0 +1,102 @@
+
+
+
Allows user interaction during the build process by displaying a message and
+reading a line of input from the console (System.in). The user will need to press
+the Return key.
+
+
The message displayed can be set via the message attribute
+or as character data nested into the element.
+
Optinonally a set of valid imput arguments can be defined via the validargs
+attribute. Input task will require the user to reenter values until the entered
+value matches one of the predefined.
+
Optionally a set of exit arguments can be defined via the exitargs attribute.
+Input task will throw a BuildException with a customisable exit message if the
+entered value matches one of the predefined.
+
Optionally a property can be created from the value entered by the user. This
+property can then be used during the following build run. Input behaves according
+to property task which means that existing properties
+cannot be overriden.
+
Parameters
+
+
+
Attribute
+
Description
+
Required
+
+
+
message
+
the Message which gets displayed to the user during the build run.
+
No
+
+
+
exitmessage
+
the exit message which gets displayed when exiting the build run.
+
No
+
+
+
validargs
+
comma separated String containing valid input arguments. If set,
+ input task will reject any input not defined here and input task will
+ require the user to reenter arguments until the entered one matches one of the
+ predefined. Validargs are compared case sensitive. If you want 'a' and 'A' to
+ be accepted you will need to define both arguments within validargs.
+
No
+
+
+
exitargs
+
comma separated String containing exit arguments. If set,
+ input task will throw a BuildException with a customisable exit message if the
+ entered value matches to one of the predefined. Exitargs are compared case
+ sensitive. If you want 'x' and 'X' to end the build run you will need to define
+ both arguments within exitargs.
+
No
+
+
+
addproperty
+
the name of a property to be created from input. Behaviour is equal
+ to property task which means that existing properties
+ cannot be overriden.
+
No
+
+
+
Examples
+
<input/>
+
Will pause the build run until return key is pressed.
+
<input>Press Return key to continue...</input>
+
Will display the message "Press Return key to continue..." and pause
+the build run until return key is pressed.
+
<input
+ message="Press Return key to continue..."
+ />
+
Will display the message "Press Return key to continue..." and pause
+the build run until return key is pressed.
+
<input
+ message="All data is going to be deleted from DB continue (y/n)?"
+ validargs="y,n"
+ exitargs="n"
+ exitmessage="Build abborted by user."
+ />
+
Will display the message "All data is going to be deleted from DB continue
+(y/n)?" and require 'y+retrun key' to continue build or 'n+return key'
+to exit build with following message "Build abborted by user.".
+
<input
+ message="Please enter db-username:"
+ addproperty="db.user"
+ />
+
Will display the message "Please enter db-username:" and set the
+property db.user to the value entered by the user.
+
+
\ No newline at end of file
diff --git a/docs/manual/CoreTasks/overview.html b/docs/manual/CoreTasks/overview.html
index 959443eea..0358dba3a 100644
--- a/docs/manual/CoreTasks/overview.html
+++ b/docs/manual/CoreTasks/overview.html
@@ -7,8 +7,8 @@
Overview of Ant core tasks
-
Given the large number of tasks available to a build designer, it may be
-difficult to get an overall view of what each task can do. The following
+
Given the large number of tasks available to a build designer, it may be
+difficult to get an overall view of what each task can do. The following
table provides a short description of each task and a link to the complete
documentation.
@@ -28,37 +28,37 @@ documentation.
Call another target within the same build-file optionally specifying some
properties.
Executes a system command. When the os attribute is specified, then
the command is only executed when Ant is run on one of the specified operating
systems.
Changes the permissions of a file or all files inside specified directories.
- Right now it has effect only under Unix. The permissions are also UNIX style, like
+
Changes the permissions of a file or all files inside specified directories.
+ Right now it has effect only under Unix. The permissions are also UNIX style, like
the argument for the chmod command.
Sequential is a container task - it can contain other Ant tasks. The nested
- tasks are simply executed in sequence. Sequential's primary use is to support
- the sequential execution of a subset of tasks within the
+
Sequential is a container task - it can contain other Ant tasks. The nested
+ tasks are simply executed in sequence. Sequential's primary use is to support
+ the sequential execution of a subset of tasks within the
parallel task
Executes a series of SQL statements via JDBC to a database. Statements
- can either be read in from a text file using the src attribute or from
+
Executes a series of SQL statements via JDBC to a database. Statements
+ can either be read in from a text file using the src attribute or from
between the enclosing SQL tags.
An extension of the Jar task with special
- treatment for files that should end up in the WEB-INF/lib,
- WEB-INF/classes or WEB-INF directories of the
+ treatment for files that should end up in the WEB-INF/lib,
+ WEB-INF/classes or WEB-INF directories of the
Web Application Archive.
diff --git a/docs/manual/coretasklist.html b/docs/manual/coretasklist.html
index 666094c81..aa52c496a 100644
--- a/docs/manual/coretasklist.html
+++ b/docs/manual/coretasklist.html
@@ -51,6 +51,7 @@
Get GUnzip GZip
+Input Jar Java Javac
@@ -82,7 +83,6 @@
Unzip Uptodate Waitfor
-Waitfor War Zip
diff --git a/src/etc/testcases/taskdefs/input.xml b/src/etc/testcases/taskdefs/input.xml
new file mode 100644
index 000000000..3b3d53811
--- /dev/null
+++ b/src/etc/testcases/taskdefs/input.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+ Press Return key to continue...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/Input.java b/src/main/org/apache/tools/ant/taskdefs/Input.java
new file mode 100644
index 000000000..72793c74f
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/Input.java
@@ -0,0 +1,212 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+
+package org.apache.tools.ant.taskdefs;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import org.apache.tools.ant.*;
+
+
+/**
+ * Ant task to read input line from console.
+ *
+ * @author Ulrich Schmidt
+ */
+public class Input extends Task {
+ private String validargs = null;
+ private String exitargs = null;
+ private String exitmessage = "Build abborted.";
+ private String message = "";
+ private String addproperty = null;
+ private String input = null;
+
+ /**
+ * Defines valid input parameters as comma separated String. If set, input
+ * task will reject any input not defined as accepted and requires the user
+ * to reenter it. Validargs are case sensitive. If you want 'a' and 'A' to
+ * be accepted you need to define both values as accepted arguments.
+ *
+ * @param validargs A comma separated String defining valid input args.
+ */
+ public void setValidargs (String validargs) {
+ this.validargs = validargs;
+ }
+
+ /**
+ * Defines the name of a property to be created from input. Behaviour is
+ * according to property task which means that existing properties
+ * cannot be overriden.
+ *
+ * @param exitargs Name for the property to be created from input
+ */
+ public void setAddproperty (String addproperty) {
+ this.addproperty = addproperty;
+ }
+
+ /*
+ * Defines exit condition parameters as comma separated String. If input
+ * matches one of these input task will end build by throwing a
+ * BuildException. ExitArgs are case sensitive. If you want the build to
+ * end on 'x' and 'X' you need to define both values as exit arguments.
+ *
+ * @param exitargs A comma separated String defining exit arguments.
+ */
+ public void setExitargs (String exitargs) {
+ this.exitargs = exitargs;
+ }
+
+ /**
+ * Sets the ExitMessage which gets displayed when exiting the build run.
+ * Default is 'Build abborted.'
+ * @param exitmessage The exit message to be displayed.
+ */
+ public void setExitmessage (String exitmessage) {
+ this.exitmessage = exitmessage;
+ }
+
+ /**
+ * Sets the Message which gets displayed to the user during the build run.
+ * @param message The message to be displayed.
+ */
+ public void setMessage (String message) {
+ this.message = message;
+ }
+
+ /**
+ * Sets surrogate input to allow automated testing.
+ * @param input The surrogate input used for testing.
+ */
+ public void setTestinput (String testinput) {
+ this.input = testinput;
+ }
+
+ /**
+ * No arg constructor.
+ */
+ public Input () {
+ }
+
+ /**
+ * Actual test method executed by jakarta-ant.
+ * @exception BuildException
+ */
+ public void execute () throws BuildException {
+ Vector accept = null;
+ if (validargs != null) {
+ accept = new Vector();
+ StringTokenizer stok = new StringTokenizer(validargs, ",", false);
+ while (stok.hasMoreTokens()) {
+ accept.addElement(stok.nextToken());
+ }
+ }
+ Vector exit = null;
+ if (exitargs != null) {
+ exit = new Vector();
+ StringTokenizer stok = new StringTokenizer(exitargs, ",", false);
+ while (stok.hasMoreTokens()) {
+ exit.addElement(stok.nextToken());
+ }
+ }
+ log(message, Project.MSG_WARN);
+ if (input == null) {
+ try {
+ BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
+ input = in.readLine();
+ if (accept != null) {
+ while (!accept.contains(input)) {
+ log(message, Project.MSG_WARN);
+ input = in.readLine();
+ }
+ }
+ } catch (IOException e) {
+ throw new BuildException("Failed to read input from Console.", e);
+ }
+ }
+ // not quite the original intention of this task but for the sake
+ // of testing ;-)
+ else {
+ if (accept != null && (!accept.contains(input))) {
+ throw new BuildException("Invalid input please reenter.");
+ }
+ }
+ // adopted from org.apache.tools.ant.taskdefs.Property
+ if (addproperty != null) {
+ if (project.getProperty(addproperty) == null) {
+ project.setProperty(addproperty, input);
+ }
+ else {
+ log("Override ignored for " + addproperty, Project.MSG_VERBOSE);
+ }
+ }
+ if (exit != null && exit.contains(input)) {
+ throw new BuildException(exitmessage);
+ }
+ }
+
+ // copied n' pasted from org.apache.tools.ant.taskdefs.Exit
+ /**
+ * Set a multiline message.
+ */
+ public void addText(String msg) {
+ message +=
+ ProjectHelper.replaceProperties(project, msg, project.getProperties());
+ }
+}
+
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
index be6a46374..d6cf5bb84 100644
--- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties
+++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
@@ -57,6 +57,7 @@ bzip2=org.apache.tools.ant.taskdefs.BZip2
bunzip2=org.apache.tools.ant.taskdefs.BUnzip2
checksum=org.apache.tools.ant.taskdefs.Checksum
waitfor=org.apache.tools.ant.taskdefs.WaitFor
+input=org.apache.tools.ant.taskdefs.Input
# optional tasks
script=org.apache.tools.ant.taskdefs.optional.Script
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/InputTest.java b/src/testcases/org/apache/tools/ant/taskdefs/InputTest.java
new file mode 100644
index 000000000..cda6f1953
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/taskdefs/InputTest.java
@@ -0,0 +1,118 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+
+package org.apache.tools.ant.taskdefs;
+import org.apache.tools.ant.BuildFileTest;
+
+/**
+ * @author Ulrich Schmidt
+ */
+public class InputTest extends BuildFileTest {
+
+ public InputTest(String name) {
+ super(name);
+ }
+
+ public void setUp() {
+ configureProject("src/etc/testcases/taskdefs/input.xml");
+ }
+
+ public void test1() {
+ expectLog("test1", "Press Return key to continue...");
+ }
+
+ public void test2() {
+ expectLog("test2", "Press Return key to continue...");
+ }
+
+ public void test3() {
+ String log = "All data is going to be deleted from DB continue (y/n)?";
+ String message = "Invalid input please reenter.";
+ try {
+ executeTarget("test3");
+ } catch (org.apache.tools.ant.BuildException e) {
+ String realLog = getLog();
+ assertEquals(log, realLog);
+ assertEquals(message, e.getMessage());
+ }
+ }
+
+ public void test4() {
+ String log = "All data is going to be deleted from DB continue (y/n)?";
+ String message = "Build abborted.";
+ try {
+ executeTarget("test4");
+ } catch (org.apache.tools.ant.BuildException e) {
+ String realLog = getLog();
+ assertEquals(log, realLog);
+ assertEquals(message, e.getMessage());
+ }
+ }
+
+ public void test5() {
+ expectLog("test5",
+ "All data is going to be deleted from DB continue (y/n)?");
+ }
+
+ public void test6() {
+ expectLog("test6",
+ "Please enter db-username:");
+ assertEquals("scott", project.getProperty("db.user"));
+ }
+
+ public void test7() {
+ expectBuildException("test7",
+ "Don't trust if you don't have the source ;-)");
+ }
+}