+1
On Sep 30, 2013, at 1:23 PM, huizhe wang wrote:

> 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
>>>>> 
>>>> 
>>> 
>> 
> 

Lance Andersen| Principal Member of Technical Staff | +1.781.442.2037
Oracle Java Engineering 
1 Network Drive 
Burlington, MA 01803
lance.ander...@oracle.com

Reply via email to