[ http://nagoya.apache.org/jira/browse/XALANJ-667?page=history ]

Henry Zongaro updated XALANJ-667:
---------------------------------

           type: Improvement  (was: Bug)
    Description: 
In org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.getHandleOfNode "==" used to
test for two nodes been the same.  In the comment just before this method
definition it is stated that this is "flaky" solution, and I can not agree more.
 The question is, what is wrong with using "equals" instead of "=="?  I do
realize that "equals" is not part of the DOM, but same is true for "==".

Andrei Tchijov

PS These are snipets of code I am talking about

  public int getHandleOfNode(Node node)
  {
    if (null != node)
    {
      // Is Node actually within the same document? If not, don't search!
      // This would be easier if m_root was always the Document node, but
      // we decided to allow wrapping a DTM around a subtree.
        /*
         * hyperNOC fix.
         * used to be
      if((m_root==node) ||
         (m_root.getNodeType()==DOCUMENT_NODE &&
          m_root==node.getOwnerDocument()) ||
         (m_root.getNodeType()!=DOCUMENT_NODE &&
          m_root.getOwnerDocument()==node.getOwnerDocument())
         )
         */
      if((m_root==node) ||
         (m_root.getNodeType()==DOCUMENT_NODE &&
          m_root.equals( node.getOwnerDocument())) ||
         (m_root.getNodeType()!=DOCUMENT_NODE &&
          m_root.getOwnerDocument().equals( node.getOwnerDocument()))
         )
        {
          // If node _is_ in m_root's tree, find its handle
          //
          // %OPT% This check may be improved significantly when DOM
          // Level 3 nodeKey and relative-order tests become
          // available!
          for(Node cursor=node;
              cursor!=null;
              cursor=
                (cursor.getNodeType()!=ATTRIBUTE_NODE)
                ? cursor.getParentNode()
                : ((org.w3c.dom.Attr)cursor).getOwnerElement())
            {
                /*
                 * hyperNOC fix.
                 * used to be
              if(cursor==m_root)
                 */
              if(cursor.equals( m_root ))
                // We know this node; find its handle.
                return getHandleFromNode(node);
            } // for ancestors of node
        } // if node and m_root in same Document
    } // if node!=null

    return DTM.NULL;
  }

Same is true for getHandleFromNode

  private int getHandleFromNode(Node node)
  {
    if (null != node)
    {
      int len = m_nodes.size();       
      boolean isMore;
      int i = 0;
      do
      {         
        for (; i < len; i++)
        {
            /*
             * hyperNOC fix
             * used to be
          if (m_nodes.elementAt(i) == node)
             */
          if (m_nodes.elementAt(i).equals( node ))
            return i | m_dtmIdent;        
        }

        isMore = nextNode();
 
        len = m_nodes.size();
           
      }
      while(isMore || i < len);
    }
   
    return DTM.NULL;
  }

  was:
In org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.getHandleOfNode "==" used to
test for two nodes been the same.  In the comment just before this method
definition it is stated that this is "flaky" solution, and I can not agree more.
 The question is, what is wrong with using "equals" instead of "=="?  I do
realize that "equals" is not part of the DOM, but same is true for "==".

Andrei Tchijov

PS These are snipets of code I am talking about

  public int getHandleOfNode(Node node)
  {
    if (null != node)
    {
      // Is Node actually within the same document? If not, don't search!
      // This would be easier if m_root was always the Document node, but
      // we decided to allow wrapping a DTM around a subtree.
        /*
         * hyperNOC fix.
         * used to be
      if((m_root==node) ||
         (m_root.getNodeType()==DOCUMENT_NODE &&
          m_root==node.getOwnerDocument()) ||
         (m_root.getNodeType()!=DOCUMENT_NODE &&
          m_root.getOwnerDocument()==node.getOwnerDocument())
         )
         */
      if((m_root==node) ||
         (m_root.getNodeType()==DOCUMENT_NODE &&
          m_root.equals( node.getOwnerDocument())) ||
         (m_root.getNodeType()!=DOCUMENT_NODE &&
          m_root.getOwnerDocument().equals( node.getOwnerDocument()))
         )
        {
          // If node _is_ in m_root's tree, find its handle
          //
          // %OPT% This check may be improved significantly when DOM
          // Level 3 nodeKey and relative-order tests become
          // available!
          for(Node cursor=node;
              cursor!=null;
              cursor=
                (cursor.getNodeType()!=ATTRIBUTE_NODE)
                ? cursor.getParentNode()
                : ((org.w3c.dom.Attr)cursor).getOwnerElement())
            {
                /*
                 * hyperNOC fix.
                 * used to be
              if(cursor==m_root)
                 */
              if(cursor.equals( m_root ))
                // We know this node; find its handle.
                return getHandleFromNode(node);
            } // for ancestors of node
        } // if node and m_root in same Document
    } // if node!=null

    return DTM.NULL;
  }

Same is true for getHandleFromNode

  private int getHandleFromNode(Node node)
  {
    if (null != node)
    {
      int len = m_nodes.size();       
      boolean isMore;
      int i = 0;
      do
      {         
        for (; i < len; i++)
        {
            /*
             * hyperNOC fix
             * used to be
          if (m_nodes.elementAt(i) == node)
             */
          if (m_nodes.elementAt(i).equals( node ))
            return i | m_dtmIdent;        
        }

        isMore = nextNode();
 
        len = m_nodes.size();
           
      }
      while(isMore || i < len);
    }
   
    return DTM.NULL;
  }

    Environment: 
Operating System: Other
Platform: Other

  was:
Operating System: Other
Platform: Other

       Priority: Major
    Bugzilla Id:   (was: 4808)

> using object identity as a substitute for isSameNode is bad idea
> ----------------------------------------------------------------
>
>          Key: XALANJ-667
>          URL: http://nagoya.apache.org/jira/browse/XALANJ-667
>      Project: XalanJ2
>         Type: Improvement
>   Components: DTM
>     Versions: 2.0.0
>  Environment: Operating System: Other
> Platform: Other
>     Reporter: Andrei Tchijov
>     Assignee: Joe Kesselman

>
> In org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.getHandleOfNode "==" used to
> test for two nodes been the same.  In the comment just before this method
> definition it is stated that this is "flaky" solution, and I can not agree 
> more.
>  The question is, what is wrong with using "equals" instead of "=="?  I do
> realize that "equals" is not part of the DOM, but same is true for "==".
> Andrei Tchijov
> PS These are snipets of code I am talking about
>   public int getHandleOfNode(Node node)
>   {
>     if (null != node)
>     {
>       // Is Node actually within the same document? If not, don't search!
>       // This would be easier if m_root was always the Document node, but
>       // we decided to allow wrapping a DTM around a subtree.
>         /*
>          * hyperNOC fix.
>          * used to be
>       if((m_root==node) ||
>          (m_root.getNodeType()==DOCUMENT_NODE &&
>           m_root==node.getOwnerDocument()) ||
>          (m_root.getNodeType()!=DOCUMENT_NODE &&
>           m_root.getOwnerDocument()==node.getOwnerDocument())
>          )
>          */
>       if((m_root==node) ||
>          (m_root.getNodeType()==DOCUMENT_NODE &&
>           m_root.equals( node.getOwnerDocument())) ||
>          (m_root.getNodeType()!=DOCUMENT_NODE &&
>           m_root.getOwnerDocument().equals( node.getOwnerDocument()))
>          )
>         {
>           // If node _is_ in m_root's tree, find its handle
>           //
>           // %OPT% This check may be improved significantly when DOM
>           // Level 3 nodeKey and relative-order tests become
>           // available!
>           for(Node cursor=node;
>               cursor!=null;
>               cursor=
>                 (cursor.getNodeType()!=ATTRIBUTE_NODE)
>                 ? cursor.getParentNode()
>                 : ((org.w3c.dom.Attr)cursor).getOwnerElement())
>             {
>                 /*
>                  * hyperNOC fix.
>                  * used to be
>               if(cursor==m_root)
>                  */
>               if(cursor.equals( m_root ))
>                 // We know this node; find its handle.
>                 return getHandleFromNode(node);
>             } // for ancestors of node
>         } // if node and m_root in same Document
>     } // if node!=null
>     return DTM.NULL;
>   }
> Same is true for getHandleFromNode
>   private int getHandleFromNode(Node node)
>   {
>     if (null != node)
>     {
>       int len = m_nodes.size();       
>       boolean isMore;
>       int i = 0;
>       do
>       {         
>         for (; i < len; i++)
>         {
>             /*
>              * hyperNOC fix
>              * used to be
>           if (m_nodes.elementAt(i) == node)
>              */
>           if (m_nodes.elementAt(i).equals( node ))
>             return i | m_dtmIdent;        
>         }
>         isMore = nextNode();
>  
>         len = m_nodes.size();
>            
>       }
>       while(isMore || i < len);
>     }
>    
>     return DTM.NULL;
>   }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://nagoya.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to