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

veithen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git


The following commit(s) were added to refs/heads/master by this push:
     new b78db1fc8 Use ScopedNamespaceContext in normalizeDocument to track 
inherited namespace declarations
b78db1fc8 is described below

commit b78db1fc8beba8e8c0bd0916ba7b7bd0e9578256
Author: Copilot <[email protected]>
AuthorDate: Sat May 23 16:42:07 2026 +0100

    Use ScopedNamespaceContext in normalizeDocument to track inherited 
namespace declarations
    
    Co-authored-by: Andreas Veithen-Knowles <[email protected]>
---
 mixins/dom-mixins/pom.xml                          |  5 +++
 .../main/java/org/apache/axiom/dom/DOMNode.java    |  3 +-
 .../java/org/apache/axiom/dom/DOMParentNode.java   |  3 +-
 .../axiom/dom/impl/mixin/DOMAttributeMixin.java    |  3 +-
 .../dom/impl/mixin/DOMDocumentFragmentMixin.java   |  3 +-
 .../axiom/dom/impl/mixin/DOMDocumentMixin.java     |  5 ++-
 .../dom/impl/mixin/DOMEntityReferenceMixin.java    |  3 +-
 .../axiom/dom/impl/mixin/DOMLeafNodeMixin.java     |  3 +-
 .../dom/impl/mixin/DOMNSAwareElementMixin.java     | 46 +++++++++-------------
 .../dom/impl/mixin/DOMNSUnawareElementMixin.java   |  3 +-
 .../axiom/dom/impl/mixin/DOMParentNodeMixin.java   |  9 +++--
 11 files changed, 46 insertions(+), 40 deletions(-)

diff --git a/mixins/dom-mixins/pom.xml b/mixins/dom-mixins/pom.xml
index 048a77ff1..705ea20d0 100644
--- a/mixins/dom-mixins/pom.xml
+++ b/mixins/dom-mixins/pom.xml
@@ -37,6 +37,11 @@
             <artifactId>core-mixins</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>namespace-utils</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>xml-utils</artifactId>
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMNode.java 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMNode.java
index 60005d8ff..7611bd4ad 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMNode.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMNode.java
@@ -20,6 +20,7 @@ package org.apache.axiom.dom;
 
 import org.apache.axiom.core.CoreElement;
 import org.apache.axiom.core.CoreNode;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Inject;
 import org.w3c.dom.Node;
 
@@ -38,5 +39,5 @@ public interface DOMNode extends Node, CoreNode {
      */
     CoreElement getNamespaceContext();
 
-    void normalizeRecursively(DOMConfigurationImpl config);
+    void normalizeRecursively(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext);
 }
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
index 905d40974..dcba5c308 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
@@ -19,8 +19,9 @@
 package org.apache.axiom.dom;
 
 import org.apache.axiom.core.CoreParentNode;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.w3c.dom.NodeList;
 
 public interface DOMParentNode extends DOMNode, NodeList, CoreParentNode {
-    void normalize(DOMConfigurationImpl config);
+    void normalize(DOMConfigurationImpl config, ScopedNamespaceContext 
nsContext);
 }
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMAttributeMixin.java
 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMAttributeMixin.java
index c18ab6694..2b6cb0218 100644
--- 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMAttributeMixin.java
+++ 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMAttributeMixin.java
@@ -24,6 +24,7 @@ import org.apache.axiom.dom.DOMAttribute;
 import org.apache.axiom.dom.DOMConfigurationImpl;
 import org.apache.axiom.dom.DOMExceptionUtil;
 import org.apache.axiom.dom.DOMSemantics;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Mixin;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
@@ -119,5 +120,5 @@ public abstract class DOMAttributeMixin implements 
DOMAttribute {
     }
 
     @Override
-    public final void normalize(DOMConfigurationImpl config) {}
+    public final void normalize(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext) {}
 }
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentFragmentMixin.java
 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentFragmentMixin.java
index f0175e693..8ea84429d 100644
--- 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentFragmentMixin.java
+++ 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentFragmentMixin.java
@@ -27,6 +27,7 @@ import org.apache.axiom.dom.DOMConfigurationImpl;
 import org.apache.axiom.dom.DOMDocumentFragment;
 import org.apache.axiom.dom.DOMExceptionUtil;
 import org.apache.axiom.dom.DOMSemantics;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Mixin;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
@@ -112,5 +113,5 @@ public abstract class DOMDocumentFragmentMixin implements 
DOMDocumentFragment {
     }
 
     @Override
