diff --git a/docs/manual/CoreTasks/fail.html b/docs/manual/CoreTasks/fail.html index 125bc2075..7801fe7f4 100644 --- a/docs/manual/CoreTasks/fail.html +++ b/docs/manual/CoreTasks/fail.html @@ -41,10 +41,10 @@ or character data nested into the element.

Parameters specified as nested elements

As an alternative to the if/unless attributes, - conditional failure can be achieved using a single nested condition. - For a complete list of core conditions, as well as information - about custom conditions, see here.
- Since Ant 1.6.2 + conditional failure can be achieved using a single nested + <condition> element, which should contain exactly one + core or custom condition. For information about conditions, see + here.
Since Ant 1.6.2

Examples

@@ -79,12 +79,15 @@ BUILD FAILED build.xml:2: unless=thisdoesnotexist -A simple example using conditions to achieve the same effect: +Using a condition to achieve the same effect: +
   <fail>
-     <not>
-       <isset property="thisdoesnotexist"/>
-     </not>
+     <condition>
+       <not>
+         <isset property="thisdoesnotexist"/>
+       </not>
+     </condition>
    </fail>
 
diff --git a/src/etc/testcases/taskdefs/fail.xml b/src/etc/testcases/taskdefs/fail.xml index b7b7f3037..d32c2c6c9 100644 --- a/src/etc/testcases/taskdefs/fail.xml +++ b/src/etc/testcases/taskdefs/fail.xml @@ -28,54 +28,87 @@ - + + + - + + + - + + + - + + + - + + + - + + + - - + + + + + + - + + + testNested6 testNested6 testNested6 + + + + + + + + + + + + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/Exit.java b/src/main/org/apache/tools/ant/taskdefs/Exit.java index f3fbfc792..e04706e36 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Exit.java +++ b/src/main/org/apache/tools/ant/taskdefs/Exit.java @@ -17,6 +17,8 @@ package org.apache.tools.ant.taskdefs; +import java.util.Vector; +import org.apache.tools.ant.Task; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.taskdefs.condition.Condition; import org.apache.tools.ant.taskdefs.condition.ConditionBase; @@ -42,9 +44,21 @@ import org.apache.tools.ant.taskdefs.condition.ConditionBase; * * @ant.task name="fail" category="control" */ -public class Exit extends ConditionBase { +public class Exit extends Task { + + private class NestedCondition extends ConditionBase implements Condition { + public boolean eval() { + if (countConditions() != 1) { + throw new BuildException( + "A single nested condition is required."); + } + return ((Condition)(getConditions().nextElement())).eval(); + } + } + private String message; private String ifCondition, unlessCondition; + private NestedCondition nestedCondition; /** * A message giving further information on why the build exited. @@ -128,6 +142,19 @@ public class Exit extends ConditionBase { message += getProject().replaceProperties(msg); } + /** + * Add a condition element. + * @return ConditionBase. + * @since Ant 1.6.2 + */ + public ConditionBase createCondition() { + if (nestedCondition != null) { + throw new BuildException("Only one nested condition is allowed."); + } + nestedCondition = new NestedCondition(); + return nestedCondition; + } + /** * test the if condition * @return true if there is no if condition, or the named property exists @@ -156,21 +183,22 @@ public class Exit extends ConditionBase { * @return true if there is none, or it evaluates to true */ private boolean testNestedCondition() { - if (ifCondition != null || unlessCondition != null) { - throw new BuildException("Nested conditions " - + "not permitted in conjunction with if/unless attributes"); - } + boolean result = nestedConditionPresent(); - int count = countConditions(); - if (count > 1) { - throw new BuildException("Too many conditions: " + count); + if (result && ifCondition != null || unlessCondition != null) { + throw new BuildException("Nested conditions " + + "not permitted in conjunction with if/unless attributes"); } - return (count == 0) ? true - : (((Condition)(getConditions().nextElement())).eval()); + return result && nestedCondition.eval(); } + /** + * test whether there is a nested condition. + * @return boolean. + */ private boolean nestedConditionPresent() { - return (countConditions() > 0); + return (nestedCondition != null); } + } diff --git a/src/testcases/org/apache/tools/ant/taskdefs/FailTest.java b/src/testcases/org/apache/tools/ant/taskdefs/FailTest.java index f5df9932d..033865894 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/FailTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/FailTest.java @@ -138,7 +138,7 @@ public class FailTest extends BuildFileTest { public void testNested5() { expectSpecificBuildException("testNested5", "it is required to fail :-)", - "Too many conditions: 2"); + "Only one nested condition is allowed."); } public void testNested6() { @@ -147,4 +147,17 @@ public class FailTest extends BuildFileTest { "testNested6\ntestNested6\ntestNested6"); } - } + public void testNested7() { + String specificMessage = "A single nested condition is required."; + + char[] c = {'a', 'b'}; + StringBuffer target = new StringBuffer("testNested7x"); + + for (int i = 0; i < c.length; i++) { + target.setCharAt(target.length() - 1, c[i]); + expectSpecificBuildException(target.toString(), + "it is required to fail :-)", specificMessage); + } + } + +}