commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bugzi...@apache.org
Subject DO NOT REPLY [Bug 38841] New: - JXPath: does not properly handle NodeSet returned by extension function
Date Fri, 03 Mar 2006 16:52:06 GMT
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG·
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=38841>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND·
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=38841

           Summary: JXPath: does not properly handle NodeSet returned by
                    extension function
           Product: Commons
           Version: 1.2 Final
          Platform: All
        OS/Version: other
            Status: NEW
          Severity: normal
          Priority: P2
         Component: JXPath
        AssignedTo: commons-dev@jakarta.apache.org
        ReportedBy: kgregory@healthmarketscience.com


Per the documentation, my function is returning a BasicNodeSet containing zero
or more pointers:

  public static NodeSet observations(ExpressionContext context) {
    // the cast below shouldn't break, as this is the only pointer type that
    // makes sense in this context
    List<NodePointer> ptrs = extractObservations(
                                  (NodePointer)context.getContextNodePointer(), 
                                  new ArrayList<NodePointer>());
    BasicNodeSet result = new BasicNodeSet();
    for (NodePointer ptr : ptrs) {
      result.add(ptr);
    }
    return result;
  }

However, if I call JXPathContext.selectNodes("ems:observations()"), I'm getting
a single node containing the BasicNodeSet. I notice that there is a testcase for
functions that return NodeSets, but that it uses expressions that actually
return the children of the NodeSet ("test:nodeSet()/name").

There appear to be two problems. First, Expression.iterate() and
Expression.iteratePointers() do not correctly recognize a NodeSet as something
iterable. I've resolved this by reaching into the NodeSet and getting an
iterator over its pointers.

Second, Expression.PointerIterator doesn't recognize when it already has a
pointer, and instead tries to wrap it in a new pointer. This ends up treating
the pointer as a bean.

I've made these changes, and written a testcase that uses an unadorned NodeSet
function. I also found a class that used a variable named "enum", and changed
this so that it would compile under 1.5.

The patch is attached. It's relative to "commons-jxpath-1.2" (root of extract
directory).

-- 
Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message