Add support for @RestMethod proxies.

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

Branch: refs/heads/master
Commit: 9db2e03fa04ec54e5e2d85f9c4ab530233700853
Parents: 1174420
Author: JamesBognar <[email protected]>
Authored: Sat Mar 25 10:25:20 2017 -0700
Committer: JamesBognar <[email protected]>
Committed: Sat Mar 25 10:25:20 2017 -0700

----------------------------------------------------------------------
 .../a/rttests/RoundTripLargeObjectsTest.java    |  18 +-
 .../ByteArrayBase64SwapComboTest.java           |  28 +--
 .../transforms/CalendarSwapComboTest.java       |  72 +++---
 .../juneau/transforms/DateSwapComboTest.java    |  72 +++---
 .../urlencoding/UrlEncodingSerializerTest.java  |  16 +-
 .../java/org/apache/juneau/BeanSession.java     |   8 +-
 .../main/java/org/apache/juneau/ClassMeta.java  |  33 ++-
 .../java/org/apache/juneau/html/HtmlParser.java |  40 +++-
 .../java/org/apache/juneau/html/HtmlTag.java    |  10 +-
 .../org/apache/juneau/internal/ClassUtils.java  |  41 ++++
 .../apache/juneau/msgpack/MsgPackParser.java    |  25 +++
 .../java/org/apache/juneau/parser/Parser.java   |  30 ++-
 .../juneau/parser/ParserGroupBuilder.java       |  12 +
 .../serializer/SerializerGroupBuilder.java      |  12 +
 .../java/org/apache/juneau/uon/UonParser.java   |  14 +-
 .../juneau/urlencoding/UrlEncodingParser.java   |  84 +++++--
 .../urlencoding/UrlEncodingSerializer.java      |  45 +++-
 juneau-core/src/main/javadoc/overview.html      |  35 +++
 .../examples/addressbook/AddressBook.java       |  25 ++-
 .../examples/addressbook/IAddressBook.java      |   3 +
 .../rest/addressbook/AddressBookResource.java   |  29 +--
 .../examples/rest/AddressBookResourceTest.java  |  40 ++++
 .../org/apache/juneau/rest/client/RestCall.java | 153 +++++++++----
 .../apache/juneau/rest/client/RestClient.java   |  74 ++++--
 .../juneau/rest/client/RestClientBuilder.java   |  15 ++
 juneau-rest-test/pom.xml                        |   1 +
 .../apache/juneau/rest/test/InterfaceProxy.java |  62 +++++
 .../rest/test/InterfaceProxyResource.java       | 128 +++++++++++
 .../java/org/apache/juneau/rest/test/Root.java  |   1 +
 .../juneau/rest/test/InterfaceProxyTest.java    | 225 +++++++++++++++++++
 .../apache/juneau/rest/test/RestTestcase.java   |  24 ++
 .../juneau/rest/test/TestMicroservice.java      |   2 +-
 .../org/apache/juneau/rest/test/TestUtils.java  |   7 +
 .../org/apache/juneau/rest/test/_TestSuite.java |   1 +
 .../java/org/apache/juneau/rest/CallMethod.java |  14 +-
 .../org/apache/juneau/rest/RestContext.java     |  63 +++++-
 .../java/org/apache/juneau/rest/RestLogger.java |   5 +-
 .../org/apache/juneau/rest/RestRequest.java     |  64 ++++--
 .../juneau/rest/annotation/RestMethod.java      |  24 +-
 .../rest/remoteable/RemoteableServlet.java      |   2 +-
 40 files changed, 1295 insertions(+), 262 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
