You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2010/05/04 18:57:53 UTC
svn commit: r940950 - in /cxf/trunk/rt/frontend/jaxrs/src:
main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java
Author: sergeyb
Date: Tue May 4 16:57:52 2010
New Revision: 940950
URL: http://svn.apache.org/viewvc?rev=940950&view=rev
Log:
CXF2784 : updating UriBuilderImpl to support queries with templates
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java?rev=940950&r1=940949&r2=940950&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java Tue May 4 16:57:52 2010
@@ -77,18 +77,28 @@ public class UriBuilderImpl extends UriB
private URI doBuild(boolean fromEncoded, Object... values) {
try {
String thePath = buildPath(fromEncoded);
- thePath = substituteVarargs(thePath, values);
- return buildURI(fromEncoded, thePath);
+ URITemplate pathTempl = new URITemplate(thePath);
+ thePath = substituteVarargs(pathTempl, values, 0);
+
+ String theQuery = buildQuery(fromEncoded);
+ if (theQuery != null) {
+ URITemplate queryTempl = new URITemplate(theQuery);
+ int lengthDiff = values.length - pathTempl.getVariables().size();
+ if (lengthDiff > 0) {
+ theQuery = substituteVarargs(queryTempl, values, values.length - lengthDiff);
+ }
+ }
+
+ return buildURI(fromEncoded, thePath, theQuery);
} catch (URISyntaxException ex) {
throw new UriBuilderException("URI can not be built", ex);
}
}
- private URI buildURI(boolean fromEncoded, String thePath) throws URISyntaxException {
- String theQuery = buildQuery(fromEncoded);
+ private URI buildURI(boolean fromEncoded, String thePath, String theQuery) throws URISyntaxException {
// TODO : do encodePartiallyEncoded only once here, do not do it inside buildPath()
// buildFromEncoded and buildFromEncodedMap - we'll need to be careful such that
- // path '/' seperators are not encoded so probably we'll need to create PathSegments
+ // path '/' separators are not encoded so probably we'll need to create PathSegments
// again if fromEncoded is set
if (fromEncoded) {
StringBuilder b = new StringBuilder();
@@ -126,9 +136,9 @@ public class UriBuilderImpl extends UriB
return schemeSpecificPart != null;
}
- private String substituteVarargs(String path, Object... values) {
+ private String substituteVarargs(URITemplate templ, Object[] values, int ind) {
Map<String, String> varValueMap = new HashMap<String, String>();
- URITemplate templ = new URITemplate(path);
+
// vars in set are properly ordered due to linking in hash set
Set<String> uniqueVars = new LinkedHashSet<String>(templ.getVariables());
if (values.length < uniqueVars.size()) {
@@ -136,7 +146,7 @@ public class UriBuilderImpl extends UriB
+ " value(s) given for " + uniqueVars.size()
+ " unique variable(s)");
}
- int idx = 0;
+ int idx = ind;
for (String var : uniqueVars) {
Object oval = values[idx++];
varValueMap.put(var, oval.toString());
@@ -170,14 +180,22 @@ public class UriBuilderImpl extends UriB
try {
String thePath = buildPath(fromEncoded);
thePath = substituteMapped(thePath, map);
- return buildURI(fromEncoded, thePath);
+
+ String theQuery = buildQuery(fromEncoded);
+ if (theQuery != null) {
+ theQuery = substituteMapped(theQuery, map);
+ }
+
+ return buildURI(fromEncoded, thePath, theQuery);
} catch (URISyntaxException ex) {
throw new UriBuilderException("URI can not be built", ex);
}
}
private String substituteMapped(String path, Map<String, ? extends Object> varValueMap) {
+
URITemplate templ = new URITemplate(path);
+
Set<String> uniqueVars = new HashSet<String>(templ.getVariables());
if (varValueMap.size() < uniqueVars.size()) {
throw new IllegalArgumentException("Unresolved variables; only " + varValueMap.size()
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java?rev=940950&r1=940949&r2=940950&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java Tue May 4 16:57:52 2010
@@ -38,6 +38,63 @@ import org.junit.Test;
public class UriBuilderImplTest extends Assert {
+ @Test
+ public void testQueryParamWithTemplateValues() {
+ URI uri;
+ uri = UriBuilder.fromPath("/index.jsp").queryParam("a", "{a}").queryParam("b", "{b}")
+ .build("valueA", "valueB");
+ assertEquals("/index.jsp?a=valueA&b=valueB", uri.toString());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testQueryParamWithMissingTemplateValues() {
+ UriBuilder.fromPath("/index.jsp").queryParam("a", "{a}").queryParam("b", "{b}")
+ .build("valueA");
+ }
+
+ @Test
+ public void testPathAndQueryParamWithTemplateValues() {
+ URI uri;
+ uri = UriBuilder.fromPath("/index{ind}.jsp").queryParam("a", "{a}").queryParam("b", "{b}")
+ .build("1", "valueA", "valueB");
+ assertEquals("/index1.jsp?a=valueA&b=valueB", uri.toString());
+ }
+
+ @Test
+ public void testReplaceQueryStringWithTemplateValues() {
+ URI uri;
+ uri = UriBuilder.fromUri("/index.jsp").replaceQuery("a={a}&b={b}")
+ .build("valueA", "valueB");
+ assertEquals("/index.jsp?a=valueA&b=valueB", uri.toString());
+ }
+
+ @Test
+ public void testQueryParamUsingMapWithTemplateValues() {
+ Map<String, String> values = new HashMap<String, String>();
+ values.put("a", "valueA");
+ values.put("b", "valueB");
+ URI uri;
+ uri = UriBuilder.fromPath("/index.jsp")
+ .queryParam("a", "{a}")
+ .queryParam("b", "{b}")
+ .buildFromMap(values);
+ assertEquals("/index.jsp?a=valueA&b=valueB", uri.toString());
+ }
+
+ @Test
+ public void testPathAndQueryParamUsingMapWithTemplateValues() {
+ Map<String, String> values = new HashMap<String, String>();
+ values.put("a", "valueA");
+ values.put("b", "valueB");
+ values.put("ind", "1");
+ URI uri;
+ uri = UriBuilder.fromPath("/index{ind}.jsp")
+ .queryParam("a", "{a}")
+ .queryParam("b", "{b}")
+ .buildFromMap(values);
+ assertEquals("/index1.jsp?a=valueA&b=valueB", uri.toString());
+ }
+
@Test(expected = IllegalArgumentException.class)
public void testCtorNull() throws Exception {
new UriBuilderImpl(null);