-    public final void normalize(DOMConfigurationImpl config) {}
+    public final void normalize(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext) {}
 }
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentMixin.java
 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentMixin.java
index 12ead113a..d0e40d1ee 100644
--- 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentMixin.java
+++ 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentMixin.java
@@ -50,6 +50,7 @@ import org.apache.axiom.dom.DOMText;
 import org.apache.axiom.dom.ElementsByTagName;
 import org.apache.axiom.dom.ElementsByTagNameNS;
 import org.apache.axiom.dom.NSUtil;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Mixin;
 import org.w3c.dom.Attr;
 import org.w3c.dom.CDATASection;
@@ -204,7 +205,7 @@ public abstract class DOMDocumentMixin implements 
DOMDocument {
                 || domConfig.isEnabled(DOMConfigurationImpl.WELLFORMED)) {
             throw new UnsupportedOperationException("TODO");
         } else {
-            normalizeRecursively(domConfig);
+            normalizeRecursively(domConfig, new ScopedNamespaceContext());
         }
     }
 
@@ -481,7 +482,7 @@ public abstract class DOMDocumentMixin implements 
DOMDocument {
     }
 
     @Override
-    public final void normalize(DOMConfigurationImpl config) {}
+    public final void normalize(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext) {}
 
     @Override
     public final Node importNode(Node importedNode, boolean deep) throws 
DOMException {
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMEntityReferenceMixin.java
 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMEntityReferenceMixin.java
index 516fc40a1..46cbfe269 100644
--- 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMEntityReferenceMixin.java
+++ 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMEntityReferenceMixin.java
@@ -23,6 +23,7 @@ import static 
org.apache.axiom.dom.DOMExceptionUtil.newDOMException;
 import org.apache.axiom.core.CoreElement;
 import org.apache.axiom.dom.DOMConfigurationImpl;
 import org.apache.axiom.dom.DOMEntityReference;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Mixin;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
@@ -141,5 +142,5 @@ public abstract class DOMEntityReferenceMixin implements 
DOMEntityReference {
     }
 
     @Override
-    public final void normalizeRecursively(DOMConfigurationImpl config) {}
+    public final void normalizeRecursively(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext) {}
 }
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMLeafNodeMixin.java
 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMLeafNodeMixin.java
index 14b48540a..169f44152 100644
--- 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMLeafNodeMixin.java
+++ 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMLeafNodeMixin.java
@@ -24,6 +24,7 @@ import org.apache.axiom.core.CoreElement;
 import org.apache.axiom.dom.DOMConfigurationImpl;
 import org.apache.axiom.dom.DOMLeafNode;
 import org.apache.axiom.dom.EmptyNodeList;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Mixin;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
@@ -124,5 +125,5 @@ public abstract class DOMLeafNodeMixin implements 
DOMLeafNode {
     }
 
     @Override
-    public final void normalizeRecursively(DOMConfigurationImpl config) {}
+    public final void normalizeRecursively(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext) {}
 }
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSAwareElementMixin.java
 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSAwareElementMixin.java
index ae4d8f604..f6e248cd7 100644
--- 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSAwareElementMixin.java
+++ 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSAwareElementMixin.java
@@ -19,53 +19,43 @@
 package org.apache.axiom.dom.impl.mixin;
 
 import org.apache.axiom.core.CoreAttribute;
