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 &gt; 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 &gt; 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()));

Reply via email to