You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by ch...@apache.org on 2006/12/13 10:32:49 UTC

svn commit: r486561 - in /webservices/axis2/branches/java/WSDL_2_0/modules/kernel: src/org/apache/axis2/transport/http/RESTSender.java test/org/apache/axis2/transport/http/ test/org/apache/axis2/transport/http/RestSenderTest.java

Author: chinthaka
Date: Wed Dec 13 01:32:48 2006
New Revision: 486561

URL: http://svn.apache.org/viewvc?view=rev&rev=486561
Log:
Making the URL templates to work. Added a test as well.

Added:
    webservices/axis2/branches/java/WSDL_2_0/modules/kernel/test/org/apache/axis2/transport/http/
    webservices/axis2/branches/java/WSDL_2_0/modules/kernel/test/org/apache/axis2/transport/http/RestSenderTest.java
Modified:
    webservices/axis2/branches/java/WSDL_2_0/modules/kernel/src/org/apache/axis2/transport/http/RESTSender.java

Modified: webservices/axis2/branches/java/WSDL_2_0/modules/kernel/src/org/apache/axis2/transport/http/RESTSender.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/WSDL_2_0/modules/kernel/src/org/apache/axis2/transport/http/RESTSender.java?view=diff&rev=486561&r1=486560&r2=486561
==============================================================================
--- webservices/axis2/branches/java/WSDL_2_0/modules/kernel/src/org/apache/axis2/transport/http/RESTSender.java (original)
+++ webservices/axis2/branches/java/WSDL_2_0/modules/kernel/src/org/apache/axis2/transport/http/RESTSender.java Wed Dec 13 01:32:48 2006
@@ -45,6 +45,8 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
 
 public class RESTSender extends AbstractHTTPSender {
     private static final Log log = LogFactory.getLog(RESTSender.class);
@@ -146,37 +148,72 @@
     }
 
     /**
-     * This will be used to support http location. User can set set of param lists and those will be
-     * appended to the url.
+     * This will be used to support http location. User will create an OMElement to be plugged in to
+     * SOAP body. Then he has to name the parameters that should go in the url. This method will extract
+     * those parameters from the body first child and append to the url.
+     * <p/>
+     * In addition to that, user can set a URL template, like ?firstName={FirstName}. In this case,
+     * first name must be taken from the body and will replace the url.
      *
      * @param messageContext
      * @param urlString
      * @return - the URL after appending the properties
      */
