synapse-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andreas Veithen <andreas.veit...@gmail.com>
Subject Re: XPath evaluation doesn't work on resources picked from registry
Date Sun, 21 Jun 2009 17:29:11 GMT
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.kuma@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 <esaliya@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.kuma@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 <esaliya@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.veithen@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.kuma@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-unsubscribe@synapse.apache.org
>>>>> > For additional commands, e-mail: dev-help@synapse.apache.org
>>>>> >
>>>>> >
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: dev-unsubscribe@synapse.apache.org
>>>>> For additional commands, e-mail: dev-help@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-unsubscribe@synapse.apache.org
> For additional commands, e-mail: dev-help@synapse.apache.org
>
>

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


Mime
View raw message