Browse Source

ensure defined order of filters in <replace>

fix for https://bz.apache.org/bugzilla/show_bug.cgi?id=58997
master
Stefan Bodewig 9 years ago
parent
commit
4d0bbb4404
2 changed files with 27 additions and 1 deletions
  1. +5
    -0
      WHATSNEW
  2. +22
    -1
      src/main/org/apache/tools/ant/taskdefs/Replace.java

+ 5
- 0
WHATSNEW View File

@@ -45,6 +45,11 @@ Fixed bugs:
using different names.
Bugzilla Report 57965

* <replace>'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:
--------------



+ 22
- 1
src/main/org/apache/tools/ant/taskdefs/Replace.java View File

@@ -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<Object> getOrderedIterator(Properties props) {
Set<Object> keys = new TreeSet(new Comparator<Object>() {
@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();
}
}

Loading…
Cancel
Save