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> |