Author: sergeyb Date: Wed Apr 29 13:35:46 2009 New Revision: 769784 URL: http://svn.apache.org/viewvc?rev=769784&view=rev Log: JAXRS: updating UriBuilderImpl to support opaque URIs
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=769784&r1=769783&r2=769784&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 Wed Apr 29 13:35:46 2009 @@ -49,9 +49,10 @@ private String host; private List<PathSegment> paths = new ArrayList<PathSegment>(); private String fragment; + private String schemeSpecificPart; private MultivaluedMap<String, String> query = new MetadataMap<String, String>(); private MultivaluedMap<String, String> matrix = new MetadataMap<String, String>(); - + /** * Creates builder with empty URI. */ @@ -91,29 +92,40 @@ // again if fromEncoded is set if (fromEncoded) { StringBuilder b = new StringBuilder(); - b.append(scheme).append("://"); - if (userInfo != null) { - b.append(userInfo).append('@'); - } - b.append(host); - if (port != -1) { - b.append(':').append(port); - } - if (thePath != null && thePath.length() > 0) { - b.append(thePath.startsWith("/") ? thePath : '/' + thePath); - } - if (theQuery != null && theQuery.length() != 0) { - b.append('?').append(theQuery); + b.append(scheme).append(":"); + if (!isSchemeOpaque()) { + b.append("//"); + if (userInfo != null) { + b.append(userInfo).append('@'); + } + b.append(host); + if (port != -1) { + b.append(':').append(port); + } + if (thePath != null && thePath.length() > 0) { + b.append(thePath.startsWith("/") ? thePath : '/' + thePath); + } + if (theQuery != null && theQuery.length() != 0) { + b.append('?').append(theQuery); + } + } else { + b.append(schemeSpecificPart); } if (fragment != null) { b.append('#').append(fragment); } return new URI(b.toString()); - } else { + } else if (!isSchemeOpaque()) { return new URI(scheme, userInfo, host, port, thePath, theQuery, fragment); + } else { + return new URI(scheme, schemeSpecificPart, fragment); } } + private boolean isSchemeOpaque() { + return schemeSpecificPart != null; + } + private String substituteVarargs(String path, Object... values) { Map<String, String> varValueMap = new HashMap<String, String>(); URITemplate templ = new URITemplate(path); @@ -311,7 +323,7 @@ if (scheme == null) { scheme = "http"; } - URI uri = new URI(scheme + "://" + ssp); + URI uri = new URI(scheme, ssp, fragment); setUriParts(uri); } catch (URISyntaxException e) { throw new IllegalArgumentException("Wrong syntax of scheme-specific part", e); @@ -336,12 +348,22 @@ throw new IllegalArgumentException("uri is null"); } scheme = uri.getScheme(); - port = uri.getPort(); - host = uri.getHost(); - setPathAndMatrix(uri.getRawPath()); + if (!uri.isOpaque()) { + port = uri.getPort(); + host = uri.getHost(); + String rawPath = uri.getRawPath(); + if (rawPath != null) { + setPathAndMatrix(uri.getRawPath()); + } + String rawQuery = uri.getRawQuery(); + if (rawQuery != null) { + query = JAXRSUtils.getStructuredParams(rawQuery, "&", false); + } + userInfo = uri.getUserInfo(); + } else { + schemeSpecificPart = uri.getSchemeSpecificPart(); + } fragment = uri.getFragment(); - query = JAXRSUtils.getStructuredParams(uri.getRawQuery(), "&", false); - userInfo = uri.getUserInfo(); } private void setPathAndMatrix(String path) { @@ -502,7 +524,10 @@ if (fromEncoded) { val = HttpUtils.encodePartiallyEncoded(val, isQuery); } - b.append(entry.getKey()).append('=').append(val); + b.append(entry.getKey()); + if (val.length() != 0) { + b.append('=').append(val); + } if (sit.hasNext() || it.hasNext()) { b.append(separator); } 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=769784&r1=769783&r2=769784&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 Wed Apr 29 13:35:46 2009 @@ -26,6 +26,7 @@ import java.util.Map; import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.UriBuilder; import org.apache.cxf.jaxrs.resources.Book; import org.apache.cxf.jaxrs.resources.BookStore; @@ -119,8 +120,17 @@ @Test public void testSchemeSpecificPart() throws Exception { URI uri = new URI("http://bar"); - URI newUri = new UriBuilderImpl(uri).scheme("https").schemeSpecificPart("foo/bar").build(); - assertEquals("URI is not built correctly", "https://foo/bar", newUri.toString()); + URI newUri = new UriBuilderImpl(uri).scheme("https").schemeSpecificPart("//localhost:8080/foo/bar") + .build(); + assertEquals("URI is not built correctly", "https://localhost:8080/foo/bar", newUri.toString()); + } + + @Test + public void testOpaqueSchemeSpecificPart() throws Exception { + URI expectedUri = new URI("mailto:java...@java.net.com"); + URI newUri = new UriBuilderImpl().scheme("mailto") + .schemeSpecificPart("java...@java.net.com").build(); + assertEquals("URI is not built correctly", expectedUri, newUri); } @Test @@ -570,6 +580,27 @@ assertEquals("URI is not built correctly", new URI("http://blah/foo/bar;p1=v1/baz;p2=v2"), newUri); } + @Test + public void testNonHttpSchemes() { + String[] uris = {"ftp://ftp.is.co.za/rfc/rfc1808.txt", + "mailto:java-...@java.sun.com", + "news:comp.lang.java", + "urn:isbn:096139212y", + "ldap://[2001:db8::7]/c=GB?objectClass?one", + "telnet://194.1.2.17:81/", + "tel:+1-816-555-1212", + "foo://bar.com:8042/there/here?name=baz#brr"}; + + int expectedCount = 0; + + for (int i = 0; i < uris.length; i++) { + URI uri = UriBuilder.fromUri(uris[i]).build(); + assertEquals("Strange", uri.toString(), uris[i]); + expectedCount++; + } + assertEquals(8, expectedCount); + } + private void compareURIs(URI uri1, URI uri2) { assertEquals("Unexpected scheme", uri1.getScheme(), uri2.getScheme());