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 "";
                 }
             }
         }


Reply via email to