[
https://issues.apache.org/jira/browse/WSCOMMONS-557?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12901290#action_12901290
]
Amila Jayasekara commented on WSCOMMONS-557:
--------------------------------------------
Hi Andreas,
It seems to be the way i understood org.apache.axiom.om.impl.dom.ElementImpl
implementation is not quite correct. Also I am facing few difficulties,
understanding org.apache.axiom.om.impl.dom.ElementImpl implementation.
Let me explain my issue in detail.
Assume i have following xml,
<root><child xmlns=""/></root>
According to above xml the element "child" is having an empty namespace. During
a debug session i found following values of ElementImpl relevant to element
"child",
ElementImpl.namespace = null
ElementImpl.namespaces = {java.util.hash...@965} size = 1
[0] = {java.util.hashmap$en...@980} ->
org.apache.axiom.om.impl.dom.namespacei...@0
key: java.lang.String =
{java.lang.str...@982}""
value:
org.apache.axiom.om.impl.dom.NamespaceImpl =
{org.apache.axiom.om.impl.dom.namespacei...@986}
nsUri =
{java.lang.str...@982}""
nsPrefix =
{java.lang.str...@982}""
As per above values ElementImpl.namespaces is having an element. Thus the
nsPrefix of that element is an empty string. This should be the namespace we
defined for "child" element. (i.e. <child xmlns=""/>) So what is the convention
here ? Are we assuming when the nsPrefix is null, it represents xmlns ?
Also i found some code in ElementImpl.getAttributes() method which made me
confuse,
// Add the NS declarations
if (this.namespaces != null) {
Iterator nsDecls = this.namespaces.keySet().iterator();
while (nsDecls.hasNext()) {
String prefix = (String) nsDecls.next();
if (prefix != null && !"".equals(prefix)
&& !prefix.equals(OMConstants.XMLNS_NS_PREFIX)) {
<------------------------- Here we are checking whether prefix is not equal to
"xmlns". If we are interpreting nsPrefix="" as xmlns we will never encounter
this condition. Do we ?
OMNamespace ns = (OMNamespace) this.namespaces.get(prefix);
AttrImpl attr = new AttrImpl(this.ownerNode, prefix, ns
.getNamespaceURI(), this.factory);
attr.setOMNamespace(new NamespaceImpl(
OMConstants.XMLNS_NS_URI,
OMConstants.XMLNS_NS_PREFIX));
attributeMap.addItem(attr);
}
}
.......
.....
...
According to the DOM API the ElementImpl.getAttributes() should return
attributes and namespaces attached to an element. But
ElementImpl.getAttributes() is checking ElementImpl.namespace varriable and
does a traversal. I dont understand why we need this. Cos we are querying
attributes and namespaces through ElementImpl.namespaces.
> org.apache.axiom.om.impl.dom.ElementImpl class's hasAttributes() and
> getAttributes() methods are not compatible with DOM interfaces.
> ------------------------------------------------------------------------------------------------------------------------------------
>
> Key: WSCOMMONS-557
> URL: https://issues.apache.org/jira/browse/WSCOMMONS-557
> Project: WS-Commons
> Issue Type: Bug
> Components: AXIOM
> Affects Versions: Axiom 1.2.10
> Environment: Ubuntu, JDK 1.6
> Reporter: Amila Jayasekara
> Assignee: Andreas Veithen
> Attachments: WSCOMMONS-557.diff
>
>
> The class org.apache.axiom.om.impl.dom.ElementImpl implements both DOM
> Element and OMElement interfaces. According to DOM API the method
> hasAttrbutes() should return true if there are attributes attached to current
> node. Also this method will return true if there are namespaces attached to
> current node. But according to current implementation the ElementImpl class
> only checks for namespace nullability. This code will fail if we have a xml
> like follows,
> <?xml version='1.0' encoding='utf-8'?>
> <soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
> xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
> wsu:Id="Id-739587016">
> <GetDirectionsResponse xmlns="http://www.example.org/webservices/">
> <GetDirectionsResult>
> <drivingdirections xmlns="">
> <route distanceToTravel="500m" finalStep="false" id="0">Head south on
> Grove St</route>
> </drivingdirections>
> </GetDirectionsResult>
> </GetDirectionsResponse>
> </soapenv:Body>
> In above xml the node "drivingdirections" is having an empty namespace. But
> for "drivingdirections" node, the method "hasAttribute()" should return true,
> as there is a namespace attached to it. But current implementation of
> ElementImpl returns false.
> Also getAttributes() method should return empty namespace ("xmlns=\"\"") for
> "drivingdirections" node. Current implementation doesnt return empty
> namespace as an attribute. Since namespace of drivingdirections is empty,
> namespace of child elements of "drivingdirections" are also null. Therefore
> hasAttribute() method will return false for even elements like "route".
> ("route" element has attributes, therefore hasAttribute() should return true)
> There are 2 rampart issues which depends on this.
> [1] https://issues.apache.org/jira/browse/RAMPART-303
> [2] https://issues.apache.org/jira/browse/RAMPART-128
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.