Polish "Encode usual XML reserved characters"

See gh-1073
This commit is contained in:
Stephane Nicoll 2020-11-17 13:56:41 +01:00
parent 0cdf11e467
commit ac9da18440
2 changed files with 19 additions and 34 deletions

View File

@ -486,7 +486,7 @@ public class MavenBuildWriter {
private void writeSingleElement(IndentingWriter writer, String name, String text) { private void writeSingleElement(IndentingWriter writer, String name, String text) {
if (text != null) { if (text != null) {
writer.print(String.format("<%s>", name)); writer.print(String.format("<%s>", name));
writer.print(escapeString(text)); writer.print(encodeText(text));
writer.println(String.format("</%s>", name)); writer.println(String.format("</%s>", name));
} }
} }
@ -516,32 +516,31 @@ public class MavenBuildWriter {
} }
} }
private String escapeString(String inputString) { private String encodeText(String text) {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (int i = 0; i < inputString.length(); i++) { for (int i = 0; i < text.length(); i++) {
char character = inputString.charAt(i); char character = text.charAt(i);
switch (character) { switch (character) {
case '\'': case '\'':
stringBuilder.append("&apos;"); sb.append("&apos;");
break; break;
case '\"': case '\"':
stringBuilder.append("&quot;"); sb.append("&quot;");
break; break;
case '<': case '<':
stringBuilder.append("&lt;"); sb.append("&lt;");
break; break;
case '>': case '>':
stringBuilder.append("&gt;"); sb.append("&gt;");
break; break;
case '&': case '&':
stringBuilder.append("&amp;"); sb.append("&amp;");
break; break;
default: default:
stringBuilder.append(character); sb.append(character);
} }
} }
return sb.toString();
return stringBuilder.toString();
} }
} }

View File

@ -818,38 +818,24 @@ class MavenBuildWriterTests {
} }
@Test @Test
void pomWithEscapedCharacters() { void pomWithReservedCharacters() {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.settings().coordinates("com.example.demo", "demo").name("<demo project>") build.settings().coordinates("com.example.demo", "demo").name("<demo project>")
.description("A \"demo\" project for 'developers' & 'testers'"); .description("A \"demo\" project for 'developers' & 'testers'");
String pom = writePom(build);
generatePomString(build, (pomString) -> { assertThat(pom).contains("<name>&lt;demo project&gt;</name>").contains(
String separator = System.lineSeparator(); "<description>A &quot;demo&quot; project for &apos;developers&apos; &amp; &apos;testers&apos;</description>");
assertThat(pomString).isEqualTo("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + separator
+ "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+ separator
+ " xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\">"
+ separator + " <modelVersion>4.0.0</modelVersion>" + separator
+ " <groupId>com.example.demo</groupId>" + separator + " <artifactId>demo</artifactId>"
+ separator + " <version>0.0.1-SNAPSHOT</version>" + separator
+ " <name>&lt;demo project&gt;</name>" + separator
+ " <description>A &quot;demo&quot; project for &apos;developers&apos; &amp; &apos;testers&apos;</description>"
+ separator + separator + "</project>" + separator);
});
} }
private void generatePom(MavenBuild mavenBuild, Consumer<NodeAssert> consumer) { private void generatePom(MavenBuild mavenBuild, Consumer<NodeAssert> consumer) {
MavenBuildWriter writer = new MavenBuildWriter(); consumer.accept(new NodeAssert(writePom(mavenBuild)));
StringWriter out = new StringWriter();
writer.writeTo(new IndentingWriter(out), mavenBuild);
consumer.accept(new NodeAssert(out.toString()));
} }
private void generatePomString(MavenBuild mavenBuild, Consumer<String> consumer) { private String writePom(MavenBuild mavenBuild) {
MavenBuildWriter writer = new MavenBuildWriter(); MavenBuildWriter writer = new MavenBuildWriter();
StringWriter out = new StringWriter(); StringWriter out = new StringWriter();
writer.writeTo(new IndentingWriter(out), mavenBuild); writer.writeTo(new IndentingWriter(out), mavenBuild);
consumer.accept(out.toString()); return out.toString();
} }
} }