diff --git a/WHATSNEW b/WHATSNEW index 116ace18c..3256f14e0 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -45,6 +45,11 @@ Fixed bugs: using different names. Bugzilla Report 57965 + * 's result was undefined when using the replacefilterfile + attribute and some keys inside the properties files have been + substrings of other keys. Keys are now sorted by descending size. + Bugzilla Report 58997 + Other changes: -------------- diff --git a/src/main/org/apache/tools/ant/taskdefs/Replace.java b/src/main/org/apache/tools/ant/taskdefs/Replace.java index 9aa9fe8e6..31f24c74b 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Replace.java +++ b/src/main/org/apache/tools/ant/taskdefs/Replace.java @@ -31,8 +31,11 @@ import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; +import java.util.Comparator; import java.util.Iterator; import java.util.Properties; +import java.util.Set; +import java.util.TreeSet; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; @@ -508,7 +511,7 @@ public class Replace extends MatchingTask { try { if (replaceFilterResource != null) { Properties props = getProperties(replaceFilterResource); - Iterator e = props.keySet().iterator(); + Iterator e = getOrderedIterator(props); while (e.hasNext()) { String tok = e.next().toString(); Replacefilter replaceFilter = createReplacefilter(); @@ -952,4 +955,22 @@ public class Replace extends MatchingTask { } } + /** + * Sort keys by size so that tokens that are substrings of other + * strings are tried later. + */ + private Iterator getOrderedIterator(Properties props) { + Set keys = new TreeSet(new Comparator() { + @Override + public int compare(Object key1, Object key2) { + return compare(key1.toString(), key2.toString()); + } + + private int compare(String key1, String key2) { + return key2.length() - key1.length(); + } + }); + keys.addAll(props.keySet()); + return keys.iterator(); + } }