Author: midon
Date: Thu Jun 26 19:28:09 2008
New Revision: 672082

URL: http://svn.apache.org/viewvc?rev=672082&view=rev
Log:
ODE-308: add support for both parentheses and braces as part delimiters

Modified:
    
ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/httpbinding/HttpClientHelper.java
    
ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/util/UrlReplacementTransformer.java
    
ode/branches/APACHE_ODE_1.1/axis2/src/test/java/org/apache/ode/axis2/util/UrlReplacementTransformerTest.java
    
ode/branches/APACHE_ODE_1.1/utils/src/main/java/org/apache/ode/utils/wsdl/Messages.java

Modified: 
ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/httpbinding/HttpClientHelper.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/httpbinding/HttpClientHelper.java?rev=672082&r1=672081&r2=672082&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/httpbinding/HttpClientHelper.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/httpbinding/HttpClientHelper.java
 Thu Jun 26 19:28:09 2008
@@ -140,7 +140,7 @@
         boolean useUrlEncoded = WsdlUtils.useUrlEncoded(bindingInput) || 
PostMethod.FORM_URL_ENCODED_CONTENT_TYPE.equalsIgnoreCase(contentType);
         boolean useUrlReplacement = WsdlUtils.useUrlReplacement(bindingInput);
 
-        final UrlReplacementTransformer replacementTransformer = new 
UrlReplacementTransformer(partValues.keySet());
+        final UrlReplacementTransformer replacementTransformer = new 
UrlReplacementTransformer();
         final URLEncodedTransformer encodedTransformer = new 
URLEncodedTransformer();
 
         // the http method to be built and returned

Modified: 
ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/util/UrlReplacementTransformer.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/util/UrlReplacementTransformer.java?rev=672082&r1=672081&r2=672082&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/util/UrlReplacementTransformer.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.1/axis2/src/main/java/org/apache/ode/axis2/util/UrlReplacementTransformer.java
 Thu Jun 26 19:28:09 2008
@@ -19,24 +19,20 @@
 
 package org.apache.ode.axis2.util;
 
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.httpclient.util.URIUtil;
 import org.apache.commons.httpclient.URIException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ode.utils.DOMUtils;
-import org.apache.ode.utils.wsdl.Messages;
 import org.w3c.dom.Element;
 
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * This encoder applies urlReplacement as defined by the <a 
href='http://www.w3.org/TR/wsdl#_http:urlReplacement'>WSDL specification</a>.
+ * <br/>Surrounding characters for parts may be parentheses '()' or braces 
'{}'. Pattern with parentheses is look up first, if found then it's replaced 
with the part value, else the pattern with braces is look up.
  * <p/><strong>Escaping Considerations</strong>
  * <br/>Replacement and default values are escaped. All characters except 
unreserved (as defined by <a 
href="http://tools.ietf.org/html/rfc2396#appendix-A";>rfc2396</a>) are escaped.
  * <br/> unreserved    = alphanum | mark
@@ -51,33 +47,18 @@
 
     private static final Log log = 
LogFactory.getLog(UrlReplacementTransformer.class);
 
-    private static final org.apache.ode.utils.wsdl.Messages msgs = 
Messages.getMessages(Messages.class);
     private static final org.apache.ode.axis2.httpbinding.Messages httpMsgs = 
org.apache.ode.axis2.httpbinding.Messages.getMessages(org.apache.ode.axis2.httpbinding.Messages.class);
 
