You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Hugo de Almeida Cocharro (Updated) (JIRA)" <ji...@apache.org> on 2012/01/18 11:55:39 UTC

[jira] [Updated] (JXPATH-154) Resetting the default namespace causes a serious endless loop when requesting .asPath() on a node.

     [ https://issues.apache.org/jira/browse/JXPATH-154?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Hugo de Almeida Cocharro updated JXPATH-154:
--------------------------------------------

    Description: 
sample smaller case:
{code}
<...>
 <b:foo xmlns:b="bla" xmlns="test111">    <!--  No nodes are placed in the tree within ns "test111" but the attribute is still there.-->
  <b:bar>a</b:bar>                         <!-- is in ns 'bla' -->
  <test xmlns=""></test>                   <!-- does not have a namespace -->
 </b:foo>
</...>
{code}

when requesting .asPath() on the 'test' node, it loops in org.apache.commons.jxpath.ri.NamespaceResolver.getPrefix(NodePointer, String), 
and if it didn't loop it would create a wrong xpath '//b:fo/null:test' DOMNodePointer.asPath().


So I think that the fix should be in org.apache.commons.jxpath.ri.model.dom.DOMNodePointer.asPath()

{code}
....
                    String ln = DOMNodePointer.getLocalName(node);
                    String nsURI = getNamespaceURI();
                    if (nsURI == null) {
                        buffer.append(ln);
                        buffer.append('[');
                        buffer.append(getRelativePositionByName()).append(']');
                    }
                    else {
                        String prefix = getNamespaceResolver().getPrefix(nsURI);
                        if (prefix != null) {
...
{code}

should become
{code}
...
                    String ln = DOMNodePointer.getLocalName(node);
                    String nsURI = getNamespaceURI();
                    if (nsURI == null || nsURI.length() == 0) { // check for empty string which means that the node doesn't have a namespace.
                        buffer.append(ln);
                        buffer.append('[');
                        buffer.append(getRelativePositionByName()).append(']');
                    }
                    else {
                        String prefix = getNamespaceResolver().getPrefix(nsURI);
                        if (prefix != null) {
...
{code}


  was:
sample smaller case:
{code}
<...>
 <b:foo xmlns:b="bla" xmlns="test111">    <!--  No nodes are placed in the tree within ns "test111" but the attribute is still there.-->
  <b:bar>a</b:bar>                         <!-- is in ns 'bla' -->
  <test xmlns=""></test>                   <!-- does not have a namespace -->
 </b:foo>
</...>
{code}

when requesting .asPath() on the 'test' node, it loops in org.apache.commons.jxpath.ri.NamespaceResolver.getPrefix(NodePointer, String), 
and if it didn't loop it would create a wrong xpath '//' DOMNodePointer.asPath().


So I think that the fix should be in org.apache.commons.jxpath.ri.model.dom.DOMNodePointer.asPath()

{code}
....
                    String ln = DOMNodePointer.getLocalName(node);
                    String nsURI = getNamespaceURI();
                    if (nsURI == null) {
                        buffer.append(ln);
                        buffer.append('[');
                        buffer.append(getRelativePositionByName()).append(']');
                    }
                    else {
                        String prefix = getNamespaceResolver().getPrefix(nsURI);
                        if (prefix != null) {
...
{code}

should become
{code}
...
                    String ln = DOMNodePointer.getLocalName(node);
                    String nsURI = getNamespaceURI();
                    if (nsURI == null || nsURI.length() == 0) { // check for empty string which means that the node doesn't have a namespace.
                        buffer.append(ln);
                        buffer.append('[');
                        buffer.append(getRelativePositionByName()).append(']');
                    }
                    else {
                        String prefix = getNamespaceResolver().getPrefix(nsURI);
                        if (prefix != null) {
...
{code}


    
> Resetting the default namespace causes a serious endless loop when requesting .asPath() on a node.
> --------------------------------------------------------------------------------------------------
>
>                 Key: JXPATH-154
>                 URL: https://issues.apache.org/jira/browse/JXPATH-154
>             Project: Commons JXPath
>          Issue Type: Bug
>    Affects Versions: 1.3
>         Environment: jxpath eclipse plugin from orbit
>            Reporter: Hugo de Almeida Cocharro
>
> sample smaller case:
> {code}
> <...>
>  <b:foo xmlns:b="bla" xmlns="test111">    <!--  No nodes are placed in the tree within ns "test111" but the attribute is still there.-->
>   <b:bar>a</b:bar>                         <!-- is in ns 'bla' -->
>   <test xmlns=""></test>                   <!-- does not have a namespace -->
>  </b:foo>
> </...>
> {code}
> when requesting .asPath() on the 'test' node, it loops in org.apache.commons.jxpath.ri.NamespaceResolver.getPrefix(NodePointer, String), 
> and if it didn't loop it would create a wrong xpath '//b:fo/null:test' DOMNodePointer.asPath().
> So I think that the fix should be in org.apache.commons.jxpath.ri.model.dom.DOMNodePointer.asPath()
> {code}
> ....
>                     String ln = DOMNodePointer.getLocalName(node);
>                     String nsURI = getNamespaceURI();
>                     if (nsURI == null) {
>                         buffer.append(ln);
>                         buffer.append('[');
>                         buffer.append(getRelativePositionByName()).append(']');
>                     }
>                     else {
>                         String prefix = getNamespaceResolver().getPrefix(nsURI);
>                         if (prefix != null) {
> ...
> {code}
> should become
> {code}
> ...
>                     String ln = DOMNodePointer.getLocalName(node);
>                     String nsURI = getNamespaceURI();
>                     if (nsURI == null || nsURI.length() == 0) { // check for empty string which means that the node doesn't have a namespace.
>                         buffer.append(ln);
>                         buffer.append('[');
>                         buffer.append(getRelativePositionByName()).append(']');
>                     }
>                     else {
>                         String prefix = getNamespaceResolver().getPrefix(nsURI);
>                         if (prefix != null) {
> ...
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira