Browse Source

added the inline handler element to the input task.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@359317 13f79535-47bb-0310-9956-ffa450edef68
master
Matthew Jason Benson 19 years ago
parent
commit
2ddb16472e
6 changed files with 295 additions and 4 deletions
  1. +2
    -0
      WHATSNEW
  2. +49
    -0
      docs/manual/CoreTasks/input.html
  3. +2
    -0
      src/etc/testcases/taskdefs/input.stdin
  4. +72
    -0
      src/etc/testcases/taskdefs/input.xml
  5. +133
    -4
      src/main/org/apache/tools/ant/taskdefs/Input.java
  6. +37
    -0
      src/testcases/org/apache/tools/ant/taskdefs/InputTest.java

+ 2
- 0
WHATSNEW View File

@@ -339,6 +339,8 @@ Other changes:

* added the onmissingfiltersfile attribute to filterset. Bugzilla report 19845.

* added the inline handler element to the input task.

Changes from Ant 1.6.4 to Ant 1.6.5
===================================



+ 49
- 0
docs/manual/CoreTasks/input.html View File

@@ -78,6 +78,55 @@ file and load in before the input task.</p>
<td valign="top" align="center">No</td>
</tr>
</table>
<h3>Parameters Specified as Nested Elements</h3>
<h4>Handler</h4>
<p>Since <b>Ant 1.7</b>, a nested &lt;handler&gt; element can be used to
specify an InputHandler, so that different InputHandlers may be used
among different Input tasks.

<table border="1" cellpadding="2" cellspacing="0">
<tr>
<td valign="top"><b>Attribute</b></td>
<td valign="top"><b>Description</b></td>
<td align="center" valign="top"><b>Required</b></td>
</tr>
<tr>
<td valign="top">type</td>
<td valign="top">one of "default","propertyfile", or "greedy".
</td>
<td align="center" valign="top" rowspan="3">One of these</td>
</tr>
<tr>
<td valign="top">refid</td>
<td valign="top">Reference to an <code>InputHandler</code>
defined elsewhere in the project.
</td>
</tr>
<tr>
<td valign="top">classname</td>
<td valign="top">The name of an <code>InputHandler</code> subclass.</td>
</tr>
<tr>
<td valign="top">classpath</td>
<td valign="top">The classpath to use with <i>classname</i>.</td>
<td valign="top">No</td>
</tr>
<tr>
<td valign="top">classpathref</td>
<td valign="top">The refid of a classpath to use with <i>classname</i>.</td>
<td valign="top">No</td>
</tr>
<tr>
<td valign="top">loaderref</td>
<td valign="top">The refid of a classloader to use with <i>classname</i>.
</td>
<td valign="top">No</td>
</tr>
</table>
<br />
The classpath can also be specified by means of one or more nested
&lt;classpath&gt; elements.</p>

<h3>Examples</h3>
<pre> &lt;input/&gt;</pre>
<p>Will pause the build run until return key is pressed when using the


+ 2
- 0
src/etc/testcases/taskdefs/input.stdin View File

@@ -0,0 +1,2 @@
foo
bar

+ 72
- 0
src/etc/testcases/taskdefs/input.xml View File

@@ -28,4 +28,76 @@
/>
</target>

<target name="testPropertyFileInlineHandler">
<input message="Press Return key to continue..." addproperty="test">
<handler type="propertyfile" />
</input>
<fail>
<condition>
<not>
<equals arg1="${test}" arg2="test" />
</not>
</condition>
</fail>
</target>

<target name="testDefaultInlineHandler">
<input message="Press Return key to continue..." addproperty="test">
<handler type="default" />
</input>
<fail message="$${test} = ${test}">
<condition>
<not>
<equals arg1="${test}" arg2="foo" />
</not>
</condition>
</fail>
</target>

<target name="testGreedyInlineHandler">
<input message="Press Return key to continue..." addproperty="test">
<handler type="greedy" />
</input>
<fail message="$${test} = ${test}">
<condition>
<not>
<equals arg1="${test}"
arg2="foo${line.separator}bar${line.separator}" />
</not>
</condition>
</fail>
</target>

<target name="testGreedyInlineHandlerClassname">
<input message="Press Return key to continue..." addproperty="test">
<handler classname="org.apache.tools.ant.input.GreedyInputHandler" />
</input>
<fail message="$${test} = ${test}">
<condition>
<not>
<equals arg1="${test}"
arg2="foo${line.separator}bar${line.separator}" />
</not>
</condition>
</fail>
</target>

<target name="testGreedyInlineHandlerRefid">
<typedef name="greedy"
classname="org.apache.tools.ant.input.GreedyInputHandler" />
<greedy id="greedy" />

<input message="Press Return key to continue..." addproperty="test">
<handler refid="greedy" />
</input>
<fail message="$${test} = ${test}">
<condition>
<not>
<equals arg1="${test}"
arg2="foo${line.separator}bar${line.separator}" />
</not>
</condition>
</fail>
</target>

</project>

+ 133
- 4
src/main/org/apache/tools/ant/taskdefs/Input.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 2001-2004 The Apache Software Foundation
* Copyright 2001-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,11 +18,20 @@
package org.apache.tools.ant.taskdefs;

