This is an automated email from the ASF dual-hosted git repository.

elharo pushed a commit to branch fix/xpp3dom-removechild
in repository https://gitbox.apache.org/repos/asf/maven-shared-utils.git

commit 2b644b2bff89277b3651e866326b862b62a80130
Author: Elliotte Rusty Harold <[email protected]>
AuthorDate: Wed Jul 1 09:25:08 2026 -0400

    Xpp3Dom.removeChild(int): fix childMap corruption with duplicate names
---
 .../java/org/apache/maven/shared/utils/xml/Xpp3Dom.java  | 16 +++++++++++++++-
 .../apache/maven/shared/utils/xml/pull/Xpp3DomTest.java  | 16 ++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java 
b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java
index e76c6b9..3c933ac 100644
--- a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java
+++ b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java
@@ -261,8 +261,22 @@ public class Xpp3Dom implements Iterable<Xpp3Dom> {
      */
     public void removeChild(int i) {
         Xpp3Dom child = childList.remove(i);
-        childMap.values().remove(child);
         child.setParent(null);
+
+        String name = child.getName();
+        if (childMap.get(name) == child) {
+            Xpp3Dom lastWithName = null;
+            for (Xpp3Dom c : childList) {
+                if (name.equals(c.getName())) {
+                    lastWithName = c;
+                }
+            }
+            if (lastWithName != null) {
+                childMap.put(name, lastWithName);
+            } else {
+                childMap.remove(name);
+            }
+        }
     }
 
     /**
diff --git 
a/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java 
b/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java
index d64e9c4..b2cb9e1 100644
--- a/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java
+++ b/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java
@@ -42,6 +42,22 @@ public class Xpp3DomTest {
         return t1s1;
     }
 
+    @Test
+    public void removeChildByIndexUpdatesChildMap() {
+        Xpp3Dom parent = new Xpp3Dom("parent");
+        Xpp3Dom first = new Xpp3Dom("child");
+        first.setValue("first");
+        Xpp3Dom second = new Xpp3Dom("child");
+        second.setValue("second");
+        parent.addChild(first);
+        parent.addChild(second);
+
+        parent.removeChild(1);
+
+        assertEquals(1, parent.getChildCount());
+        assertEquals("first", parent.getChild("child").getValue());
+    }
+
     @Test
     public void mergePrecedenceSelfClosed() throws XmlPullParserException {
         Xpp3Dom parentConfig = 
build("<configuration><items><item/></items></configuration>");

Reply via email to