Yes, I think that is the best solution.

Andreas

On Mon, Jun 22, 2009 at 12:14, indika kumara<indika.k...@gmail.com> wrote:
> 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
>>
>
>

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

Reply via email to