You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/05/29 22:22:02 UTC

[5/5] incubator-juneau git commit: Improved support for resolution of URIs.

Improved support for resolution of URIs.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/c4952d2c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/c4952d2c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/c4952d2c

Branch: refs/heads/master
Commit: c4952d2cf412c827c11ac001753d01ad00279635
Parents: d28634b
Author: JamesBognar <ja...@apache.org>
Authored: Mon May 29 18:21:47 2017 -0400
Committer: JamesBognar <ja...@apache.org>
Committed: Mon May 29 18:21:47 2017 -0400

----------------------------------------------------------------------
 .../org/apache/juneau/jena/RdfSerializer.java   |  17 +-
 .../juneau/jena/RdfSerializerBuilder.java       |  14 +-
 .../juneau/jena/RdfSerializerSession.java       |   4 +-
 .../java/org/apache/juneau/jena/package.html    |   6 +-
 .../java/org/apache/juneau/html/CommonTest.java | 191 ------
 .../java/org/apache/juneau/html/HtmlTest.java   | 156 ++---
 .../java/org/apache/juneau/jena/CommonTest.java | 144 ----
 .../java/org/apache/juneau/json/CommonTest.java | 130 ----
 .../org/apache/juneau/serializer/TestURI.java   |  92 +++
 .../juneau/serializer/UriResolutionTest.java    | 671 +++++++++++++++++++
 .../juneau/urlencoding/Common_UonTest.java      | 136 ----
 .../urlencoding/Common_UrlEncodingTest.java     | 126 ----
 .../utils/UriContextResolutionComboTest.java    | 145 ++--
 .../juneau/utils/UriContextUriComboTest.java    |   2 +-
 .../java/org/apache/juneau/xml/CommonTest.java  | 131 ----
 .../main/java/org/apache/juneau/UriContext.java | 155 +----
 .../java/org/apache/juneau/UriRelativity.java   |   4 +-
 .../java/org/apache/juneau/UriResolver.java     | 273 ++++++++
 .../java/org/apache/juneau/annotation/URI.java  |  10 +-
 .../apache/juneau/csv/CsvSerializerBuilder.java |  14 +-
 .../apache/juneau/html/HtmlDocSerializer.java   |  19 +-
 .../juneau/html/HtmlDocSerializerSession.java   |   2 +-
 .../org/apache/juneau/html/HtmlSerializer.java  |  10 +-
 .../juneau/html/HtmlSerializerBuilder.java      |  14 +-
 .../juneau/html/HtmlSerializerSession.java      |  48 +-
 .../java/org/apache/juneau/html/HtmlWriter.java |  17 +-
 .../apache/juneau/html/SimpleHtmlWriter.java    |   2 +-
 .../org/apache/juneau/internal/AsciiMap.java    |  82 +++
 .../apache/juneau/jso/JsoSerializerBuilder.java |  14 +-
 .../json/JsonSchemaSerializerBuilder.java       |  14 +-
 .../org/apache/juneau/json/JsonSerializer.java  |   2 +-
 .../juneau/json/JsonSerializerBuilder.java      |  14 +-
 .../juneau/json/JsonSerializerSession.java      |   2 +-
 .../java/org/apache/juneau/json/JsonWriter.java |  19 +-
 .../msgpack/MsgPackSerializerBuilder.java       |  14 +-
 .../plaintext/PlainTextSerializerBuilder.java   |  14 +-
 .../juneau/serializer/SerializerBuilder.java    | 136 ++--
 .../juneau/serializer/SerializerContext.java    | 147 ++--
 .../serializer/SerializerGroupBuilder.java      |  27 +-
 .../juneau/serializer/SerializerSession.java    | 119 ++--
 .../juneau/serializer/SerializerWriter.java     |  49 +-
 .../juneau/soap/SoapXmlSerializerBuilder.java   |  14 +-
 .../apache/juneau/uon/UonSerializerBuilder.java |  14 +-
 .../apache/juneau/uon/UonSerializerSession.java |   2 +-
 .../java/org/apache/juneau/uon/UonWriter.java   |  24 +-
 .../UrlEncodingSerializerBuilder.java           |  14 +-
 .../apache/juneau/xml/XmlSchemaSerializer.java  |   4 +-
 .../juneau/xml/XmlSchemaSerializerBuilder.java  |  14 +-
 .../org/apache/juneau/xml/XmlSerializer.java    |   2 +-
 .../apache/juneau/xml/XmlSerializerBuilder.java |  14 +-
 .../apache/juneau/xml/XmlSerializerSession.java |   2 +-
 .../java/org/apache/juneau/xml/XmlUtils.java    | 440 +++++++-----
 .../java/org/apache/juneau/xml/XmlWriter.java   |  54 +-
 juneau-core/src/main/javadoc/overview.html      | 123 +++-
 .../juneau/examples/addressbook/Person.java     |   2 +-
 .../juneau/examples/rest/AtomFeedResource.java  |   2 +-
 .../juneau/examples/rest/DirectoryResource.java |   2 +-
 .../examples/rest/DockerRegistryResource.java   |   2 +-
 .../juneau/examples/rest/FileSpaceResource.java |  15 +-
 .../examples/rest/HelloWorldResource.java       |   2 +-
 .../examples/rest/JsonSchemaResource.java       |   2 +-
 .../examples/rest/MethodExampleResource.java    |   4 +-
 .../juneau/examples/rest/PhotosResource.java    |   7 +-
 .../examples/rest/RequestEchoResource.java      |   2 +-
 .../examples/rest/SampleRemoteableServlet.java  |   2 +-
 .../juneau/examples/rest/SqlQueryResource.java  |   2 +-
 .../examples/rest/SystemPropertiesResource.java |  18 +-
 .../juneau/examples/rest/TempDirResource.java   |   2 +-
 .../examples/rest/TumblrParserResource.java     |   2 +-
 .../examples/rest/UrlEncodedFormResource.java   |   2 +-
 .../rest/addressbook/AddressBookResource.java   |  37 +-
 .../apache/juneau/microservice/Resource.java    |   6 +-
 .../juneau/microservice/ResourceGroup.java      |   2 +-
 .../juneau/microservice/ResourceJena.java       |   2 +-
 .../microservice/resources/ConfigResource.java  |   2 +-
 .../resources/DirectoryResource.java            |   2 +-
 .../juneau/rest/client/RestClientBuilder.java   |  27 +-
 .../java/org/apache/juneau/rest/CallMethod.java |   6 -
 .../java/org/apache/juneau/rest/RestConfig.java |  11 +-
 .../org/apache/juneau/rest/RestContext.java     |   2 +-
 .../org/apache/juneau/rest/RestRequest.java     |  13 +-
 .../juneau/rest/annotation/RestResource.java    |   4 +-
 .../java/org/apache/juneau/rest/package.html    |  68 +-
 83 files changed, 2258 insertions(+), 1899 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index 734f38a..05dc92e 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -21,7 +21,6 @@ import java.util.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
 import org.apache.juneau.xml.*;
