This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new 1e75ad9 Tests.
1e75ad9 is described below
commit 1e75ad92efd5dde6403caa38974e634c43ed13cb
Author: JamesBognar <[email protected]>
AuthorDate: Thu Jul 5 13:22:48 2018 -0400
Tests.
---
.../juneau/httppart/OpenApiPartParserTest.java | 840 +++++++++++++++++----
.../org/apache/juneau/testutils/TestUtils.java | 4 +
.../org/apache/juneau/httppart/HttpPartSchema.java | 82 +-
.../juneau/httppart/HttpPartSchemaBuilder.java | 27 +-
.../apache/juneau/httppart/OpenApiPartParser.java | 105 ++-
.../org/apache/juneau/uon/UonParserSession.java | 4 +-
6 files changed, 886 insertions(+), 176 deletions(-)
diff --git
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/httppart/OpenApiPartParserTest.java
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/httppart/OpenApiPartParserTest.java
index 1b5078b..6ab32fa 100644
---
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/httppart/OpenApiPartParserTest.java
+++
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/httppart/OpenApiPartParserTest.java
@@ -14,12 +14,14 @@ package org.apache.juneau.httppart;
import static org.junit.Assert.*;
import static org.apache.juneau.testutils.TestUtils.*;
+import static org.apache.juneau.internal.StringUtils.*;
import java.io.*;
import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.internal.*;
+import org.apache.juneau.json.*;
import org.junit.*;
public class OpenApiPartParserTest {
@@ -32,13 +34,13 @@ public class OpenApiPartParserTest {
@Test
public void a01_inputValidations_nullInput() throws Exception {
- HttpPartSchema s = HttpPartSchema.create().build();
+ HttpPartSchema s = schema().build();
assertNull(p.parse(s, null, String.class));
- s = HttpPartSchema.create().required(false).build();
+ s = schema().required(false).build();
assertNull(p.parse(s, null, String.class));
- s = HttpPartSchema.create().required().build();
+ s = schema().required().build();
try {
p.parse(s, null, String.class);
fail();
@@ -46,7 +48,7 @@ public class OpenApiPartParserTest {
assertEquals("No value specified.", e.getMessage());
}
- s = HttpPartSchema.create().required(true).build();
+ s = schema().required(true).build();
try {
p.parse(s, null, String.class);
fail();
@@ -58,13 +60,13 @@ public class OpenApiPartParserTest {
@Test
public void a02_inputValidations_emptyInput() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().allowEmptyValue().build();
+ HttpPartSchema s = schema().allowEmptyValue().build();
assertEquals("", p.parse(s, "", String.class));
- s = HttpPartSchema.create().allowEmptyValue().build();
+ s = schema().allowEmptyValue().build();
assertEquals("", p.parse(s, "", String.class));
- s = HttpPartSchema.create().allowEmptyValue(false).build();
+ s = schema().allowEmptyValue(false).build();
try {
p.parse(s, "", String.class);
fail();
@@ -84,7 +86,7 @@ public class OpenApiPartParserTest {
@Test
public void a03_inputValidations_pattern() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().pattern("x.*").allowEmptyValue().build();
+ HttpPartSchema s =
schema().pattern("x.*").allowEmptyValue().build();
assertEquals("x", p.parse(s, "x", String.class));
assertEquals("xx", p.parse(s, "xx", String.class));
assertEquals(null, p.parse(s, null, String.class));
@@ -104,15 +106,15 @@ public class OpenApiPartParserTest {
}
// Blank/null patterns are ignored.
- s =
HttpPartSchema.create().pattern("").allowEmptyValue().build();
+ s = schema().pattern("").allowEmptyValue().build();
assertEquals("x", p.parse(s, "x", String.class));
- s =
HttpPartSchema.create().pattern(null).allowEmptyValue().build();
+ s = schema().pattern(null).allowEmptyValue().build();
assertEquals("x", p.parse(s, "x", String.class));
}
@Test
public void a04_inputValidations_enum() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create()._enum("foo").allowEmptyValue().build();
+ HttpPartSchema s =
schema()._enum("foo").allowEmptyValue().build();
assertEquals("foo", p.parse(s, "foo", String.class));
assertEquals(null, p.parse(s, null, String.class));
@@ -131,18 +133,18 @@ public class OpenApiPartParserTest {
assertEquals("Value does not match one of the expected
values. Must be one of the following: ['foo']", e.getMessage());
}
- s = HttpPartSchema.create()._enum((Set<String>)null).build();
+ s = schema()._enum((Set<String>)null).build();
assertEquals("foo", p.parse(s, "foo", String.class));
- s =
HttpPartSchema.create()._enum((Set<String>)null).allowEmptyValue().build();
+ s = schema()._enum((Set<String>)null).allowEmptyValue().build();
assertEquals("foo", p.parse(s, "foo", String.class));
- s = HttpPartSchema.create()._enum("foo","foo").build();
+ s = schema()._enum("foo","foo").build();
assertEquals("foo", p.parse(s, "foo", String.class));
}
@Test
public void a05_inputValidations_minMaxLength() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().minLength(1l).maxLength(2l).allowEmptyValue().build();
+ HttpPartSchema s =
schema().minLength(1l).maxLength(2l).allowEmptyValue().build();
assertEquals(null, p.parse(s, null, String.class));
assertEquals("1", p.parse(s, "1", String.class));
@@ -163,21 +165,21 @@ public class OpenApiPartParserTest {
}
try {
- s =
HttpPartSchema.create().minLength(2l).maxLength(1l).build();
+ s = schema().minLength(2l).maxLength(1l).build();
fail();
} catch (Exception e) {
assertTrue(e.getMessage().contains("maxLength cannot be
less than minLength."));
}
try {
- s = HttpPartSchema.create().minLength(-1l).build();
+ s = schema().minLength(-1l).build();
fail();
} catch (Exception e) {
assertTrue(e.getMessage().contains("minLength cannot be
less than zero."));
}
try {
- s = HttpPartSchema.create().maxLength(-1l).build();
+ s = schema().maxLength(-1l).build();
fail();
} catch (Exception e) {
assertTrue(e.getMessage().contains("maxLength cannot be
less than zero."));
@@ -213,23 +215,32 @@ public class OpenApiPartParserTest {
// type = string
//-----------------------------------------------------------------------------------------------------------------
- @Test
- public void c01_stringType_simple() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("string").build();
- assertEquals("foo", p.parse(s, "foo", String.class));
+ public static class C1 {
+ private String f;
+ public C1(byte[] b) {
+ f = "C1-" + new String(b);
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
}
- @Test
- public void c02_stringType_default() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("string")._default("x").build();
- assertEquals("foo", p.parse(s, "foo", String.class));
- assertEquals("x", p.parse(s, null, String.class));
+ public static class C2 {
+ private String f;
+ public C2(String s) {
+ f = "C2-" + s;
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
}
public static class C3 {
private String f;
- public C3(byte[] b) {
- f = new String(b);
+ public C3(String[] in) {
+ f = "C3-" + JsonSerializer.DEFAULT_LAX.toString(in);
}
@Override
public String toString() {
@@ -237,39 +248,53 @@ public class OpenApiPartParserTest {
}
}
+
+ @Test
+ public void c01_stringType_simple() throws Exception {
+ HttpPartSchema s = schema("string").build();
+ assertEquals("foo", p.parse(s, "foo", String.class));
+ }
+
+ @Test
+ public void c02_stringType_default() throws Exception {
+ HttpPartSchema s = schema("string")._default("x").build();
+ assertEquals("foo", p.parse(s, "foo", String.class));
+ assertEquals("x", p.parse(s, null, String.class));
+ }
+
@Test
public void c03_stringType_byteFormat() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("string").format("byte").build();
- String in = StringUtils.base64Encode("foo".getBytes());
+ HttpPartSchema s = schema("string", "byte").build();
+ String in = base64Encode("foo".getBytes());
assertEquals("foo", p.parse(s, in, String.class));
assertEquals("foo", IOUtils.read(p.parse(s, in,
InputStream.class)));
assertEquals("foo", IOUtils.read(p.parse(s, in, Reader.class)));
- assertEquals("foo", p.parse(s, in, C3.class).toString());
+ assertEquals("C1-foo", p.parse(s, in, C1.class).toString());
}
@Test
public void c04_stringType_binaryFormat() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("string").format("binary").build();
- String in = StringUtils.toHex("foo".getBytes());
+ HttpPartSchema s = schema("string", "binary").build();
+ String in = toHex("foo".getBytes());
assertEquals("foo", p.parse(s, in, String.class));
assertEquals("foo", IOUtils.read(p.parse(s, in,
InputStream.class)));
assertEquals("foo", IOUtils.read(p.parse(s, in, Reader.class)));
- assertEquals("foo", p.parse(s, in, C3.class).toString());
+ assertEquals("C1-foo", p.parse(s, in, C1.class).toString());
}
@Test
public void c05_stringType_binarySpacedFormat() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("string").format("binary-spaced").build();
- String in = StringUtils.toSpacedHex("foo".getBytes());
+ HttpPartSchema s = schema("string", "binary-spaced").build();
+ String in = toSpacedHex("foo".getBytes());
assertEquals("foo", p.parse(s, in, String.class));
assertEquals("foo", IOUtils.read(p.parse(s, in,
InputStream.class)));
assertEquals("foo", IOUtils.read(p.parse(s, in, Reader.class)));
- assertEquals("foo", p.parse(s, in, C3.class).toString());
+ assertEquals("C1-foo", p.parse(s, in, C1.class).toString());
}
@Test
public void c06_stringType_dateFormat() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("string").format("date").build();
+ HttpPartSchema s = schema("string", "date").build();
String in = "2012-12-21";
assertTrue(p.parse(s, in, String.class).contains("2012"));
assertTrue(p.parse(s, in,
Date.class).toString().contains("2012"));
@@ -279,7 +304,7 @@ public class OpenApiPartParserTest {
@Test
public void c07_stringType_dateTimeFormat() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("string").format("date-time").build();
+ HttpPartSchema s = schema("string", "date-time").build();
String in = "2012-12-21T12:34:56.789";
assertTrue(p.parse(s, in, String.class).contains("2012"));
assertTrue(p.parse(s, in,
Date.class).toString().contains("2012"));
@@ -287,35 +312,56 @@ public class OpenApiPartParserTest {
assertEquals(2012, p.parse(s, in,
GregorianCalendar.class).get(Calendar.YEAR));
}
- public static class C8 {
- private String f;
- public C8(String s) {
- f = s;
- }
- @Override
- public String toString() {
- return f;
- }
- }
-
@Test
public void c08_stringType_uonFormat() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("string").format("uon").build();
+ HttpPartSchema s = schema("string", "uon").build();
assertEquals("foo", p.parse(s, "foo", String.class));
assertEquals("foo", p.parse(s, "'foo'", String.class));
- assertEquals("foo", p.parse(s, "'foo'", C8.class).toString());
- assertEquals("C8", p.parse(s, "'foo'",
C8.class).getClass().getSimpleName());
+ assertEquals("C2-foo", p.parse(s, "'foo'",
C2.class).toString());
// UonPartParserTest should handle all other cases.
}
@Test
- public void c08_stringType_noneFormat() throws Exception {
+ public void c09_stringType_noneFormat() throws Exception {
// If no format is specified, then we should transform directly
from a string.
- HttpPartSchema s =
HttpPartSchema.create().type("string").build();
+ HttpPartSchema s = schema("string").build();
assertEquals("foo", p.parse(s, "foo", String.class));
assertEquals("'foo'", p.parse(s, "'foo'", String.class));
- assertEquals("foo", p.parse(s, "foo", C8.class).toString());
- assertEquals("C8", p.parse(s, "foo",
C8.class).getClass().getSimpleName());
+ assertEquals("C2-foo", p.parse(s, "foo", C2.class).toString());
+ }
+
+ @Test
+ public void c10_stringType_noneFormat_2d() throws Exception {
+ HttpPartSchema s =
schema("array").items(schema("string")).build();
+ assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
String[].class));
+ assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
List.class, String.class));
+ assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
Object[].class));
+ assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
List.class, Object.class));
+ Object o = p.parse(s, "foo,bar", Object.class);
+ assertObjectEquals("['foo','bar']", o);
+ assertClass(ObjectList.class, o);
+ assertObjectEquals("['C2-foo','C2-bar']", p.parse(s, "foo,bar",
C2[].class));
+ assertObjectEquals("['C2-foo','C2-bar']", p.parse(s, "foo,bar",
List.class, C2.class));
+ assertEquals("C3-['foo','bar']", p.parse(s, "foo,bar",
C3.class).toString());
+ }
+
+ @Test
+ public void c11_stringType_noneFormat_3d() throws Exception {
+ HttpPartSchema s =
schema("array").collectionFormat("pipes").items(schema("array").items(schema("string"))).build();
+ assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s,
"foo,bar|baz", String[][].class));
+ assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s,
"foo,bar|baz", List.class, String[].class));
+ assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s,
"foo,bar|baz", List.class, List.class, String.class));
+ assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s,
"foo,bar|baz", Object[][].class));
+ assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s,
"foo,bar|baz", List.class, Object[].class));
+ assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s,
"foo,bar|baz", List.class, List.class, Object.class));
+ Object o = p.parse(s, "foo,bar|baz", Object.class);
+ assertObjectEquals("[['foo','bar'],['baz']]", o);
+ assertClass(ObjectList.class, o);
+ assertObjectEquals("[['C2-foo','C2-bar'],['C2-baz']]",
p.parse(s, "foo,bar|baz", C2[][].class));
+ assertObjectEquals("[['C2-foo','C2-bar'],['C2-baz']]",
p.parse(s, "foo,bar|baz", List.class, C2[].class));
+ assertObjectEquals("[['C2-foo','C2-bar'],['C2-baz']]",
p.parse(s, "foo,bar|baz", List.class, List.class, C2.class));
+
assertObjectEquals("['C3-[\\'foo\\',\\'bar\\']','C3-[\\'baz\\']']", p.parse(s,
"foo,bar|baz", C3[].class));
+
assertObjectEquals("['C3-[\\'foo\\',\\'bar\\']','C3-[\\'baz\\']']", p.parse(s,
"foo,bar|baz", List.class, C3.class));
}
//-----------------------------------------------------------------------------------------------------------------
@@ -325,7 +371,7 @@ public class OpenApiPartParserTest {
public static class D {
private String f;
public D(String in) {
- this.f = in;
+ this.f = "D-" + in;
}
@Override
public String toString() {
@@ -335,121 +381,121 @@ public class OpenApiPartParserTest {
@Test
public void d01_arrayType_collectionFormatCsv() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("csv").build();
+ HttpPartSchema s =
schema("array").collectionFormat("csv").build();
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
String[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
Object[].class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
D[].class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo,bar",
D[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
List.class, String.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
List.class, Object.class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
List.class, D.class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo,bar",
List.class, D.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
Object.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
ObjectList.class));
}
@Test
public void d02_arrayType_collectionFormatPipes() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("pipes").build();
+ HttpPartSchema s =
schema("array").collectionFormat("pipes").build();
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar",
String[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar",
Object[].class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar",
D[].class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo|bar",
D[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar",
List.class, String.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar",
List.class, Object.class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar",
List.class, D.class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo|bar",
List.class, D.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar",
Object.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar",
ObjectList.class));
}
@Test
public void d03_arrayType_collectionFormatSsv() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("ssv").build();
+ HttpPartSchema s =
schema("array").collectionFormat("ssv").build();
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar",
String[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar",
Object[].class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo bar",
D[].class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo bar",
D[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar",
List.class, String.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar",
List.class, Object.class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo bar",
List.class, D.class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo bar",
List.class, D.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar",
Object.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar",
ObjectList.class));
}
@Test
public void d04_arrayType_collectionFormatTsv() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("tsv").build();
+ HttpPartSchema s =
schema("array").collectionFormat("tsv").build();
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar",
String[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar",
Object[].class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar",
D[].class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo\tbar",
D[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar",
List.class, String.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar",
List.class, Object.class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar",
List.class, D.class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo\tbar",
List.class, D.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar",
Object.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar",
ObjectList.class));
}
@Test
public void d05_arrayType_collectionFormatUon() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("uon").build();
+ HttpPartSchema s =
schema("array").collectionFormat("uon").build();
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
String[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
Object[].class));
- assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
D[].class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s,
"@(foo,bar)", D[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
List.class, String.class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
List.class, Object.class));
- assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
List.class, D.class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s,
"@(foo,bar)", List.class, D.class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
Object.class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
ObjectList.class));
}
@Test
public void d06a_arrayType_collectionFormatNone() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").build();
+ HttpPartSchema s = schema("array").build();
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
String[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
Object[].class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
D[].class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo,bar",
D[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
List.class, String.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
List.class, Object.class));
- assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
List.class, D.class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo,bar",
List.class, D.class));
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar",
Object.class));
}
@Test
public void d06b_arrayType_collectionFormatNone_autoDetectUon() throws
Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").build();
+ HttpPartSchema s = schema("array").build();
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
String[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
Object[].class));
- assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
D[].class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s,
"@(foo,bar)", D[].class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
List.class, String.class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
List.class, Object.class));
- assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
List.class, D.class));
+ assertObjectEquals("['D-foo','D-bar']", p.parse(s,
"@(foo,bar)", List.class, D.class));
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)",
Object.class));
}
@Test
public void d07_arrayType_collectionFormatMulti() throws Exception {
// collectionFormat=multi should not do any sort of splitting.
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("multi").build();
+ HttpPartSchema s =
schema("array").collectionFormat("multi").build();
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar",
String[].class));
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar",
Object[].class));
- assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar",
D[].class));
+ assertObjectEquals("['D-foo,bar']", p.parse(s, "foo,bar",
D[].class));
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar",
List.class, String.class));
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar",
List.class, Object.class));
- assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar",
List.class, D.class));
+ assertObjectEquals("['D-foo,bar']", p.parse(s, "foo,bar",
List.class, D.class));
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar",
Object.class));
}
@Test
public void d08_arrayType_collectionFormatCsvAndPipes() throws
Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("pipes").items(HttpPartSchema.create().type("array").collectionFormat("csv")).build();
+ HttpPartSchema s =
schema("array").collectionFormat("pipes").items(schema("array").collectionFormat("csv")).build();
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s,
"foo,bar|baz,qux", String[][].class));
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s,
"foo,bar|baz,qux", Object[][].class));
- assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s,
"foo,bar|baz,qux", D[][].class));
+ assertObjectEquals("[['D-foo','D-bar'],['D-baz','D-qux']]",
p.parse(s, "foo,bar|baz,qux", D[][].class));
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s,
"foo,bar|baz,qux", List.class, List.class, String.class));
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s,
"foo,bar|baz,qux", List.class, List.class, Object.class));
- assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s,
"foo,bar|baz,qux", List.class, List.class, D.class));
+ assertObjectEquals("[['D-foo','D-bar'],['D-baz','D-qux']]",
p.parse(s, "foo,bar|baz,qux", List.class, List.class, D.class));
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s,
"foo,bar|baz,qux", Object.class));
}
@Test
public void d09_arrayType_itemsInteger() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("csv").items(HttpPartSchema.create().type("integer")).build();
+ HttpPartSchema s =
schema("array").collectionFormat("csv").items(schema("integer")).build();
assertObjectEquals("[1,2]", p.parse(s, "1,2", int[].class));
assertObjectEquals("[1,2]", p.parse(s, "1,2", Integer[].class));
assertObjectEquals("[1,2]", p.parse(s, "1,2", Object[].class));
@@ -462,110 +508,624 @@ public class OpenApiPartParserTest {
// type = boolean
//-----------------------------------------------------------------------------------------------------------------
+ public static class E1 {
+ private String f;
+ public E1(Boolean in) {
+ this.f = "E1-" + in.toString();
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ public static class E2 {
+ private String f;
+ public E2(Boolean[] in) {
+ this.f = "E2-" +
JsonSerializer.DEFAULT_LAX.toString(in);
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
@Test
public void e01_booleanType() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("boolean").build();
+ HttpPartSchema s = schema("boolean").build();
assertEquals(true, p.parse(s, "true", boolean.class));
assertEquals(true, p.parse(s, "true", Boolean.class));
assertEquals(true, p.parse(s, "True", boolean.class));
assertEquals(true, p.parse(s, "TRUE", boolean.class));
assertEquals("true", p.parse(s, "true", String.class));
assertEquals(true, p.parse(s, "true", Object.class));
+ assertObjectEquals("'E1-true'", p.parse(s, "true", E1.class));
}
@Test
public void e02_booleanType_2d() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").items(HttpPartSchema.create().type("boolean")).build();
+ HttpPartSchema s =
schema("array").items(schema("boolean")).build();
assertObjectEquals("[true,true]", p.parse(s, "true,true",
boolean[].class));
assertObjectEquals("[true,true]", p.parse(s, "true,true",
Boolean[].class));
assertObjectEquals("[true,true]", p.parse(s, "true,true",
List.class, Boolean.class));
- assertObjectEquals("[true,true]", p.parse(s, "True,true",
boolean[].class));
- assertObjectEquals("[true,true]", p.parse(s, "TRUE,true",
boolean[].class));
assertObjectEquals("['true','true']", p.parse(s, "true,true",
String[].class));
assertObjectEquals("['true','true']", p.parse(s, "true,true",
List.class, String.class));
assertObjectEquals("[true,true]", p.parse(s, "true,true",
Object[].class));
assertObjectEquals("[true,true]", p.parse(s, "true,true",
List.class, Object.class));
+ assertObjectEquals("['E1-true','E1-true']", p.parse(s,
"true,true", E1[].class));
+ assertObjectEquals("['E1-true','E1-true']", p.parse(s,
"true,true", List.class, E1.class));
+ assertObjectEquals("'E2-[true,true]'", p.parse(s, "true,true",
E2.class));
+
+ assertObjectEquals("[true,true]", p.parse(s, "True,true",
boolean[].class));
+ assertObjectEquals("[true,true]", p.parse(s, "TRUE,true",
boolean[].class));
}
@Test
public void e03_booleanType_3d() throws Exception {
- HttpPartSchema s =
HttpPartSchema.create().type("array").collectionFormat("pipes").items(HttpPartSchema.create().type("array").items(HttpPartSchema.create().type("boolean"))).build();
+ HttpPartSchema s =
schema("array").collectionFormat("pipes").items(schema("array").items(schema("boolean"))).build();
assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", boolean[][].class));
assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", List.class, boolean[].class));
assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", Boolean[][].class));
- assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", List.class, List.class, Boolean.class));
assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", List.class, Boolean[].class));
- assertObjectEquals("[[true,true],[false]]", p.parse(s,
"True,true|false", boolean[][].class));
- assertObjectEquals("[[true,true],[false]]", p.parse(s,
"TRUE,true|false", boolean[][].class));
+ assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", List.class, List.class, Boolean.class));
assertObjectEquals("[['true','true'],['false']]", p.parse(s,
"true,true|false", String[][].class));
assertObjectEquals("[['true','true'],['false']]", p.parse(s,
"true,true|false", List.class, List.class, String.class));
assertObjectEquals("[['true','true'],['false']]", p.parse(s,
"true,true|false", List.class, String[].class));
assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", Object[][].class));
assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", List.class, List.class, Object.class));
assertObjectEquals("[[true,true],[false]]", p.parse(s,
"true,true|false", List.class, Object[].class));
+ assertObjectEquals("[['E1-true','E1-true'],['E1-false']]",
p.parse(s, "true,true|false", E1[][].class));
+ assertObjectEquals("[['E1-true','E1-true'],['E1-false']]",
p.parse(s, "true,true|false", List.class, List.class, E1.class));
+ assertObjectEquals("[['E1-true','E1-true'],['E1-false']]",
p.parse(s, "true,true|false", List.class, E1[].class));
+ assertObjectEquals("['E2-[true,true]','E2-[false]']",
p.parse(s, "true,true|false", E2[].class));
+ assertObjectEquals("['E2-[true,true]','E2-[false]']",
p.parse(s, "true,true|false", List.class, E2.class));
+
+ assertObjectEquals("[[true,true],[false]]", p.parse(s,
"True,true|false", boolean[][].class));
+ assertObjectEquals("[[true,true],[false]]", p.parse(s,
"TRUE,true|false", boolean[][].class));
}
//-----------------------------------------------------------------------------------------------------------------
// type = integer
//-----------------------------------------------------------------------------------------------------------------
+ public static class F1 {
+ private String f;
+ public F1(Integer in) {
+ this.f = "F1-" + in.toString();
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ public static class F2 {
+ private String f;
+ public F2(Integer[] in) {
+ this.f = "F2-" +
JsonSerializer.DEFAULT_LAX.toString(in);
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ public static class F3 {
+ private String f;
+ public F3(Long in) {
+ this.f = "F3-" + in.toString();
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ public static class F4 {
+ private String f;
+ public F4(Long[] in) {
+ this.f = "F4-" +
JsonSerializer.DEFAULT_LAX.toString(in);
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ @Test
+ public void f01_integerType_int32() throws Exception {
+ HttpPartSchema s = schema("integer", "int32").build();
+ assertObjectEquals("1", p.parse(s, "1", int.class));
+ assertObjectEquals("1", p.parse(s, "1", Integer.class));
+ assertObjectEquals("1", p.parse(s, "1", short.class));
+ assertObjectEquals("1", p.parse(s, "1", Short.class));
+ assertObjectEquals("1", p.parse(s, "1", long.class));
+ assertObjectEquals("1", p.parse(s, "1", Long.class));
+ assertObjectEquals("'1'", p.parse(s, "1", String.class));
+ Object o = p.parse(s, "1", Object.class);
+ assertObjectEquals("1", o);
+ assertClass(Integer.class, o);
+ assertObjectEquals("'F1-1'", p.parse(s, "1", F1.class));
+ }
+
+ @Test
+ public void f02_integerType_int32_2d() throws Exception {
+ HttpPartSchema s = schema("array").items(schema("integer",
"int32")).build();
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", int[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", Integer[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class,
Integer.class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", short[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", Short[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class,
Short.class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", long[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", Long[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class,
Long.class));
+ assertObjectEquals("['1','2']", p.parse(s, "1,2",
String[].class));
+ assertObjectEquals("['1','2']", p.parse(s, "1,2", List.class,
String.class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", Object[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class,
Object.class));
+ assertObjectEquals("['F1-1','F1-2']", p.parse(s, "1,2",
F1[].class));
+ assertObjectEquals("['F1-1','F1-2']", p.parse(s, "1,2",
List.class, F1.class));
+ assertObjectEquals("'F2-[1,2]'", p.parse(s, "1,2", F2.class));
+ }
+
+ @Test
+ public void f03_integerType_int32_3d() throws Exception {
+ HttpPartSchema s =
schema("array").collectionFormat("pipes").items(schema("array").items(schema("integer",
"int32"))).build();
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
int[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, int[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
Integer[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, Integer[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, List.class, Integer.class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
short[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, short[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
Short[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, Short[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, List.class, Short.class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
long[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, long[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
Long[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, Long[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, List.class, Long.class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
String[][].class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
List.class, String[].class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
List.class, List.class, String.class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
Object[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, Object[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, List.class, Object.class));
+ assertObjectEquals("[['F1-1','F1-2'],['F1-3']]", p.parse(s,
"1,2|3", F1[][].class));
+ assertObjectEquals("[['F1-1','F1-2'],['F1-3']]", p.parse(s,
"1,2|3", List.class, F1[].class));
+ assertObjectEquals("[['F1-1','F1-2'],['F1-3']]", p.parse(s,
"1,2|3", List.class, List.class, F1.class));
+ assertObjectEquals("['F2-[1,2]','F2-[3]']", p.parse(s, "1,2|3",
F2[].class));
+ assertObjectEquals("['F2-[1,2]','F2-[3]']", p.parse(s, "1,2|3",
List.class, F2.class));
+ }
+
+ @Test
+ public void f04_integerType_int64() throws Exception {
+ HttpPartSchema s = schema("integer", "int64").build();
+ assertObjectEquals("1", p.parse(s, "1", int.class));
+ assertObjectEquals("1", p.parse(s, "1", Integer.class));
+ assertObjectEquals("1", p.parse(s, "1", short.class));
+ assertObjectEquals("1", p.parse(s, "1", Short.class));
+ assertObjectEquals("1", p.parse(s, "1", long.class));
+ assertObjectEquals("1", p.parse(s, "1", Long.class));
+ assertObjectEquals("'1'", p.parse(s, "1", String.class));
+ Object o = p.parse(s, "1", Object.class);
+ assertObjectEquals("1", o);
+ assertClass(Long.class, o);
+ assertObjectEquals("'F3-1'", p.parse(s, "1", F3.class));
+ }
+
+ @Test
+ public void f05_integerType_int64_2d() throws Exception {
+ HttpPartSchema s = schema("array").items(schema("integer",
"int64")).build();
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", int[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", Integer[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class,
Integer.class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", short[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", Short[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class,
Short.class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", long[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", Long[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class,
Long.class));
+ assertObjectEquals("['1','2']", p.parse(s, "1,2",
String[].class));
+ assertObjectEquals("['1','2']", p.parse(s, "1,2", List.class,
String.class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", Object[].class));
+ assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class,
Object.class));
+ assertObjectEquals("['F3-1','F3-2']", p.parse(s, "1,2",
F3[].class));
+ assertObjectEquals("['F3-1','F3-2']", p.parse(s, "1,2",
List.class, F3.class));
+ assertObjectEquals("'F4-[1,2]'", p.parse(s, "1,2", F4.class));
+ }
+
+ @Test
+ public void f06_integerType_int64_3d() throws Exception {
+ HttpPartSchema s =
schema("array").collectionFormat("pipes").items(schema("array").items(schema("integer",
"int64"))).build();
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
int[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, int[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
Integer[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, Integer[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, List.class, Integer.class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
short[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, short[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
Short[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, Short[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, List.class, Short.class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
long[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, long[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
Long[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, Long[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, List.class, Long.class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
String[][].class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
List.class, String[].class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
List.class, List.class, String.class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
Object[][].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, Object[].class));
+ assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3",
List.class, List.class, Object.class));
+ assertObjectEquals("[['F3-1','F3-2'],['F3-3']]", p.parse(s,
"1,2|3", F3[][].class));
+ assertObjectEquals("[['F3-1','F3-2'],['F3-3']]", p.parse(s,
"1,2|3", List.class, F3[].class));
+ assertObjectEquals("[['F3-1','F3-2'],['F3-3']]", p.parse(s,
"1,2|3", List.class, List.class, F3.class));
+ assertObjectEquals("['F4-[1,2]','F4-[3]']", p.parse(s, "1,2|3",
F4[].class));
+ assertObjectEquals("['F4-[1,2]','F4-[3]']", p.parse(s, "1,2|3",
List.class, F4.class));
+ }
-// case INTEGER: {
-// if (type.isObject()) {
-// switch (schema.getFormat()) {
-// case INT64:
-// type =
(ClassMeta<T>)getClassMeta(Long.class);
-// break;
-// default:
-// type =
(ClassMeta<T>)getClassMeta(Integer.class);
-//
-// }
-// }
-// return super.parse(partType, schema,
in, type);
-// }
//-----------------------------------------------------------------------------------------------------------------
// type = number
//-----------------------------------------------------------------------------------------------------------------
-// case NUMBER: {
-// if (type.isObject()) {
-// switch (schema.getFormat()) {
-// case DOUBLE:
-// type =
(ClassMeta<T>)getClassMeta(Double.class);
-// break;
-// default:
-// type =
(ClassMeta<T>)getClassMeta(Float.class);
-// }
-// }
-// return super.parse(partType, schema,
in, type);
-// }
+
+ public static class G1 {
+ private String f;
+ public G1(Float in) {
+ this.f = "G1-" + in.toString();
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ public static class G2 {
+ private String f;
+ public G2(Float[] in) {
+ this.f = "G2-" +
JsonSerializer.DEFAULT_LAX.toString(in);
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ public static class G3 {
+ private String f;
+ public G3(Double in) {
+ this.f = "G3-" + in.toString();
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ public static class G4 {
+ private String f;
+ public G4(Double[] in) {
+ this.f = "G4-" +
JsonSerializer.DEFAULT_LAX.toString(in);
+ }
+ @Override
+ public String toString() {
+ return f;
+ }
+ }
+
+ @Test
+ public void g01_numberType_float() throws Exception {
+ HttpPartSchema s = schema("number", "float").build();
+ assertObjectEquals("1.0", p.parse(s, "1", float.class));
+ assertObjectEquals("1.0", p.parse(s, "1", Float.class));
+ assertObjectEquals("1.0", p.parse(s, "1", double.class));
+ assertObjectEquals("1.0", p.parse(s, "1", Double.class));
+ assertObjectEquals("'1'", p.parse(s, "1", String.class));
+ Object o = p.parse(s, "1", Object.class);
+ assertObjectEquals("1.0",o);
+ assertClass(Float.class, o);
+ assertObjectEquals("'G1-1.0'", p.parse(s, "1", G1.class));
+ }
+
+ @Test
+ public void g02_numberType_float_2d() throws Exception {
+ HttpPartSchema s = schema("array").items(schema("number",
"float")).build();
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
float[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
Float[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class,
Float.class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
double[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
Double[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class,
Double.class));
+ assertObjectEquals("['1','2']", p.parse(s, "1,2",
String[].class));
+ assertObjectEquals("['1','2']", p.parse(s, "1,2", List.class,
String.class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
Object[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class,
Object.class));
+ assertObjectEquals("['G1-1.0','G1-2.0']", p.parse(s, "1,2",
G1[].class));
+ assertObjectEquals("['G1-1.0','G1-2.0']", p.parse(s, "1,2",
List.class, G1.class));
+ assertObjectEquals("'G2-[1.0,2.0]'", p.parse(s, "1,2",
G2.class));
+ }
+
+ @Test
+ public void g03_numberType_float_3d() throws Exception {
+ HttpPartSchema s =
schema("array").collectionFormat("pipes").items(schema("array").items(schema("number",
"float"))).build();
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
float[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, float[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
Float[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, Float[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, List.class, Float.class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
double[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, double[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
Double[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, Double[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, List.class, Double.class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
String[][].class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
List.class, String[].class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
List.class, List.class, String.class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
Object[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, Object[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, List.class, Object.class));
+ assertObjectEquals("[['G1-1.0','G1-2.0'],['G1-3.0']]",
p.parse(s, "1,2|3", G1[][].class));
+ assertObjectEquals("[['G1-1.0','G1-2.0'],['G1-3.0']]",
p.parse(s, "1,2|3", List.class, G1[].class));
+ assertObjectEquals("[['G1-1.0','G1-2.0'],['G1-3.0']]",
p.parse(s, "1,2|3", List.class, List.class, G1.class));
+ assertObjectEquals("['G2-[1.0,2.0]','G2-[3.0]']", p.parse(s,
"1,2|3", G2[].class));
+ assertObjectEquals("['G2-[1.0,2.0]','G2-[3.0]']", p.parse(s,
"1,2|3", List.class, G2.class));
+ }
+
+ @Test
+ public void g04_numberType_double() throws Exception {
+ HttpPartSchema s = schema("number", "double").build();
+ assertObjectEquals("1.0", p.parse(s, "1", float.class));
+ assertObjectEquals("1.0", p.parse(s, "1", Float.class));
+ assertObjectEquals("1.0", p.parse(s, "1", double.class));
+ assertObjectEquals("1.0", p.parse(s, "1", Double.class));
+ assertObjectEquals("'1'", p.parse(s, "1", String.class));
+ Object o = p.parse(s, "1", Object.class);
+ assertObjectEquals("1.0", o);
+ assertClass(Double.class, o);
+ assertObjectEquals("'G3-1.0'", p.parse(s, "1", G3.class));
+ }
+
+ @Test
+ public void g05_numberType_double_2d() throws Exception {
+ HttpPartSchema s = schema("array").items(schema("number",
"double")).build();
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
float[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
Float[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class,
Float.class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
double[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
Double[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class,
Double.class));
+ assertObjectEquals("['1','2']", p.parse(s, "1,2",
String[].class));
+ assertObjectEquals("['1','2']", p.parse(s, "1,2", List.class,
String.class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2",
Object[].class));
+ assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class,
Object.class));
+ assertObjectEquals("['G3-1.0','G3-2.0']", p.parse(s, "1,2",
G3[].class));
+ assertObjectEquals("['G3-1.0','G3-2.0']", p.parse(s, "1,2",
List.class, G3.class));
+ assertObjectEquals("'G4-[1.0,2.0]'", p.parse(s, "1,2",
G4.class));
+ }
+
+ @Test
+ public void g06_numberType_double_3d() throws Exception {
+ HttpPartSchema s =
schema("array").collectionFormat("pipes").items(schema("array").items(schema("number",
"double"))).build();
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
float[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, float[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
Float[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, Float[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, List.class, Float.class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
double[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, double[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
Double[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, Double[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, List.class, Double.class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
String[][].class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
List.class, String[].class));
+ assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3",
List.class, List.class, String.class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
Object[][].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, Object[].class));
+ assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3",
List.class, List.class, Object.class));
+ assertObjectEquals("[['G3-1.0','G3-2.0'],['G3-3.0']]",
p.parse(s, "1,2|3", G3[][].class));
+ assertObjectEquals("[['G3-1.0','G3-2.0'],['G3-3.0']]",
p.parse(s, "1,2|3", List.class, G3[].class));
+ assertObjectEquals("[['G3-1.0','G3-2.0'],['G3-3.0']]",
p.parse(s, "1,2|3", List.class, List.class, G3.class));
+ assertObjectEquals("['G4-[1.0,2.0]','G4-[3.0]']", p.parse(s,
"1,2|3", G4[].class));
+ assertObjectEquals("['G4-[1.0,2.0]','G4-[3.0]']", p.parse(s,
"1,2|3", List.class, G4.class));
+ }
+
//-----------------------------------------------------------------------------------------------------------------
// type = object
//-----------------------------------------------------------------------------------------------------------------
-// case OBJECT: {
-// if (type.isObject())
-// type =
(ClassMeta<T>)getClassMeta(ObjectMap.class);
-// switch (schema.getFormat()) {
-// default:
-// return
super.parse(partType, schema, in, type);
-// }
-// }
-
//-----------------------------------------------------------------------------------------------------------------
- // type = file
-
//-----------------------------------------------------------------------------------------------------------------
-// case FILE: {
-// throw new ParseException("File part not
supported.");
-// }
+ public static class H1 {
+ public int f;
+ }
+
+ @Test
+ public void h01_objectType() throws Exception {
+ HttpPartSchema s =
HttpPartSchema.create().type("object").build();
+ assertObjectEquals("{f:1}", p.parse(s, "(f=1)", H1.class));
+ assertObjectEquals("{f:1}", p.parse(s, "(f=1)",
ObjectMap.class));
+ Object o = p.parse(s, "(f=1)", Object.class);
+ assertObjectEquals("{f:1}", o);
+ assertClass(ObjectMap.class, o);
+ }
+
+ @Test
+ public void h02_objectType_2d() throws Exception {
+ HttpPartSchema s =
schema("array").format("uon").items(schema("object")).build();
+ assertObjectEquals("[{f:1},{f:2}]", p.parse(s,
"@((f=1),(f=2))", H1[].class));
+ assertObjectEquals("[{f:1},{f:2}]", p.parse(s,
"@((f=1),(f=2))", List.class, H1.class));
+ assertObjectEquals("[{f:1},{f:2}]", p.parse(s,
"@((f=1),(f=2))", ObjectMap[].class));
+ assertObjectEquals("[{f:1},{f:2}]", p.parse(s,
"@((f=1),(f=2))", List.class, ObjectMap.class));
+ assertObjectEquals("[{f:1},{f:2}]", p.parse(s,
"@((f=1),(f=2))", Object[].class));
+ assertObjectEquals("[{f:1},{f:2}]", p.parse(s,
"@((f=1),(f=2))", List.class, Object.class));
+ Object o = p.parse(s, "@((f=1),(f=2))", Object.class);
+ assertObjectEquals("[{f:1},{f:2}]", o);
+ assertClass(ObjectList.class, o);
+ }
+
+ @Test
+ public void h03_objectType_3d() throws Exception {
+ HttpPartSchema s =
schema("array").format("uon").items(schema("array").items(schema("object"))).build();
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", H1[][].class));
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", List.class, H1[].class));
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", List.class, List.class, H1.class));
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", ObjectMap[][].class));
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", List.class, ObjectMap[].class));
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", List.class, List.class, ObjectMap.class));
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", Object[][].class));
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", List.class, Object[].class));
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s,
"@(@((f=1),(f=2)),@((f=3)))", List.class, List.class, Object.class));
+ Object o = p.parse(s, "@(@((f=1),(f=2)),@((f=3)))",
Object.class);
+ assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", o);
+ assertClass(ObjectList.class, o);
+ }
+
+ public static class H2 {
+ public Object f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11,
f12, f99;
+ }
+
+ @Test
+ public void h04_objectType_simpleProperties() throws Exception {
+ HttpPartSchema s = schema("object")
+ .property("f1", schema("string"))
+ .property("f2", schema("string", "byte"))
+ .property("f4", schema("string", "date-time"))
+ .property("f5", schema("string", "binary"))
+ .property("f6", schema("string", "binary-spaced"))
+ .property("f7", schema("string", "uon"))
+ .property("f8", schema("integer"))
+ .property("f9", schema("integer", "int64"))
+ .property("f10", schema("number"))
+ .property("f11", schema("number", "double"))
+ .property("f12", schema("boolean"))
+ .additionalProperties(schema("integer"))
+ .build();
+
+ byte[] foob = "foo".getBytes();
+ String in =
"(f1=foo,f2="+base64Encode(foob)+",f4=2012-12-21T12:34:56Z,f5="+toHex(foob)+",f6='"+toSpacedHex(foob)+"',f7=foo,f8=1,f9=1,f10=1,f11=1,f12=true,f99=1)";
+
+ H2 h2 = p.parse(s, in, H2.class);
+
assertObjectEquals("{f1:'foo',f2:[102,111,111],f4:'2012-12-21T12:34:56Z',f5:[102,111,111],f6:[102,111,111],f7:'foo',f8:1,f9:1,f10:1.0,f11:1.0,f12:true,f99:1}",
h2);
+ assertClass(String.class, h2.f1);
+ assertClass(byte[].class, h2.f2);
+ assertClass(GregorianCalendar.class, h2.f4);
+ assertClass(byte[].class, h2.f5);
+ assertClass(byte[].class, h2.f6);
+ assertClass(String.class, h2.f7);
+ assertClass(Integer.class, h2.f8);
+ assertClass(Long.class, h2.f9);
+ assertClass(Float.class, h2.f10);
+ assertClass(Double.class, h2.f11);
+ assertClass(Boolean.class, h2.f12);
+ assertClass(Integer.class, h2.f99);
+
+ ObjectMap om = p.parse(s, in, ObjectMap.class);
+
assertObjectEquals("{f1:'foo',f2:[102,111,111],f4:'2012-12-21T12:34:56Z',f5:[102,111,111],f6:[102,111,111],f7:'foo',f8:1,f9:1,f10:1.0,f11:1.0,f12:true,f99:1}",
om);
+ assertClass(String.class, om.get("f1"));
+ assertClass(byte[].class, om.get("f2"));
+ assertClass(GregorianCalendar.class, om.get("f4"));
+ assertClass(byte[].class, om.get("f5"));
+ assertClass(byte[].class, om.get("f6"));
+ assertClass(String.class, om.get("f7"));
+ assertClass(Integer.class, om.get("f8"));
+ assertClass(Long.class, om.get("f9"));
+ assertClass(Float.class, om.get("f10"));
+ assertClass(Double.class, om.get("f11"));
+ assertClass(Boolean.class, om.get("f12"));
+ assertClass(Integer.class, om.get("f99"));
+
+ om = (ObjectMap)p.parse(s, in, Object.class);
+
assertObjectEquals("{f1:'foo',f2:[102,111,111],f4:'2012-12-21T12:34:56Z',f5:[102,111,111],f6:[102,111,111],f7:'foo',f8:1,f9:1,f10:1.0,f11:1.0,f12:true,f99:1}",
om);
+ assertClass(String.class, om.get("f1"));
+ assertClass(byte[].class, om.get("f2"));
+ assertClass(GregorianCalendar.class, om.get("f4"));
+ assertClass(byte[].class, om.get("f5"));
+ assertClass(byte[].class, om.get("f6"));
+ assertClass(String.class, om.get("f7"));
+ assertClass(Integer.class, om.get("f8"));
+ assertClass(Long.class, om.get("f9"));
+ assertClass(Float.class, om.get("f10"));
+ assertClass(Double.class, om.get("f11"));
+ assertClass(Boolean.class, om.get("f12"));
+ assertClass(Integer.class, om.get("f99"));
+ }
+
+ @Test
+ public void h05_objectType_arrayProperties() throws Exception {
+ HttpPartSchema s = schema("object")
+ .property("f1", schema("array").items(schema("string")))
+ .property("f2", schema("array").items(schema("string",
"byte")))
+ .property("f4", schema("array").items(schema("string",
"date-time")))
+ .property("f5", schema("array").items(schema("string",
"binary")))
+ .property("f6", schema("array").items(schema("string",
"binary-spaced")))
+ .property("f7", schema("array").items(schema("string",
"uon")))
+ .property("f8",
schema("array").items(schema("integer")))
+ .property("f9", schema("array").items(schema("integer",
"int64")))
+ .property("f10",
schema("array").items(schema("number")))
+ .property("f11", schema("array").items(schema("number",
"double")))
+ .property("f12",
schema("array").items(schema("boolean")))
+
.additionalProperties(schema("array").items(schema("integer")))
+ .build();
+
+ byte[] foob = "foo".getBytes();
+ String in =
"(f1=foo,f2="+base64Encode(foob)+",f4=2012-12-21T12:34:56Z,f5="+toHex(foob)+",f6='"+toSpacedHex(foob)+"',f7=foo,f8=1,f9=1,f10=1,f11=1,f12=true,f99=1)";
+
+ H2 h2 = p.parse(s, in, H2.class);
+
assertObjectEquals("{f1:['foo'],f2:[[102,111,111]],f4:['2012-12-21T12:34:56Z'],f5:[[102,111,111]],f6:[[102,111,111]],f7:['foo'],f8:[1],f9:[1],f10:[1.0],f11:[1.0],f12:[true],f99:[1]}",
h2);
+
+ ObjectMap om = p.parse(s, in, ObjectMap.class);
+
assertObjectEquals("{f1:['foo'],f2:[[102,111,111]],f4:['2012-12-21T12:34:56Z'],f5:[[102,111,111]],f6:[[102,111,111]],f7:['foo'],f8:[1],f9:[1],f10:[1.0],f11:[1.0],f12:[true],f99:[1]}",
om);
+
+ om = (ObjectMap)p.parse(s, in, Object.class);
+
assertObjectEquals("{f1:['foo'],f2:[[102,111,111]],f4:['2012-12-21T12:34:56Z'],f5:[[102,111,111]],f6:[[102,111,111]],f7:['foo'],f8:[1],f9:[1],f10:[1.0],f11:[1.0],f12:[true],f99:[1]}",
om);
+ }
+
+ @Test
+ public void h06_objectType_arrayProperties_pipes() throws Exception {
+ HttpPartSchema s = schema("object")
+ .property("f1",
schema("array").collectionFormat("pipes").items(schema("string")))
+ .property("f2",
schema("array").collectionFormat("pipes").items(schema("string", "byte")))
+ .property("f4",
schema("array").collectionFormat("pipes").items(schema("string", "date-time")))
+ .property("f5",
schema("array").collectionFormat("pipes").items(schema("string", "binary")))
+ .property("f6",
schema("array").collectionFormat("pipes").items(schema("string",
"binary-spaced")))
+ .property("f7",
schema("array").collectionFormat("pipes").items(schema("string", "uon")))
+ .property("f8",
schema("array").collectionFormat("pipes").items(schema("integer")))
+ .property("f9",
schema("array").collectionFormat("pipes").items(schema("integer", "int64")))
+ .property("f10",
schema("array").collectionFormat("pipes").items(schema("number")))
+ .property("f11",
schema("array").collectionFormat("pipes").items(schema("number", "double")))
+ .property("f12",
schema("array").collectionFormat("pipes").items(schema("boolean")))
+
.additionalProperties(schema("array").collectionFormat("pipes").items(schema("integer")))
+ .build();
+
+ byte[] foob = "foo".getBytes(), barb = "bar".getBytes();
+ String in =
"(f1=foo|bar,f2="+base64Encode(foob)+"|"+base64Encode(barb)+",f4=2012-12-21T12:34:56Z|2012-12-21T12:34:56Z,f5="+toHex(foob)+"|"+toHex(barb)+",f6='"+toSpacedHex(foob)+"|"+toSpacedHex(barb)+"',f7=foo|bar,f8=1|2,f9=1|2,f10=1|2,f11=1|2,f12=true|true,f99=1|2)";
+
+ H2 h2 = p.parse(s, in, H2.class);
+
assertObjectEquals("{f1:['foo','bar'],f2:[[102,111,111],[98,97,114]],f4:['2012-12-21T12:34:56Z','2012-12-21T12:34:56Z'],f5:[[102,111,111],[98,97,114]],f6:[[102,111,111],[98,97,114]],f7:['foo','bar'],f8:[1,2],f9:[1,2],f10:[1.0,2.0],f11:[1.0,2.0],f12:[true,true],f99:[1,2]}",
h2);
+
+ ObjectMap om = p.parse(s, in, ObjectMap.class);
+
assertObjectEquals("{f1:['foo','bar'],f2:[[102,111,111],[98,97,114]],f4:['2012-12-21T12:34:56Z','2012-12-21T12:34:56Z'],f5:[[102,111,111],[98,97,114]],f6:[[102,111,111],[98,97,114]],f7:['foo','bar'],f8:[1,2],f9:[1,2],f10:[1.0,2.0],f11:[1.0,2.0],f12:[true,true],f99:[1,2]}",
om);
+
+ om = (ObjectMap)p.parse(s, in, Object.class);
+
assertObjectEquals("{f1:['foo','bar'],f2:[[102,111,111],[98,97,114]],f4:['2012-12-21T12:34:56Z','2012-12-21T12:34:56Z'],f5:[[102,111,111],[98,97,114]],f6:[[102,111,111],[98,97,114]],f7:['foo','bar'],f8:[1,2],f9:[1,2],f10:[1.0,2.0],f11:[1.0,2.0],f12:[true,true],f99:[1,2]}",
om);
+ }
//-----------------------------------------------------------------------------------------------------------------
- // type = none
+ // Utility methods
//-----------------------------------------------------------------------------------------------------------------
-// case NONE: {
-// throw new ParseException("Invalid
type.");
-// }
-// }
-// }
+ private static HttpPartSchemaBuilder schema() {
+ return HttpPartSchema.create();
+ }
+
+ private static HttpPartSchemaBuilder schema(String type) {
+ return HttpPartSchema.create(type);
+ }
+
+ private static HttpPartSchemaBuilder schema(String type, String format)
{
+ return HttpPartSchema.create(type, format);
+ }
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/testutils/TestUtils.java
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/testutils/TestUtils.java
index cd6b77b..7681e66 100644
---
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/testutils/TestUtils.java
+++
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/testutils/TestUtils.java
@@ -45,6 +45,7 @@ public class TestUtils {
.ssq()
.trimNullProperties(false)
.addBeanTypes().addRootType()
+ .pojoSwaps(CalendarSwap.ISO8601DTZ.class,
DateSwap.ISO8601DTPZ.class)
.build();
private static JsonSerializer jsSorted = JsonSerializer.create()
@@ -53,6 +54,7 @@ public class TestUtils {
.sortMaps()
.trimNullProperties(false)
.addBeanTypes().addRootType()
+ .pojoSwaps(CalendarSwap.ISO8601DTZ.class,
DateSwap.ISO8601DTPZ.class)
.build();
@@ -60,6 +62,7 @@ public class TestUtils {
.ssq()
.pojoSwaps(IteratorSwap.class, EnumerationSwap.class)
.addBeanTypes().addRootType()
+ .pojoSwaps(CalendarSwap.ISO8601DTZ.class,
DateSwap.ISO8601DTPZ.class)
.build();
private static JsonSerializer js3 = JsonSerializer.create()
@@ -67,6 +70,7 @@ public class TestUtils {
.pojoSwaps(IteratorSwap.class, EnumerationSwap.class)
.sortProperties()
.addBeanTypes().addRootType()
+ .pojoSwaps(CalendarSwap.ISO8601DTZ.class,
DateSwap.ISO8601DTPZ.class)
.build();
private static final BeanSession beanSession =
BeanContext.DEFAULT.createSession();
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
index 28ed7b2..212a502 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
@@ -14,6 +14,8 @@ package org.apache.juneau.httppart;
import static java.util.Collections.*;
import static org.apache.juneau.internal.StringUtils.*;
+import static org.apache.juneau.httppart.HttpPartSchema.Type.*;
+import static org.apache.juneau.httppart.HttpPartSchema.Format.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
@@ -63,6 +65,7 @@ public class HttpPartSchema {
final Long maxLength, minLength, maxItems, minItems, maxProperties,
minProperties;
final Class<? extends HttpPartParser> parser;
final Class<? extends HttpPartSerializer> serializer;
+ final ClassMeta<?> parsedType;
final ObjectMap api;
@@ -141,6 +144,27 @@ public class HttpPartSchema {
}
/**
+ * Shortcut for calling <code>create().type(type);</code>
+ *
+ * @param type The schema type value.
+ * @return A new builder.
+ */
+ public static HttpPartSchemaBuilder create(String type) {
+ return create().type(type);
+ }
+
+ /**
+ * Shortcut for calling <code>create().type(type).format(format);</code>
+ *
+ * @param type The schema type value.
+ * @param format The schema format value.
+ * @return A new builder.
+ */
+ public static HttpPartSchemaBuilder create(String type, String format) {
+ return create().type(type).format(format);
+ }
+
+ /**
* Utility method for creating response maps from a schema.
*
* <p>
@@ -246,6 +270,33 @@ public class HttpPartSchema {
this.parser = b.parser;
this.serializer = b.serializer;
+ // Calculate parse type
+ Class<?> parsedType = Object.class;
+ if (type == ARRAY) {
+ if (items != null)
+ parsedType =
Array.newInstance(items.parsedType.getInnerClass(), 0).getClass();
+ } else if (type == BOOLEAN) {
+ parsedType = Boolean.class;
+ } else if (type == INTEGER) {
+ if (format == INT64)
+ parsedType = Long.class;
+ else
+ parsedType = Integer.class;
+ } else if (type == NUMBER) {
+ if (format == DOUBLE)
+ parsedType = Double.class;
+ else
+ parsedType = Float.class;
+ } else if (type == STRING) {
+ if (format == BYTE || format == BINARY || format ==
BINARY_SPACED)
+ parsedType = byte[].class;
+ else if (format == DATE || format == DATE_TIME)
+ parsedType = Calendar.class;
+ else
+ parsedType = String.class;
+ }
+ this.parsedType = BeanContext.DEFAULT.getClassMeta(parsedType);
+
if (b.noValidate)
return;
@@ -395,6 +446,8 @@ public class HttpPartSchema {
errors.add("minProperties cannot be less than zero.");
if (maxProperties != null && maxProperties < 0)
errors.add("maxProperties cannot be less than zero.");
+ if (type == ARRAY && items != null && items.getType() == OBJECT
&& (format != UON && format != Format.NONE))
+ errors.add("Cannot define an array of objects unless
array format is 'uon'.");
if (! errors.isEmpty())
throw new ContextRuntimeException("Schema specification
errors: \n\t" + join(errors, "\n\t"));
@@ -597,6 +650,15 @@ public class HttpPartSchema {
}
/**
+ * Returns the default parsed type for this schema.
+ *
+ * @return The default parsed type for this schema. Never
<jk>null</jk>.
+ */
+ public ClassMeta<?> getParsedType() {
+ return parsedType;
+ }
+
+ /**
* Returns the name of the object described by this schema, for example
the query or form parameter name.
*
* @return The name, or <jk>null</jk> if not specified.
@@ -1150,7 +1212,13 @@ public class HttpPartSchema {
return true;
}
- private HttpPartSchema getProperty(String name) {
+ /**
+ * Returns the schema information for the specified property.
+ *
+ * @param name The property name.
+ * @return The schema information for the specified property, or
<jk>null</jk> if properties are not defined on this schema.
+ */
+ public HttpPartSchema getProperty(String name) {
if (properties != null) {
HttpPartSchema schema = properties.get(name);
if (schema != null)
@@ -1159,6 +1227,14 @@ public class HttpPartSchema {
return additionalProperties;
}
+ /**
+ * Returns <jk>true</jk> if this schema has properties associated with
it.
+ *
+ * @return <jk>true</jk> if this schema has properties associated with
it.
+ */
+ public boolean hasProperties() {
+ return properties != null || additionalProperties != null;
+ }
private static <T> Set<T> copy(Set<T> in) {
return in == null ? Collections.EMPTY_SET : unmodifiableSet(new
LinkedHashSet<>(in));
@@ -1209,10 +1285,6 @@ public class HttpPartSchema {
}
}
-// final static Integer toInteger(int i) {
-// return i == -1 ? null : i;
-// }
-
final static Long toLong(long l) {
return l == -1 ? null : l;
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
index 37d0a9b..e48c2e3 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
@@ -2,7 +2,7 @@
// * Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file *
// * distributed with this work for additional information regarding copyright
ownership. The ASF licenses this file *
// * to you under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance *
-// * with the License. You may obtain a copy of the License at
*
+// * with the License. You may obtain a copy of the License at
*
// *
*
// * http://www.apache.org/licenses/LICENSE-2.0
*
// *
*
@@ -1274,15 +1274,26 @@ public class HttpPartSchemaBuilder {
* <li><a class="doclink"
href="https://swagger.io/specification/v2/#schemaObject">Schema</a>
* </ul>
*
+ * @param key
+ * The property name.
* @param value
* The new value for this property.
* <br>Ignored if value is <jk>null</jk>.
* @return This object (for method chaining).
*/
- public HttpPartSchemaBuilder properties(ObjectMap value) {
+ public HttpPartSchemaBuilder property(String key, HttpPartSchemaBuilder
value) {
+ if ( key != null && value != null) {
+ if (properties == null)
+ properties = new LinkedHashMap<>();
+ properties.put(key, value);
+ }
+ return this;
+ }
+
+ private HttpPartSchemaBuilder properties(ObjectMap value) {
if (value != null && ! value.isEmpty())
- for (Map.Entry<String,Object> e : value.entrySet())
- properties.put(e.getKey(),
HttpPartSchema.create().apply((ObjectMap)e.getValue()));
+ for (Map.Entry<String,Object> e : value.entrySet())
+ property(e.getKey(),
HttpPartSchema.create().apply((ObjectMap)e.getValue()));
return this;
}
@@ -1300,7 +1311,13 @@ public class HttpPartSchemaBuilder {
* <br>Ignored if value is <jk>null</jk> or empty.
* @return This object (for method chaining).
*/
- public HttpPartSchemaBuilder additionalProperties(ObjectMap value) {
+ public HttpPartSchemaBuilder additionalProperties(HttpPartSchemaBuilder
value) {
+ if (value != null)
+ additionalProperties = value;
+ return this;
+ }
+
+ private HttpPartSchemaBuilder additionalProperties(ObjectMap value) {
if (value != null && ! value.isEmpty())
additionalProperties =
HttpPartSchema.create().apply(value);
return this;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/OpenApiPartParser.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/OpenApiPartParser.java
index 8577740..a5e94f6 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/OpenApiPartParser.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/OpenApiPartParser.java
@@ -35,10 +35,11 @@ import org.apache.juneau.parser.*;
* </td>
* <td>
* <ul>
- * <li><code><jk>byte</jk>[]</code>
+ * <li><code><jk>byte</jk>[]</code> (default)
* <li>{@link InputStream} - Returns a {@link
ByteArrayInputStream}.
* <li>{@link Reader} - Returns a {@link
InputStreamReader} wrapped around a {@link ByteArrayInputStream}.
* <li>{@link String} - Constructed using {@link
String#String(byte[])}.
+ * <li>{@link Object} - Returns the default
<code><jk>byte</jk>[]</code>.
* <li>Any POJO transformable from a
<code><jk>byte</jk>[]</code> (via constructors or static create methods).
* </ul>
* </td>
@@ -51,10 +52,11 @@ import org.apache.juneau.parser.*;
* </td>
* <td>
* <ul>
- * <li>{@link Calendar}
+ * <li>{@link Calendar} (default)
* <li>{@link Date}
* <li>{@link GregorianCalendar}
* <li>{@link String} - Converted using {@link
Calendar#toString()}.
+ * <li>{@link Object} - Returns the default {@link
Calendar}.
* <li>Any POJO transformable from a {@link
Calendar} (via constructors or static create methods).
* </ul>
* </td>
@@ -73,7 +75,8 @@ import org.apache.juneau.parser.*;
* <td>none specified</td>
* <td>
* <ul>
- * <li>{@link String}
+ * <li>{@link String} (default)
+ * <li>{@link Object} - Returns the default {@link
String}.
* <li>Any POJO transformable from a {@link
String} (via constructors or static create methods).
* </ul>
* </td>
@@ -85,10 +88,11 @@ import org.apache.juneau.parser.*;
* </td>
* <td>
* <ul>
+ * <li>{@link Boolean} (default)
* <li><jk>boolean</code>
- * <li>{@link Boolean}
* <li>{@link String}
- * <li>{@link Object} - Returns a {@link Boolean}.
+ * <li>{@link Object} - Returns the default {@link
Boolean}.
+ * <li>Any POJO transformable from a {@link
Boolean} (via constructors or static create methods).
* </ul>
* </td>
* </tr>
@@ -98,7 +102,22 @@ import org.apache.juneau.parser.*;
*
* </td>
* <td>
- * Arrays or Collections of anything on this list.
+ * <ul>
+ * <li>Arrays or Collections of anything on this
list.
+ * <li>Any POJO transformable from arrays of the
default types (e.g. <code>Integer[]</code>, <code>Boolean[][]</code>, etc...).
+ * </ul>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td ><code>object</code></td>
+ * <td>
+ *
+ * </td>
+ * <td>
+ * <ul>
+ * <li>Beans with properties of anything on this
list.
+ * <li>Maps with string keys.
+ * </ul>
* </td>
* </tr>
* </table>
@@ -140,6 +159,17 @@ public class OpenApiPartParser extends UonPartParser {
/** Reusable instance of {@link OpenApiPartParser}. */
public static final OpenApiPartParser DEFAULT = new
OpenApiPartParser(PropertyStore.DEFAULT);
+ // Cache these for faster lookup
+ private static final BeanContext BC = BeanContext.DEFAULT;
+ private static final ClassMeta<Long> CM_Long =
BC.getClassMeta(Long.class);
+ private static final ClassMeta<Integer> CM_Integer =
BC.getClassMeta(Integer.class);
+ private static final ClassMeta<Double> CM_Double =
BC.getClassMeta(Double.class);
+ private static final ClassMeta<Float> CM_Float =
BC.getClassMeta(Float.class);
+ private static final ClassMeta<Boolean> CM_Boolean =
BC.getClassMeta(Boolean.class);
+ private static final ClassMeta<ObjectList> CM_ObjectList =
BC.getClassMeta(ObjectList.class);
+ private static final ClassMeta<ObjectMap> CM_ObjectMap =
BC.getClassMeta(ObjectMap.class);
+
+ private static final HttpPartSchema DEFAULT_SCHEMA =
HttpPartSchema.DEFAULT;
//-------------------------------------------------------------------------------------------------------------------
// Instance
@@ -156,7 +186,7 @@ public class OpenApiPartParser extends UonPartParser {
super(
ps.builder().build()
);
- this.schema = getProperty(OAPI_schema, HttpPartSchema.class,
HttpPartSchema.DEFAULT);
+ this.schema = getProperty(OAPI_schema, HttpPartSchema.class,
DEFAULT_SCHEMA);
}
@Override /* Context */
@@ -194,7 +224,7 @@ public class OpenApiPartParser extends UonPartParser {
* @throws SchemaValidationParseException If the input or resulting
HTTP part object fails schema validation.
*/
public <T> T parse(HttpPartSchema schema, String in, Class<T> type)
throws ParseException, SchemaValidationParseException {
- return parse(null, schema, in,
BeanContext.DEFAULT.getClassMeta(type));
+ return parse(null, schema, in, getClassMeta(type));
}
/**
@@ -213,12 +243,12 @@ public class OpenApiPartParser extends UonPartParser {
*/
@SuppressWarnings("unchecked")
public <T> T parse(HttpPartSchema schema, String in,
java.lang.reflect.Type type, java.lang.reflect.Type...args) throws
ParseException, SchemaValidationParseException {
- return (T)parse(null, schema, in,
BeanContext.DEFAULT.getClassMeta(type, args));
+ return (T)parse(null, schema, in, getClassMeta(type, args));
}
@Override /* HttpPartParser */
public <T> T parse(HttpPartType partType, HttpPartSchema schema, String
in, ClassMeta<T> type) throws ParseException, SchemaValidationParseException {
- schema = ObjectUtils.firstNonNull(schema, this.schema,
HttpPartSchema.DEFAULT);
+ schema = ObjectUtils.firstNonNull(schema, this.schema,
DEFAULT_SCHEMA);
T t = parseInner(partType, schema, in, type);
if (t == null && type.isPrimitive())
t = type.getPrimitiveDefault();
@@ -271,11 +301,11 @@ public class OpenApiPartParser extends UonPartParser {
}
case ARRAY: {
if (type.isObject())
- type =
(ClassMeta<T>)getClassMeta(ObjectList.class);
+ type =
(ClassMeta<T>)CM_ObjectList;
ClassMeta<?> eType = type.isObject() ?
string() : type.getElementType();
if (eType == null)
- throw new ParseException("Value
of type ARRAY cannot be converted to type {0}", type);
+ eType =
schema.getParsedType().getElementType();
String[] ss = new String[0];
switch (schema.getCollectionFormat()) {
@@ -309,50 +339,77 @@ public class OpenApiPartParser extends UonPartParser {
} else {
o = ss;
}
+ if
(type.getTransform(schema.getParsedType().getInnerClass()) != null)
+ return toType(toType(o,
schema.getParsedType()), type);
return toType(o, type);
}
case BOOLEAN: {
if (type.isObject())
- type =
(ClassMeta<T>)getClassMeta(Boolean.class);
- return super.parse(partType, schema,
toLowerCase(in), type);
+ type = (ClassMeta<T>)CM_Boolean;
+ if (type.isBoolean())
+ return super.parse(partType,
schema, in, type);
+ return toType(super.parse(partType,
schema, in, CM_Boolean), type);
}
case INTEGER: {
if (type.isObject()) {
switch (schema.getFormat()) {
case INT64:
- type =
(ClassMeta<T>)getClassMeta(Long.class);
+ type =
(ClassMeta<T>)CM_Long;
break;
default:
- type =
(ClassMeta<T>)getClassMeta(Integer.class);
+ type =
(ClassMeta<T>)CM_Integer;
}
}
- return super.parse(partType, schema,
in, type);
+ if (type.isNumber())
+ return super.parse(partType,
schema, in, type);
+ return toType(super.parse(partType,
schema, in, CM_Integer), type);
}
case NUMBER: {
if (type.isObject()) {
switch (schema.getFormat()) {
case DOUBLE:
- type =
(ClassMeta<T>)getClassMeta(Double.class);
+ type =
(ClassMeta<T>)CM_Double;
break;
default:
- type =
(ClassMeta<T>)getClassMeta(Float.class);
+ type =
(ClassMeta<T>)CM_Float;
}
}
- return super.parse(partType, schema,
in, type);
+ if (type.isNumber())
+ return super.parse(partType,
schema, in, type);
+ return toType(super.parse(partType,
schema, in, CM_Integer), type);
}
case OBJECT: {
if (type.isObject())
- type =
(ClassMeta<T>)getClassMeta(ObjectMap.class);
- switch (schema.getFormat()) {
- default:
- return
super.parse(partType, schema, in, type);
+ type =
(ClassMeta<T>)CM_ObjectMap;
+ if (schema.hasProperties() &&
type.isMapOrBean()) {
+ try {
+ if (type.isBean()) {
+ BeanMap<T> m =
BC.createBeanSession().newBeanMap(type.getInnerClass());
+ for
(Map.Entry<String,Object> e : parse(partType, DEFAULT_SCHEMA, in,
CM_ObjectMap).entrySet()) {
+ String
key = e.getKey();
+
BeanPropertyMeta bpm = m.getPropertyMeta(key);
+
m.put(key, parse(partType, schema.getProperty(key), asString(e.getValue()), bpm
== null ? object() : bpm.getClassMeta()));
+ }
+ return
m.getBean();
+ }
+ Map<String,Object> m =
(Map<String,Object>)type.newInstance();
+ for
(Map.Entry<String,Object> e : parse(partType, DEFAULT_SCHEMA, in,
CM_ObjectMap).entrySet()) {
+ String key =
e.getKey();
+ m.put(key,
parse(partType, schema.getProperty(key), asString(e.getValue()), object()));
+ }
+ return (T)m;
+ } catch (Exception e1) {
+ throw new
ParseException(e1, "Could not instantiate type ''{0}''.", type);
+ }
}
+ return super.parse(partType, schema,
in, type);
}
case FILE: {
throw new ParseException("File part not
supported.");
}
case NONE: {
+ // This should never be returned by
HttpPartSchema.getType(ClassMeta).
throw new ParseException("Invalid
type.");
}
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
index 33e37ba..6915c06 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
@@ -731,9 +731,9 @@ public class UonParserSession extends ReaderParserSession {
String s = parseString(r, false);
if (s == null || s.equals("null"))
return null;
- if (s.equals("true"))
+ if (s.equalsIgnoreCase("true"))
return true;
- if (s.equals("false"))
+ if (s.equalsIgnoreCase("false"))
return false;
throw new ParseException(this, "Unrecognized syntax for
boolean. ''{0}''.", s);
}