-    protected Set<String> partNames;
-
     public UrlReplacementTransformer() {
-        partNames = new HashSet<String>();
-    }
-
-    public UrlReplacementTransformer(Set<String> partNames) {
-        this.partNames = partNames;
     }
 
     /**
      * @param baseUri - the base uri template containing part names enclosed 
within single curly braces
      * @param values  - a map<String, Object>, the key is a part name (without 
curly braces), the value the replacement value for the part name.
      * @return the encoded uri
-     * @throws java.lang.IllegalArgumentException
-     *          if a part (key) is missing in the map, if a replacement value 
is null in the map, if a part pattern is not found in the uri template, if a 
part pattern is found more than once
+     * @throws java.lang.IllegalArgumentException if a replacement value is 
null in the map or if a part pattern is found more than once
      */
     public String transform(String baseUri, Map<String, Element> values) {
-        // each part must be given a replacement value
-        if (values.keySet().size() != partNames.size() || 
!values.keySet().containsAll(partNames)) {
-            Collection<String> disjunction = 
CollectionUtils.disjunction(partNames, values.keySet());
-            throw new 
IllegalArgumentException(msgs.msgMissingReplacementValuesFor(disjunction));
-        }
-
         // the list containing the final split result
         List<String> result = new ArrayList<String>();
 
@@ -87,11 +68,9 @@
         // replace each part exactly once
         for (Map.Entry<String, Element> e : values.entrySet()) {
 
-            String partPattern;
+            String partName = e.getKey();
             String replacementValue;
             {
-                String partName = e.getKey();
-                partPattern = "\\(" + partName + "\\)";
                 Element value = e.getValue();
                 if (value == null) {
                     throw new 
IllegalArgumentException(httpMsgs.msgSimpleTypeExpected(partName));
@@ -105,7 +84,14 @@
                 // this exception is never thrown by the code of httpclient
                 if (log.isWarnEnabled()) log.warn(urie.getMessage(), urie);
             }
-            replace(result, partPattern, replacementValue);
+
+            // first, search for parentheses
+            String partPattern = "\\(" + partName + "\\)";
+            if(!replace(result, partPattern, replacementValue)){
+                // if parentheses not found, try braces
+                partPattern = "\\{" + partName + "\\}";
+                replace(result, partPattern, replacementValue);
+            }
         }
 
         // join all the array elements to form the final url
@@ -114,23 +100,14 @@
         return sb.toString();
     }
 
-    private void replace(List<String> result, String partPattern, String 
replacementValue) {
+    private boolean replace(List<String> result, String partPattern, String 
replacementValue) {
         // !!!  i=i+2      replacement values will be skipped,
         // so replaced values do not trigger additional matches
         for (int i = 0; i < result.size(); i = i + 2) {
             String segment = result.get(i);
             // use a negative limit, so empty strings are not discarded
             String[] matches = segment.split(partPattern, -1);
-            if (matches.length == 1) {
-                if (i == result.size() - 1) {
-                    // last segment, no more string to test
-                    throw new 
IllegalArgumentException(httpMsgs.msgInvalidURIPattern());
-                } else {
-                    continue;
-                }
-            } else if (matches.length > 2) {
-                throw new 
IllegalArgumentException(httpMsgs.msgInvalidURIPattern());
-            } else {
+            if (matches.length == 2) {
                 // if exactly one match...
 
                 // remove the matching segment
@@ -142,8 +119,9 @@
 
                 // pattern found and replaced, we're done for this pattern
                 // move on to the next part
-                break;
+                return true;
             }
         }
+        return false;
     }
 }

Modified: 
ode/branches/APACHE_ODE_1.1/axis2/src/test/java/org/apache/ode/axis2/util/UrlReplacementTransformerTest.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/axis2/src/test/java/org/apache/ode/axis2/util/UrlReplacementTransformerTest.java?rev=672082&r1=672081&r2=672082&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.1/axis2/src/test/java/org/apache/ode/axis2/util/UrlReplacementTransformerTest.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.1/axis2/src/test/java/org/apache/ode/axis2/util/UrlReplacementTransformerTest.java
 Thu Jun 26 19:28:09 2008
@@ -33,22 +33,48 @@
  */
 public class UrlReplacementTransformerTest extends TestCase {
 
-    //<http:operation location="o1/A(part1)B(part2)/(part3)"/>
-    private String baseUrl = "o1/A(part1)B(part2)/(part3)";
 
-    public void testRegularCases() {
+    public void testWithParentheses() {
         String[][] a = new String[][]{
-                new String[]{"with alphabetical chars", baseUrl, 
"o1/AtutuBtiti/toto", "part1", "tutu", "part2", "titi", "part3", "toto"}
+                new String[]{"with alphabetical chars", 
"o1/A(part1)B(part2)/(part3)", "o1/AtutuBtiti/toto", "part1", "tutu", "part2", 
"titi", "part3", "toto"}
                 , new String[]{"parts are ends", "(part1)B(part2)/(part3)", 
"3B14/159", "part1", "3", "part2", "14", "part3", "159"}
                 , new String[]{"a single part", "(part1)", "314159", "part1", 
"314159"}
                 , new String[]{"parts surrounded with ()", 
"o1/A((part1))B((part2))/((part3))", "o1/A(3)B(14)/(159)", "part1", "3", 
"part2", "14", "part3", "159"}
-                , new String[]{"with numeric chars", baseUrl, 
"o1/A3B14/159%20and%20an%20epsilon", "part1", "3", "part2", "14", "part3", "159 
and an epsilon"}
-                , new String[]{"with empty values", baseUrl, "o1/AB/", 
"part1", "", "part2", "", "part3", ""}
-                , new String[]{"with special chars", baseUrl, 
"o1/AWhatB%2410%2C000/~!%40%23%24%25%5E%26*()_%2B%3D-%60%5B%5D%7B%7D%7C%5C.", 
"part1", "What", "part2", "$10,000", "part3", "[EMAIL 
PROTECTED]&*()_+=-`[]{}|\\."}
-                , new String[]{"with values containing key names", baseUrl, 
"o1/Avalue_of_part1_is_(part2)_and_should_not_be_replacedBsame_for_part2(part3)/foo",
 "part1", "value_of_part1_is_(part2)_and_should_not_be_replaced", "part2", 
"same_for_part2(part3)", "part3", "foo"}
+                , new String[]{"with numeric chars", 
"o1/A(part1)B(part2)/(part3)", "o1/A3B14/159%20and%20an%20epsilon", "part1", 
"3", "part2", "14", "part3", "159 and an epsilon"}
+                , new String[]{"with empty values", 
"o1/A(part1)B(part2)/(part3)", "o1/AB/", "part1", "", "part2", "", "part3", ""}
+                , new String[]{"with special chars", 
"o1/A(part1)B(part2)/(part3)", 
"o1/AWhatB%2410%2C000/~!%40%23%24%25%5E%26*()_%2B%3D-%60%5B%5D%7B%7D%7C%5C.", 
"part1", "What", "part2", "$10,000", "part3", "[EMAIL 
PROTECTED]&*()_+=-`[]{}|\\."}
+                , new String[]{"with values containing key names", 
"o1/A(part1)B(part2)/(part3)", 
"o1/Avalue_of_part1_is_(part2)_and_should_not_be_replacedBsame_for_part2(part3)/foo",
 "part1", "value_of_part1_is_(part2)_and_should_not_be_replaced", "part2", 
"same_for_part2(part3)", "part3", "foo"}
         };
 
         Document doc = DOMUtils.newDocument();
+        UrlReplacementTransformer encoder = new UrlReplacementTransformer();
+        for (String[] data : a) {
+            // convert into map
+            Map<String, Element> parts = new HashMap<String, Element>();
+            for (int k = 3; k < data.length; k = k + 2) {
+                Element element = doc.createElement(data[k]);
+                element.setTextContent(data[k + 1]);
+                parts.put(data[k], element);
+            }
+            assertEquals(data[0], data[2], encoder.transform(data[1], parts));
+        }
+    }
+
+
+    public void testWithBraces() {
+        String[][] a = new String[][]{
+                new String[]{"with alphabetical chars", 
"o1/A{part1}B{part2}/{part3}", "o1/AtutuBtiti/toto", "part1", "tutu", "part2", 
"titi", "part3", "toto"}
+                , new String[]{"parts are ends", "{part1}B{part2}/{part3}", 
"3B14/159", "part1", "3", "part2", "14", "part3", "159"}
+                , new String[]{"a single part", "{part1}", "314159", "part1", 
"314159"}
+                , new String[]{"parts surrounded with {}", 
"o1/A{{part1}}B{{part2}}/{{part3}}", "o1/A{3}B{14}/{159}", "part1", "3", 
"part2", "14", "part3", "159"}
+                , new String[]{"with numeric chars", 
"o1/A{part1}B{part2}/{part3}", "o1/A3B14/159%20and%20an%20epsilon", "part1", 
"3", "part2", "14", "part3", "159 and an epsilon"}
+                , new String[]{"with empty values", 
"o1/A{part1}B{part2}/{part3}", "o1/AB/", "part1", "", "part2", "", "part3", ""}
+                , new String[]{"with special chars", 
"o1/A{part1}B{part2}/{part3}", 
"o1/AWhatB%2410%2C000/~!%40%23%24%25%5E%26*()_%2B%3D-%60%5B%5D%7B%7D%7C%5C.", 
"part1", "What", "part2", "$10,000", "part3", "[EMAIL 
PROTECTED]&*()_+=-`[]{}|\\."}
+                , new String[]{"with values containing key names", 
"o1/A{part1}B{part2}/{part3}", 
"o1/Avalue_of_part1_is_%7Bpart2%7D_and_should_not_be_replacedBsame_for_part2%7Bpart3%7D/foo",
 "part1", "value_of_part1_is_{part2}_and_should_not_be_replaced", "part2", 
"same_for_part2{part3}", "part3", "foo"}
+        };
+
+        Document doc = DOMUtils.newDocument();
+        UrlReplacementTransformer encoder = new UrlReplacementTransformer();
         for (String[] data : a) {
             // convert into map
             Map<String, Element> parts = new HashMap<String, Element>();
@@ -57,24 +83,35 @@
                 element.setTextContent(data[k + 1]);
                 parts.put(data[k], element);
             }
-            UrlReplacementTransformer encoder = new 
UrlReplacementTransformer(parts.keySet());
             assertEquals(data[0], data[2], encoder.transform(data[1], parts));
         }
 
     }
 
-    public void testMissingPartPatterns() {
-        try {
-            Map<String, Element> map = new HashMap<String, Element>();
-            map.put("part1", null);
-            UrlReplacementTransformer encoder = new 
UrlReplacementTransformer(map.keySet());
-            encoder.transform("", map);
-            fail("Exception expected! Missing Part Patterns in URI");
-        } catch (IllegalArgumentException e) {
-            // expected behavior
+    public void testWithMixnMatch() {
+        String[][] a = new String[][]{
+                new String[]{"with alphabetical chars", 
"o1/A(part1)B{part2}/{part3}", "o1/AtutuBtiti/toto", "part1", "tutu", "part2", 
"titi", "part3", "toto"}
+                , new String[]{"parts are ends", "{part1}B{part2}/(part3)", 
"3B14/159", "part1", "3", "part2", "14", "part3", "159"}
+                , new String[]{"a single part", "{part1}", "314159", "part1", 
"314159"}
+                , new String[]{"with empty values", 
"o1/A{part1}B(part2)/{part3}", "o1/AB/", "part1", "", "part2", "", "part3", ""}
+        };
+
+        Document doc = DOMUtils.newDocument();
+        UrlReplacementTransformer encoder = new UrlReplacementTransformer();
+        for (String[] data : a) {
+            // convert into map
+            Map<String, Element> parts = new HashMap<String, Element>();
+            for (int k = 3; k < data.length; k = k + 2) {
+                Element element = doc.createElement(data[k]);
+                element.setTextContent(data[k + 1]);
+                parts.put(data[k], element);
+            }
+            assertEquals(data[0], data[2], encoder.transform(data[1], parts));
         }
+
     }
 
+
     public void testComplexType() {
         Document doc = DOMUtils.newDocument();
         Element element = doc.createElement("part1");
@@ -82,7 +119,7 @@
         Map<String, Element> m = new HashMap<String, Element>();
         m.put("part1", element);
 
-        UrlReplacementTransformer encoder = new 
UrlReplacementTransformer(m.keySet());
+        UrlReplacementTransformer encoder = new UrlReplacementTransformer();
         try {
             encoder.transform("(part1)", m);
             fail("IllegalArgumentException expected because a complex type is 
passed.");

Modified: 
ode/branches/APACHE_ODE_1.1/utils/src/main/java/org/apache/ode/utils/wsdl/Messages.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/utils/src/main/java/org/apache/ode/utils/wsdl/Messages.java?rev=672082&r1=672081&r2=672082&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.1/utils/src/main/java/org/apache/ode/utils/wsdl/Messages.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.1/utils/src/main/java/org/apache/ode/utils/wsdl/Messages.java
 Thu Jun 26 19:28:09 2008
@@ -191,17 +191,6 @@
         return format("Binding not found: port {0}.", portName);
     }
 
-    public String msgMissingReplacementValuesFor(Collection<String> partNames) 
{
-        StringBuilder sb = new StringBuilder();
-        for (Iterator it = partNames.iterator(); it.hasNext();) {
-            sb.append(it.next());
-            if (it.hasNext()) sb.append(", ");
-        }
-        return format("Missing Replacement value for {0}", sb.toString());
-    }
-
-
-
     public String msgMultipleMimeContent() {
         return format("Multiple MIME Contents found!");
     }


Reply via email to