Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 70587DC4F for ; Mon, 4 Mar 2013 14:59:59 +0000 (UTC) Received: (qmail 24270 invoked by uid 500); 4 Mar 2013 14:59:59 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 24157 invoked by uid 500); 4 Mar 2013 14:59:58 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 24149 invoked by uid 99); 4 Mar 2013 14:59:58 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Mar 2013 14:59:58 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Mar 2013 14:59:56 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id E0AE223888E7; Mon, 4 Mar 2013 14:59:36 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1452337 - in /cxf/branches/2.7.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/... Date: Mon, 04 Mar 2013 14:59:36 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130304145936.E0AE223888E7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Mon Mar 4 14:59:36 2013 New Revision: 1452337 URL: http://svn.apache.org/r1452337 Log: Merged revisions 1452335 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r1452335 | sergeyb | 2013-03-04 14:53:13 +0000 (Mon, 04 Mar 2013) | 1 line [CXF-4851] Improving the way UriBuilder handles encoding in case of build() calls ........ Modified: cxf/branches/2.7.x-fixes/ (props changed) cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java Propchange: cxf/branches/2.7.x-fixes/ ------------------------------------------------------------------------------ Merged /cxf/trunk:r1452335 Propchange: cxf/branches/2.7.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java?rev=1452337&r1=1452336&r2=1452337&view=diff ============================================================================== --- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java (original) +++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java Mon Mar 4 14:59:36 2013 @@ -88,7 +88,16 @@ public class UriBuilderImpl extends UriB } private URI doBuild(boolean fromEncoded, boolean encodePathSlash, Object... values) { - UriParts parts = doBuildUriParts(fromEncoded, encodePathSlash, values); + if (values == null) { + throw new IllegalArgumentException("Template parameter values are set to null"); + } + for (int i = 0; i < values.length; i++) { + if (values[i] == null) { + throw new IllegalArgumentException("Template parameter value is set to null"); + } + } + + UriParts parts = doBuildUriParts(fromEncoded, encodePathSlash, false, values); try { return buildURI(fromEncoded, parts.path, parts.query, parts.fragment); } catch (URISyntaxException ex) { @@ -96,7 +105,8 @@ public class UriBuilderImpl extends UriB } } - private UriParts doBuildUriParts(boolean fromEncoded, boolean encodePathSlash, Object... values) { + private UriParts doBuildUriParts(boolean fromEncoded, boolean encodePathSlash, + boolean allowUnresolved, Object... values) { Map alreadyResolvedTs = getResolvedTemplates(resolvedTemplates); Map alreadyResolvedTsPathEnc = getResolvedTemplates(resolvedTemplatesPathEnc); @@ -105,37 +115,38 @@ public class UriBuilderImpl extends UriB + alreadyResolvedEncTs.size() + alreadyResolvedTsPathEnc.size(); - String thePath = buildPath(fromEncoded); + String thePath = buildPath(); URITemplate pathTempl = new URITemplate(thePath); thePath = substituteVarargs(pathTempl, alreadyResolvedTs, alreadyResolvedTsPathEnc, - alreadyResolvedEncTs, values, 0, false, fromEncoded, encodePathSlash); + alreadyResolvedEncTs, values, 0, false, fromEncoded, + allowUnresolved, encodePathSlash); int pathTemplateVarsSize = pathTempl.getVariables().size(); - String theQuery = buildQuery(fromEncoded); + String theQuery = buildQuery(); int queryTemplateVarsSize = 0; if (theQuery != null) { URITemplate queryTempl = new URITemplate(theQuery); - int lengthDiff = values.length + resolvedTsSize - - alreadyResolvedTs.size() - alreadyResolvedTsPathEnc.size() - alreadyResolvedEncTs.size() - - pathTemplateVarsSize; - if (lengthDiff > 0) { - queryTemplateVarsSize = queryTempl.getVariables().size(); + queryTemplateVarsSize = queryTempl.getVariables().size(); + if (queryTemplateVarsSize > 0) { + int lengthDiff = values.length + resolvedTsSize + - alreadyResolvedTs.size() - alreadyResolvedTsPathEnc.size() - alreadyResolvedEncTs.size() + - pathTemplateVarsSize; theQuery = substituteVarargs(queryTempl, alreadyResolvedTs, alreadyResolvedTsPathEnc, alreadyResolvedEncTs, values, values.length - lengthDiff, - true, fromEncoded, false); + true, fromEncoded, allowUnresolved, false); } } String theFragment = fragment; if (theFragment != null) { URITemplate fragmentTempl = new URITemplate(theFragment); - int lengthDiff = values.length + resolvedTsSize - - alreadyResolvedTs.size() - alreadyResolvedTsPathEnc.size() - alreadyResolvedEncTs.size() - - pathTemplateVarsSize - queryTemplateVarsSize; - if (lengthDiff > 0) { + if (fragmentTempl.getVariables().size() > 0) { + int lengthDiff = values.length + resolvedTsSize + - alreadyResolvedTs.size() - alreadyResolvedTsPathEnc.size() - alreadyResolvedEncTs.size() + - pathTemplateVarsSize - queryTemplateVarsSize; theFragment = substituteVarargs(fragmentTempl, alreadyResolvedTs, alreadyResolvedTsPathEnc, alreadyResolvedEncTs, values, values.length - lengthDiff, - true, fromEncoded, false); + true, fromEncoded, allowUnresolved, false); } } @@ -144,19 +155,17 @@ public class UriBuilderImpl extends UriB private URI buildURI(boolean fromEncoded, String thePath, String theQuery, String theFragment) throws URISyntaxException { - if (fromEncoded) { + if (fromEncoded) { return buildURIFromEncoded(thePath, theQuery, theFragment); } else if (!isSchemeOpaque()) { if ((scheme != null || host != null || userInfo != null) && thePath.length() != 0 && !thePath.startsWith("/")) { thePath = "/" + thePath; } - if (theQuery != null && HttpUtils.isPartiallyEncoded(theQuery)) { - try { - return buildURIFromEncoded(thePath, theQuery, theFragment); - } catch (Exception ex) { - // lets try the option below - } + try { + return buildURIFromEncoded(thePath, theQuery, theFragment); + } catch (Exception ex) { + // lets try the option below } URI uri = new URI(scheme, userInfo, host, port, thePath, theQuery, theFragment); @@ -216,22 +225,6 @@ public class UriBuilderImpl extends UriB @Override public URI buildFromEncoded(Object... values) throws IllegalArgumentException, UriBuilderException { - // Problem: multi-arg URI c-tor always forces encoding, operation contract would be broken; - // use os single-arg URI c-tor requires unnecessary concatenate-parse roundtrip. - // While decoding back given values and passing as non-decoded to regular build() method - // is promising unfortunatley it causes the loss of encoded reserved values such as +, - // which might cause problems if consumers do rely on URLEncoder which would turn '+' into - // ' ' or would break the contract in when query parameters are expected to have %2B - if (values == null) { - throw new IllegalArgumentException("Template parameter values are set to null"); - } - for (int i = 0; i < values.length; i++) { - if (values[i] == null) { - throw new IllegalArgumentException("Template parameter value is set to null"); - } - - values[i] = HttpUtils.encodePartiallyEncoded(values[i].toString(), false); - } return doBuild(true, false, values); } @@ -249,11 +242,11 @@ public class UriBuilderImpl extends UriB Map alreadyResolvedTsPathEnc = getResolvedTemplates(resolvedTemplatesPathEnc); Map alreadyResolvedEncTs = getResolvedTemplates(resolvedEncodedTemplates); - String thePath = buildPath(fromEncoded); + String thePath = buildPath(); thePath = substituteMapped(thePath, map, alreadyResolvedTs, alreadyResolvedTsPathEnc, alreadyResolvedEncTs, false, fromEncoded, encodePathSlash); - String theQuery = buildQuery(fromEncoded); + String theQuery = buildQuery(); if (theQuery != null) { theQuery = substituteMapped(theQuery, map, alreadyResolvedTs, alreadyResolvedTsPathEnc, alreadyResolvedEncTs, true, fromEncoded, false); @@ -277,13 +270,15 @@ public class UriBuilderImpl extends UriB int ind, boolean isQuery, boolean fromEncoded, + boolean allowUnresolved, boolean encodePathSlash) { + //CHECKSTYLE:ON Map varValueMap = new HashMap(); // vars in set are properly ordered due to linking in hash set Set uniqueVars = new LinkedHashSet(templ.getVariables()); - if (values.length + alreadyResolvedTs.size() + alreadyResolvedTsEnc.size() + if (!allowUnresolved && values.length + alreadyResolvedTs.size() + alreadyResolvedTsEnc.size() + alreadyResolvedTsPathEnc.size() < uniqueVars.size()) { throw new IllegalArgumentException("Unresolved variables; only " + values.length + " value(s) given for " + uniqueVars.size() @@ -301,21 +296,30 @@ public class UriBuilderImpl extends UriB : isPathEncVar ? alreadyResolvedTsPathEnc : alreadyResolvedTs; Object oval = resolved.isEmpty() ? null : resolved.remove(var); if (oval == null) { + if (allowUnresolved) { + continue; + } oval = values[idx++]; - } else if (fromEncoded) { - oval = HttpUtils.encodePartiallyEncoded(oval.toString(), isQuery); - } + } + if (oval == null) { throw new IllegalArgumentException("No object for " + var); } String value = oval.toString(); + if (fromEncoded) { + value = HttpUtils.encodePartiallyEncoded(value, isQuery); + } else { + value = isQuery ? HttpUtils.queryEncode(value) : HttpUtils.pathEncode(value); + } + varValueMap.put(var, value); if (!isQuery && (isPathEncVar || encodePathSlash)) { pathEncodeVars.add(var); } + } - return templ.substitute(varValueMap, pathEncodeVars); + return templ.substitute(varValueMap, pathEncodeVars, allowUnresolved); } //CHECKSTYLE:OFF @@ -351,18 +355,21 @@ public class UriBuilderImpl extends UriB Object oval = resolved.isEmpty() ? null : resolved.remove(var); if (oval == null) { oval = varValueMap.get(var); - } else if (fromEncoded) { - oval = HttpUtils.encodePartiallyEncoded(oval.toString(), isQuery); - } + } if (oval == null) { throw new IllegalArgumentException("No object for " + var); } + if (fromEncoded) { + oval = HttpUtils.encodePartiallyEncoded(oval.toString(), isQuery); + } else { + oval = isQuery ? HttpUtils.queryEncode(oval.toString()) : HttpUtils.pathEncode(oval.toString()); + } theMap.put(var, oval); if (!isQuery && (isPathEncVar || encodePathSlash)) { pathEncodeVars.add(var); } } - return templ.substitute(theMap, pathEncodeVars); + return templ.substitute(theMap, pathEncodeVars, false); } @Override @@ -609,14 +616,14 @@ public class UriBuilderImpl extends UriB } } - private String buildPath(boolean fromEncoded) { + private String buildPath() { StringBuilder sb = new StringBuilder(); Iterator iter = paths.iterator(); while (iter.hasNext()) { PathSegment ps = iter.next(); String p = ps.getPath(); if (p.length() != 0 || !iter.hasNext()) { - p = fromEncoded ? new URITemplate(p).encodeLiteralCharacters() : p; + p = new URITemplate(p).encodeLiteralCharacters(false); if (sb.length() == 0 && leadingSlash) { sb.append('/'); } else if (!p.startsWith("/") && sb.length() > 0) { @@ -624,16 +631,16 @@ public class UriBuilderImpl extends UriB } sb.append(p); if (iter.hasNext()) { - buildMatrix(sb, ps.getMatrixParameters(), fromEncoded); + buildMatrix(sb, ps.getMatrixParameters()); } } } - buildMatrix(sb, matrix, fromEncoded); + buildMatrix(sb, matrix); return sb.toString(); } - private String buildQuery(boolean fromEncoded) { - return buildParams(query, '&', fromEncoded); + private String buildQuery() { + return buildParams(query, '&'); } @Override @@ -783,16 +790,18 @@ public class UriBuilderImpl extends UriB * @param fromEncoded if true then values will be decoded * @return stringified params. */ - private String buildParams(MultivaluedMap map, char separator, - boolean fromEncoded) { + private String buildParams(MultivaluedMap map, char separator) { boolean isQuery = separator == '&'; StringBuilder b = new StringBuilder(); for (Iterator>> it = map.entrySet().iterator(); it.hasNext();) { Map.Entry> entry = it.next(); for (Iterator sit = entry.getValue().iterator(); sit.hasNext();) { String val = sit.next(); - if (fromEncoded || (isQuery && !val.startsWith("{") && !val.endsWith("}"))) { + boolean templateValue = val.startsWith("{") && val.endsWith("}"); + if (!templateValue) { val = HttpUtils.encodePartiallyEncoded(val, isQuery); + } else { + val = new URITemplate(val).encodeLiteralCharacters(isQuery); } b.append(entry.getKey()); if (val.length() != 0) { @@ -812,18 +821,17 @@ public class UriBuilderImpl extends UriB * @param sb buffer to add the matrix part to, will get ';' added if map is not empty * @param map matrix multivalued map */ - private void buildMatrix(StringBuilder sb, MultivaluedMap map, - boolean fromEncoded) { + private void buildMatrix(StringBuilder sb, MultivaluedMap map) { if (!map.isEmpty()) { sb.append(';'); - sb.append(buildParams(map, ';', fromEncoded)); + sb.append(buildParams(map, ';')); } } private PathSegment replacePathSegment(PathSegment ps) { StringBuilder sb = new StringBuilder(); sb.append(ps.getPath()); - buildMatrix(sb, matrix, false); + buildMatrix(sb, matrix); return new PathSegmentImpl(sb.toString()); } @@ -857,7 +865,7 @@ public class UriBuilderImpl extends UriB @Override public String toTemplate() { - UriParts parts = doBuildUriParts(false, false); + UriParts parts = doBuildUriParts(false, false, true); return buildUriString(parts.path, parts.query, parts.fragment); } Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java?rev=1452337&r1=1452336&r2=1452337&view=diff ============================================================================== --- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java (original) +++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java Mon Mar 4 14:59:36 2013 @@ -190,7 +190,7 @@ public class UriInfoImpl implements UriI } UriBuilder ub = UriBuilder.fromPath(sum.toString()); objects.addAll(invocation.getTemplateValues()); - uris.add(0, ub.build(objects.toArray()).normalize().getPath()); + uris.add(0, ub.build(objects.toArray()).normalize().getRawPath()); } return uris; } Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java?rev=1452337&r1=1452336&r2=1452337&view=diff ============================================================================== --- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java (original) +++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java Mon Mar 4 14:59:36 2013 @@ -249,8 +249,8 @@ public final class URITemplate { return sb.toString(); } - public String substitute(Map valuesMap) throws IllegalArgumentException { - return this.substitute(valuesMap, Collections.emptySet()); + String substitute(Map valuesMap) throws IllegalArgumentException { + return this.substitute(valuesMap, Collections.emptySet(), false); } /** @@ -266,7 +266,8 @@ public final class URITemplate { * @return template with bound variables. */ public String substitute(Map valuesMap, - Set encodePathSlashVars) throws IllegalArgumentException { + Set encodePathSlashVars, + boolean allowUnresolved) throws IllegalArgumentException { if (valuesMap == null) { throw new IllegalArgumentException("valuesMap is null"); } @@ -286,9 +287,11 @@ public final class URITemplate { sval = sval.replaceAll("/", "%2F"); } sb.append(sval); + } else if (allowUnresolved) { + sb.append(chunk); } else { throw new IllegalArgumentException("Template variable " + var.getName() - + " has no matching value"); + + " has no matching value"); } } else { sb.append(chunk); @@ -302,13 +305,13 @@ public final class URITemplate { * ex. "a {id} b" will be encoded to "a%20{id}%20b" * @return encoded value */ - public String encodeLiteralCharacters() { + public String encodeLiteralCharacters(boolean isQuery) { final float encodedRatio = 1.5f; StringBuilder sb = new StringBuilder((int)(encodedRatio * template.length())); for (UriChunk chunk : uriChunks) { String val = chunk.getValue(); if (chunk instanceof Literal) { - sb.append(HttpUtils.encodePartiallyEncoded(val, false)); + sb.append(HttpUtils.encodePartiallyEncoded(val, isQuery)); } else { sb.append(val); } Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java?rev=1452337&r1=1452336&r2=1452337&view=diff ============================================================================== --- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java (original) +++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java Mon Mar 4 14:59:36 2013 @@ -40,6 +40,76 @@ import org.junit.Test; public class UriBuilderImplTest extends Assert { @Test + public void testBuildWithNonEncodedSubstitutionValue() { + URI uri; + uri = UriBuilder.fromPath("/{a}").build("{}"); + assertEquals("/%7B%7D", uri.toString()); + } + + @Test + public void testBuildWithNonEncodedSubstitutionValue2() { + URI uri; + uri = UriBuilder.fromPath("/{a}").buildFromEncoded("{}"); + assertEquals("/%7B%7D", uri.toString()); + } + + @Test + public void testBuildWithNonEncodedSubstitutionValue3() { + UriBuilder ub = UriBuilder.fromPath("/"); + URI uri = ub.path("{a}").buildFromEncoded("%"); + assertEquals("/%25", uri.toString()); + uri = ub.path("{token}").buildFromEncoded("%", "{}"); + assertEquals("/%25/%7B%7D", uri.toString()); + } + + @Test + public void testBuildWithNonEncodedSubstitutionValue4() { + UriBuilder ub = UriBuilder.fromPath("/"); + URI uri = ub.path("{a}").build("%"); + assertEquals("/%25", uri.toString()); + uri = ub.path("{token}").build("%", "{}"); + assertEquals("/%25/%7B%7D", uri.toString()); + } + + @Test + public void testBuildWithNonEncodedSubstitutionValue5() { + UriBuilder ub = UriBuilder.fromUri("/%25"); + URI uri = ub.build(); + assertEquals("/%25", uri.toString()); + uri = ub.replacePath("/%/{token}").build("{}"); + assertEquals("/%25/%7B%7D", uri.toString()); + } + + @Test + public void testBuildWithNonEncodedSubstitutionValue6() { + UriBuilder ub = UriBuilder.fromPath("/"); + URI uri = ub.path("%").build(); + assertEquals("/%25", uri.toString()); + uri = ub.replacePath("/%/{token}").build("{}"); + assertEquals("/%25/%7B%7D", uri.toString()); + } + + @Test + public void testBuildWithNonEncodedSubstitutionValue7() { + UriBuilder ub = UriBuilder.fromPath("/"); + URI uri = ub.replaceQueryParam("a", "%").buildFromEncoded(); + assertEquals("/?a=%25", uri.toString()); + uri = ub.replaceQueryParam("a2", "{token}").buildFromEncoded("{}"); + assertEquals("/?a=%25&a2=%7B%7D", uri.toString()); + } + + @Test + public void testBuildWithNonEncodedSubstitutionValue8() { + UriBuilder ub = UriBuilder.fromPath("/"); + URI uri = ub.replaceQueryParam("a", "%").build(); + assertEquals("/?a=%25", uri.toString()); + uri = ub.replaceQueryParam("a2", "{token}").build("{}"); + assertEquals("/?a=%25&a2=%7B%7D", uri.toString()); + } + + + + @Test public void testResolveTemplate() { URI uri; uri = ((UriBuilderImpl)UriBuilder.fromPath("/{a}")).resolveTemplate("a", "1").build(); @@ -108,6 +178,11 @@ public class UriBuilderImplTest extends UriBuilder.fromPath("/index.jsp").queryParam("a", "{a}").queryParam("b", "{b}") .build("valueA"); } + + @Test(expected = IllegalArgumentException.class) + public void testQueryParamWithMissingTemplateValues2() { + UriBuilder.fromPath("/index.jsp").queryParam("a", "{a}").build(); + } @Test public void testPathAndQueryParamWithTemplateValues() { @@ -1122,7 +1197,7 @@ public class UriBuilderImplTest extends @Test public void testNullScheme() { - String expected = "//localhost:8080"; + String expected = "localhost:8080"; URI uri = UriBuilder.fromUri("http://localhost:8080") .scheme(null) .build(); Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java?rev=1452337&r1=1452336&r2=1452337&view=diff ============================================================================== --- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java (original) +++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java Mon Mar 4 14:59:36 2013 @@ -698,13 +698,13 @@ public class URITemplateTest extends Ass @Test public void testEncodeLiteralCharacters() { URITemplate ut = new URITemplate("a {id} b"); - assertEquals("a%20{id}%20b", ut.encodeLiteralCharacters()); + assertEquals("a%20{id}%20b", ut.encodeLiteralCharacters(false)); } @Test public void testEncodeLiteralCharactersNotVariable() { URITemplate ut = new URITemplate("a {digit:[0-9]} b"); //System.out.println(ut.encodeLiteralCharacters()); - assertEquals("a%20{digit:[0-9]}%20b", ut.encodeLiteralCharacters()); + assertEquals("a%20{digit:[0-9]}%20b", ut.encodeLiteralCharacters(false)); } }