This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch MNG-7831 in repository https://gitbox.apache.org/repos/asf/maven.git
commit 981f64d3cd1a7a61da9f6a223b79f1d9038092ee Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Sun Jul 2 19:29:15 2023 +0200 [MNG-7831] Ensure XmlUtils does not fail when xmlpullparser detects an entityref and parser.name is null --- .../ConsumerPomArtifactTransformerTest.java | 26 ++++++++++++++++++++++ .../test/resources/projects/transform/before2.pom | 11 +++++++++ .../maven/model/transform/pull/XmlUtils.java | 20 ++++++++++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/maven-core/src/test/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformerTest.java b/maven-core/src/test/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformerTest.java index 27c4d15e6..68ab7097c 100644 --- a/maven-core/src/test/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformerTest.java +++ b/maven-core/src/test/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformerTest.java @@ -18,8 +18,11 @@ */ package org.apache.maven.internal.transformation; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -33,7 +36,9 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.xmlunit.assertj.XmlAssert; +import static java.util.stream.Collectors.joining; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @@ -52,6 +57,27 @@ class ConsumerPomArtifactTransformerTest { } } + @Test + void transform2() throws Exception { + Path beforePomFile = + Paths.get("src/test/resources/projects/transform/before2.pom").toAbsolutePath(); + try (BufferedReader result = new BufferedReader(new InputStreamReader( + ConsumerPomArtifactTransformer.transform(beforePomFile, new NoTransformerContext()), + StandardCharsets.UTF_8))) { + assertEquals( + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + + "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" + + " <modelVersion>4.0.0</modelVersion>\n" + + "\n" + + " <groupId>com.apache.maven</groupId>\n" + + " <artifactId>transform-me</artifactId>\n" + + " <version>1.0.0-SNAPSHOT</version>\n" + + " <description>1 > 2</description>\n" + + "</project>", + result.lines().collect(joining("\n"))); + } + } + @Test void injectTransformedArtifactsWithoutPomShouldNotInjectAnyArtifacts() throws IOException { MavenProject emptyProject = new MavenProject(); diff --git a/maven-core/src/test/resources/projects/transform/before2.pom b/maven-core/src/test/resources/projects/transform/before2.pom new file mode 100644 index 000000000..e32b2b6ae --- /dev/null +++ b/maven-core/src/test/resources/projects/transform/before2.pom @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.apache.maven</groupId> + <artifactId>transform-me</artifactId> + <version>1.0.0-SNAPSHOT</version> + <description>1 > 2</description> +</project> diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/XmlUtils.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/XmlUtils.java index a2f71aa55..80d2c62b7 100644 --- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/XmlUtils.java +++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/XmlUtils.java @@ -78,7 +78,25 @@ public class XmlUtils { serializer.cdsect(parser.getText()); break; case XmlPullParser.ENTITY_REF: - serializer.entityRef(parser.getName()); + final String name = parser.getName(); + if (name != null) { + serializer.entityRef(name); + } else { // mxparser is pseudo-bugy so handle this case (escaped xml char) in a tag without cdata + final String text = parser.getText(); + switch (text) { + case "&": + serializer.entityRef("amp"); + break; + case "<": + serializer.entityRef("lt"); + break; + case ">": + serializer.entityRef("gt"); + break; + default: // here we can loose the original escaping but not a big deal + serializer.text(text); + } + } break; case XmlPullParser.IGNORABLE_WHITESPACE: serializer.ignorableWhitespace(normalize(parser.getText()));