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(); + } + } }