import java.util.Vector;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.input.InputHandler;
import org.apache.tools.ant.input.InputRequest;
import org.apache.tools.ant.input.GreedyInputHandler;
import org.apache.tools.ant.input.DefaultInputHandler;
import org.apache.tools.ant.input.PropertyFileInputHandler;
import org.apache.tools.ant.input.MultipleChoiceInputRequest;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.util.StringUtils;
import org.apache.tools.ant.util.ClasspathUtils;

/**
* Reads an input line from the console.
@@ -32,10 +41,108 @@ import org.apache.tools.ant.util.StringUtils;
* @ant.task category="control"
*/
public class Input extends Task {

/**
* Represents an InputHandler.
*/
public class Handler extends DefBase {

private String refid = null;
private HandlerType type = null;
private String classname = null;

/**
* Specify that the handler is a reference on the project;
* this allows the use of a custom inputhandler.
* @param refid the String refid.
*/
public void setRefid(String refid) {
this.refid = refid;
}
/**
* Get the refid of this Handler.
* @return String refid.
*/
public String getRefid() {
return refid;
}
/**
* Set the InputHandler classname.
* @param classname the String classname.
*/
public void setClassname(String classname) {
this.classname = classname;
}
/**
* Get the classname of the InputHandler.
* @return String classname.
*/
public String getClassname() {
return classname;
}
/**
* Set the handler type.
* @param type a HandlerType.
*/
public void setType(HandlerType type) {
this.type = type;
}
/**
* Get the handler type.
* @return a HandlerType object.
*/
public HandlerType getType() {
return type;
}
private InputHandler getInputHandler() {
if (type != null) {
return type.getInputHandler();
}
if (refid != null) {
try {
return (InputHandler) (getProject().getReference(refid));
} catch (ClassCastException e) {
throw new BuildException(
refid + " does not denote an InputHandler", e);
}
}
if (classname != null) {
return (InputHandler) (ClasspathUtils.newInstance(classname,
createLoader(), InputHandler.class));
}
throw new BuildException(
"Must specify refid, classname or type");
}
}

/**
* EnumeratedAttribute representing the built-in input handler types:
* "default", "propertyfile", "greedy".
*/
public static class HandlerType extends EnumeratedAttribute {
private static final String[] VALUES
= {"default", "propertyfile", "greedy"};

private static final InputHandler[] HANDLERS
= {new DefaultInputHandler(),
new PropertyFileInputHandler(),
new GreedyInputHandler()};

//inherit doc
public String[] getValues() {
return VALUES;
}
private InputHandler getInputHandler() {
return HANDLERS[getIndex()];
}
}

private String validargs = null;
private String message = "";
private String addproperty = null;
private String defaultvalue = null;
private Handler handler = null;
private boolean messageAttribute;

/**
* Defines valid input parameters as comma separated strings. If set, input
@@ -66,6 +173,7 @@ public class Input extends Task {
*/
public void setMessage (String message) {
this.message = message;
messageAttribute = true;
}

/**
@@ -84,7 +192,11 @@ public class Input extends Task {
* @param msg The message to be displayed.
*/
public void addText(String msg) {
message += getProject().replaceProperties(msg);
msg = getProject().replaceProperties(msg);
if (messageAttribute && "".equals(msg.trim())) {
return;
}
message += msg;
}

/**
@@ -113,7 +225,11 @@ public class Input extends Task {
request = new InputRequest(message);
}

getProject().getInputHandler().handleInput(request);
InputHandler h = handler == null
? getProject().getInputHandler()
: handler.getInputHandler();

h.handleInput(request);

String value = request.getInput();
if ((value == null || value.trim().length() == 0)
@@ -125,4 +241,17 @@ public class Input extends Task {
}
}

/**
* Create a nested handler element.
* @return a Handler for this Input task.
*/
public Handler createHandler() {
if (handler != null) {
throw new BuildException(
"Cannot define > 1 nested input handler");
}
handler = new Handler();
return handler;
}

}

+ 37
- 0
src/testcases/org/apache/tools/ant/taskdefs/InputTest.java View File

@@ -17,6 +17,9 @@

package org.apache.tools.ant.taskdefs;

import java.io.InputStream;
import java.io.FileInputStream;

import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.input.PropertyFileInputHandler;

@@ -62,6 +65,40 @@ public class InputTest extends BuildFileTest {
assertEquals("scott", project.getProperty("db.user"));
}

public void testPropertyFileInlineHandler() {
executeTarget("testPropertyFileInlineHandler");
}

public void testDefaultInlineHandler() {
stdin();
executeTarget("testDefaultInlineHandler");
}

public void testGreedyInlineHandler() {
stdin();
executeTarget("testGreedyInlineHandler");
}

public void testGreedyInlineHandlerClassname() {
stdin();
executeTarget("testGreedyInlineHandlerClassname");
}

public void testGreedyInlineHandlerRefid() {
stdin();
executeTarget("testGreedyInlineHandlerRefid");
}

private void stdin() {
try {
System.setIn(new FileInputStream(
getProject().resolveFile("input.stdin")));
} catch (Exception e) {
throw e instanceof RuntimeException
? (RuntimeException) e : new RuntimeException(e.getMessage());
}
}

private String getKey(String key) {
return key; // XXX what is this for?
}


Loading…
Cancel
Save