[ 
https://issues.apache.org/jira/browse/SYNAPSE-557?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Bill Harts updated SYNAPSE-557:
-------------------------------

    Attachment: changes.patch

Changes to SynapseXPath.java to fix the XPath attribute problem.  Needs to be 
applied to the codebase.

Bill


> XPath doesn't return attribute value
> ------------------------------------
>
>                 Key: SYNAPSE-557
>                 URL: https://issues.apache.org/jira/browse/SYNAPSE-557
>             Project: Synapse
>          Issue Type: Bug
>          Components: Core
>            Reporter: Bill Harts
>         Attachments: changes.patch
>
>
> Problem:
> An XPath expression in my synapse.xml configuration file is unable to 
> retrieve an XML attribute from a message.  Example:
> <log level="custom">
>   <property name="sessID"  
> expression="//ns:LoginResponse/ns:LoginResponseData/@sessionID" 
> xmlns:ns="http://www.test.com/ns"; />
> </log>
> The message body is:
>  <soapenv:Body>
>   <ns:LoginResponse xmlns:ns="http://www.test.com/ns";>
>    <ns:LoginResponseData sessionID="250446AD43C0EEF3ED2F3172F8FA0A3D" 
> statusCode="0"/>
>   </ns:LoginResponse>
>  </soapenv:Body>
> In this case the log mediator always returns null for the sessID variable.
> Cause:
> After poking around in a bunch of modules I believe that these XPath 
> expressions are being handled in module synapseXPath.java.  Specifically 
> there is a call in stringValueOf(MessageContext synCtx) to 
> BaseXPath.evaluate() which returns a List of element pointers retrieved by 
> the XPath expression.  The function then correctly checks each element to to 
> determine if it is of type OMTextImpl, OMElementImpl or OMDocumentImpl but 
> when an attribute has been found evaluate() returns an attribute of type 
> DocumentNavigator$OMAttributeEx.  It appears that there is no code in 
> stringValueOf() to handle this type of pointer.
> Solution:
> I added the following code to synapseXpath.java::stringValueOf at line 206:
>                     ...
>                     } else if (o instanceof OMAttributeEx) {
>                         textValue.append( 
> ((OMAttributeEx)o).getAttributeValue());
>                    }
>                    ...
> Also, since the type OMAttributeEx is an inner class of type 
> DocumentNavigator I needed to add an import statement in SynapseXPath.java:
> import org.apache.axiom.om.xpath.DocumentNavigator.OMAttributeEx;
> Unfortunately, OMAtributeEx is defined as private to class DocumentNavigator 
> so I had to declare class and constructor OMAttributeEx as public in the 
> module DocumentNavigator.java in the Axiom project module axiom-api.jar.  

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to