git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@916460 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -65,6 +65,11 @@ Other changes: | |||||
| * PropertyResource will effectively proxy another Resource if ${name} | * PropertyResource will effectively proxy another Resource if ${name} | ||||
| evaluates to a Resource object. | evaluates to a Resource object. | ||||
| * Added forcestring attribute to equals condition to force evaluation | |||||
| of Object args as strings; previously only API-level usage of the | |||||
| equals condition allowed Object args, but Ant 1.8.x+ property | |||||
| evaluation may yield values of any type. | |||||
| Changes from Ant 1.8.0RC1 TO Ant 1.8.0 | Changes from Ant 1.8.0RC1 TO Ant 1.8.0 | ||||
| ====================================== | ====================================== | ||||
| @@ -138,7 +138,7 @@ the tests succeed. | |||||
| </ul> | </ul> | ||||
| <h4>equals</h4> | <h4>equals</h4> | ||||
| <p>Tests whether the two given Strings are identical</p> | |||||
| <p>Tests whether the two given values are equal.</p> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
| <tr> | <tr> | ||||
| <td valign="top"><b>Attribute</b></td> | <td valign="top"><b>Attribute</b></td> | ||||
| @@ -147,12 +147,12 @@ the tests succeed. | |||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td valign="top">arg1</td> | <td valign="top">arg1</td> | ||||
| <td valign="top">First string to test.</td> | |||||
| <td valign="top">First value to test.</td> | |||||
| <td valign="top" align="center">Yes</td> | <td valign="top" align="center">Yes</td> | ||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td valign="top">arg2</td> | <td valign="top">arg2</td> | ||||
| <td valign="top">Second string to test.</td> | |||||
| <td valign="top">Second value to test.</td> | |||||
| <td valign="top" align="center">Yes</td> | <td valign="top" align="center">Yes</td> | ||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| @@ -167,6 +167,13 @@ the tests succeed. | |||||
| them. Default is false.</td> | them. Default is false.</td> | ||||
| <td valign="top" align="center">No</td> | <td valign="top" align="center">No</td> | ||||
| </tr> | </tr> | ||||
| <tr> | |||||
| <td valign="top">forcestring</td> | |||||
| <td valign="top">Force string comparison of <code>arg1/arg2</code>. | |||||
| Default is false. <em>Since Ant 1.8.1</em> | |||||
| </td> | |||||
| <td valign="top" align="center">No</td> | |||||
| </tr> | |||||
| </table> | </table> | ||||
| <h4>isset</h4> | <h4>isset</h4> | ||||
| @@ -32,6 +32,7 @@ public class Equals implements Condition { | |||||
| private boolean trim = false; | private boolean trim = false; | ||||
| private boolean caseSensitive = true; | private boolean caseSensitive = true; | ||||
| private int args; | private int args; | ||||
| private boolean forcestring = false; | |||||
| /** | /** | ||||
| * Set the first argument | * Set the first argument | ||||
| @@ -106,6 +107,16 @@ public class Equals implements Condition { | |||||
| caseSensitive = b; | caseSensitive = b; | ||||
| } | } | ||||
| /** | |||||
| * Set whether to force string comparisons for non-equal, non-string objects. | |||||
| * This allows object properties (legal in Ant 1.8.x+) to be compared as strings. | |||||
| * @param forcestring value to set | |||||
| * @since Ant 1.8.1 | |||||
| */ | |||||
| public void setForcestring(boolean forcestring) { | |||||
| this.forcestring = forcestring; | |||||
| } | |||||
| /** | /** | ||||
| * @return true if the two strings are equal | * @return true if the two strings are equal | ||||
| * @exception BuildException if the attributes are not set correctly | * @exception BuildException if the attributes are not set correctly | ||||
| @@ -114,7 +125,13 @@ public class Equals implements Condition { | |||||
| if ((args & REQUIRED) != REQUIRED) { | if ((args & REQUIRED) != REQUIRED) { | ||||
| throw new BuildException("both arg1 and arg2 are required in equals"); | throw new BuildException("both arg1 and arg2 are required in equals"); | ||||
| } | } | ||||
| if (arg1 == arg2 || arg1 != null && arg1.equals(arg2)) { | |||||
| return true; | |||||
| } | |||||
| if (forcestring) { | |||||
| arg1 = arg1 == null || arg1 instanceof String ? arg1 : arg1.toString(); | |||||
| arg2 = arg2 == null || arg2 instanceof String ? arg2 : arg2.toString(); | |||||
| } | |||||
| if (arg1 instanceof String && trim) { | if (arg1 instanceof String && trim) { | ||||
| arg1 = ((String) arg1).trim(); | arg1 = ((String) arg1).trim(); | ||||
| } | } | ||||
| @@ -126,6 +143,6 @@ public class Equals implements Condition { | |||||
| String s2 = (String) arg2; | String s2 = (String) arg2; | ||||
| return caseSensitive ? s1.equals(s2) : s1.equalsIgnoreCase(s2); | return caseSensitive ? s1.equals(s2) : s1.equalsIgnoreCase(s2); | ||||
| } | } | ||||
| return arg1 == arg2 || arg1 != null && arg1.equals(arg2); | |||||
| return false; | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,80 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||||
| contributor license agreements. See the NOTICE file distributed with | |||||
| this work for additional information regarding copyright ownership. | |||||
| The ASF licenses this file to You 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. | |||||
| --> | |||||
| <project name="equals-test" xmlns:au="antlib:org.apache.ant.antunit" | |||||
| default="antunit"> | |||||
| <import file="../../antunit-base.xml" /> | |||||
| <target name="test-noforcestring"> | |||||
| <string id="s" value="foo" /> | |||||
| <au:assertFalse> | |||||
| <equals arg1="foo" arg2="${ant.refid:s}" /> | |||||
| </au:assertFalse> | |||||
| </target> | |||||
| <target name="test-forcestring"> | |||||
| <string id="s" value="foo" /> | |||||
| <au:assertTrue> | |||||
| <equals arg1="foo" arg2="${ant.refid:s}" forcestring="true" /> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| <target name="test-forcestring-notrim"> | |||||
| <string id="s" value=" foo " /> | |||||
| <au:assertFalse> | |||||
| <equals arg1="foo" arg2="${ant.refid:s}" forcestring="true" /> | |||||
| </au:assertFalse> | |||||
| </target> | |||||
| <target name="test-forcestring-trim"> | |||||
| <string id="s" value=" foo " /> | |||||
| <au:assertTrue> | |||||
| <equals arg1="foo" arg2="${ant.refid:s}" forcestring="true" trim="true" /> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| <target name="test-forcestring-cs"> | |||||
| <string id="s" value="Foo" /> | |||||
| <au:assertFalse> | |||||
| <equals arg1="foo" arg2="${ant.refid:s}" forcestring="true" /> | |||||
| </au:assertFalse> | |||||
| </target> | |||||
| <target name="test-forcestring-nocs"> | |||||
| <string id="s" value="Foo" /> | |||||
| <au:assertTrue> | |||||
| <equals arg1="foo" arg2="${ant.refid:s}" forcestring="true" casesensitive="false" /> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| <target name="test-forcestring-trim-cs"> | |||||
| <string id="s" value=" Foo " /> | |||||
| <au:assertFalse> | |||||
| <equals arg1="foo" arg2="${ant.refid:s}" forcestring="true" trim="true" /> | |||||
| </au:assertFalse> | |||||
| </target> | |||||
| <target name="test-forcestring-trim-nocs"> | |||||
| <string id="s" value=" Foo " /> | |||||
| <au:assertTrue> | |||||
| <equals arg1="foo" arg2="${ant.refid:s}" forcestring="true" | |||||
| trim="true" casesensitive="false" /> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| </project> | |||||