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);
}