-import org.apache.axiom.core.CoreElement;
 import org.apache.axiom.core.CoreModelException;
 import org.apache.axiom.core.CoreNamespaceDeclaration;
 import org.apache.axiom.dom.DOMConfigurationImpl;
 import org.apache.axiom.dom.DOMExceptionUtil;
 import org.apache.axiom.dom.DOMNSAwareElement;
 import org.apache.axiom.dom.DOMSemantics;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class DOMNSAwareElementMixin implements DOMNSAwareElement {
     @Override
-    public final void normalize(DOMConfigurationImpl config) {
+    public final void normalize(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext) {
         if (config.isEnabled(DOMConfigurationImpl.NAMESPACES)) {
             try {
+                // Add existing namespace declarations on this element to the 
context so that
+                // they are visible to descendants and so we can check them 
below.
+                for (CoreAttribute a = coreGetFirstAttribute(); a != null; a = 
a.coreGetNextAttribute()) {
+                    if (a instanceof CoreNamespaceDeclaration decl) {
+                        nsContext.setPrefix(
+                                decl.coreGetDeclaredPrefix(),
+                                decl.coreGetCharacterData().toString());
+                    }
+                }
                 String namespaceURI = coreGetNamespaceURI();
                 if (namespaceURI.isEmpty()) {
-                    // Walk up from this element looking for the first 
explicit default namespace
-                    // declaration. If it maps to a non-empty URI, add 
xmlns="" to override it.
-                    CoreElement current = this;
-                    outer:
-                    while (current != null) {
-                        for (CoreAttribute a = current.coreGetFirstAttribute();
-                                a != null;
-                                a = a.coreGetNextAttribute()) {
-                            if (a instanceof CoreNamespaceDeclaration decl
-                                    && decl.coreGetDeclaredPrefix().isEmpty()) 
{
-                                if 
(!decl.coreGetCharacterData().toString().isEmpty()) {
-                                    
coreSetAttribute(DOMSemantics.NAMESPACE_DECLARATION_MATCHER, null, "", null, 
"");
-                                }
-                                break outer;
-                            }
-                        }
-                        current = current.coreGetParentElement();
+                    // If the default namespace is bound to a non-empty URI in 
the context,
+                    // add xmlns="" to override it.
+                    if (!nsContext.getNamespaceURI("").isEmpty()) {
+                        
coreSetAttribute(DOMSemantics.NAMESPACE_DECLARATION_MATCHER, null, "", null, 
"");
+                        nsContext.setPrefix("", "");
                     }
                 } else {
-                    // Check only this element's own explicit namespace 
declarations.
                     String prefix = coreGetPrefix();
-                    boolean declared = false;
-                    for (CoreAttribute a = coreGetFirstAttribute(); a != null; 
a = a.coreGetNextAttribute()) {
-                        if (a instanceof CoreNamespaceDeclaration decl && 
prefix.equals(decl.coreGetDeclaredPrefix())) {
-                            declared = 
decl.coreGetCharacterData().toString().equals(namespaceURI);
-                            break;
-                        }
-                    }
-                    if (!declared) {
+                    if 
(!namespaceURI.equals(nsContext.getNamespaceURI(prefix))) {
                         
coreSetAttribute(DOMSemantics.NAMESPACE_DECLARATION_MATCHER, null, prefix, 
null, namespaceURI);
+                        nsContext.setPrefix(prefix, namespaceURI);
                     }
                 }
             } catch (CoreModelException ex) {
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSUnawareElementMixin.java
 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSUnawareElementMixin.java
index fc19dcbb6..006655f78 100644
--- 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSUnawareElementMixin.java
+++ 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSUnawareElementMixin.java
@@ -20,10 +20,11 @@ package org.apache.axiom.dom.impl.mixin;
 
 import org.apache.axiom.dom.DOMConfigurationImpl;
 import org.apache.axiom.dom.DOMNSUnawareElement;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class DOMNSUnawareElementMixin implements DOMNSUnawareElement {
     @Override
-    public final void normalize(DOMConfigurationImpl config) {}
+    public final void normalize(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext) {}
 }
diff --git 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMParentNodeMixin.java
 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMParentNodeMixin.java
index 2055234fe..647b9768b 100644
--- 
a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMParentNodeMixin.java
+++ 
b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMParentNodeMixin.java
@@ -29,6 +29,7 @@ import org.apache.axiom.dom.DOMNode;
 import org.apache.axiom.dom.DOMParentNode;
 import org.apache.axiom.dom.DOMSemantics;
 import org.apache.axiom.dom.DocumentWhitespaceFilter;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.axiom.weaver.annotation.Mixin;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Node;
@@ -101,14 +102,16 @@ public abstract class DOMParentNodeMixin implements 
DOMParentNode {
     }
 
     @Override
-    public final void normalizeRecursively(DOMConfigurationImpl config) {
+    public final void normalizeRecursively(DOMConfigurationImpl config, 
ScopedNamespaceContext nsContext) {
         try {
-            normalize(config);
+            nsContext.startScope();
+            normalize(config, nsContext);
             CoreChildNode child = coreGetFirstChild();
             while (child != null) {
-                ((DOMNode) child).normalizeRecursively(config);
+                ((DOMNode) child).normalizeRecursively(config, nsContext);
                 child = child.coreGetNextSibling();
             }
+            nsContext.endScope();
         } catch (CoreModelException ex) {
             throw DOMExceptionUtil.toUncheckedException(ex);
         }

Reply via email to