OMDocument didn't have a build() method. I fixed this (see
WSCOMMONS-479), but we can't upgrade to 1.2.9-SNAPSHOT right now. The
workaround is to loop over the children of the OMDocument to make sure
it is entirely built.

Andreas

On Sun, Jun 21, 2009 at 19:11, indika kumara<indika.k...@gmail.com> wrote:
> Hi Saliya
>
> This Use case scenario is related with XPath evaluation on the
> resources picked from the registry. After reading the resource we
> close input stream as it is needed.
>
> In this use case, parent is always an OMDocument.
>
> For both following code, you get ‘org.apache.axiom.om.OMException:
> com.ctc.wstx.exc.WstxIOException: Stream closed’.
>
> 1)     remove result.detach()
>
> 2)     replace result.detach() with  result.build()
>
> (Please refers SimpleURLRegistry.java)
>
> Note that here ‘result = builder.getDocumentElement();’ and it is not
> builder.getDocument(). If It is possible to call build() method on
> OMDocument this issue (‘Stream closed’) may not be occurred (I didn’t
> look at AXIOM code).  As Andreas pointed out ‘OMDocument has no method
> to build the entire tree and detach() do that as a side effect”.
>
> I didn't look at deep but feel current possible solutions are what
> Andreas suggested.
>
> Thanks
> Indika
>
> On Sun, Jun 21, 2009 at 5:31 PM, Saliya Ekanayake <esal...@gmail.com> wrote:
>>
>> Hi Indika,
>>
>> I tested your point and found the cause. Simply, in the second case there is 
>> no parent for the root element. Therefore, evaluating an XPath containing 
>> <hello> element will cause an exception. But if you evaluate an XPath like, 
>> //anotherthing/insideanother, you will get the desired result.
>>
>> So the solution I would like to suggest in this case is to first check the 
>> parent of the element. If the parent is an instance of OMDocument then we 
>> need not detach (if you need to build then just use OMNode#build()). If the 
>> parent is an instance of OMElement then you need to detach since you want 
>> the element to be isolated from the connecting tree.
>>
>> Thanks,
>> Saliya
>>
>> On Sun, Jun 21, 2009 at 11:06 AM, indika kumara <indika.k...@gmail.com> 
>> wrote:
>>>
>>>         Hi Saliya
>>>
>>>         Following shown my scenarios.
>>>
>>>
>>>        Scenario 1  - without detach on root element
>>>
>>>         String str = "<hello><something>wow 
>>> nice</something><anotherthing><insideanother>great</insideanother></anotherthing></hello>";
>>>         XMLStreamReader parser = XMLInputFactory.newInstance().
>>>                 createXMLStreamReader(new 
>>> ByteArrayInputStream(str.getBytes()));
>>>         StAXOMBuilder builder = new StAXOMBuilder(parser);
>>>         OMElement root = builder.getDocumentElement();
>>> //        root.detach();
>>>
>>>         AXIOMXPath xpath = new AXIOMXPath("//hello/something");
>>>         OMElement node = (OMElement) xpath.selectSingleNode(root);
>>>         System.out.println(node == null);
>>>         if (node != null) {
>>>             System.out.println(node.getText());
>>>         }
>>>
>>>
>>>       Out put :
>>>
>>>        false
>>>        wow nice
>>>
>>>
>>>        Scenario 2 - with  detach on root element
>>>
>>>         String str = "<hello><something>wow 
>>> nice</something><anotherthing><insideanother>great</insideanother></anotherthing></hello>";
>>>         XMLStreamReader parser = XMLInputFactory.newInstance().
>>>                 createXMLStreamReader(new 
>>> ByteArrayInputStream(str.getBytes()));
>>>         StAXOMBuilder builder = new StAXOMBuilder(parser);
>>>         OMElement root = builder.getDocumentElement();
>>>         root.detach();
>>>
>>>         AXIOMXPath xpath = new AXIOMXPath("//hello/something");
>>>         OMElement node = (OMElement) xpath.selectSingleNode(root);
>>>         System.out.println(node == null);
>>>         if (node != null) {
>>>             System.out.println(node.getText());
>>>         }
>>>
>>>        Output
>>>
>>>        true
>>>
>>>
>>>    In second case , XPath  have not been evaluated correctly.
>>>
>>> Thanks
>>> Indika
>>>
>>> On Sat, Jun 20, 2009 at 9:40 PM, Saliya Ekanayake <esal...@gmail.com> wrote:
>>>>
>>>> Hi,
>>>>
>>>> Um, I am not really clarified with the problem here. I agree that the full 
>>>> tree should be built before we can evaluate XPath. Adding the element to a 
>>>> new OMDocument, however, just to get this done seems not right. 
>>>> Additionally, the original OMDocument created by the builder will be there 
>>>> even if you detach the element. Detach will only remove the element from 
>>>> the tree to which it belongs. To check this, you can get the builder from 
>>>> the detached element and ask for the OMDocument.  IMHO, we can call 
>>>> result.build() if necessary.
>>>>
>>>> Btw. I am not clear why XPath doesn't work on the detached element. I did 
>>>> a simple test as follows and XPath worked, may be I have missed something 
>>>> (please let me know if so).
>>>>
>>>>     public static void main(String[] args) throws XMLStreamException, 
>>>> JaxenException {
>>>>         String str = "<hello><something>wow 
>>>> nice</something><anotherthing><insideanother>great</insideanother></anotherthing></hello>";
>>>>         StAXOMBuilder builder = new StAXOMBuilder(new 
>>>> ByteArrayInputStream(str.getBytes()));
>>>>         OMElement root = builder.getDocumentElement();
>>>>
>>>>         OMDocument doc = builder.getDocument();
>>>>         System.out.println(doc == null);
>>>>
>>>>         OMElement anotherthing = root.getFirstChildWithName(new 
>>>> QName("anotherthing"));
>>>>         anotherthing.detach();
>>>>
>>>>         doc = ((StAXOMBuilder)anotherthing.getBuilder()).getDocument();
>>>>         System.out.println(doc == null);
>>>>
>>>>         AXIOMXPath xpath = new AXIOMXPath("//insideanother");
>>>>         OMElement node = (OMElement) xpath.selectSingleNode(anotherthing);
>>>>         System.out.println(node.getText());
>>>>     }
>>>>
>>>> Thanks,
>>>> Saliya
>>>>
>>>> On Sat, Jun 20, 2009 at 4:45 AM, Andreas Veithen 
>>>> <andreas.veit...@gmail.com> wrote:
>>>>>
>>>>> StAXOMBuilder actually already creates an OMDocument (which can be
>>>>> retrieved by the getDocument method). The important thing is that we
>>>>> need to make sure that the Axiom tree is fully built before closing
>>>>> the input stream. I guess that the detach method is used because it
>>>>> has the side effect of fully building the element and because
>>>>> OMDocument has no method to build the entire tree (see WSCOMMONS-479).
>>>>>
>>>>> This gives us two solutions:
>>>>>
>>>>> - Use StAXOMBuilder#getDocument and iterate over its children to make
>>>>> sure the document is fully built.
>>>>> - Continue to use "detach" and add the element to a new document, as
>>>>> you suggested. Note that you should not use OMDocumentImpl directly,
>>>>> but create it using the OMFactory.
>>>>>
>>>>> Andreas
>>>>>
>>>>> On Fri, Jun 19, 2009 at 09:30, indika kumara<indika.k...@gmail.com> wrote:
>>>>> > Devs
>>>>> >
>>>>> > $subject is due to we do  'detach()'  on picked resource OMElement .
>>>>> > If I add detached element to a OMDocument as a child, it works
>>>>> >
>>>>> > Existing code  SImpleURLRegistry
>>>>> >
>>>>> > result.detach();
>>>>> > inputStream.close();
>>>>> >
>>>>> >
>>>>> > Modified code
>>>>> >
>>>>> > result.detach();
>>>>> > OMDocumentImpl omDocument = new OMDocumentImpl();
>>>>> > omDocument.addChild(result);
>>>>> > inputStream.close();
>>>>> >
>>>>> >
>>>>> > Are there any best solution other than what I did ?  I haven't deep
>>>>> > AXIOM knowledge?  Could anyone help me?
>>>>> >
>>>>> > Thanks
>>>>> > Indika
>>>>> >
>>>>> > ---------------------------------------------------------------------
>>>>> > To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org
>>>>> > For additional commands, e-mail: dev-h...@synapse.apache.org
>>>>> >
>>>>> >
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org
>>>>> For additional commands, e-mail: dev-h...@synapse.apache.org
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Saliya Ekanayake
>>>> http://www.esaliya.blogspot.com
>>>> http://www.esaliya.wordpress.com
>>>
>>
>>
>>
>> --
>> Saliya Ekanayake
>> http://www.esaliya.blogspot.com
>> http://www.esaliya.wordpress.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org
> For additional commands, e-mail: dev-h...@synapse.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org
For additional commands, e-mail: dev-h...@synapse.apache.org

Reply via email to