I will use the second option and add TODO as a reminder for do correct change when we are moving to 1.2.9-SNAPSHOT
Indika On Sun, Jun 21, 2009 at 10:59 PM, Andreas Veithen <andreas.veit...@gmail.com > wrote: > 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 > >