index 4e41a60..139f03c 100755
--- 
a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
@@ -50,55 +50,55 @@ public class RoundTripLargeObjectsTest extends 
RoundTripTest {
                        { /* 0 */
                                "Json DEFAULT",
                                new 
JsonSerializerBuilder().trimNullProperties(false),
-                               JsonParser.DEFAULT,
+                               new JsonParserBuilder(),
                                0
                        },
                        { /* 1 */
                                "Json DEFAULT_LAX",
                                new 
JsonSerializerBuilder().simple().trimNullProperties(false),
-                               JsonParser.DEFAULT,
+                               new JsonParserBuilder(),
                                0
                        },
                        { /* 2 */
                                "Json DEFAULT_SQ",
                                new 
JsonSerializerBuilder().simple().trimNullProperties(false),
-                               JsonParser.DEFAULT,
+                               new JsonParserBuilder(),
                                0
                        },
                        { /* 3 */
                                "Xml DEFAULT w/namespaces,validation",
                                new 
XmlSerializerBuilder().sq().ns().trimNullProperties(false).addNamespaceUrisToRoot(true).useWhitespace(true),
-                               XmlParser.DEFAULT,
+                               new XmlParserBuilder(),
                                CHECK_XML_WHITESPACE | VALIDATE_XML
                        },
                        { /* 4 */
                                "Xml DEFAULT wo/namespaces,validation",
                                new 
XmlSerializerBuilder().sq().trimNullProperties(false),
-                               XmlParser.DEFAULT,
+                               new XmlParserBuilder(),
                                CHECK_XML_WHITESPACE
                        },
                        { /* 5 */
                                "Html",
                                new 
HtmlSerializerBuilder().trimNullProperties(false),
-                               HtmlParser.DEFAULT,
+                               new HtmlParserBuilder(),
                                CHECK_XML_WHITESPACE
                        },
                        { /* 6 */
                                "UrlEncoding",
                                new 
UrlEncodingSerializerBuilder().trimNullProperties(false),
-                               UrlEncodingParser.DEFAULT,
+                               new UrlEncodingParserBuilder(),
                                0
                        },
                        { /* 7 */
                                "Uon",
                                new 
UonSerializerBuilder().trimNullProperties(false),
-                               UonParser.DEFAULT,
+                               new UonParserBuilder(),
                                0
                        },
                        { /* 8 */
                                "MsgPack",
                                new 
MsgPackSerializerBuilder().trimNullProperties(false),
-                               MsgPackParser.DEFAULT,
+                               new MsgPackParserBuilder(),
                                0
                        },
 //                     { /* 9 */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core-test/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java
index b9ac9c3..08934de 100644
--- 
a/juneau-core-test/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java
@@ -30,7 +30,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest {
        @Parameterized.Parameters
        public static Collection<Object[]> getParameters() {
                return Arrays.asList(new Object[][] {
-                       {
+                       {       /* 0 */
                                "ByteArray1d",
                                new byte[] {1,2,3},
                                /* Json */              "'AQID'",
@@ -55,7 +55,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>AQID</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>AQID</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 1 */
                                "ByteArray2d",
                                new byte[][]{{1,2,3},{4,5,6},null},
                                /* Json */              "['AQID','BAUG',null]",
@@ -71,16 +71,16 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* Uon */               "@(AQID,BAUG,null)",
                                /* UonT */              "@(AQID,BAUG,null)",
                                /* UonR */              
"@(\n\tAQID,\n\tBAUG,\n\tnull\n)",
-                               /* UrlEnc */    "_value=@(AQID,BAUG,null)",
-                               /* UrlEncT */   "_value=@(AQID,BAUG,null)",
-                               /* UrlEncR */   
"_value=@(\n\tAQID,\n\tBAUG,\n\tnull\n)",
+                               /* UrlEnc */    "0=AQID&1=BAUG&2=null",
+                               /* UrlEncT */   "0=AQID&1=BAUG&2=null",
+                               /* UrlEncR */   "0=AQID\n&1=BAUG\n&2=null",
                                /* MsgPack */   "93A441514944A442415547C0",
                                /* MsgPackT */  "93A441514944A442415547C0",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>AQID</rdf:li>\n<rdf:li>BAUG</rdf:li>\n<rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>AQID</rdf:li>\n<rdf:li>BAUG</rdf:li>\n<rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>AQID</rdf:li>\n    <rdf:li>BAUG</rdf:li>\n    <rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n  
</rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 2 */
                                "ListOfByteArrays",
                                new ArrayList<byte[]>(){{
                                        add(new byte[]{1,2,3});
@@ -109,7 +109,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>AQID</rdf:li>\n<rdf:li>BAUG</rdf:li>\n<rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>AQID</rdf:li>\n    <rdf:li>BAUG</rdf:li>\n    <rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n  
</rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 3 */
                                "MapOfByteArrays",
                                new LinkedHashMap<String,byte[]>() {{
                                        put("foo", new byte[]{1,2,3});
@@ -139,7 +139,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>AQID</jp:foo>\n<jp:bar 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:_x0000_>BAUG</jp:_x0000_>\n<jp:null>BwgJ</jp:null>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>AQID</jp:foo>\n    <jp:bar 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n    
<jp:_x0000_>BAUG</jp:_x0000_>\n    <jp:null>BwgJ</jp:null>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 4 */
                                "BeanWithByteArrayField",
                                new BeanWithByteArrayField().init(),
                                /* Json */              "{f:'AQID'}",
@@ -164,7 +164,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f>AQID</jp:f>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f>AQID</jp:f>\n  </rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 5 */
                                "BeanWithByteArray2dField",
                                new BeanWithByteArray2dField().init(),
                                /* Json */              
"{f:['AQID','BAUG',null]}",
@@ -189,7 +189,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>AQID</rdf:li>\n<rdf:li>BAUG</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f>\n      <rdf:Seq>\n        <rdf:li>AQID</rdf:li>\n 
       <rdf:li>BAUG</rdf:li>\n        <rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n      
</rdf:Seq>\n    </jp:f>\n  </rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 6 */
                                "BeanWithByteArrayNullField",
                                new BeanWithByteArrayNullField().init(),
                                /* Json */              "{f:null}",
@@ -214,7 +214,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 7 */
                                "BeanWithByteArrayListField",
                                new BeanWithByteArrayListField().init(),
                                /* Json */              
"{f:['AQID','BAUG',null]}",
@@ -239,7 +239,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>AQID</rdf:li>\n<rdf:li>BAUG</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f>\n      <rdf:Seq>\n        <rdf:li>AQID</rdf:li>\n 
       <rdf:li>BAUG</rdf:li>\n        <rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n      
</rdf:Seq>\n    </jp:f>\n  </rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 8 */
                                "BeanWithByteArrayMapField",
                                new BeanWithByteArrayMapField().init(),
                                /* Json */              
"{f:{foo:'AQID',bar:null,null:'BAUG'}}",
@@ -264,7 +264,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:parseType='Resource'>\n<jp:foo>AQID</jp:foo>\n<jp:bar 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:_x0000_>BAUG</jp:_x0000_>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f rdf:parseType='Resource'>\n      
<jp:foo>AQID</jp:foo>\n      <jp:bar 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n      
<jp:_x0000_>BAUG</jp:_x0000_>\n    </jp:f>\n  </rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 9 */
                                "BeanWithByteArrayBeanListField",
                                new BeanWithByteArrayBeanListField().init(),
                                /* Json */              
"{f:[{f1:'AQID',f2:['AQID','BAUG',null],f3:null,f4:['AQID','BAUG',null],f5:{foo:'AQID',bar:null,null:'BAUG'}},null]}",
@@ -289,7 +289,7 @@ public class ByteArrayBase64SwapComboTest extends ComboTest 
{
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:f1>AQID</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>AQID</rdf:li>\n<rdf:li>BAUG</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>AQID</rdf:li>\n<rdf:li>BAUG</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
 rdf:parseType='Resource'>\n<jp:foo>AQID</jp:foo>\n<jp:bar 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:_x0000_>BAUG</jp:_x0000_>\n</jp:f5>\n</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f>\n      <rdf:Seq>\n        <rdf:li 
rdf:parseType='Resource'>\n          <jp:f1>AQID</jp:f1>\n          <jp:f2>\n   
         <rdf:Seq>\n              <rdf:li>AQID</rdf:li>\n              
<rdf:li>BAUG</rdf:li>\n              <rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n            
</rdf:Seq>\n          </jp:f2>\n          <jp:f3 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n          
<jp:f4>\n            <rdf:Seq>\n              <rdf:li>AQID</rdf:li>\n           
   <rdf:li>BAUG</rdf:li>\n              <rdf:li 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n            
</rdf:Seq>\n          </jp:f4>\n          <jp:f5 rdf:parseType='Resource'>\n    
        <jp:foo>AQID</jp:foo>\n            <jp:bar 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n            
<jp:_x0000_>BAUG</jp:_x0000_>\n          </jp:f5>\n        </rdf:li>\n        
<rdf:li rdf:r
 esource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n      </rdf:Seq>\n 
   </jp:f>\n  </rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 10 */
                                "BeanWithByteArrayBeanMapField",
                                new BeanWithByteArrayBeanMapField().init(),
                                /* Json */              
"{f:{foo:{f1:'AQID',f2:['AQID','BAUG',null],f3:null,f4:['AQID','BAUG',null],f5:{foo:'AQID',bar:null,null:'BAUG'}},bar:null,null:{f1:'AQID',f2:['AQID','BAUG',null],f3:null,f4:['AQID','BAUG',null],f5:{foo:'AQID',bar:null,null:'BAUG'}}}}",

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapComboTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapComboTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapComboTest.java
index c3453b3..b804241 100644
--- 
a/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapComboTest.java
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapComboTest.java
@@ -42,7 +42,7 @@ public class CalendarSwapComboTest extends ComboTest {
        @Parameterized.Parameters
        public static Collection<Object[]> getParameters() {
                return Arrays.asList(new Object[][] {
-                       {
+                       {       /* 0 */
                                "CalendarSwap.ToString/singleDate",
                                singleDate,
                                CalendarSwap.ToString.class,
@@ -68,7 +68,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>Sun Mar 03 10:11:12 PST 
1901</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>Sun Mar 03 10:11:12 PST 1901</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 1 */
                                "CalendarSwap.ToString/dateArray",
                                dateArray,
                                CalendarSwap.ToString.class,
@@ -85,16 +85,16 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* Uon */               "@('Sun Mar 03 10:11:12 
PST 1901')",
                                /* UonT */              "@('Sun Mar 03 10:11:12 
PST 1901')",
                                /* UonR */              "@(\n\t'Sun Mar 03 
10:11:12 PST 1901'\n)",
-                               /* UrlEnc */    
"_value=@('Sun+Mar+03+10:11:12+PST+1901')",
-                               /* UrlEncT */   
"_value=@('Sun+Mar+03+10:11:12+PST+1901')",
-                               /* UrlEncR */   
"_value=@(\n\t'Sun+Mar+03+10:11:12+PST+1901'\n)",
+                               /* UrlEnc */    
"0='Sun+Mar+03+10:11:12+PST+1901'",
+                               /* UrlEncT */   
"0='Sun+Mar+03+10:11:12+PST+1901'",
+                               /* UrlEncR */   
"0='Sun+Mar+03+10:11:12+PST+1901'",
                                /* MsgPack */   
"91BC53756E204D61722030332031303A31313A3132205053542031393031",
                                /* MsgPackT */  
"91BC53756E204D61722030332031303A31313A3132205053542031393031",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun Mar 03 10:11:12 PST 
1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun Mar 03 10:11:12 PST 
1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>Sun Mar 03 10:11:12 PST 1901</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 2 */
                                "CalendarSwap.ToString",
                                dateMap,
                                CalendarSwap.ToString.class,
@@ -120,7 +120,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Sun Mar 03 10:11:12 PST 
1901</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>Sun Mar 03 10:11:12 PST 1901</jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 3 */
                                "CalendarSwap.ISO8601DT/singleDate",
                                singleDate,
                                CalendarSwap.ISO8601DT.class,
@@ -146,7 +146,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>1901-03-03T10:11:12-08:00</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>1901-03-03T10:11:12-08:00</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 4 */
                                "CalendarSwap.ISO8601DT/dateArray",
                                dateArray,
                                CalendarSwap.ISO8601DT.class,
@@ -163,16 +163,16 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* Uon */               
"@(1901-03-03T10:11:12-08:00)",
                                /* UonT */              
"@(1901-03-03T10:11:12-08:00)",
                                /* UonR */              
"@(\n\t1901-03-03T10:11:12-08:00\n)",
-                               /* UrlEnc */    
"_value=@(1901-03-03T10:11:12-08:00)",
-                               /* UrlEncT */   
"_value=@(1901-03-03T10:11:12-08:00)",
-                               /* UrlEncR */   
"_value=@(\n\t1901-03-03T10:11:12-08:00\n)",
+                               /* UrlEnc */    "0=1901-03-03T10:11:12-08:00",
+                               /* UrlEncT */   "0=1901-03-03T10:11:12-08:00",
+                               /* UrlEncR */   "0=1901-03-03T10:11:12-08:00",
                                /* MsgPack */   
"91B9313930312D30332D30335431303A31313A31322D30383A3030",
                                /* MsgPackT */  
"91B9313930312D30332D30335431303A31313A31322D30383A3030",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 5 */
                                "CalendarSwap.ISO8601DT/dateMap",
                                dateMap,
                                CalendarSwap.ISO8601DT.class,
@@ -198,7 +198,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>1901-03-03T10:11:12-08:00</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>1901-03-03T10:11:12-08:00</jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 6 */
                                "CalendarSwap.RFC2822DTZ/singleDate",
                                singleDate,
                                CalendarSwap.RFC2822DTZ.class,
@@ -224,7 +224,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>Sun, 03 Mar 1901 18:11:12 
GMT</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>Sun, 03 Mar 1901 18:11:12 GMT</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 7 */
                                "CalendarSwap.RFC2822DTZ/dateArray",
                                dateArray,
                                CalendarSwap.RFC2822DTZ.class,
@@ -241,16 +241,16 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* Uon */               "@('Sun, 03 Mar 1901 
18:11:12 GMT')",
                                /* UonT */              "@('Sun, 03 Mar 1901 
18:11:12 GMT')",
                                /* UonR */              "@(\n\t'Sun, 03 Mar 
1901 18:11:12 GMT'\n)",
-                               /* UrlEnc */    
"_value=@('Sun,+03+Mar+1901+18:11:12+GMT')",
-                               /* UrlEncT */   
"_value=@('Sun,+03+Mar+1901+18:11:12+GMT')",
-                               /* UrlEncR */   
"_value=@(\n\t'Sun,+03+Mar+1901+18:11:12+GMT'\n)",
+                               /* UrlEnc */    
"0='Sun,+03+Mar+1901+18:11:12+GMT'",
+                               /* UrlEncT */   
"0='Sun,+03+Mar+1901+18:11:12+GMT'",
+                               /* UrlEncR */   
"0='Sun,+03+Mar+1901+18:11:12+GMT'",
                                /* MsgPack */   
"91BD53756E2C203033204D617220313930312031383A31313A313220474D54",
                                /* MsgPackT */  
"91BD53756E2C203033204D617220313930312031383A31313A313220474D54",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun, 03 Mar 1901 18:11:12 
GMT</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun, 03 Mar 1901 18:11:12 
GMT</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>Sun, 03 Mar 1901 18:11:12 GMT</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 8 */
                                "CalendarSwap.RFC2822DTZ/dateMap",
                                dateMap,
                                CalendarSwap.RFC2822DTZ.class,
@@ -276,7 +276,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Sun, 03 Mar 1901 18:11:12 
GMT</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>Sun, 03 Mar 1901 18:11:12 GMT</jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 9 */
                                "CalendarLongSwap",
                                singleDate,
                                CalendarLongSwap.class,
@@ -302,7 +302,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>-2172116928000</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>-2172116928000</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 10 */
                                "CalendarLongSwap/dateArray",
                                dateArray,
                                CalendarLongSwap.class,
@@ -319,16 +319,16 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* Uon */               "@(-2172116928000)",
                                /* UonT */              "@(-2172116928000)",
                                /* UonR */              
"@(\n\t-2172116928000\n)",
-                               /* UrlEnc */    "_value=@(-2172116928000)",
-                               /* UrlEncT */   "_value=@(-2172116928000)",
-                               /* UrlEncR */   
"_value=@(\n\t-2172116928000\n)",
+                               /* UrlEnc */    "0=-2172116928000",
+                               /* UrlEncT */   "0=-2172116928000",
+                               /* UrlEncR */   "0=-2172116928000",
                                /* MsgPack */   "91D3FFFFFE0643BDFA00",
                                /* MsgPackT */  "91D3FFFFFE0643BDFA00",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>-2172116928000</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>-2172116928000</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>-2172116928000</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 11 */
                                "CalendarLongSwap/dateMap",
                                dateMap,
                                CalendarLongSwap.class,
@@ -354,7 +354,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>-2172116928000</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>-2172116928000</jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 12 */
                                "CalendarMapSwap/singleDate",
                                singleDate,
                                CalendarMapSwap.class,
@@ -380,7 +380,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:time>-2172116928000</jp:time>\n<jp:timeZone>PST</jp:timeZone>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:time>-2172116928000</jp:time>\n    
<jp:timeZone>PST</jp:timeZone>\n  </rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 13 */
                                "CalendarMapSwap/dateArray",
                                dateArray,
                                CalendarMapSwap.class,
@@ -397,16 +397,16 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* Uon */               
"@((time=-2172116928000,timeZone=PST))",
                                /* UonT */              
"@((time=-2172116928000,timeZone=PST))",
                                /* UonR */              
"@(\n\t(\n\t\ttime=-2172116928000,\n\t\ttimeZone=PST\n\t)\n)",
-                               /* UrlEnc */    
"_value=@((time=-2172116928000,timeZone=PST))",
-                               /* UrlEncT */   
"_value=@((time=-2172116928000,timeZone=PST))",
-                               /* UrlEncR */   
"_value=@(\n\t(\n\t\ttime=-2172116928000,\n\t\ttimeZone=PST\n\t)\n)",
+                               /* UrlEnc */    
"0=(time=-2172116928000,timeZone=PST)",
+                               /* UrlEncT */   
"0=(time=-2172116928000,timeZone=PST)",
+                               /* UrlEncR */   
"0=(\n\ttime=-2172116928000,\n\ttimeZone=PST\n)",
                                /* MsgPack */   
"9182A474696D65D3FFFFFE0643BDFA00A874696D655A6F6E65A3505354",
                                /* MsgPackT */  
"9182A474696D65D3FFFFFE0643BDFA00A874696D655A6F6E65A3505354",
                                /* RdfXml */    "<rdf:RDF>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n<jp:timeZone>PST</jp:timeZone>\n</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   "<rdf:RDF>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n<jp:timeZone>PST</jp:timeZone>\n</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li rdf:parseType='Resource'>\n      <jp:time>-2172116928000</jp:time>\n    
  <jp:timeZone>PST</jp:timeZone>\n    </rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 14 */
                                "CalendarMapSwap/dateMap",
                                dateMap,
                                CalendarMapSwap.class,
@@ -432,7 +432,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo 
rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n<jp:timeZone>PST</jp:timeZone>\n</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo rdf:parseType='Resource'>\n      
<jp:time>-2172116928000</jp:time>\n      <jp:timeZone>PST</jp:timeZone>\n    
</jp:foo>\n  </rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 15 */
                                "CalendarSwap.DateMedium/singleDate",
                                singleDate,
                                CalendarSwap.DateMedium.class,
@@ -458,7 +458,7 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>Mar 3, 
1901</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>Mar 3, 1901</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 16 */
                                "CalendarSwap.DateMedium/dateArray",
                                dateArray,
                                CalendarSwap.DateMedium.class,
@@ -475,16 +475,16 @@ public class CalendarSwapComboTest extends ComboTest {
                                /* Uon */               "@('Mar 3, 1901')",
                                /* UonT */              "@('Mar 3, 1901')",
                                /* UonR */              "@(\n\t'Mar 3, 
1901'\n)",
-                               /* UrlEnc */    "_value=@('Mar+3,+1901')",
-                               /* UrlEncT */   "_value=@('Mar+3,+1901')",
-                               /* UrlEncR */   "_value=@(\n\t'Mar+3,+1901'\n)",
+                               /* UrlEnc */    "0='Mar+3,+1901'",
+                               /* UrlEncT */   "0='Mar+3,+1901'",
+                               /* UrlEncR */   "0='Mar+3,+1901'",
                                /* MsgPack */   "91AB4D617220332C2031393031",
                                /* MsgPackT */  "91AB4D617220332C2031393031",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Mar 3, 1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Mar 3, 1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>Mar 3, 1901</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 17 */
                                "CalendarSwap.DateMedium/dateMap",
                                dateMap,
                                CalendarSwap.DateMedium.class,

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapComboTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapComboTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapComboTest.java
index 5965e94..376cbec 100644
--- 
a/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapComboTest.java
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/transforms/DateSwapComboTest.java
@@ -38,7 +38,7 @@ public class DateSwapComboTest extends ComboTest {
        @Parameterized.Parameters
        public static Collection<Object[]> getParameters() {
                return Arrays.asList(new Object[][] {
-                       {
+                       {       /* 0 */
                                "DateSwap.ToString/singleDate",
                                singleDate,
                                DateSwap.ToString.class,
@@ -64,7 +64,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>Sun Mar 03 10:11:12 PST 
1901</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>Sun Mar 03 10:11:12 PST 1901</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 1 */
                                "DateSwap.ToString/dateArray",
                                dateArray,
                                DateSwap.ToString.class,
@@ -81,16 +81,16 @@ public class DateSwapComboTest extends ComboTest {
                                /* Uon */               "@('Sun Mar 03 10:11:12 
PST 1901')",
                                /* UonT */              "@('Sun Mar 03 10:11:12 
PST 1901')",
                                /* UonR */              "@(\n\t'Sun Mar 03 
10:11:12 PST 1901'\n)",
-                               /* UrlEnc */    
"_value=@('Sun+Mar+03+10:11:12+PST+1901')",
-                               /* UrlEncT */   
"_value=@('Sun+Mar+03+10:11:12+PST+1901')",
-                               /* UrlEncR */   
"_value=@(\n\t'Sun+Mar+03+10:11:12+PST+1901'\n)",
+                               /* UrlEnc */    
"0='Sun+Mar+03+10:11:12+PST+1901'",
+                               /* UrlEncT */   
"0='Sun+Mar+03+10:11:12+PST+1901'",
+                               /* UrlEncR */   
"0='Sun+Mar+03+10:11:12+PST+1901'",
                                /* MsgPack */   
"91BC53756E204D61722030332031303A31313A3132205053542031393031",
                                /* MsgPackT */  
"91BC53756E204D61722030332031303A31313A3132205053542031393031",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun Mar 03 10:11:12 PST 
1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun Mar 03 10:11:12 PST 
1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>Sun Mar 03 10:11:12 PST 1901</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 2 */
                                "DateSwap.ToString",
                                dateMap,
                                DateSwap.ToString.class,
@@ -116,7 +116,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Sun Mar 03 10:11:12 PST 
1901</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>Sun Mar 03 10:11:12 PST 1901</jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 3 */
                                "DateSwap.ISO8601DT/singleDate",
                                singleDate,
                                DateSwap.ISO8601DT.class,
@@ -142,7 +142,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>1901-03-03T10:11:12-08:00</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>1901-03-03T10:11:12-08:00</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 4 */
                                "DateSwap.ISO8601DT/dateArray",
                                dateArray,
                                DateSwap.ISO8601DT.class,
@@ -159,16 +159,16 @@ public class DateSwapComboTest extends ComboTest {
                                /* Uon */               
"@(1901-03-03T10:11:12-08:00)",
                                /* UonT */              
"@(1901-03-03T10:11:12-08:00)",
                                /* UonR */              
"@(\n\t1901-03-03T10:11:12-08:00\n)",
-                               /* UrlEnc */    
"_value=@(1901-03-03T10:11:12-08:00)",
-                               /* UrlEncT */   
"_value=@(1901-03-03T10:11:12-08:00)",
-                               /* UrlEncR */   
"_value=@(\n\t1901-03-03T10:11:12-08:00\n)",
+                               /* UrlEnc */    "0=1901-03-03T10:11:12-08:00",
+                               /* UrlEncT */   "0=1901-03-03T10:11:12-08:00",
+                               /* UrlEncR */   "0=1901-03-03T10:11:12-08:00",
                                /* MsgPack */   
"91B9313930312D30332D30335431303A31313A31322D30383A3030",
                                /* MsgPackT */  
"91B9313930312D30332D30335431303A31313A31322D30383A3030",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 5 */
                                "DateSwap.ISO8601DT/dateMap",
                                dateMap,
                                DateSwap.ISO8601DT.class,
@@ -194,7 +194,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>1901-03-03T10:11:12-08:00</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>1901-03-03T10:11:12-08:00</jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 6 */
                                "DateSwap.RFC2822DTZ/singleDate",
                                singleDate,
                                DateSwap.RFC2822DTZ.class,
@@ -220,7 +220,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>Sun, 03 Mar 1901 18:11:12 
GMT</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>Sun, 03 Mar 1901 18:11:12 GMT</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 7 */
                                "DateSwap.RFC2822DTZ/dateArray",
                                dateArray,
                                DateSwap.RFC2822DTZ.class,
@@ -237,16 +237,16 @@ public class DateSwapComboTest extends ComboTest {
                                /* Uon */               "@('Sun, 03 Mar 1901 
18:11:12 GMT')",
                                /* UonT */              "@('Sun, 03 Mar 1901 
18:11:12 GMT')",
                                /* UonR */              "@(\n\t'Sun, 03 Mar 
1901 18:11:12 GMT'\n)",
-                               /* UrlEnc */    
"_value=@('Sun,+03+Mar+1901+18:11:12+GMT')",
-                               /* UrlEncT */   
"_value=@('Sun,+03+Mar+1901+18:11:12+GMT')",
-                               /* UrlEncR */   
"_value=@(\n\t'Sun,+03+Mar+1901+18:11:12+GMT'\n)",
+                               /* UrlEnc */    
"0='Sun,+03+Mar+1901+18:11:12+GMT'",
+                               /* UrlEncT */   
"0='Sun,+03+Mar+1901+18:11:12+GMT'",
+                               /* UrlEncR */   
"0='Sun,+03+Mar+1901+18:11:12+GMT'",
                                /* MsgPack */   
"91BD53756E2C203033204D617220313930312031383A31313A313220474D54",
                                /* MsgPackT */  
"91BD53756E2C203033204D617220313930312031383A31313A313220474D54",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun, 03 Mar 1901 18:11:12 
GMT</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun, 03 Mar 1901 18:11:12 
GMT</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>Sun, 03 Mar 1901 18:11:12 GMT</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 8 */
                                "DateSwap.RFC2822DTZ/dateMap",
                                dateMap,
                                DateSwap.RFC2822DTZ.class,
@@ -272,7 +272,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Sun, 03 Mar 1901 18:11:12 
GMT</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>Sun, 03 Mar 1901 18:11:12 GMT</jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 9 */
                                "DateLongSwap",
                                singleDate,
                                DateLongSwap.class,
@@ -298,7 +298,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>-2172116928000</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>-2172116928000</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 10 */
                                "DateLongSwap/dateArray",
                                dateArray,
                                DateLongSwap.class,
@@ -315,16 +315,16 @@ public class DateSwapComboTest extends ComboTest {
                                /* Uon */               "@(-2172116928000)",
                                /* UonT */              "@(-2172116928000)",
                                /* UonR */              
"@(\n\t-2172116928000\n)",
-                               /* UrlEnc */    "_value=@(-2172116928000)",
-                               /* UrlEncT */   "_value=@(-2172116928000)",
-                               /* UrlEncR */   
"_value=@(\n\t-2172116928000\n)",
+                               /* UrlEnc */    "0=-2172116928000",
+                               /* UrlEncT */   "0=-2172116928000",
+                               /* UrlEncR */   "0=-2172116928000",
                                /* MsgPack */   "91D3FFFFFE0643BDFA00",
                                /* MsgPackT */  "91D3FFFFFE0643BDFA00",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>-2172116928000</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>-2172116928000</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>-2172116928000</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 11 */
                                "DateLongSwap/dateMap",
                                dateMap,
                                DateLongSwap.class,
@@ -350,7 +350,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo>-2172116928000</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo>-2172116928000</jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 12 */
                                "DateMapSwap/singleDate",
                                singleDate,
                                DateMapSwap.class,
@@ -376,7 +376,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:time>-2172116928000</jp:time>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:time>-2172116928000</jp:time>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 13 */
                                "DateMapSwap/dateArray",
                                dateArray,
                                DateMapSwap.class,
@@ -393,16 +393,16 @@ public class DateSwapComboTest extends ComboTest {
                                /* Uon */               
"@((time=-2172116928000))",
                                /* UonT */              
"@((time=-2172116928000))",
                                /* UonR */              
"@(\n\t(\n\t\ttime=-2172116928000\n\t)\n)",
-                               /* UrlEnc */    
"_value=@((time=-2172116928000))",
-                               /* UrlEncT */   
"_value=@((time=-2172116928000))",
-                               /* UrlEncR */   
"_value=@(\n\t(\n\t\ttime=-2172116928000\n\t)\n)",
+                               /* UrlEnc */    "0=(time=-2172116928000)",
+                               /* UrlEncT */   "0=(time=-2172116928000)",
+                               /* UrlEncR */   "0=(\n\ttime=-2172116928000\n)",
                                /* MsgPack */   
"9181A474696D65D3FFFFFE0643BDFA00",
                                /* MsgPackT */  
"9181A474696D65D3FFFFFE0643BDFA00",
                                /* RdfXml */    "<rdf:RDF>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   "<rdf:RDF>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li rdf:parseType='Resource'>\n      <jp:time>-2172116928000</jp:time>\n    
</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 14 */
                                "DateMapSwap/dateMap",
                                dateMap,
                                DateMapSwap.class,
@@ -428,7 +428,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:foo 
rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:foo rdf:parseType='Resource'>\n      
<jp:time>-2172116928000</jp:time>\n    </jp:foo>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 15 */
                                "DateSwap.DateMedium/singleDate",
                                singleDate,
                                DateSwap.DateMedium.class,
@@ -454,7 +454,7 @@ public class DateSwapComboTest extends ComboTest {
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<j:value>Mar 3, 
1901</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <j:value>Mar 3, 1901</j:value>\n  
</rdf:Description>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 16 */
                                "DateSwap.DateMedium/dateArray",
                                dateArray,
                                DateSwap.DateMedium.class,
@@ -471,16 +471,16 @@ public class DateSwapComboTest extends ComboTest {
                                /* Uon */               "@('Mar 3, 1901')",
                                /* UonT */              "@('Mar 3, 1901')",
                                /* UonR */              "@(\n\t'Mar 3, 
1901'\n)",
-                               /* UrlEnc */    "_value=@('Mar+3,+1901')",
-                               /* UrlEncT */   "_value=@('Mar+3,+1901')",
-                               /* UrlEncR */   "_value=@(\n\t'Mar+3,+1901'\n)",
+                               /* UrlEnc */    "0='Mar+3,+1901'",
+                               /* UrlEncT */   "0='Mar+3,+1901'",
+                               /* UrlEncR */   "0='Mar+3,+1901'",
                                /* MsgPack */   "91AB4D617220332C2031393031",
                                /* MsgPackT */  "91AB4D617220332C2031393031",
                                /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Mar 3, 1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Mar 3, 1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
                                /* RdfXmlR */   "<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>Mar 3, 1901</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n",
                        },
-                       {
+                       {       /* 17 */
                                "DateSwap.DateMedium/dateMap",
                                dateMap,
                                DateSwap.DateMedium.class,

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
index 91dc1a6..66e50dc 100755
--- 
a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
@@ -81,8 +81,8 @@ public class UrlEncodingSerializerTest {
                // Empty array
                // Top level
                t = new String[0];
-               assertEquals("_value=@()", s.serialize(t));
-               assertEquals("_value=@()", sr.serialize(t));
+               assertEquals("", s.serialize(t));
+               assertEquals("", sr.serialize(t));
 
                // 2nd level in map
                t = new ObjectMap("{x:[]}");
@@ -91,14 +91,14 @@ public class UrlEncodingSerializerTest {
 
                // Empty 2 dimensional array
                t = new String[1][0];
-               assertEquals("_value=@(@())", s.serialize(t));
-               assertEquals("_value=@(\n\t@()\n)", sr.serialize(t));
+               assertEquals("0=@()", s.serialize(t));
+               assertEquals("0=@()", sr.serialize(t));
 
                // Array containing empty string
                // Top level
                t = new String[]{""};
-               assertEquals("_value=@('')", s.serialize(t));
-               assertEquals("_value=@(\n\t''\n)", sr.serialize(t));
+               assertEquals("0=''", s.serialize(t));
+               assertEquals("0=''", sr.serialize(t));
 
                // 2nd level
                t = new ObjectMap("{x:['']}");
@@ -107,8 +107,8 @@ public class UrlEncodingSerializerTest {
 
                // Array containing 3 empty strings
                t = new String[]{"","",""};
-               assertEquals("_value=@('','','')", s.serialize(t));
-               assertEquals("_value=@(\n\t'',\n\t'',\n\t''\n)", 
sr.serialize(t));
+               assertEquals("0=''&1=''&2=''", s.serialize(t));
+               assertEquals("0=''\n&1=''\n&2=''", sr.serialize(t));
 
                // String containing \u0000
                // Top level

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
index b033324..1fb0464 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
@@ -732,7 +732,7 @@ public class BeanSession extends Session {
                if (m == null)
                        return null;
                T bean = null;
-               if (m.constructorArgs.length == 0) 
+               if (m.constructorArgs.length == 0)
                        bean = newBean(outer, c);
                return new BeanMap<T>(this, bean, m);
        }
@@ -774,7 +774,7 @@ public class BeanSession extends Session {
                        return null;
                try {
                        T o = (T)m.newBean(outer);
-                       if (o == null) 
+                       if (o == null)
                                throw new BeanRuntimeException(c, "Class does 
not have a no-arg constructor.");
                        return o;
                } catch (BeanRuntimeException e) {
@@ -843,13 +843,13 @@ public class BeanSession extends Session {
        }
 
        /**
-        * Given an array of {@link Class} objects, returns an array of 
corresponding {@link ClassMeta} objects.
+        * Given an array of {@link Type} objects, returns an array of 
corresponding {@link ClassMeta} objects.
         * Constructs a new array on each call.
         *
         * @param classes The array of classes to get class metas for.
         * @return An array of {@link ClassMeta} objects corresponding to the 
classes.  Never <jk>null</jk>.
         */
-       public final ClassMeta<?>[] getClassMetas(Class<?>[] classes) {
+       public final ClassMeta<?>[] getClassMetas(Type[] classes) {
                assertFieldNotNull(classes, "classes");
                ClassMeta<?>[] cm = new ClassMeta<?>[classes.length];
                for (int i = 0; i < classes.length; i++)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java 
b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
index e320777..fa3fed1 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
@@ -54,7 +54,7 @@ public final class ClassMeta<T> implements Type {
 
        /** Class categories. */
        enum ClassCategory {
-               MAP, COLLECTION, CLASS, NUMBER, DECIMAL, BOOLEAN, CHAR, DATE, 
ARRAY, ENUM, OTHER, CHARSEQ, STR, OBJ, URI, BEANMAP, READER, INPUTSTREAM
+               MAP, COLLECTION, CLASS, NUMBER, DECIMAL, BOOLEAN, CHAR, DATE, 
ARRAY, ENUM, OTHER, CHARSEQ, STR, OBJ, URI, BEANMAP, READER, INPUTSTREAM, VOID
        }
 
        final Class<T> innerClass;                              // The class 
being wrapped.
@@ -83,6 +83,7 @@ public final class ClassMeta<T> implements Type {
        private final Object primitiveDefault;                  // Default 
value for primitive type classes.
        private final Map<String,Method>
                remoteableMethods,                                   // Methods 
annotated with @Remoteable.  Contains all public methods if class is annotated 
with @Remotable.
+               proxyableMethods,                                    // 
Remoteable methods only if at least one method is marked @Remoteable, otherwise 
all public methods.
                publicMethods;                                       // All 
public methods, including static methods.
        private final PojoSwap<?,?>[] childPojoSwaps;           // Any 
PojoSwaps where the normal type is a subclass of this class.
        private final ConcurrentHashMap<Class<?>,PojoSwap<?,?>>
@@ -159,6 +160,7 @@ public final class ClassMeta<T> implements Type {
                this.primitiveDefault = builder.primitiveDefault;
                this.publicMethods = builder.publicMethods;
                this.remoteableMethods = builder.remoteableMethods;
+               this.proxyableMethods = builder.proxyableMethods;
                this.beanFilter = beanFilter;
                this.pojoSwap = builder.pojoSwap;
                this.extMeta = new MetadataMap();
@@ -208,6 +210,7 @@ public final class ClassMeta<T> implements Type {
                this.isMemberClass = mainType.isMemberClass;
                this.primitiveDefault = mainType.primitiveDefault;
                this.remoteableMethods = mainType.remoteableMethods;
+               this.proxyableMethods = mainType.proxyableMethods;
                this.publicMethods = mainType.publicMethods;
                this.beanContext = mainType.beanContext;
                this.serializedClassMeta = this;
@@ -253,7 +256,8 @@ public final class ClassMeta<T> implements Type {
                Object primitiveDefault = null;
                Map<String,Method>
                        publicMethods = new LinkedHashMap<String,Method>(),
-                       remoteableMethods = null;
+                       remoteableMethods = null,
+                       proxyableMethods = null;
                ClassMeta<?>
                        keyType = null,
                        valueType = null,
@@ -294,6 +298,8 @@ public final class ClassMeta<T> implements Type {
                                }
                                else if (c == Character.TYPE)
                                        cc = CHAR;
+                               else if (c == void.class || c == Void.class)
+                                       cc = VOID;
                        } else {
                                if (isParentClass(Delegate.class, c))
                                        isDelegate = true;
@@ -479,7 +485,7 @@ public final class ClassMeta<T> implements Type {
                                        
publicMethods.put(ClassUtils.getMethodSignature(m), m);
 
                        if (c.getAnnotation(Remoteable.class) != null) {
-                               remoteableMethods = publicMethods;
+                               remoteableMethods = proxyableMethods = 
publicMethods;
                        } else {
                                for (Method m : c.getMethods()) {
                                        if (m.getAnnotation(Remoteable.class) 
!= null) {
@@ -488,6 +494,7 @@ public final class ClassMeta<T> implements Type {
                                                
remoteableMethods.put(ClassUtils.getMethodSignature(m), m);
                                        }
                                }
+                               proxyableMethods = (remoteableMethods != null ? 
remoteableMethods : publicMethods);
                        }
 
                        if (innerClass != Object.class) {
@@ -1050,6 +1057,15 @@ public final class ClassMeta<T> implements Type {
        }
 
        /**
+        * Returns <jk>true</jk> if this class is {@link Void} or <jk>void</jk>.
+        *
+        * @return <jk>true</jk> if this class is {@link Void} or <jk>void</jk>.
+        */
+       public boolean isVoid() {
+               return cc == VOID;
+       }
+
+       /**
         * Returns <jk>true</jk> if instance of this object can be 
<jk>null</jk>.
         * <p>
         * Objects can be <jk>null</jk>, but primitives cannot, except for 
chars which can be represented
@@ -1099,6 +1115,17 @@ public final class ClassMeta<T> implements Type {
        }
 
        /**
+        * All methods on this class that can be exposed as a proxy method.
+        * <p>
+        * Same as {@link #getRemoteableMethods()} except returns all public 
methods if class is not annotated with {@link Remoteable @Remotable}.
+        *
+        * @return All proxyable methods on this class.
+        */
+       public Map<String,Method> getProxyableMethods() {
+               return proxyableMethods;
+       }
+
+       /**
         * All public methods on this class including static methods.
         * Keys are method signatures.
         *

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
index ef73860..75f2760 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
@@ -111,6 +111,9 @@ public class HtmlParser extends XmlParser {
                boolean isValid = true;
                HtmlTag tag = (event == CHARACTERS ? null : 
HtmlTag.forString(r.getName().getLocalPart(), false));
 
+               if (tag == HTML)
+                       tag = skipToData(r);
+
                if (isEmpty) {
                        o = "";
                } else if (tag == null || tag.isOneOf(BR,BS,FF,SP)) {
@@ -164,6 +167,12 @@ public class HtmlParser extends XmlParser {
                                isValid = false;
                        skipTag(r, xBOOLEAN);
 
+               } else if (tag == P) {
+                       String text = session.getElementText(r);
+                       if (! "No Results".equals(text))
+                               isValid = false;
+                       skipTag(r, xP);
+
                } else if (tag == NULL) {
                        skipTag(r, NULL);
                        skipTag(r, xNULL);
@@ -246,6 +255,26 @@ public class HtmlParser extends XmlParser {
                return (T)o;
        }
 
+       /**
+        * For parsing output from HtmlDocSerializer, this skips over the head, 
title, and links.
+        */
+       private static HtmlTag skipToData(XMLStreamReader r) throws 
XMLStreamException {
+               while (true) {
+                       int event = r.next();
+                       if (event == START_ELEMENT && 
"div".equals(r.getLocalName()) && "data".equals(r.getAttributeValue(null, 
"id"))) {
+                               r.nextTag();
+                               event = r.getEventType();
+                               boolean isEmpty = (event == END_ELEMENT);
+                               // Skip until we find a start element, end 
document, or non-empty text.
+                               if (! isEmpty)
+                                       event = skipWs(r);
+                               if (event == END_DOCUMENT)
+                                       throw new 
XMLStreamException("Unexpected end of stream looking for data.", 
r.getLocation());
+                               return (event == CHARACTERS ? null : 
HtmlTag.forString(r.getName().getLocalPart(), false));
+                       }
+               }
+       }
+
        private static String getAttribute(XMLStreamReader r, String name, 
String def) {
                for (int i = 0; i < r.getAttributeCount(); i++)
                        if (r.getAttributeLocalName(i).equals(name))
@@ -327,10 +356,19 @@ public class HtmlParser extends XmlParser {
         * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
         */
        private Object[] parseArgs(HtmlParserSession session, XMLStreamReader 
r, ClassMeta<?>[] argTypes) throws Exception {
+               HtmlTag tag = HtmlTag.forEvent(r);
+
+               // Special case:
+               // Serializing args containing a single bean (or multiple beans 
of the same type) will end up serialized as a <table _type='array'>
+               if (tag == TABLE) {
+                       List<Object> l = (List<Object>)parseAnything(session, 
session.getClassMeta(List.class, argTypes[0]), r, session.getOuter(), true, 
null);
+                       return l.toArray(new Object[l.size()]);
+               }
+
                Object[] o = new Object[argTypes.length];
                int i = 0;
                while (true) {
-                       HtmlTag tag = nextTag(r, LI, xUL);
+                       tag = nextTag(r, LI, xUL);
                        if (tag == xUL)
                                break;
                        o[i] = parseAnything(session, argTypes[i], r, 
session.getOuter(), false, null);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/html/HtmlTag.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlTag.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlTag.java
index efa36e2..74a98ce 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlTag.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlTag.java
@@ -40,6 +40,8 @@ enum HtmlTag {
        FF(13,"<ff>"),          // formfeed
        BS(14,"<bs>"),          // backspace
        SP(17, "<sp>"),   // space
+       P(18, "<p>"),
+       HTML(19, "<html>"),
        xTABLE(-1,"</table>"),
        xTR(-2,"</tr>"),
        xTH(-3,"</th>"),
@@ -54,7 +56,9 @@ enum HtmlTag {
        xBR(-12,"</br>"),
        xFF(-13,"</ff>"),
        xBS(-14,"</bs>"),
-       xSP(-17, "</sp>");
+       xSP(-17, "</sp>"),
+       xP(-18, "</p>"),
+       xHTML(-19, "</html>");
 
        private Map<Integer,HtmlTag> cache = new HashMap<Integer,HtmlTag>();
 
@@ -121,6 +125,10 @@ enum HtmlTag {
                }
                else if (c == 'f')
                        t = (end ? xFF : FF);
+               else if (c == 'p')
+                       t = (end ? xP : P);
+               else if (c == 'h')
+                       t = (end ? xHTML : HTML);
                if (t == null)
                        throw new XMLStreamException("Unknown tag '"+tag+"' 
encountered");
                return t;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java 
b/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
index 4ba239f..39bf16b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
@@ -624,4 +624,45 @@ public final class ClassUtils {
 //     private Class<?> findClass(String name) throws ClassNotFoundException {
 //             return classLoader == null ? Class.forName(name) : 
Class.forName(name, true, classLoader);
 //     }
+
+       /**
+        * Returns a {@link MethodInfo} bean that describes the specified 
method.
+        * @param m The method to describe.
+        * @return The bean with information about the method.
+        */
+       public static MethodInfo getMethodInfo(Method m) {
+               return new MethodInfo(m);
+       }
+
+       /**
+        * Returns {@link MethodInfo} beans that describe the specified methods.
+        * @param m The methods to describe.
+        * @return The beans with information about the methods.
+        */
+       public static MethodInfo[] getMethodInfo(Collection<Method> m) {
+               MethodInfo[] mi = new MethodInfo[m.size()];
+               int i = 0;
+               for (Method mm : m)
+                       mi[i++] = getMethodInfo(mm);
+               return mi;
+       }
+
+       /**
+        * Simple bean that shows the name, parameter types, and return type of 
a method.
+        */
+       @SuppressWarnings("javadoc")
+       public static class MethodInfo {
+               public final String methodName;
+               public final String[] parameterTypes;
+               public final String returnType;
+
+               MethodInfo(Method m) {
+                       methodName = m.getName();
+                       Type[] pt = m.getGenericParameterTypes();
+                       parameterTypes = new String[pt.length];
+                       for (int i  = 0; i < pt.length; i++)
+                               parameterTypes[i] = 
BeanContext.DEFAULT.getClassMeta(pt[i]).toString();
+                       returnType = 
BeanContext.DEFAULT.getClassMeta(m.getGenericReturnType()).toString();
+               }
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
index ce4db63..77e0b9c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
@@ -196,7 +196,24 @@ public class MsgPackParser extends InputStreamParser {
                return (T)o;
        }
 
+       private Object[] parseArgs(MsgPackParserSession session, 
MsgPackInputStream is, ClassMeta<?>[] argTypes) throws Exception {
 
+               Object[] o = new Object[argTypes.length];
+               DataType dt = is.readDataType();
+               int length = (int)is.readLength();
+
+               if (dt != ARRAY)
+                       throw new ParseException("Expected ARRAY but was {0}", 
dt);
+               if (length != argTypes.length)
+                       throw new ParseException("Expected array length {0} but 
was {1}", argTypes.length, length);
+
+               for (int i = 0; i < length; i++)
+                       o[i] = parseAnything(session, argTypes[i], is, null, 
null);
+
+               return o;
+       }
+
+       
        
//--------------------------------------------------------------------------------
        // Entry point methods
        
//--------------------------------------------------------------------------------
@@ -213,4 +230,12 @@ public class MsgPackParser extends InputStreamParser {
                T o = parseAnything(s, type, is, s.getOuter(), null);
                return o;
        }
+
+       @Override /* ReaderParser */
+       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+               MsgPackParserSession s = (MsgPackParserSession)session;
+               MsgPackInputStream is = s.getInputStream();
+               Object[] a = parseArgs(s, is, argTypes);
+               return a;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java 
b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
index 53ec4c6..bb79146 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
@@ -272,6 +272,7 @@ public abstract class Parser extends CoreObject {
         *      <br>Ignored if the main type is not a map or collection.
         * @return The parsed object.
         * @throws ParseException If the input contains a syntax error or is 
malformed, or is not valid for the specified type.
+        * @see BeanSession#getClassMeta(Type,Type...) for argument syntax for 
maps and collections.
         */
        @SuppressWarnings("unchecked")
        public final <T> T parse(Object input, Type type, Type...args) throws 
ParseException {
@@ -288,11 +289,14 @@ public abstract class Parser extends CoreObject {
         *      ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
         *
         *      <jc>// Parse into a string.</jc>
-        *      MyBean b = p.parse(json, String.<jk>class</jk>);
+        *      String s = p.parse(json, String.<jk>class</jk>);
         *
         *      <jc>// Parse into a bean.</jc>
         *      MyBean b = p.parse(json, MyBean.<jk>class</jk>);
         *
+        *      <jc>// Parse into a bean array.</jc>
+        *      MyBean[] ba = p.parse(json, MyBean[].<jk>class</jk>);
+        *
         *      <jc>// Parse into a linked-list of objects.</jc>
         *      List l = p.parse(json, LinkedList.<jk>class</jk>);
         *
@@ -477,7 +481,6 @@ public abstract class Parser extends CoreObject {
         * @param argTypes Specifies the type of objects to create for each 
entry in the array.
         * @return An array of parsed objects.
         * @throws ParseException If the input contains a syntax error or is 
malformed, or is not valid for the specified type.
-        * @throws UnsupportedOperationException If not implemented.
         */
        public final Object[] parseArgs(Object input, ClassMeta<?>[] argTypes) 
throws ParseException {
                if (argTypes == null || argTypes.length == 0)
@@ -495,6 +498,29 @@ public abstract class Parser extends CoreObject {
        }
 
        /**
+        * Same as {@link #parseArgs(Object, ClassMeta[])} except allows you to 
pass in {@link Class} objects.
+        *
+        * @param input The input.  Subclasses can support different input 
types.
+        * @param argTypes Specifies the type of objects to create for each 
entry in the array.
+        * @return An array of parsed objects.
+        * @throws ParseException If the input contains a syntax error or is 
malformed, or is not valid for the specified type.
+        */
+       public final Object[] parseArgs(Object input, Type[] argTypes) throws 
ParseException {
+               if (argTypes == null || argTypes.length == 0)
+                       return new Object[0];
+               ParserSession session = createSession(input);
+               try {
+                       return doParseArgs(session, 
session.getClassMetas(argTypes));
+               } catch (ParseException e) {
+                       throw e;
+               } catch (Exception e) {
+                       throw new ParseException(session, e);
+               } finally {
+                       session.close();
+               }
+       }
+
+       /**
         * Implementation method.
         * Default implementation throws an {@link 
UnsupportedOperationException}.
         * @param session The runtime session object returned by {@link 
#createSession(Object, ObjectMap, Method, Object, Locale, TimeZone, MediaType)}.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
index 64f9253..ac44c84 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
@@ -36,6 +36,18 @@ public class ParserGroupBuilder {
        }
 
        /**
+        * Create an empty parser group using the specified property store for 
settings.
+        * <p>
+        * Note:  Modifying the specified property store externally will also 
modify it here.
+        *
+        * @param propertyStore The property store containing all settings 
common to all parsers in this group.
+        */
+       public ParserGroupBuilder(PropertyStore propertyStore) {
+               this.parsers = new ArrayList<Object>();
+               this.propertyStore = propertyStore;
+       }
+
+       /**
         * Clone an existing parser group builder.
         * @param copyFrom The parser group that we're copying settings and 
parsers from.
         */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
index b639358..5521a9d 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
@@ -36,6 +36,18 @@ public class SerializerGroupBuilder {
        }
 
        /**
+        * Create an empty serializer group using the specified property store 
for settings.
+        * <p>
+        * Note:  Modifying the specified property store externally will also 
modify it here.
+        *
+        * @param propertyStore The property store containing all settings 
common to all serializers in this group.
+        */
+       public SerializerGroupBuilder(PropertyStore propertyStore) {
+               this.serializers = new ArrayList<Object>();
+               this.propertyStore = propertyStore;
+       }
+
+       /**
         * Clone an existing serializer group builder.
         * @param copyFrom The serializer group that we're copying settings and 
serializers from.
         */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java 
b/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java
index b4ed5ea..817811d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java
@@ -125,6 +125,10 @@ public class UonParser extends ReaderParser {
                        else if (sType.isPrimitive())
                                o = sType.getPrimitiveDefault();
                        // Otherwise, leave null.
+               } else if (sType.isVoid()) {
+                       String s = parseString(session, r, isUrlParamValue);
+                       if (s != null)
+                               throw new ParseException(session, "Expected 
''null'' for void value, but was ''{0}''.", s);
                } else if (sType.isObject()) {
                        if (c == '(') {
                                ObjectMap m = new ObjectMap(session);
@@ -138,10 +142,12 @@ public class UonParser extends ReaderParser {
                                if (c != '\'') {
                                        if ("true".equals(s) || 
"false".equals(s))
                                                o = Boolean.valueOf(s);
-                                       else if (StringUtils.isNumeric(s))
-                                               o = StringUtils.parseNumber(s, 
Number.class);
-                                       else
-                                               o = s;
+                                       else if (! "null".equals(s)) {
+                                               if (StringUtils.isNumeric(s))
+                                                       o = 
StringUtils.parseNumber(s, Number.class);
+                                               else
+                                                       o = s;
+                                       }
                                } else {
                                        o = s;
                                }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
index f6de298..89d68ea 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
@@ -112,9 +112,9 @@ public class UrlEncodingParser extends UonParser {
                                o = session.cast(m, null, eType);
                        else if (m.containsKey("_value"))
                                o = session.convertToType(m.get("_value"), 
sType);
-                       else if (sType.isCollection()) {
+                       else if (sType.isCollection() || sType.isArray()) {
                                // ?1=foo&2=bar...
-                               Collection c2 = sType.canCreateNewInstance() ? 
(Collection)sType.newInstance() : new ObjectList(session);
+                               Collection c2 = (sType.isArray() || ! 
sType.canCreateNewInstance(outer)) ? new ObjectList(session) : 
(Collection)sType.newInstance();
                                Map<Integer,Object> t = new 
TreeMap<Integer,Object>();
                                for (Map.Entry<String,Object> e : m.entrySet()) 
{
                                        String k = e.getKey();
@@ -122,7 +122,7 @@ public class UrlEncodingParser extends UonParser {
                                                t.put(Integer.valueOf(k), 
session.convertToType(e.getValue(), sType.getElementType()));
                                }
                                c2.addAll(t.values());
-                               o = c2;
+                               o = (sType.isArray() ? ArrayUtils.toArray(c2, 
sType.getElementType().getInnerClass()) : c2);
                        } else {
                                if (sType.getNotABeanReason() != null)
                                        throw new ParseException(session, 
"Class ''{0}'' could not be instantiated as application/x-www-form-urlencoded.  
Reason: ''{1}''", sType, sType.getNotABeanReason());
@@ -413,18 +413,76 @@ public class UrlEncodingParser extends UonParser {
        }
 
        private Object[] parseArgs(UrlEncodingParserSession session, 
ParserReader r, ClassMeta<?>[] argTypes) throws Exception {
-               // TODO - This can be made more efficient.
-               ClassMeta<TreeMap<Integer,String>> cm = 
session.getClassMeta(TreeMap.class, Integer.class, String.class);
-               TreeMap<Integer,String> m = parseAnything(session, cm, r, 
session.getOuter());
-               Object[] vals = m.values().toArray(new Object[m.size()]);
-               if (vals.length != argTypes.length)
-                       throw new ParseException(session, "Argument lengths 
don't match.  vals={0}, argTypes={1}", vals.length, argTypes.length);
-               for (int i = 0; i < vals.length; i++) {
-                       String s = String.valueOf(vals[i]);
-                       vals[i] = super.parseAnything(session, argTypes[i], new 
UonReader(s, false), session.getOuter(), true, null);
+
+               int c = r.peekSkipWs();
+               if (c == '?')
+                       r.read();
+
+               Object[] vals = new Object[argTypes.length];
+
+               final int S1=1; // Looking for attrName start.
+               final int S2=2; // Found attrName end, looking for =.
+               final int S3=3; // Found =, looking for valStart.
+               final int S4=4; // Looking for & or end.
+               boolean isInEscape = false;
+
+               int state = S1;
+               Integer currIdx = 0;
+               while (c != -1) {
+                       c = r.read();
+                       if (! isInEscape) {
+                               if (state == S1) {
+                                       if (c == -1)
+                                               return vals;
+                                       r.unread();
+                                       Object attr = parseAttr(session, r, 
true);
+                                       currIdx = 
Integer.parseInt(attr.toString());
+                                       if (currIdx >= vals.length)
+                                               throw new 
ParseException(session, "Out-of-range index encountered.  args length={0}, 
index={1}", vals.length, currIdx);
+                                       state = S2;
+                                       c = 0; // Avoid isInEscape if c was '\'
+                               } else if (state == S2) {
+                                       if (c == '\u0002')
+                                               state = S3;
+                                       else if (c == -1 || c == '\u0001') {
+                                               vals[currIdx] = null;
+                                               if (c == -1)
+                                                       return vals;
+                                               state = S1;
+                                       }
+                               } else if (state == S3) {
+                                       if (c == -1 || c == '\u0001') {
+                                               vals[currIdx] = 
convertAttrToType(session, null, "", argTypes[currIdx]);
+                                               if (c == -1)
+                                                       return vals;
+                                               state = S1;
+                                       } else  {
+                                               // For performance, we bypass 
parseAnything for string values.
+                                               vals[currIdx] = 
argTypes[currIdx].isString() ? super.parseString(session, r.unread(), true) : 
super.parseAnything(session, argTypes[currIdx], r.unread(), null, true, null);
+
+                                               state = S4;
+                                               c = 0; // Avoid isInEscape if c 
was '\'
+                                       }
+                               } else if (state == S4) {
+                                       if (c == '\u0001')
+                                               state = S1;
+                                       else if (c == -1) {
+                                               return vals;
+                                       }
+                               }
+                       }
+                       isInEscape = (c == '\\' && ! isInEscape);
                }
+               if (state == S1)
+                       throw new ParseException(session, "Could not find 
attribute name on object.");
+               if (state == S2)
+                       throw new ParseException(session, "Could not find '=' 
following attribute name on object.");
+               if (state == S3)
+                       throw new ParseException(session, "Dangling '=' found 
in object entry");
+               if (state == S4)
+                       throw new ParseException(session, "Could not find end 
of object.");
 
-               return vals;
+               return null; // Unreachable.
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
index 665ff27..222ad7c 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
@@ -239,8 +239,9 @@ public class UrlEncodingSerializer extends UonSerializer {
                                serializeMap(session, out, (Map)o, sType);
                } else if (sType.isBean()) {
                        serializeBeanMap(session, out, session.toBeanMap(o), 
typeName);
-               } else if (sType.isCollection()) {
-                       serializeMap(session, out, 
getCollectionMap((Collection)o), session.getClassMeta(Map.class, Integer.class, 
sType.getElementType()));
+               } else if (sType.isCollection() || sType.isArray()) {
+                       Map m = sType.isCollection() ? 
getCollectionMap((Collection)o) : getCollectionMap(o);
+                       serializeCollectionMap(session, out, m, 
session.getClassMeta(Map.class, Integer.class, Object.class));
                } else {
                        // All other types can't be serialized as key/value 
pairs, so we create a
                        // mock key/value pair with a "_value" key.
@@ -252,6 +253,9 @@ public class UrlEncodingSerializer extends UonSerializer {
                return out;
        }
 
+       /**
+        * Converts a Collection into an integer-indexed map.
+        */
        private static Map<Integer,Object> getCollectionMap(Collection<?> c) {
                Map<Integer,Object> m = new TreeMap<Integer,Object>();
                int i = 0;
@@ -260,6 +264,16 @@ public class UrlEncodingSerializer extends UonSerializer {
                return m;
        }
 
+       /**
+        * Converts an array into an integer-indexed map.
+        */
+       private static Map<Integer,Object> getCollectionMap(Object array) {
+               Map<Integer,Object> m = new TreeMap<Integer,Object>();
+               for (int i = 0; i < Array.getLength(array); i++)
+                       m.put(i, Array.get(array, i));
+               return m;
+       }
+
        @SuppressWarnings({ "rawtypes", "unchecked" })
        private SerializerWriter serializeMap(UrlEncodingSerializerSession 
session, UonWriter out, Map m, ClassMeta<?> type) throws Exception {
 
@@ -270,13 +284,9 @@ public class UrlEncodingSerializer extends UonSerializer {
                int depth = session.getIndent();
                boolean addAmp = false;
 
-               Iterator mapEntries = m.entrySet().iterator();
-
-               while (mapEntries.hasNext()) {
-                       Map.Entry e = (Map.Entry) mapEntries.next();
-                       Object value = e.getValue();
+               for (Map.Entry e : (Set<Map.Entry>)m.entrySet()) {
                        Object key = session.generalize(e.getKey(), keyType);
-
+                       Object value = e.getValue();
 
                        if (session.shouldUseExpandedParams(value)) {
                                Iterator i = value instanceof Collection ? 
((Collection)value).iterator() : ArrayUtils.iterator(value);
@@ -299,6 +309,25 @@ public class UrlEncodingSerializer extends UonSerializer {
                return out;
        }
 
+       @SuppressWarnings({ "rawtypes", "unchecked" })
+       private SerializerWriter 
serializeCollectionMap(UrlEncodingSerializerSession session, UonWriter out, Map 
m, ClassMeta<?> type) throws Exception {
+
+               ClassMeta<?> valueType = type.getValueType();
+
+               int depth = session.getIndent();
+               boolean addAmp = false;
+
+               for (Map.Entry e : (Set<Map.Entry>)m.entrySet()) {
+                       if (addAmp)
+                               out.cr(depth).append('&');
+                       out.append(e.getKey()).append('=');
+                       super.serializeAnything(session, out, e.getValue(), 
valueType, null, null);
+                       addAmp = true;
+               }
+
+               return out;
+       }
+
        @SuppressWarnings({ "rawtypes" })
        private SerializerWriter serializeBeanMap(UrlEncodingSerializerSession 
session, UonWriter out, BeanMap<?> m, String typeName) throws Exception {
                int depth = session.getIndent();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-core/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/overview.html 
b/juneau-core/src/main/javadoc/overview.html
index 9a959d0..66952a8 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -5723,6 +5723,8 @@
                                <li>New {@link 
org.apache.juneau.svl.vars.SwitchVar $SWITCH} variable for switch block logic.
                                <li>Whitespace wasn't being ignored in some 
cases.
                        </ul>
+                       <li>{@link org.apache.juneau.html.HtmlParser} can now 
parse full body contents generated by {@link 
org.apache.juneau.html.HtmlDocSerializer}. 
+                       <li>Parse-args supported added to {@link 
org.apache.juneau.msgpack.MsgPackParser} to allow it to be used in remoteable 
proxies. 
                </ul>
                
                <h6 class='topic'>org.apache.juneau.rest</h6>
@@ -5772,11 +5774,44 @@
                        <li>{@link 
org.apache.juneau.rest.annotation.RestResource#stylesheet()} can now take in a 
comma-delimited list of stylesheet paths.
                        <li>{@link org.apache.juneau.rest.StreamResource} can 
now contain multiple sources from a variety of source types (e.g. 
<code><jk>byte</jk>[]</code> arrays, <code>InputStreams</code>, 
<code>Files</code>, etc...)
                                and is now immutable.  It also includes a new 
{@link org.apache.juneau.rest.StreamResource.Builder} class.
+                       <li>Simplified remoteable proxies using the 
<code><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</code> annotation on REST 
methods.
+                               Used to expose interface proxies without the 
need for {@link org.apache.juneau.rest.remoteable.RemoteableServlet}.
+                       <p class='bcode'>
+       <jc>// Server side</jc>
+       <ja>@RestMethod</ja>(name=<js>"PROXY"</js>, path=<js>"/myproxy/*"</js>)
+       <jk>public</jk> IAddressBook getProxy() {
+               <jk>return</jk> <jf>addressBook</jf>;
+       }
+
+       <jc>// Client side</jc>
+       RestClient client = <jk>new</jk> 
RestClientBuilder().rootUrl(<jf>samplesUrl</jf>).build();                      
+       IAddressBook ab = 
client.getRemoteableProxy(IAddressBook.<jk>class</jk>, 
<js>"/addressBook/myproxy"</js>);
+                       </p>
+                               See {@link 
org.apache.juneau.rest.annotation.RestMethod#name()} for more information.
+                       <li>{@link 
org.apache.juneau.rest.RestRequest#toString()} can be called at any time to 
view the headers and content of the request
+                               without affecting functionality.  Very useful 
for debugging.
                </ul>
 
                <h6 class='topic'>org.apache.juneau.rest.client</h6>
                <ul class='spaced-list'>
                        <li>Revamped the client API to use builders.
+                       <li>New methods added to {@link 
org.apache.juneau.rest.client.RestCall}:
+                       <ul>
+                               <li>{@link 
org.apache.juneau.rest.client.RestCall#serializer(Serializer)} - Override the 
serializer defined on the client for a single call.
+                               <li>{@link 
org.apache.juneau.rest.client.RestCall#parser(Parser)} - Override the parser 
defined on the client for a single call.
+                       </ul>
+                       <li>New methods added to {@link 
org.apache.juneau.rest.client.RestClient}:
+                       <ul>
+                               <li>{@link 
org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class,Object)} - 
For interface proxies defined using 
<code><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</code>.
+                               <li>{@link 
org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class,Object,Serializer,Parser)}
 - Same as above, but overrides the serializer and parser defined on the client.
+                       </ul>
+                       <li>New methods added to {@link 
org.apache.juneau.rest.client.RestClientBuilder}:
+                       <ul>
+                               <li>{@link 
org.apache.juneau.rest.client.RestClientBuilder#noTrace()} - Adds a 
<code>No-Trace: true</code> header on all requests to prevent
+                                       the servlet from logging errors.
+                                       Useful for testing scenarios when you 
don't want the console to end up showing errors done on purpose.
+                               <li>{@link 
org.apache.juneau.rest.client.RestClientBuilder#debug(boolean)} now adds a 
<code>Debug: true</code> header on all requests.
+                       </ul>
                </ul>
                
                <h6 class='topic'>org.apache.juneau.microservice</h6>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/AddressBook.java
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/AddressBook.java
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/AddressBook.java
index 28935df..ede24f2 100755
--- 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/AddressBook.java
+++ 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/AddressBook.java
@@ -35,6 +35,27 @@ public class AddressBook extends LinkedList<Person> 
implements IAddressBook {
        public AddressBook(URI uri) throws Exception {
                this.uri = uri;
        }
+       
+       @Override /* IAddressBook */
+       public void init() throws Exception {
+               clear();
+               createPerson(
+                       new CreatePerson(
+                               "Barack Obama",
+                               toCalendar("Aug 4, 1961"),
+                               new CreateAddress("1600 Pennsylvania Ave", 
"Washington", "DC", 20500, true),
+                               new CreateAddress("5046 S Greenwood Ave", 
"Chicago", "IL", 60615, false)
+                       )
+               );
+               createPerson(
+                       new CreatePerson(
+                               "George Walker Bush",
+                               toCalendar("Jul 6, 1946"),
+                               new CreateAddress("43 Prairie Chapel Rd", 
"Crawford", "TX", 76638, true),
+                               new CreateAddress("1600 Pennsylvania Ave", 
"Washington", "DC", 20500, false)
+                       )
+               );
+       }
 
        @Override /* IAddressBook */
        public List<Person> getPeople() {
@@ -97,6 +118,4 @@ public class AddressBook extends LinkedList<Person> 
implements IAddressBook {
                c.setTime(DateFormat.getDateInstance(DateFormat.MEDIUM, 
Locale.US).parse(birthDate));
                return c;
        }
-}
-
-
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/IAddressBook.java
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/IAddressBook.java
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/IAddressBook.java
index 570fe06..1c7431a 100755
--- 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/IAddressBook.java
+++ 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/IAddressBook.java
@@ -19,6 +19,9 @@ import java.util.*;
  * See {@link SampleRemoteableServlet}.
  */
 public interface IAddressBook {
+       
+       /** Initialize this address book with preset entries */
+       void init() throws Exception;
 
        /** Return all people in the address book */
        List<Person> getPeople();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
index b8a7a50..4a49a60 100644
--- 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
+++ 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.examples.rest.addressbook;
 
 import static javax.servlet.http.HttpServletResponse.*;
-import static org.apache.juneau.examples.addressbook.AddressBook.*;
 import static org.apache.juneau.html.HtmlDocSerializerContext.*;
 import static org.apache.juneau.jena.RdfCommonContext.*;
 import static org.apache.juneau.jena.RdfSerializerContext.*;
@@ -74,23 +73,8 @@ public class AddressBookResource extends ResourceJena {
                        // Create the address book
                        addressBook = new AddressBook(java.net.URI.create(""));
 
-                       // Add some people to our address book by default
-                       addressBook.createPerson(
-                               new CreatePerson(
-                                       "Barack Obama",
-                                       toCalendar("Aug 4, 1961"),
-                                       new CreateAddress("1600 Pennsylvania 
Ave", "Washington", "DC", 20500, true),
-                                       new CreateAddress("5046 S Greenwood 
Ave", "Chicago", "IL", 60615, false)
-                               )
-                       );
-                       addressBook.createPerson(
-                               new CreatePerson(
-                                       "George Walker Bush",
-                                       toCalendar("Jul 6, 1946"),
-                                       new CreateAddress("43 Prairie Chapel 
Rd", "Crawford", "TX", 76638, true),
-                                       new CreateAddress("1600 Pennsylvania 
Ave", "Washington", "DC", 20500, false)
-                               )
-                       );
+                       // Initialize it with some contents.
+                       addressBook.init();
 
                } catch (Exception e) {
                        throw new RuntimeException(e);
@@ -292,6 +276,15 @@ public class AddressBookResource extends ResourceJena {
        }
 
        /**
+        * [PROXY /*]
+        * Return a proxy interface to IAddressBook.
+        */
+       @RestMethod(name="PROXY", path="/proxy/*")
+       public IAddressBook getProxy() {
+               return addressBook;
+       }
+
+       /**
         * [OPTIONS /*]
         * View resource options
         */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9db2e03f/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
 
b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
index 5f3f602..8dfa7fd 100644
--- 
a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
+++ 
b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
@@ -258,4 +258,44 @@ public class AddressBookResourceTest extends RestTestcase {
                        assertObjectEquals("['B','r','ck Obama']", tokens);
                }
        }
+
+       
//====================================================================================================
+       // Interface proxy tests
+       
//====================================================================================================
+       @Test
+       public void testProxyInterface() throws Exception {
+
+               for (RestClient client : clients) {
+
+                       List<Person> people;
+
+                       IAddressBook ab = 
client.getRemoteableProxy(IAddressBook.class, "/addressBook/proxy");
+                               
+                       // Reinitialize the resource
+                       ab.init();
+
+                       // Simple GETs
+                       people = ab.getPeople();
+                       assertEquals("Barack Obama", people.get(0).name);
+                       assertEquals(76638, people.get(1).addresses.get(0).zip);
+
+                       // POST a person
+                       CreatePerson billClinton = new CreatePerson("Bill 
Clinton", AddressBook.toCalendar("Aug 19, 1946"),
+                               new CreateAddress("a3","b3","c3",3,false)
+                       );
+                       ab.createPerson(billClinton);
+                       people = ab.getPeople();
+                       assertEquals(3, people.size());
+                       Person p = people.get(2);
+                       assertEquals("Bill Clinton", p.name);
+
+                       // DELETE a person
+                       ab.removePerson(p.id);
+                       people = ab.getPeople();
+                       assertEquals(2, people.size());
+
+                       // Reinitialize the resource
+                       ab.init();
+               }
+       }
 }

Reply via email to