Author: ruwan
Date: Tue Nov 24 09:22:29 2009
New Revision: 883633
URL: http://svn.apache.org/viewvc?rev=883633&view=rev
Log:
Applying the patch from Supun on
https://issues.apache.org/jira/browse/SYNAPSE-598 with minor fixes
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java?rev=883633&r1=883632&r2=883633&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java
Tue Nov 24 09:22:29 2009
@@ -41,4 +41,7 @@
/** Variable prefix for accessing transport headers of the message through
XPath variables */
public static final String TRANSPORT_VARIABLE_PREFIX = "trp";
+
+ /** Variable prefix for accessing URL parameters of the message through
XPath variables */
+ public static final String URL_VARIABLE_PREFIX = "url";
}
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java?rev=883633&r1=883632&r2=883633&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
Tue Nov 24 09:22:29 2009
@@ -22,10 +22,19 @@
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.synapse.MessageContext;
import org.apache.synapse.core.axis2.Axis2MessageContext;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.description.AxisBindingOperation;
+import org.apache.axis2.description.WSDL2Constants;
+import org.apache.axis2.description.WSDL20DefaultValueHolder;
+import org.apache.axis2.Constants;
+import org.apache.axis2.transport.http.util.URIEncoderDecoder;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.Log;
import org.jaxen.UnresolvableException;
import org.jaxen.VariableContext;
import java.util.Map;
+import java.io.UnsupportedEncodingException;
/**
* Jaxen variable context for the XPath variables implicitly exposed by
Synapse.
@@ -38,6 +47,9 @@
* </dl>
*/
public class SynapseXPathVariableContext implements VariableContext {
+
+ private static final Log log =
LogFactory.getLog(SynapseXPathVariableContext.class);
+
/** Parent variable context */
private final VariableContext parent;
@@ -133,6 +145,57 @@
Map headersMap = (Map) headers;
return headersMap.get(localName);
}
+ } else if
(SynapseXPathConstants.URL_VARIABLE_PREFIX.equals(prefix)) {
+
+ EndpointReference toEPR = synCtx.getTo();
+ if (toEPR != null) {
+ String completeURL = toEPR.getAddress();
+ AxisBindingOperation axisBindingOperation =
(AxisBindingOperation)
+ ((Axis2MessageContext)
synCtx).getAxis2MessageContext().getProperty(
+ Constants.AXIS_BINDING_OPERATION);
+ String queryParameterSeparator = null;
+ if (axisBindingOperation != null) {
+ queryParameterSeparator = (String)
axisBindingOperation.getProperty(
+
WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR);
+ }
+ if (queryParameterSeparator == null) {
+ queryParameterSeparator = WSDL20DefaultValueHolder.
+
ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR_DEFAULT;
+ }
+
+ int i = completeURL.indexOf("?");
+ if (i > -1) {
+ String queryString = completeURL.substring(i + 1);
+
+ if (queryString != null &&
!queryString.equals("")) {
+ String params[] =
queryString.split(queryParameterSeparator);
+
+ if (params == null || params.length == 0) {
+ return "";
+ }
+
+ for (String param : params) {
+ String temp[] = param.split("=");
+ if (temp != null && temp.length >= 1) {
+ if (temp[0].equals(localName)) {
+ try {
+ return temp.length > 1 ?
+
URIEncoderDecoder.decode(temp[1]) : "";
+ } catch
(UnsupportedEncodingException e) {
+ String msg = "Couldn't decode
the URL parameter " +
+ "value " + temp[1] +
+ " with name " +
localName;
+ log.error(msg, e);
+ throw new
UnresolvableException(
+ msg + e.getMessage());
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return "";
}
}
}