+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
[email protected]