You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ka...@apache.org on 2011/06/30 07:33:28 UTC

svn commit: r1141404 - in /synapse/trunk/java/modules/commons/src/main/java/org/apache/synapse/commons/builders: ./ XFormURLEncodedBuilder.java

Author: kasun
Date: Thu Jun 30 05:33:28 2011
New Revision: 1141404

URL: http://svn.apache.org/viewvc?rev=1141404&view=rev
Log:
Commiting patch for SYNAPSE-783

Added:
    synapse/trunk/java/modules/commons/src/main/java/org/apache/synapse/commons/builders/
    synapse/trunk/java/modules/commons/src/main/java/org/apache/synapse/commons/builders/XFormURLEncodedBuilder.java

Added: synapse/trunk/java/modules/commons/src/main/java/org/apache/synapse/commons/builders/XFormURLEncodedBuilder.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/commons/src/main/java/org/apache/synapse/commons/builders/XFormURLEncodedBuilder.java?rev=1141404&view=auto
==============================================================================
--- synapse/trunk/java/modules/commons/src/main/java/org/apache/synapse/commons/builders/XFormURLEncodedBuilder.java (added)
+++ synapse/trunk/java/modules/commons/src/main/java/org/apache/synapse/commons/builders/XFormURLEncodedBuilder.java Thu Jun 30 05:33:28 2011
@@ -0,0 +1,83 @@
+package org.apache.synapse.commons.builders;
+
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.soap.*;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
+import org.apache.axis2.builder.Builder;
+import org.apache.axis2.builder.BuilderUtil;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.AxisBinding;
+import org.apache.axis2.description.AxisEndpoint;
+import org.apache.axis2.description.WSDL2Constants;
+import org.apache.axis2.i18n.Messages;
+import org.apache.axis2.transport.http.HTTPConstants;
+import org.apache.axis2.util.MultipleEntryHashMap;
+
+import javax.xml.namespace.QName;
+import java.io.InputStream;
+
+/**
+ * Synapse specific message builder for "application/x-www-form-urlencoded" content type. This
+ * builder extends the functionality provided by the Axis2 builder.
+ */
+public class XFormURLEncodedBuilder implements Builder {
+
+    private org.apache.axis2.builder.XFormURLEncodedBuilder
+            xformAxis2Builder = new org.apache.axis2.builder.XFormURLEncodedBuilder();
+
+    private static final QName XFORM_FIRST_ELEMENT = new QName("xformValues");
+
+    public OMElement processDocument(InputStream inputStream, String s,
+                                     MessageContext messageContext) throws AxisFault {
+        // first process the input stream using the Axis2 builder
+        SOAPEnvelope soapEnv = (SOAPEnvelope) xformAxis2Builder.processDocument(inputStream,
+                s, messageContext);
+
+        // when this is a POST request, if the body of the soap envelope is empty and the parameter
+        // map is there, build a dummy soap body which contains all the parameters coming in.
+        SOAPBody body = soapEnv.getBody();
+        String httpMethod = (String) messageContext.getProperty(HTTPConstants.HTTP_METHOD);
+        if (body.getFirstElement() == null && HTTPConstants.HTTP_METHOD_POST.equals(httpMethod) &&
+                messageContext.getProperty(Constants.REQUEST_PARAMETER_MAP) != null) {
+            MultipleEntryHashMap map = (MultipleEntryHashMap) messageContext
+                    .getProperty(Constants.REQUEST_PARAMETER_MAP);
+            SOAPFactory soapFactory = getSOAPFactory(messageContext);
+            OMElement bodyFirstChild = soapFactory
+                    .createOMElement(XFORM_FIRST_ELEMENT, body);
+            BuilderUtil.createSOAPMessageWithoutSchema(soapFactory, bodyFirstChild, map);
+        }
+        return soapEnv;
+    }
+
+    private SOAPFactory getSOAPFactory(MessageContext messageContext) throws AxisFault {
+        SOAPFactory soapFactory;
+        AxisEndpoint axisEndpoint = (AxisEndpoint) messageContext
+                .getProperty(WSDL2Constants.ENDPOINT_LOCAL_NAME);
+        if (axisEndpoint != null) {
+            AxisBinding axisBinding = axisEndpoint.getBinding();
+            String soapVersion =
+                    (String) axisBinding.getProperty(WSDL2Constants.ATTR_WSOAP_VERSION);
+            soapFactory = getSOAPFactory(soapVersion);
+        } else {
+            soapFactory = getSOAPFactory(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+        }
+        return soapFactory;
+    }
+
+    private SOAPFactory getSOAPFactory(String nsURI) throws AxisFault {
+        if (nsURI == null) {
+            return OMAbstractFactory.getSOAP12Factory();
+        }
+        else if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(nsURI)) {
+            return OMAbstractFactory.getSOAP12Factory();
+        } else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(nsURI)) {
+            return OMAbstractFactory.getSOAP11Factory();
+        } else {
+            throw new AxisFault(Messages.getMessage("invalidSOAPversion"));
+        }
+    }
+
+}