-    private String appendParametersToURL(MessageContext messageContext, String urlString) {
+    protected String appendParametersToURL(MessageContext messageContext, String urlString, String queryPart) {
         try {
             OMElement firstElement = messageContext.getEnvelope().getBody().getFirstElement();
 
+            // first process the situ where user had explicitly put some params to go in the URL
             ArrayList httpLocationParams = (ArrayList) messageContext.getProperty(
                     Constants.Configuration.URL_HTTP_LOCATION_PARAMS_LIST);
 
             URL url = new URL(urlString);
             String path = url.getPath();
 
-            for (int i = 0; i < httpLocationParams.size(); i++) {
-                String httpLocationParam = (String) httpLocationParams.get(i);
-                OMElement httpURLParam = firstElement.getFirstChildWithName(new QName(httpLocationParam));
-                if (httpURLParam != null) {
-                    path += httpURLParam.getText();
+            if (httpLocationParams != null) {
+                for (int i = 0; i < httpLocationParams.size(); i++) {
+                    String httpLocationParam = (String) httpLocationParams.get(i);
+                    OMElement httpURLParam = firstElement.getFirstChildWithName(new QName(httpLocationParam));
+                    if (httpURLParam != null) {
+                        path += "/" + httpURLParam.getText();
+                        httpURLParam.detach();
+                    }
                 }
             }
 
-            String query = url.getQuery();
-            if (query != null && !"".equals(query)) {
-                return path + "?" + query;
-            } else {
-                return path;
+            if (queryPart != null && queryPart.length() > 0) {
+                if (queryPart.startsWith("?")) {
+                    path = urlString + queryPart;
+                } else {
+                    path = urlString + "?" + queryPart;
+                }
+            }
+
+            // now let's process URL templates.
+            String patternString = "\\{[A-Z0-9a-z._%-]+\\}";
+            Pattern pattern = Pattern.compile(patternString);
+
+            StringBuffer buffer = new StringBuffer(path);
+
+            Matcher matcher = pattern.matcher(buffer);
+
+            while (matcher.find()) {
+                String match = matcher.group();
+
+                // Get indices of matching string
+                int start = matcher.start();
+                int end = matcher.end();
+
+                CharSequence charSequence = match.subSequence(1, match.length() - 1);
+
+                buffer.delete(start, end);
+                buffer.insert(start, getOMElementValue(charSequence.toString(), firstElement));
+
             }
+
+            return buffer.toString();
+
+
         } catch (MalformedURLException e) {
             log.error("Error in processing POST request", e);
         }
@@ -184,6 +221,17 @@
         return null;
     }
 
+    private String getOMElementValue(String elementName, OMElement parentElement) {
+        OMElement httpURLParam = parentElement.getFirstChildWithName(new QName(elementName));
+
+        if (httpURLParam != null) {
+            return httpURLParam.getText();
+        }
+
+        return null;
+
+    }
+
     private void sendViaGet(MessageContext msgContext, URL url)
             throws MalformedURLException, AxisFault, IOException {
         String param = getQueryParameters(msgContext);
@@ -193,13 +241,9 @@
         }
 
         String urlString = url.getFile();
-        urlString = appendParametersToURL(msgContext, urlString);
+        urlString = appendParametersToURL(msgContext, urlString, param);
 
-        if (param != null && param.length() > 0) {
-            getMethod.setPath(urlString + "?" + param);
-        } else {
-            getMethod.setPath(urlString);
-        }
+        getMethod.setPath(urlString);
 
         // Serialization as "application/x-www-form-urlencoded"
         String charEncoding =
@@ -273,11 +317,9 @@
             reqData = createRequest(msgContext, dataout);
             String pathString = url.getPath();
 
-            appendParametersToURL(msgContext, pathString);
+            String urlString = appendParametersToURL(msgContext, pathString, reqData.urlRequest);
 
-            postMethod.setPath(pathString + ((reqData.urlRequest) != null
-                    ? ("?" + reqData.urlRequest)
-                    : ""));
+            postMethod.setPath(urlString);
 
             if (reqData.bodyRequest == null) {
                 reqData.bodyRequest = "0";

Added: webservices/axis2/branches/java/WSDL_2_0/modules/kernel/test/org/apache/axis2/transport/http/RestSenderTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/WSDL_2_0/modules/kernel/test/org/apache/axis2/transport/http/RestSenderTest.java?view=auto&rev=486561
==============================================================================
--- webservices/axis2/branches/java/WSDL_2_0/modules/kernel/test/org/apache/axis2/transport/http/RestSenderTest.java (added)
+++ webservices/axis2/branches/java/WSDL_2_0/modules/kernel/test/org/apache/axis2/transport/http/RestSenderTest.java Wed Dec 13 01:32:48 2006
@@ -0,0 +1,66 @@
+package org.apache.axis2.transport.http;
+
+import junit.framework.TestCase;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axiom.soap.SOAPEnvelope;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class RestSenderTest extends TestCase {
+
+    String testURL = "http://locahost:8080/paramOne/{FirstName}";
+    String queryPart = "?test=1&lastName={LastName}";
+
+
+    private MessageContext messageContext;
+
+
+    protected void setUp() throws Exception {
+        messageContext = new MessageContext();
+
+        SOAPFactory soapFactory = OMAbstractFactory.getSOAP12Factory();
+
+        SOAPEnvelope defaultEnvelope = soapFactory.getDefaultEnvelope();
+        messageContext.setEnvelope(defaultEnvelope);
+
+        OMElement bodyFirstElement = soapFactory.createOMElement("TestOperation", null);
+        defaultEnvelope.getBody().addChild(bodyFirstElement);
+
+        soapFactory.createOMElement("FirstName", null, bodyFirstElement).setText("Foo");
+        soapFactory.createOMElement("LastName", null, bodyFirstElement).setText("Bar");
+
+    }
+
+    public void testAppendParametersToURL() {
+        RESTSender restSender = new RESTSender();
+        String modifiedURL = restSender.appendParametersToURL(messageContext, testURL, queryPart);
+
+        System.out.println("original = " + testURL + queryPart);
+        System.out.println("modifiedURL = " + modifiedURL);
+
+        String expectedURL = "http://locahost:8080/paramOne/Foo?test=1&lastName=Bar";
+
+        assertEquals(modifiedURL, expectedURL);
+
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org