FYI, SYNAPSE-557 did fix the problem with returning attributes.  What I am
reporting here seems to be something specific to using XPATH in a Log
mediator (i.e, it works ok in the Filter mediator).

I am trying to get the latest trunk (787669) to compile now so I can debug
it.  There are 2 problems in Endpoint.java that cause it not to compile.

[INFO]
------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO]
------------------------------------------------------------------------
[INFO] Compilation failure

C:\Apache\Synapse-Trunk\modules\core\src\main\java\org\apache\synapse\endpoints\
Endpoint.java:[39,0] <identifier> expected

C:\Apache\Synapse-Trunk\modules\core\src\main\java\org\apache\synapse\endpoints\
Endpoint.java:[44,54] = expected


[INFO]
------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO]
------------------------------------------------------------------------
[INFO] Total time: 3 minutes 56 seconds
[INFO] Finished at: Tue Jun 23 09:36:12 EDT 2009
[INFO] Final Memory: 30M/63M
[INFO]
------------------------------------------------------------------------
C:\Apache\Synapse-Trunk>

Bill

On Tue, Jun 23, 2009 at 5:32 AM, Andreas Veithen
<[email protected]>wrote:

> Strange, this is actually a problem that should have been fixed
> recently; see SYNAPSE-557.
>
> Andreas
>
> On Mon, Jun 22, 2009 at 23:28, Bill Harts<[email protected]> 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 <[email protected]>
> > 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 <[email protected]>
> >> 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 <
> [email protected]>
> >> > 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 <[email protected]
> >
> >> >> 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
> >> >>> <[email protected]> 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<[email protected]
> >
> >> >>>> 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: [email protected]
> >> >>>> > For additional commands, e-mail: [email protected]
> >> >>>> >
> >> >>>> >
> >> >>>>
> >> >>>>
> ---------------------------------------------------------------------
> >> >>>> To unsubscribe, e-mail: [email protected]
> >> >>>> For additional commands, e-mail: [email protected]
> >> >>>>
> >> >>>
> >> >>>
> >> >>>
> >> >>> --
> >> >>> 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: [email protected]
> >> For additional commands, e-mail: [email protected]
> >>
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to