RFR 8024707: TRANSFORMEREXCEPTION : ITEM() RETURNS NULL WITH NODE LIST OF LENGTH =1 IN JAXP

huizhe wang huizhe.wang at oracle.com
Mon Sep 30 17:23:46 UTC 2013


Aleksej,

The change looks good.

Thanks,
Joe

On 9/28/2013 7:54 AM, Aleksej Efimov wrote:
> Joe,
> Thank you for a suggestion. But I modified it a little bit:
>       public Node item(int index) {
>           if (m_iter != null) {
> -            int node;
> +            int node = 0;
>               int count = m_cachedNodes.size();
>   
>               if (count > index) {
>                   node = m_cachedNodes.elementAt(index);
>                   return m_dtm.getNode(node);
>               } else if (m_last == -1) {
> -                while (((node = m_iter.next()) != DTMAxisIterator.END)
> -                           && count <= index) {
> +                while (count <= index
> +                        && ((node = m_iter.next()) != DTMAxisIterator.END)) {
>                       m_cachedNodes.addElement(node);
>                       count++;
>                   }
> We need a value assigned to 'node' to avoid compilation error with 
> uninitialized 'node' variable. But this value doesn't mean nothing 
> (let it be 0) because for the first while loop iteration the second 
> "&&" condition will be always executed (we can reach the while loop 
> only when "count<=index" - the outer if-else condition). The test 
> passes with this new version.
> As the result - new webrev: 
> http://cr.openjdk.java.net/~aefimov/8024707/webrev.01/ 
> <http://cr.openjdk.java.net/%7Eaefimov/8024707/webrev.01/>
>
> Best Regards,
> Aleksej
>
> On 09/26/2013 10:46 PM, huizhe wang wrote:
>> Hi Aleksej,
>>
>> From your tests, it appears that the getLength() method was 
>> implemented correctly, and that the bug is not in the call to 
>> m_iter.next(), but it should not be called again once the count is > 
>> index.  So that fix would be to move the conditions around such that:
>>     public Node item(int index) {
>>         if (m_iter != null) {
>>             int node;
>>             int count = m_cachedNodes.size();
>>
>>             if (count > index) {
>>                 node = m_cachedNodes.elementAt(index);
>>                 return m_dtm.getNode(node);
>>             } else if (m_last == -1) {
>> -                while (((node = m_iter.next()) != DTMAxisIterator.END)
>> -                           && count <= index) {
>> +                while (count <= index
>> +                           && ((node = m_iter.next()) != 
>> DTMAxisIterator.END)) {
>>                     m_cachedNodes.addElement(node);
>>                     count++;
>>                 }
>>                 if (node == DTMAxisIterator.END) {
>>                     m_last = count;
>>                 } else {
>>                     return m_dtm.getNode(node);
>>                 }
>>             }
>>         }
>>         return null;
>>     }
>>
>> Thanks,
>> Joe
>>
>>
>> On 9/25/2013 4:10 AM, Aleksej Efimov wrote:
>>> Hi Joe,
>>> Your suggestion about getLength() brings to mine attention the 
>>> following behavior of unmodified JDK:
>>> If we slightly modify a TestFunc class [1] in such manner:
>>>
>>>     public static Node test( NodeList list ) {
>>>                  Node ret = list.item(0);
>>>                  System.err.println(list.getLength());
>>>                  return ret;
>>>     }
>>>
>>> And add more elements to in.xml:
>>> <input1><seq-elem1>inp1_1</seq-elem1><seq-elem1>inp1_2</seq-elem1><seq-elem1>inp1_3</seq-elem1></input1>
>>>
>>> The test will fails:
>>>
>>>     2
>>>     Transformation completed. Result:<?xml version="1.0"
>>>     encoding="UTF-8"?>inp1_2
>>>     Exception in thread "main" java.lang.RuntimeException: Incorrect
>>>     transformation result
>>>         at XSLT.main(XSLT.java:49)
>>>
>>> As you can see the length of 2 is incorrect value and the 'inp1_1' 
>>> element is ignored. But If we do another one change to test function 
>>> - first get the length() and then get the item:
>>>
>>>     public static Node test( NodeList list ) {
>>>     	    System.err.println(list.getLength());
>>>                  Node ret = list.item(0);
>>>                  return ret;
>>>     }
>>>
>>> The test will pass:
>>>
>>>     3
>>>     Transformation completed. Result:<?xml version="1.0"
>>>     encoding="UTF-8"?>inp1_1
>>>
>>> This behavior tells that item() method incorrectly caches the nodes 
>>> (The method called first - do the caching). But the caching of nodes 
>>> is done in correct way by getLength() function, but its according to 
>>> the test results. Currently, I'm trying to understand why it's 
>>> working in such way in a view of source code.
>>>
>>> -Aleksej
>>>
>>>
>>>
>>> [1] 
>>> http://cr.openjdk.java.net/~aefimov/8024707/jdk/test/javax/xml/jaxp/parsers/8024707/TestFunc.java 
>>> <http://cr.openjdk.java.net/%7Eaefimov/8024707/jdk/test/javax/xml/jaxp/parsers/8024707/TestFunc.java>
>>>
>>> On 09/20/2013 01:19 AM, huizhe wang wrote:
>>>> Hi Aleksej,
>>>>
>>>> Looks like the getLength() method has the same problem.
>>>>
>>>> Joe
>>>>
>>>> On 9/17/2013 5:01 AM, Aleksej Efimov wrote:
>>>>> Hi Everyone,
>>>>>
>>>>> There is a bug [1] in JAXP about transformation of one-item sized 
>>>>> node list:
>>>>> When the length of nodelist which is passed to a XSLT extension 
>>>>> function is 1, the node gotten from the node list becomes null.
>>>>> New test illustrates this issue [2]. Full webrev with proposed fix 
>>>>> can be found here: [3].
>>>>>
>>>>> [1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8024707
>>>>> [2] 
>>>>> http://cr.openjdk.java.net/~aefimov/8024707/raw_files/new/jdk/test/javax/xml/jaxp/parsers/8024707/XSLT.java
>>>>> [3] http://cr.openjdk.java.net/~aefimov/8024707/
>>>>>
>>>>> Best regards,
>>>>> Aleksej
>>>>
>>>
>>
>




More information about the core-libs-dev mailing list