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 @@ + + + + +Ant User Manual + + + + +

Input

+

Description

+

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionRequired
messagethe Message which gets displayed to the user during the build run.No
exitmessagethe exit message which gets displayed when exiting the build run.No
validargscomma 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
exitargscomma 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
addpropertythe 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.

+ +
+

Copyright © 2000,2001 Apache Software Foundation. All rights +Reserved.

+ + \ 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.

- + AntStructure

Generates a DTD for Ant buildfiles which contains information about all tasks currently known to Ant.

- + Apply/ExecOn

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.

- + Available

Sets a property if a resource is available at runtime. This resource can be a file, a directory, a class in the classpath, or a JVM system resource.

- + Chmod -

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.

Condition

Sets a property if a certain condition holds true - this is a - generalization of Available and + generalization of Available and Uptodate.

@@ -79,20 +79,20 @@ file, a directory, a class in the classpath, or a JVM system resource.

Cvs -

Handles packages/modules retrieved from a +

Handles packages/modules retrieved from a CVS repository.

CVSPass -

Adds entries to a .cvspass file. Adding entries to this file has the same +

Adds entries to a .cvspass file. Adding entries to this file has the same affect as a cvs login command.

Delete -

Deletes either a single file, all files in a specified directory - and its sub-directories, or a set of files specified by one or more +

Deletes either a single file, all files in a specified directory + and its sub-directories, or a set of files specified by one or more FileSets.

@@ -165,6 +165,12 @@ through the Project commodity methods.

GZips a file.

+ + Input +

Allows user interaction during the build process by displaying a +message and reading a line of input from the console.

+ + Jar

Jars a set of files.

@@ -184,7 +190,7 @@ specified.

Javadoc/Javadoc2

Generates code documentation using the javadoc tool.

-

The Javadoc2 task is deprecated. Use the Javadoc task +

The Javadoc2 task is deprecated. Use the Javadoc task instead.

@@ -210,7 +216,7 @@ specified.

Parallel is a container task - it can contain other Ant tasks. Each nested task within the parallel task will be executed in its own thread.

- + Patch

Applies a diff file to originals.

@@ -241,7 +247,7 @@ specified.

Replace -

Replace is a directory based task for replacing the occurrence of a given string with another string +

Replace is a directory based task for replacing the occurrence of a given string with another string in selected file.

@@ -252,12 +258,12 @@ specified.

Sequential -

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

- + SignJar

Signs a jar or zip file with the javasign command line tool.

@@ -265,14 +271,14 @@ specified.

Sleep -

A task for sleeping a short period of time, useful when a build or +

A task for sleeping a short period of time, useful when a build or deployment process requires an interval between tasks.

Sql -

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.

@@ -300,8 +306,8 @@ specified.

TStamp -

Sets the DSTAMP, TSTAMP, and - TODAY properties in the current project based on +

Sets the DSTAMP, TSTAMP, and + TODAY properties in the current project based on the current date and time.

@@ -340,8 +346,8 @@ specified.

War

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 ;-)"); + } +}