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