@@ -330,21 +329,7 @@ public class RdfSerializer extends WriterSerializer {
 			s = uri2.toString();
 		if (s == null)
 			return null;
-		if (s.indexOf("://") == -1) {
-			String aUri = session.getAbsolutePathUriBase();
-			String rUri = session.getRelativeUriBase();
-			if (StringUtils.startsWith(s, '/')) {
-				if (aUri != null)
-					return aUri + s;
-			} else {
-				if (rUri != null) {
-					if (rUri.equals("/"))
-						return '/' + s;
-					return rUri + '/' + s;
-				}
-			}
-		}
-		return s;
+		return session.getUriResolver().resolve(s);
 	}
 
 	private void serializeMap(RdfSerializerSession session, Map m, Resource r, ClassMeta<?> type) throws SerializeException {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
index da3b59a..91957a3 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
@@ -489,14 +489,20 @@ public class RdfSerializerBuilder extends SerializerBuilder {
 	}
 
 	@Override /* SerializerBuilder */
-	public RdfSerializerBuilder relativeUriBase(String value) {
-		super.relativeUriBase(value);
+	public RdfSerializerBuilder uriContext(UriContext value) {
+		super.uriContext(value);
 		return this;
 	}
 
 	@Override /* SerializerBuilder */
-	public RdfSerializerBuilder absolutePathUriBase(String value) {
-		super.absolutePathUriBase(value);
+	public RdfSerializerBuilder uriResolution(UriResolution value) {
+		super.uriResolution(value);
+		return this;
+	}
+
+	@Override /* SerializerBuilder */
+	public RdfSerializerBuilder uriRelativity(UriRelativity value) {
+		super.uriRelativity(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index 55060ef..79691fe 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -269,7 +269,7 @@ public final class RdfSerializerSession extends SerializerSession {
 	}
 
 	/**
-	 * XML-encodes the specified string using the {@link XmlUtils#encodeInvalidCharsForText(Object)} method.
+	 * XML-encodes the specified string using the {@link XmlUtils#escapeText(Object)} method.
 	 *
 	 * @param o The string being encoded.
 	 * @return The encoded string, or <jk>null</jk> if the input was <jk>null</jk>.
@@ -278,7 +278,7 @@ public final class RdfSerializerSession extends SerializerSession {
 		if (o == null)
 			return null;
 		String s = toString(o);
-		return XmlUtils.encodeInvalidCharsForText(s);
+		return XmlUtils.escapeText(s);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html
index 095dc7e..c3073ec 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html
@@ -431,8 +431,10 @@
 		<ja>@URI</ja> <jk>public</jk> String <jf>addressBookUri</jf>;
 		</p>
 		<p>
-			Also take note of the {@link org.apache.juneau.serializer.SerializerContext#SERIALIZER_relativeUriBase} and {@link org.apache.juneau.serializer.SerializerContext#SERIALIZER_absolutePathUriBase}
-				settings that can be specified on the serializer to resolve relative and context-root-relative URIs to fully-qualfied URIs.
+			Also take note of the {@link org.apache.juneau.serializer.SerializerContext#SERIALIZER_uriResolution},
+			{@link org.apache.juneau.serializer.SerializerContext#SERIALIZER_uriRelativity}, and 
+			and {@link org.apache.juneau.serializer.SerializerContext#SERIALIZER_uriContext}
+			settings that can be specified on the serializer to resolve relative and context-root-relative URIs to fully-qualified URIs.
 		</p>
 		<p>
 			This can be useful if you want to keep the URI authority and context root information out of the bean logic layer.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java b/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
index ab82065..e83900e 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.html;
 
 import static org.apache.juneau.TestUtils.*;
-import static org.apache.juneau.html.HtmlSerializerContext.*;
 import static org.junit.Assert.*;
 
 import java.net.*;
@@ -23,7 +22,6 @@ import java.util.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.serializer.*;
-import org.apache.juneau.testbeans.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 
@@ -343,195 +341,6 @@ public class CommonTest {
 		public URL f2;
 	}
 
-	//====================================================================================================
-	// Test URIs with URI_CONTEXT and URI_AUTHORITY
-	//====================================================================================================
-	@Test
-	public void testUris() throws Exception {
-		HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().uriAnchorText(PROPERTY_NAME).useWhitespace(false).addKeyValueTableHeaders(true);
-		TestURI t = new TestURI();
-		String r;
-		String expected;
-
-		s.relativeUriBase(null);
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='f0/x0'>f0</a>"
-			+"\n[f1]=<a href='f1/x1'>f1</a>"
-			+"\n[f2]=<a href='/f2/x2'>f2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>f3</a>"
-			+"\n[f4]=<a href='f4/x4'>f4</a>"
-			+"\n[f5]=<a href='/f5/x5'>f5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>f6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>f7</a>"
-			+"\n[f8]=<a href='f8/x8'>f8</a>"
-			+"\n[f9]=<a href='f9/x9'>f9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>fa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>fd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>fe</a>"
-		;
-		assertEquals(expected, r);
-
-		s.relativeUriBase("");  // Same as null.
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='f0/x0'>f0</a>"
-			+"\n[f1]=<a href='f1/x1'>f1</a>"
-			+"\n[f2]=<a href='/f2/x2'>f2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>f3</a>"
-			+"\n[f4]=<a href='f4/x4'>f4</a>"
-			+"\n[f5]=<a href='/f5/x5'>f5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>f6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>f7</a>"
-			+"\n[f8]=<a href='f8/x8'>f8</a>"
-			+"\n[f9]=<a href='f9/x9'>f9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>fa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>fd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>fe</a>"
-		;
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/cr");
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='/cr/f0/x0'>f0</a>"
-			+"\n[f1]=<a href='/cr/f1/x1'>f1</a>"
-			+"\n[f2]=<a href='/f2/x2'>f2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>f3</a>"
-			+"\n[f4]=<a href='/cr/f4/x4'>f4</a>"
-			+"\n[f5]=<a href='/f5/x5'>f5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>f6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>f7</a>"
-			+"\n[f8]=<a href='/cr/f8/x8'>f8</a>"
-			+"\n[f9]=<a href='/cr/f9/x9'>f9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>fa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>fd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>fe</a>"
-		;
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/cr/");  // Same as above
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='/cr/f0/x0'>f0</a>"
-			+"\n[f1]=<a href='/cr/f1/x1'>f1</a>"
-			+"\n[f2]=<a href='/f2/x2'>f2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>f3</a>"
-			+"\n[f4]=<a href='/cr/f4/x4'>f4</a>"
-			+"\n[f5]=<a href='/f5/x5'>f5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>f6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>f7</a>"
-			+"\n[f8]=<a href='/cr/f8/x8'>f8</a>"
-			+"\n[f9]=<a href='/cr/f9/x9'>f9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>fa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>fd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>fe</a>"
-		;
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/");
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='/f0/x0'>f0</a>"
-			+"\n[f1]=<a href='/f1/x1'>f1</a>"
-			+"\n[f2]=<a href='/f2/x2'>f2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>f3</a>"
-			+"\n[f4]=<a href='/f4/x4'>f4</a>"
-			+"\n[f5]=<a href='/f5/x5'>f5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>f6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>f7</a>"
-			+"\n[f8]=<a href='/f8/x8'>f8</a>"
-			+"\n[f9]=<a href='/f9/x9'>f9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>fa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>fd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>fe</a>"
-		;
-		assertEquals(expected, r);
-
-		s.relativeUriBase(null);
-
-		s.absolutePathUriBase("http://foo");
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='f0/x0'>f0</a>"
-			+"\n[f1]=<a href='f1/x1'>f1</a>"
-			+"\n[f2]=<a href='http://foo/f2/x2'>f2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>f3</a>"
-			+"\n[f4]=<a href='f4/x4'>f4</a>"
-			+"\n[f5]=<a href='http://foo/f5/x5'>f5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>f6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>f7</a>"
-			+"\n[f8]=<a href='f8/x8'>f8</a>"
-			+"\n[f9]=<a href='f9/x9'>f9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>fa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>fd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>fe</a>"
-		;
-		assertEquals(expected, r);
-
-		s.absolutePathUriBase("http://foo/");
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='f0/x0'>f0</a>"
-			+"\n[f1]=<a href='f1/x1'>f1</a>"
-			+"\n[f2]=<a href='http://foo/f2/x2'>f2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>f3</a>"
-			+"\n[f4]=<a href='f4/x4'>f4</a>"
-			+"\n[f5]=<a href='http://foo/f5/x5'>f5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>f6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>f7</a>"
-			+"\n[f8]=<a href='f8/x8'>f8</a>"
-			+"\n[f9]=<a href='f9/x9'>f9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>fa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>fd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>fe</a>"
-		;
-		assertEquals(expected, r);
-
-		s.absolutePathUriBase("");  // Same as null.
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='f0/x0'>f0</a>"
-			+"\n[f1]=<a href='f1/x1'>f1</a>"
-			+"\n[f2]=<a href='/f2/x2'>f2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>f3</a>"
-			+"\n[f4]=<a href='f4/x4'>f4</a>"
-			+"\n[f5]=<a href='/f5/x5'>f5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>f6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>f7</a>"
-			+"\n[f8]=<a href='f8/x8'>f8</a>"
-			+"\n[f9]=<a href='f9/x9'>f9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>fa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>fd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>fe</a>"
-		;
-		assertEquals(expected, r);
-	}
-
-	private String strip(String html) {
-		return html
-			.replace("<table><tr><th>key</th><th>value</th></tr>", "")
-			.replace("</table>", "")
-			.replace("<tr><td>", "\n[")
-			.replace("</td><td>", "]=")
-			.replace("</td></tr>", "");
-	}
 
 	//====================================================================================================
 	// Recursion

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java b/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java
index 5a48716..9d76201 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java
@@ -49,7 +49,7 @@ public class HtmlTest {
 	//====================================================================================================
 	@Test
 	public void testAnchorTextOptions() throws Exception {
-		HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true);
+		HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true).uriResolution(UriResolution.NONE);
 		TestURI t = new TestURI();
 		String r;
 		String expected = null;
@@ -68,127 +68,105 @@ public class HtmlTest {
 			+"\n[f8]=<a href='f8/x8'>f8/x8</a>"
 			+"\n[f9]=<a href='f9/x9'>f9/x9</a>"
 			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>http://www.apache.org/fa/xa#MY_LABEL</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL</a>";
-		assertEquals(expected, r);
-
-		s.absolutePathUriBase("http://myhost");
-		s.relativeUriBase("/cr");
-		s.uriAnchorText(TO_STRING);
-		r = strip(s.build().serialize(t));
-		expected = ""
-			+"\n[f0]=<a href='/cr/f0/x0'>f0/x0</a>"
-			+"\n[f1]=<a href='/cr/f1/x1'>f1/x1</a>"
-			+"\n[f2]=<a href='http://myhost/f2/x2'>/f2/x2</a>"
-			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>http://www.apache.org/f3/x3</a>"
-			+"\n[f4]=<a href='/cr/f4/x4'>f4/x4</a>"
-			+"\n[f5]=<a href='http://myhost/f5/x5'>/f5/x5</a>"
-			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>http://www.apache.org/f6/x6</a>"
-			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>http://www.apache.org/f7/x7</a>"
-			+"\n[f8]=<a href='/cr/f8/x8'>f8/x8</a>"
-			+"\n[f9]=<a href='/cr/f9/x9'>f9/x9</a>"
-			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>http://www.apache.org/fa/xa#MY_LABEL</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL</a>";
+			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar'>MY_LABEL</a>"
+			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL'>MY_LABEL</a>"
+			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</a>"
+			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</a>";
 		assertEquals(expected, r);
 
 		s.uriAnchorText(URI);
 		r = strip(s.build().serialize(t));
 		expected = ""
-			+"\n[f0]=<a href='/cr/f0/x0'>/cr/f0/x0</a>"
-			+"\n[f1]=<a href='/cr/f1/x1'>/cr/f1/x1</a>"
-			+"\n[f2]=<a href='http://myhost/f2/x2'>http://myhost/f2/x2</a>"
+			+"\n[f0]=<a href='f0/x0'>f0/x0</a>"
+			+"\n[f1]=<a href='f1/x1'>f1/x1</a>"
+			+"\n[f2]=<a href='/f2/x2'>/f2/x2</a>"
 			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>http://www.apache.org/f3/x3</a>"
-			+"\n[f4]=<a href='/cr/f4/x4'>/cr/f4/x4</a>"
-			+"\n[f5]=<a href='http://myhost/f5/x5'>http://myhost/f5/x5</a>"
+			+"\n[f4]=<a href='f4/x4'>f4/x4</a>"
+			+"\n[f5]=<a href='/f5/x5'>/f5/x5</a>"
 			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>http://www.apache.org/f6/x6</a>"
 			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>http://www.apache.org/f7/x7</a>"
-			+"\n[f8]=<a href='/cr/f8/x8'>/cr/f8/x8</a>"
-			+"\n[f9]=<a href='/cr/f9/x9'>/cr/f9/x9</a>"
+			+"\n[f8]=<a href='f8/x8'>f8/x8</a>"
+			+"\n[f9]=<a href='f9/x9'>f9/x9</a>"
 			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>http://www.apache.org/fa/xa#MY_LABEL</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL</a>";
+			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar'>MY_LABEL</a>"
+			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL'>MY_LABEL</a>"
+			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</a>"
+			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</a>";
 		assertEquals(expected, r);
 
 		s.uriAnchorText(LAST_TOKEN);
 		r = strip(s.build().serialize(t));
 		expected = ""
-			+"\n[f0]=<a href='/cr/f0/x0'>x0</a>"
-			+"\n[f1]=<a href='/cr/f1/x1'>x1</a>"
-			+"\n[f2]=<a href='http://myhost/f2/x2'>x2</a>"
+			+"\n[f0]=<a href='f0/x0'>x0</a>"
+			+"\n[f1]=<a href='f1/x1'>x1</a>"
+			+"\n[f2]=<a href='/f2/x2'>x2</a>"
 			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>x3</a>"
-			+"\n[f4]=<a href='/cr/f4/x4'>x4</a>"
-			+"\n[f5]=<a href='http://myhost/f5/x5'>x5</a>"
+			+"\n[f4]=<a href='f4/x4'>x4</a>"
+			+"\n[f5]=<a href='/f5/x5'>x5</a>"
 			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>x6</a>"
 			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>x7</a>"
-			+"\n[f8]=<a href='/cr/f8/x8'>x8</a>"
-			+"\n[f9]=<a href='/cr/f9/x9'>x9</a>"
+			+"\n[f8]=<a href='f8/x8'>x8</a>"
+			+"\n[f9]=<a href='f9/x9'>x9</a>"
 			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>xa</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>xd</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>xe</a>";
+			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar'>MY_LABEL</a>"
+			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL'>MY_LABEL</a>"
+			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar'>xd</a>"
+			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL'>xe</a>";
 		assertEquals(expected, r);
 
 		s.uriAnchorText(URI_ANCHOR);
 		r = strip(s.build().serialize(t));
 		expected = ""
-			+"\n[f0]=<a href='/cr/f0/x0'>f0/x0</a>"
-			+"\n[f1]=<a href='/cr/f1/x1'>f1/x1</a>"
-			+"\n[f2]=<a href='http://myhost/f2/x2'>/f2/x2</a>"
+			+"\n[f0]=<a href='f0/x0'>f0/x0</a>"
+			+"\n[f1]=<a href='f1/x1'>f1/x1</a>"
+			+"\n[f2]=<a href='/f2/x2'>/f2/x2</a>"
 			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>http://www.apache.org/f3/x3</a>"
-			+"\n[f4]=<a href='/cr/f4/x4'>f4/x4</a>"
-			+"\n[f5]=<a href='http://myhost/f5/x5'>/f5/x5</a>"
+			+"\n[f4]=<a href='f4/x4'>f4/x4</a>"
+			+"\n[f5]=<a href='/f5/x5'>/f5/x5</a>"
 			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>http://www.apache.org/f6/x6</a>"
 			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>http://www.apache.org/f7/x7</a>"
-			+"\n[f8]=<a href='/cr/f8/x8'>f8/x8</a>"
-			+"\n[f9]=<a href='/cr/f9/x9'>f9/x9</a>"
+			+"\n[f8]=<a href='f8/x8'>f8/x8</a>"
+			+"\n[f9]=<a href='f9/x9'>f9/x9</a>"
 			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>MY_LABEL</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL</a>";
+			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar'>MY_LABEL</a>"
+			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL'>MY_LABEL</a>"
+			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</a>"
+			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</a>";
 		assertEquals(expected, r);
 
 		s.labelParameter("label2");
 		r = strip(s.build().serialize(t));
 		expected = ""
-			+"\n[f0]=<a href='/cr/f0/x0'>f0/x0</a>"
-			+"\n[f1]=<a href='/cr/f1/x1'>f1/x1</a>"
-			+"\n[f2]=<a href='http://myhost/f2/x2'>/f2/x2</a>"
+			+"\n[f0]=<a href='f0/x0'>f0/x0</a>"
+			+"\n[f1]=<a href='f1/x1'>f1/x1</a>"
+			+"\n[f2]=<a href='/f2/x2'>/f2/x2</a>"
 			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>http://www.apache.org/f3/x3</a>"
-			+"\n[f4]=<a href='/cr/f4/x4'>f4/x4</a>"
-			+"\n[f5]=<a href='http://myhost/f5/x5'>/f5/x5</a>"
+			+"\n[f4]=<a href='f4/x4'>f4/x4</a>"
+			+"\n[f5]=<a href='/f5/x5'>/f5/x5</a>"
 			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>http://www.apache.org/f6/x6</a>"
 			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>http://www.apache.org/f7/x7</a>"
-			+"\n[f8]=<a href='/cr/f8/x8'>f8/x8</a>"
-			+"\n[f9]=<a href='/cr/f9/x9'>f9/x9</a>"
+			+"\n[f8]=<a href='f8/x8'>f8/x8</a>"
+			+"\n[f9]=<a href='f9/x9'>f9/x9</a>"
 			+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>MY_LABEL</a>"
-			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar</a>"
-			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL</a>"
-			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>MY_LABEL</a>"
-			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>MY_LABEL</a>";
+			+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar'>http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar</a>"
+			+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL'>http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL</a>"
+			+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar'>MY_LABEL</a>"
+			+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL'>MY_LABEL</a>";
 		assertEquals(expected, r);
 
 		s.detectLinksInStrings(false);
 		r = strip(s.build().serialize(t));
 		expected = ""
-			+"\n[f0]=<a href='/cr/f0/x0'>f0/x0</a>"
-			+"\n[f1]=<a href='/cr/f1/x1'>f1/x1</a>"
-			+"\n[f2]=<a href='http://myhost/f2/x2'>/f2/x2</a>"
+			+"\n[f0]=<a href='f0/x0'>f0/x0</a>"
+			+"\n[f1]=<a href='f1/x1'>f1/x1</a>"
+			+"\n[f2]=<a href='/f2/x2'>/f2/x2</a>"
 			+"\n[f3]=<a href='http://www.apache.org/f3/x3'>http://www.apache.org/f3/x3</a>"
-			+"\n[f4]=<a href='/cr/f4/x4'>f4/x4</a>"
-			+"\n[f5]=<a href='http://myhost/f5/x5'>/f5/x5</a>"
+			+"\n[f4]=<a href='f4/x4'>f4/x4</a>"
+			+"\n[f5]=<a href='/f5/x5'>/f5/x5</a>"
 			+"\n[f6]=<a href='http://www.apache.org/f6/x6'>http://www.apache.org/f6/x6</a>"
 			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>http://www.apache.org/f7/x7</a>"
-			+"\n[f8]=<a href='/cr/f8/x8'>f8/x8</a>"
-			+"\n[f9]=<a href='/cr/f9/x9'>f9/x9</a>"
+			+"\n[f8]=<a href='f8/x8'>f8/x8</a>"
+			+"\n[f9]=<a href='f9/x9'>f9/x9</a>"
 			+"\n[fa]=http://www.apache.org/fa/xa#MY_LABEL"
 			+"\n[fb]=http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar"
 			+"\n[fc]=http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL"
@@ -200,21 +178,21 @@ public class HtmlTest {
 			s.lookForLabelParameters(false);
 			r = strip(s.build().serialize(t));
 			expected = ""
-				+"\n[f0]=<a href='/cr/f0/x0'>f0/x0</a>"
-				+"\n[f1]=<a href='/cr/f1/x1'>f1/x1</a>"
-				+"\n[f2]=<a href='http://myhost/f2/x2'>/f2/x2</a>"
+				+"\n[f0]=<a href='f0/x0'>f0/x0</a>"
+				+"\n[f1]=<a href='f1/x1'>f1/x1</a>"
+				+"\n[f2]=<a href='/f2/x2'>/f2/x2</a>"
 				+"\n[f3]=<a href='http://www.apache.org/f3/x3'>http://www.apache.org/f3/x3</a>"
-				+"\n[f4]=<a href='/cr/f4/x4'>f4/x4</a>"
-				+"\n[f5]=<a href='http://myhost/f5/x5'>/f5/x5</a>"
+				+"\n[f4]=<a href='f4/x4'>f4/x4</a>"
+				+"\n[f5]=<a href='/f5/x5'>/f5/x5</a>"
 				+"\n[f6]=<a href='http://www.apache.org/f6/x6'>http://www.apache.org/f6/x6</a>"
 				+"\n[f7]=<a href='http://www.apache.org/f7/x7'>http://www.apache.org/f7/x7</a>"
-				+"\n[f8]=<a href='/cr/f8/x8'>f8/x8</a>"
-				+"\n[f9]=<a href='/cr/f9/x9'>f9/x9</a>"
+				+"\n[f8]=<a href='f8/x8'>f8/x8</a>"
+				+"\n[f9]=<a href='f9/x9'>f9/x9</a>"
 				+"\n[fa]=<a href='http://www.apache.org/fa/xa#MY_LABEL'>MY_LABEL</a>"
-				+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar'>http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar</a>"
-				+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL'>http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL</a>"
-				+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar</a>"
-				+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL</a>";
+				+"\n[fb]=<a href='http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar'>http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar</a>"
+				+"\n[fc]=<a href='http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL'>http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL</a>"
+				+"\n[fd]=<a href='http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar'>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</a>"
+				+"\n[fe]=<a href='http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL'>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</a>";
 			assertEquals(expected, r);
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
index 7bde736..adbf317 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
@@ -22,9 +22,7 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.jena.annotation.*;
-import org.apache.juneau.testbeans.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 
@@ -276,148 +274,6 @@ public class CommonTest {
 		public URL f2;
 	}
 
-	//====================================================================================================
-	// Test URIs with URI_CONTEXT and URI_AUTHORITY
-	//====================================================================================================
-	@Test
-	public void testUris() throws Exception {
-		RdfSerializerBuilder s = getBasicSerializer();
-		TestURI t = new TestURI();
-		String r;
-		String expected = "";
-
-		s.relativeUriBase(null);
-		r = stripAndSort(s.build().serialize(t));
-		expected = ""
-			+"</rdf:Description>>"
-			+"\n<<rdf:Description rdf:about='f0/x0'>"
-			+"\n<jp:f1 rdf:resource='f1/x1'/>"
-			+"\n<jp:f2 rdf:resource='/f2/x2'/>"
-			+"\n<jp:f3 rdf:resource='http://www.apache.org/f3/x3'/>"
-			+"\n<jp:f4 rdf:resource='f4/x4'/>"
-			+"\n<jp:f5 rdf:resource='/f5/x5'/>"
-			+"\n<jp:f6 rdf:resource='http://www.apache.org/f6/x6'/>"
-			+"\n<jp:f7 rdf:resource='http://www.apache.org/f7/x7'/>"
-			+"\n<jp:f8 rdf:resource='f8/x8'/>"
-			+"\n<jp:f9 rdf:resource='f9/x9'/>"
-			+"\n<jp:fa>http://www.apache.org/fa/xa#MY_LABEL</jp:fa>"
-			+"\n<jp:fb>http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar</jp:fb>"
-			+"\n<jp:fc>http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL</jp:fc>"
-			+"\n<jp:fd>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</jp:fd>"
-			+"\n<jp:fe>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</jp:fe>"
-		;
-		assertEquals(expected, r);
-
-		s.relativeUriBase("");  // Same as null.
-		r = stripAndSort(s.build().serialize(t));
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/cr");
-		r = stripAndSort(s.build().serialize(t));
-		expected = ""
-			+"</rdf:Description>>"
-			+"\n<<rdf:Description rdf:about='/cr/f0/x0'>"
-			+"\n<jp:f1 rdf:resource='/cr/f1/x1'/>"
-			+"\n<jp:f2 rdf:resource='/f2/x2'/>"
-			+"\n<jp:f3 rdf:resource='http://www.apache.org/f3/x3'/>"
-			+"\n<jp:f4 rdf:resource='/cr/f4/x4'/>"
-			+"\n<jp:f5 rdf:resource='/f5/x5'/>"
-			+"\n<jp:f6 rdf:resource='http://www.apache.org/f6/x6'/>"
-			+"\n<jp:f7 rdf:resource='http://www.apache.org/f7/x7'/>"
-			+"\n<jp:f8 rdf:resource='/cr/f8/x8'/>"
-			+"\n<jp:f9 rdf:resource='/cr/f9/x9'/>"
-			+"\n<jp:fa>http://www.apache.org/fa/xa#MY_LABEL</jp:fa>"
-			+"\n<jp:fb>http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar</jp:fb>"
-			+"\n<jp:fc>http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL</jp:fc>"
-			+"\n<jp:fd>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</jp:fd>"
-			+"\n<jp:fe>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</jp:fe>"
-		;
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/cr/");  // Same as above
-		r = stripAndSort(s.build().serialize(t));
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/");
-		r = stripAndSort(s.build().serialize(t));
-		expected = ""
-			+"</rdf:Description>>"
-			+"\n<<rdf:Description rdf:about='/f0/x0'>"
-			+"\n<jp:f1 rdf:resource='/f1/x1'/>"
-			+"\n<jp:f2 rdf:resource='/f2/x2'/>"
-			+"\n<jp:f3 rdf:resource='http://www.apache.org/f3/x3'/>"
-			+"\n<jp:f4 rdf:resource='/f4/x4'/>"
-			+"\n<jp:f5 rdf:resource='/f5/x5'/>"
-			+"\n<jp:f6 rdf:resource='http://www.apache.org/f6/x6'/>"
-			+"\n<jp:f7 rdf:resource='http://www.apache.org/f7/x7'/>"
-			+"\n<jp:f8 rdf:resource='/f8/x8'/>"
-			+"\n<jp:f9 rdf:resource='/f9/x9'/>"
-			+"\n<jp:fa>http://www.apache.org/fa/xa#MY_LABEL</jp:fa>"
-			+"\n<jp:fb>http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar</jp:fb>"
-			+"\n<jp:fc>http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL</jp:fc>"
-			+"\n<jp:fd>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</jp:fd>"
-			+"\n<jp:fe>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</jp:fe>"
-		;
-		assertEquals(expected, r);
-
-		s.relativeUriBase(null);
-
-		s.absolutePathUriBase("http://foo");
-		r = stripAndSort(s.build().serialize(t));
-		expected = ""
-			+"</rdf:Description>>"
-			+"\n<<rdf:Description rdf:about='f0/x0'>"
-			+"\n<jp:f1 rdf:resource='f1/x1'/>"
-			+"\n<jp:f2 rdf:resource='http://foo/f2/x2'/>"
-			+"\n<jp:f3 rdf:resource='http://www.apache.org/f3/x3'/>"
-			+"\n<jp:f4 rdf:resource='f4/x4'/>"
-			+"\n<jp:f5 rdf:resource='http://foo/f5/x5'/>"
-			+"\n<jp:f6 rdf:resource='http://www.apache.org/f6/x6'/>"
-			+"\n<jp:f7 rdf:resource='http://www.apache.org/f7/x7'/>"
-			+"\n<jp:f8 rdf:resource='f8/x8'/>"
-			+"\n<jp:f9 rdf:resource='f9/x9'/>"
-			+"\n<jp:fa>http://www.apache.org/fa/xa#MY_LABEL</jp:fa>"
-			+"\n<jp:fb>http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar</jp:fb>"
-			+"\n<jp:fc>http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL</jp:fc>"
-			+"\n<jp:fd>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</jp:fd>"
-			+"\n<jp:fe>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</jp:fe>"
-		;
-		assertEquals(expected, r);
-
-		s.absolutePathUriBase("http://foo/");
-		r = stripAndSort(s.build().serialize(t));
-		assertEquals(expected, r);
-
-		s.absolutePathUriBase("");  // Same as null.
-		r = stripAndSort(s.build().serialize(t));
-		expected = ""
-			+"</rdf:Description>>"
-			+"\n<<rdf:Description rdf:about='f0/x0'>"
-			+"\n<jp:f1 rdf:resource='f1/x1'/>"
-			+"\n<jp:f2 rdf:resource='/f2/x2'/>"
-			+"\n<jp:f3 rdf:resource='http://www.apache.org/f3/x3'/>"
-			+"\n<jp:f4 rdf:resource='f4/x4'/>"
-			+"\n<jp:f5 rdf:resource='/f5/x5'/>"
-			+"\n<jp:f6 rdf:resource='http://www.apache.org/f6/x6'/>"
-			+"\n<jp:f7 rdf:resource='http://www.apache.org/f7/x7'/>"
-			+"\n<jp:f8 rdf:resource='f8/x8'/>"
-			+"\n<jp:f9 rdf:resource='f9/x9'/>"
-			+"\n<jp:fa>http://www.apache.org/fa/xa#MY_LABEL</jp:fa>"
-			+"\n<jp:fb>http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar</jp:fb>"
-			+"\n<jp:fc>http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL</jp:fc>"
-			+"\n<jp:fd>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</jp:fd>"
-			+"\n<jp:fe>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</jp:fe>"
-		;
-		assertEquals(expected, r);
-	}
-
-	private String stripAndSort(String s) {
-		s = strip(s);
-		Set<String> set = new TreeSet<String>();
-		for (String s2 : s.split("><"))
-			set.add('<' + s2 + '>');
-		return StringUtils.join(set, "\n");
-	}
 
 	//====================================================================================================
 	// Recursion

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java b/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
index ac09b1f..cd2cb22 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
@@ -21,7 +21,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
-import org.apache.juneau.testbeans.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 
@@ -236,135 +235,6 @@ public class CommonTest {
 		public URL f2;
 	}
 
-	//====================================================================================================
-	// Test URIs with URI_CONTEXT and URI_AUTHORITY
-	//====================================================================================================
-	@Test
-	public void testUris() throws Exception {
-		JsonSerializerBuilder s = new JsonSerializerBuilder().simple();
-		TestURI t = new TestURI();
-		String r;
-		String expected = "";
-
-		s.relativeUriBase(null);
-		r = s.build().serialize(t);
-		expected = "{"
-			+"f0:'f0/x0',"
-			+"f1:'f1/x1',"
-			+"f2:'/f2/x2',"
-			+"f3:'http://www.apache.org/f3/x3',"
-			+"f4:'f4/x4',"
-			+"f5:'/f5/x5',"
-			+"f6:'http://www.apache.org/f6/x6',"
-			+"f7:'http://www.apache.org/f7/x7',"
-			+"f8:'f8/x8',"
-			+"f9:'f9/x9',"
-			+"fa:'http://www.apache.org/fa/xa#MY_LABEL',"
-			+"fb:'http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
-			+"fc:'http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
-			+"fd:'http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
-			+"fe:'http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
-			+"}";
-		assertEquals(expected, r);
-
-		s.relativeUriBase("");  // Same as null.
-		r = s.build().serialize(t);
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/cr");
-		r = s.build().serialize(t);
-		expected = "{"
-			+"f0:'/cr/f0/x0',"
-			+"f1:'/cr/f1/x1',"
-			+"f2:'/f2/x2',"
-			+"f3:'http://www.apache.org/f3/x3',"
-			+"f4:'/cr/f4/x4',"
-			+"f5:'/f5/x5',"
-			+"f6:'http://www.apache.org/f6/x6',"
-			+"f7:'http://www.apache.org/f7/x7',"
-			+"f8:'/cr/f8/x8',"
-			+"f9:'/cr/f9/x9',"
-			+"fa:'http://www.apache.org/fa/xa#MY_LABEL',"
-			+"fb:'http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
-			+"fc:'http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
-			+"fd:'http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
-			+"fe:'http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
-			+"}";
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/cr/");  // Same as above
-		r = s.build().serialize(t);
-		assertEquals(expected, r);
-
-		s.relativeUriBase("/");
-		r = s.build().serialize(t);
-		expected = "{"
-			+"f0:'/f0/x0',"
-			+"f1:'/f1/x1',"
-			+"f2:'/f2/x2',"
-			+"f3:'http://www.apache.org/f3/x3',"
-			+"f4:'/f4/x4',"
-			+"f5:'/f5/x5',"
-			+"f6:'http://www.apache.org/f6/x6',"
-			+"f7:'http://www.apache.org/f7/x7',"
-			+"f8:'/f8/x8',"
-			+"f9:'/f9/x9',"
-			+"fa:'http://www.apache.org/fa/xa#MY_LABEL',"
-			+"fb:'http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
-			+"fc:'http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
-			+"fd:'http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
-			+"fe:'http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
-			+"}";
-		assertEquals(expected, r);
-
-		s.relativeUriBase(null);
-
-		s.absolutePathUriBase("http://foo");
-		r = s.build().serialize(t);
-		expected = "{"
-			+"f0:'f0/x0',"
-			+"f1:'f1/x1',"
-			+"f2:'http://foo/f2/x2',"
-			+"f3:'http://www.apache.org/f3/x3',"
-			+"f4:'f4/x4',"
-			+"f5:'http://foo/f5/x5',"
-			+"f6:'http://www.apache.org/f6/x6',"
-			+"f7:'http://www.apache.org/f7/x7',"
-			+"f8:'f8/x8',"
-			+"f9:'f9/x9',"
-			+"fa:'http://www.apache.org/fa/xa#MY_LABEL',"
-			+"fb:'http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
-			+"fc:'http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
-			+"fd:'http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
-			+"fe:'http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
-			+"}";
-		assertEquals(expected, r);
-
-		s.absolutePathUriBase("http://foo/");
-		r = s.build().serialize(t);
-		assertEquals(expected, r);
-
-		s.absolutePathUriBase("");  // Same as null.
-		r = s.build().serialize(t);
-		expected = "{"
-			+"f0:'f0/x0',"
-			+"f1:'f1/x1',"
-			+"f2:'/f2/x2',"
-			+"f3:'http://www.apache.org/f3/x3',"
-			+"f4:'f4/x4',"
-			+"f5:'/f5/x5',"
-			+"f6:'http://www.apache.org/f6/x6',"
-			+"f7:'http://www.apache.org/f7/x7',"
-			+"f8:'f8/x8',"
-			+"f9:'f9/x9',"
-			+"fa:'http://www.apache.org/fa/xa#MY_LABEL',"
-			+"fb:'http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
-			+"fc:'http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
-			+"fd:'http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
-			+"fe:'http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
-			+"}";
-		assertEquals(expected, r);
-	}
 
 	//====================================================================================================
 	// Recursion

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/c4952d2c/juneau-core-test/src/test/java/org/apache/juneau/serializer/TestURI.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/serializer/TestURI.java b/juneau-core-test/src/test/java/org/apache/juneau/serializer/TestURI.java
new file mode 100755
index 0000000..eb48e99
--- /dev/null
+++ b/juneau-core-test/src/test/java/org/apache/juneau/serializer/TestURI.java
@@ -0,0 +1,92 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              *
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.serializer;
+
+import java.net.URI;
+
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.jena.annotation.*;
+import org.apache.juneau.xml.*;
+import org.apache.juneau.xml.annotation.*;
+
+@SuppressWarnings("javadoc")
+@Bean(sort=true)
+public class TestURI {
+	
+	// String annotated as a URI
+	@org.apache.juneau.annotation.URI
+	@Rdf(beanUri=true)
+	@Xml(format=XmlFormat.ATTR)
+	public String f0 = "f0/x0";
+
+	// URI properties
+	public URI 
+		f1a = URI.create("http://www.apache.org/f1a"),
+		f1b = URI.create("/f1b"),
+		f1c = URI.create("/f1c/x/y"),
+		f1d = URI.create("f1d"),
+		f1e = URI.create("f1e/x/y"),
+		f1f = URI.create(""),
+		f1g = URI.create("servlet:/f1g/x"),
+		f1h = URI.create("servlet:/f1h"),
+		f1i = URI.create("servlet:/"),
+		f1j = URI.create("servlet:/.."),
+		f1k = URI.create("context:/f1j/x"),
+		f1l = URI.create("context:/f1k"),
+		f1m = URI.create("context:/"),
+		f1n = URI.create("context:/.."),
+		fio = null;
+		
+	// Strings annotated with @URI properties
+	@org.apache.juneau.annotation.URI
+	public String
+		f2a = "http://www.apache.org/f2a",
+		f2b = "/f2b",
+		f2c = "/f2c/x/y",
+		f2d = "f2d",
+		f2e = "f2e/x/y",
+		f2f = "",
+		f2g = "servlet:/f2g/x",
+		f2h = "servlet:/f2h",
+		f2i = "servlet:/",
+		f2j = "servlet:/..",
+		f2k = "context:/f2j/x",
+		f2l = "context:/f2k",
+		f2m = "context:/",
+		f2n = "context:/..",
+		f2o = null;
+
+	// Strings with labels
+	@org.apache.juneau.annotation.URI
+	public String
+		f3a = "http://www.apache.org/f3a/x?label=MY_LABEL&foo=bar",
+		f3b = XmlUtils.urlEncode("<>&'\""),
+		f3c = "<>&'\"";  // Invalid URI, but should produce parsable output.
+	
+	// @URI on bean
+	public TestURIb f4 = new TestURIb();
+	
+	// @URI on bean property method.
+	@org.apache.juneau.annotation.URI
+	public String getF5() {
+		return "f5/x";
+	}
+
+	@org.apache.juneau.annotation.URI
+	public static class TestURIb {
+		@Override /* Object */
+		public String toString() {
+			return "test/uri/b";
+		}
+	}
+}
\ No newline at end of file