But bill my change only with resources picked from the registry. This issue seems with XPath on Payload ...It is impossible to correlate those two . Could you re-check please?
On Tue, Jun 23, 2009 at 10:34 AM, indika kumara <indika.k...@gmail.com>wrote: > > Bill I will check .. Thanks for pointing out issue . > > Thanks > Inidka > > On Tue, Jun 23, 2009 at 2:58 AM, Bill Harts <prgt...@gmail.com> wrote: > >> Hi Guys: >> >> I'm not sure but I believe something has broken with using xpath >> expressions in a log mediator possibly related to your recent changes. I >> think this was working until I downloaded yesterday's snapshot I was using a >> 3-week old snapshot). >> >> Here's the code from my my mediator file: >> >> <!-- If there's a sessionID attribute in the message this must be a response >> to a Login --> >> <filter >> xpath="boolean(//cfl:LoginResponse/cfl:LoginResponseData/@sessionID)" >> xmlns:cfl="http://www.harts.com/cfl" > >> >> <log level="custom"> >> >> <property name="sessID" >> expression="//cfl:LoginResponse/cfl:LoginResponseData/@sessionID" >> xmlns:cfl="http://www.harts.com/cfl"/> >> >> </log> >> >> <!-- Other logic goes here --> >> >> </filter> >> >> It passes the filter test but the log mediator just displays "sessID=". >> Since the expressions in the filter and log mediators are the same I don't >> think this should happen. >> >> Bill >> >> >> On Sun, Jun 21, 2009 at 1:11 PM, 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 >>> >>> >> >