You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ru...@apache.org on 2009/11/24 10:17:22 UTC

svn commit: r883632 - in /synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath: SynapseXPathConstants.java SynapseXPathVariableContext.java

Author: ruwan
Date: Tue Nov 24 09:17:21 2009
New Revision: 883632

URL: http://svn.apache.org/viewvc?rev=883632&view=rev
Log:
Applying the patch from Supun on https://issues.apache.org/jira/browse/SYNAPSE-598 with minor fixes

Modified:
    synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java
    synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java

Modified: synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java
URL: http://svn.apache.org/viewvc/synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java?rev=883632&r1=883631&r2=883632&view=diff
==============================================================================
--- synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java (original)
+++ synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathConstants.java Tue Nov 24 09:17:21 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/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
URL: http://svn.apache.org/viewvc/synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java?rev=883632&r1=883631&r2=883632&view=diff
==============================================================================
--- synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java (original)
+++ synapse/branches/1.3/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java Tue Nov 24 09:17:21 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 "";
                 }
             }
         }