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