Description
Consider the following code:
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace ns = factory.createOMNamespace("urn:test", "");
OMElement root = factory.createOMElement("root", ns);
OMElement child = factory.createOMElement("child", null, root);
System.out.println("child has namespace declarations: " + child.getAllDeclaredNamespaces().hasNext());
System.out.println("xml = " + root.toString());
System.out.println("default namespace on child = '" + child.getDefaultNamespace().getNamespaceURI() + "'");
With the current Axiom code, the output is:
child has namespace declarations: false
xml = <root xmlns="urn:test"><child xmlns="" /></root>
default namespace on child = 'urn:test'
That means that the call to createOMElement that creates the child element doesn't generate a namespace declaration. The serialized XML is still correct because the serializer performs namespace repairing. However, because of the absence of a namespace declaration on the child OMElement, the result of getDefaultNamespace is incorrect.
The createOMElement method is supposed to create a namespace declaration if no corresponding declaration is in scope on the parent element. This should also be the case if the OMNamespace argument is null and there is a default namespace declaration with a non empty namespace URI.