diff --git a/WHATSNEW b/WHATSNEW index 92d8de49a..9eb64cfe6 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -19,6 +19,8 @@ Fixed bugs: * 's outputfile attribute will be resolved as relative to the projects basedir. +* should create a valid DTD for propertyfile.operation.entry + Changes from Ant 1.2 to Ant 1.3 =========================================== diff --git a/src/main/org/apache/tools/ant/taskdefs/AntStructure.java b/src/main/org/apache/tools/ant/taskdefs/AntStructure.java index 4c632eb54..24add68b5 100644 --- a/src/main/org/apache/tools/ant/taskdefs/AntStructure.java +++ b/src/main/org/apache/tools/ant/taskdefs/AntStructure.java @@ -256,7 +256,9 @@ public class AntStructure extends Task { EnumeratedAttribute ea = (EnumeratedAttribute)type.newInstance(); String[] values = ea.getValues(); - if (values == null || values.length == 0) { + if (values == null + || values.length == 0 + || !areNmtokens(values)) { sb.append("CDATA "); } else { sb.append("("); @@ -291,4 +293,35 @@ public class AntStructure extends Task { private void printTail(PrintWriter out) {} + /** + * Does this String match the XML-NMTOKEN production? + */ + protected boolean isNmtoken(String s) { + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + // XXX - we are ommitting CombiningChar and Extender here + if (!Character.isLetterOrDigit(c) && + c != '.' && c != '-' && + c != '_' && c != ':') { + return false; + } + } + return true; + } + + /** + * Do the Strings all match the XML-NMTOKEN production? + * + *

Otherwise they are not suitable as an enumerated attribute, + * for example.

+ */ + protected boolean areNmtokens(String[] s) { + for (int i = 0; i < s.length; i++) { + if (!isNmtoken(s[i])) { + return false; + } + } + return true; + } + }