You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2018/08/13 21:16:55 UTC
[juneau] branch master updated: JsonSchemaSerializer improvements.
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 86bd487 JsonSchemaSerializer improvements.
86bd487 is described below
commit 86bd487e3f3c730331ba99784fbe96e5131033d2
Author: JamesBognar <ja...@apache.org>
AuthorDate: Mon Aug 13 17:16:16 2018 -0400
JsonSchemaSerializer improvements.
---
.../org/apache/juneau/a/rttests/RoundTripTest.java | 1 -
.../java/org/apache/juneau/html/CommonTest.java | 2 +-
.../HtmlSchemaSerializerTest.java | 5 +-
.../java/org/apache/juneau/jena/CommonTest.java | 2 +-
.../java/org/apache/juneau/json/CommonTest.java | 12 +-
.../juneau/json/JsonSchemaSerializerTest.java} | 109 ++-
...lizerTest.java => JsonSchemaGeneratorTest.java} | 355 +++------
.../java/org/apache/juneau/uon/Common_UonTest.java | 2 +-
.../juneau/urlencoding/Common_UrlEncodingTest.java | 2 +-
.../java/org/apache/juneau/xml/CommonTest.java | 2 +-
.../main/java/org/apache/juneau/BeanContext.java | 2 +-
.../java/org/apache/juneau/BeanContextBuilder.java | 2 +-
...ckage-info.java => BeanRecursionException.java} | 51 +-
.../org/apache/juneau/BeanTraverseBuilder.java | 559 ++++++++++++++
.../org/apache/juneau/BeanTraverseContext.java | 304 ++++++++
.../org/apache/juneau/BeanTraverseSession.java | 290 +++++++
.../org/apache/juneau/html/HtmlDocSerializer.java | 1 -
.../HtmlSchemaDocSerializer.java | 20 +-
.../HtmlSchemaDocSerializerSession.java | 15 +-
.../{htmlschema => html}/HtmlSchemaSerializer.java | 66 +-
.../HtmlSchemaSerializerBuilder.java | 30 +-
.../HtmlSchemaSerializerSession.java | 25 +-
.../org/apache/juneau/html/HtmlSerializer.java | 1 -
.../org/apache/juneau/http/annotation/Body.java | 4 +-
.../apache/juneau/http/annotation/FormData.java | 5 +-
.../org/apache/juneau/http/annotation/Header.java | 5 +-
.../org/apache/juneau/http/annotation/Path.java | 5 +-
.../org/apache/juneau/http/annotation/Query.java | 5 +-
.../apache/juneau/http/annotation/Response.java | 4 +-
.../JsonSchemaSerializer.java} | 123 ++-
.../JsonSchemaSerializerBuilder.java | 29 +-
.../JsonSchemaSerializerSession.java} | 27 +-
.../org/apache/juneau/json/JsonSerializer.java | 3 +-
.../apache/juneau/json/JsonSerializerSession.java | 1 -
...emaSerializer.java => JsonSchemaGenerator.java} | 841 ++++++++++-----------
.../JsonSchemaGeneratorBuilder.java} | 371 +++------
...ession.java => JsonSchemaGeneratorSession.java} | 64 +-
.../org/apache/juneau/jsonschema/TypeCategory.java | 4 +-
.../juneau/jsonschema/annotation/JsonSchema.java | 2 +-
.../org/apache/juneau/serializer/Serializer.java | 236 +-----
.../juneau/serializer/SerializerBuilder.java | 167 +---
.../apache/juneau/serializer/SerializerGroup.java | 2 +-
.../juneau/serializer/SerializerGroupBuilder.java | 167 +---
.../juneau/serializer/SerializerSession.java | 224 +-----
.../apache/juneau/xml/XmlSerializerSession.java | 7 +-
juneau-doc/src/main/javadoc/overview.html | 89 ++-
.../src/main/resources/ReleaseNotes/5.1.0.07.html | 2 +-
.../src/main/resources/ReleaseNotes/7.2.0.html | 7 -
.../Topics/02.juneau-marshall/01.Serializers.html | 5 +-
.../02.CommonSerializer.html | 55 +-
.../Topics/02.juneau-marshall/13.Recursion.html | 4 +-
.../19.JsonDetails/06.JsonSchema.html | 2 +-
.../21.HtmlDetails/09.HtmlSchema.html | 4 +-
.../02.juneau-marshall/29.BestPractices.html | 2 +-
.../06.RequestEchoResource.html | 4 +-
.../juneau/examples/rest/RequestEchoResource.java | 4 +-
.../juneau/rest/client/RestClientBuilder.java | 25 +-
.../apache/juneau/rest/jaxrs/BasicProvider.java | 1 -
.../org/apache/juneau/rest/BasicRestConfig.java | 2 -
.../org/apache/juneau/rest/BasicRestServlet.java | 3 +-
.../java/org/apache/juneau/rest/RestContext.java | 9 +-
.../org/apache/juneau/rest/SwaggerGenerator.java | 4 +-
62 files changed, 2243 insertions(+), 2133 deletions(-)
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
index f13617b..05574e7 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
@@ -22,7 +22,6 @@ import org.apache.juneau.*;
import org.apache.juneau.html.*;
import org.apache.juneau.jena.*;
import org.apache.juneau.json.*;
-import org.apache.juneau.jsonschema.*;
import org.apache.juneau.msgpack.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.serializer.*;
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
index 5d45719..88e24c1 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
@@ -394,7 +394,7 @@ public class CommonTest {
fail("Exception expected!");
} catch (Exception e) {
String msg = e.getLocalizedMessage();
- assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+ assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
}
// Recursion detection, no ignore
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlSchemaSerializerTest.java
similarity index 96%
rename from juneau-core/juneau-core-test/src/test/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerTest.java
rename to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlSchemaSerializerTest.java
index 1fa78bb..48646cb 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlSchemaSerializerTest.java
@@ -10,7 +10,7 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.html;
import static org.junit.Assert.*;
@@ -19,6 +19,9 @@ import java.util.*;
import org.apache.juneau.testutils.pojos.*;
import org.junit.*;
+/**
+ * Most of the heavy testing for HtmlSchemaSerializer is done in JsonSchemaGeneratorTest.
+ */
public class HtmlSchemaSerializerTest {
//====================================================================================================
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
index 2a4eadc..b7cbb6a 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
@@ -314,7 +314,7 @@ public class CommonTest {
fail("Exception expected!");
} catch (Exception e) {
String msg = e.getLocalizedMessage();
- assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+ assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
}
// Recursion detection, no ignore
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
index bbf2bb0..b83767d 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
@@ -274,7 +274,7 @@ public class CommonTest {
fail("Exception expected!");
} catch (Exception e) {
String msg = e.getLocalizedMessage();
- assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+ assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
}
// Recursion detection, no ignore
@@ -284,10 +284,12 @@ public class CommonTest {
fail("Exception expected!");
} catch (Exception e) {
String msg = e.getLocalizedMessage();
- assertTrue(msg.contains("[0]root:org.apache.juneau.json.CommonTest$R1"));
- assertTrue(msg.contains("->[1]r2:org.apache.juneau.json.CommonTest$R2"));
- assertTrue(msg.contains("->[2]r3:org.apache.juneau.json.CommonTest$R3"));
- assertTrue(msg.contains("->[3]r1:org.apache.juneau.json.CommonTest$R1"));
+ assertContains(msg,
+ "[0]root:org.apache.juneau.json.CommonTest$R1",
+ "->[1]r2:org.apache.juneau.json.CommonTest$R2",
+ "->[2]r3:org.apache.juneau.json.CommonTest$R3",
+ "->[3]r1:org.apache.juneau.json.CommonTest$R1"
+ );
}
s.ignoreRecursions();
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
old mode 100644
new mode 100755
similarity index 50%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
index 92f2dcc..ad4b494
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
@@ -1,59 +1,50 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
-// * with the License. You may obtain a copy of the License at *
-// * *
-// * http://www.apache.org/licenses/LICENSE-2.0 *
-// * *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
-// * specific language governing permissions and limitations under the License. *
-// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
-
-import java.lang.reflect.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.html.*;
-import org.apache.juneau.jsonschema.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Context object that lives for the duration of a single serialization of {@link HtmlSchemaDocSerializer} and its subclasses.
- *
- * <p>
- * This class is NOT thread safe. It is meant to be discarded after one-time use.
- */
-public class HtmlSchemaSerializerSession extends HtmlSerializerSession {
-
- private final JsonSchemaSerializerSession js;
-
- /**
- * Create a new session using properties specified in the context.
- *
- * @param jsctx
- * The JSON-Schema serializer used to convert a POJO into JSON-Schema metadata.
- * @param ctx
- * The context creating this session object.
- * The context contains all the configuration settings for this object.
- * @param args
- * Runtime arguments.
- */
- protected HtmlSchemaSerializerSession(JsonSchemaSerializer jsctx, HtmlSchemaSerializer ctx, SerializerSessionArgs args) {
- super(ctx, args);
- this.js = jsctx.createSession(args);
- }
-
- @Override /* SerializerSession */
- protected void doSerialize(SerializerPipe out, Object o) throws Exception {
- ObjectMap schema = js.getSchema(toClassMeta(o));
- super.doSerialize(out, schema);
- }
-
- private ClassMeta<?> toClassMeta(Object o) {
- if (o instanceof Type)
- return getClassMeta((Type)o);
- return getClassMetaForObject(o);
- }
-}
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
+// * with the License. You may obtain a copy of the License at *
+// * *
+// * http://www.apache.org/licenses/LICENSE-2.0 *
+// * *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
+// * specific language governing permissions and limitations under the License. *
+// ***************************************************************************************************************************
+package org.apache.juneau.json;
+
+import static org.junit.Assert.*;
+
+import org.apache.juneau.testutils.pojos.*;
+import org.junit.*;
+
+/**
+ * Most of the heavy testing for JsonSchemaSerializer is done in JsonSchemaGeneratorTest.
+ */
+public class JsonSchemaSerializerTest {
+
+ //====================================================================================================
+ // Simple objects
+ //====================================================================================================
+
+ @Test
+ public void simpleObjects() throws Exception {
+ JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
+
+ assertEquals("{type:'integer',format:'int16'}", s.serialize((short)1));
+ assertEquals("{type:'integer',format:'int32'}", s.serialize(1));
+ assertEquals("{type:'integer',format:'int64'}", s.serialize(1l));
+ assertEquals("{type:'number',format:'float'}", s.serialize(1f));
+ assertEquals("{type:'number',format:'double'}", s.serialize(1d));
+ assertEquals("{type:'boolean'}", s.serialize(true));
+ assertEquals("{type:'string'}", s.serialize("foo"));
+ assertEquals("{type:'string'}", s.serialize(new StringBuilder("foo")));
+ assertEquals("{type:'string'}", s.serialize('c'));
+ assertEquals("{type:'string','enum':['one','two','three']}", s.serialize(TestEnumToString.ONE));
+ assertEquals("{type:'object',properties:{f1:{type:'string'}}}", s.serialize(new SimpleBean()));
+ }
+
+ public static class SimpleBean {
+ public String f1;
+ }
+
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaSerializerTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
similarity index 71%
rename from juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaSerializerTest.java
rename to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
index 6305dc6..3e478b0 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaSerializerTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
@@ -13,7 +13,6 @@
package org.apache.juneau.jsonschema;
import static org.apache.juneau.testutils.TestUtils.*;
-import static org.junit.Assert.*;
import java.util.*;
@@ -24,31 +23,15 @@ import org.apache.juneau.testutils.pojos.*;
import org.apache.juneau.transform.*;
import org.junit.*;
-public class JsonSchemaSerializerTest {
+public class JsonSchemaGeneratorTest {
//====================================================================================================
// Simple objects
//====================================================================================================
- @Test
- public void simpleObjects() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-
- assertEquals("{type:'integer',format:'int16'}", s.serialize((short)1));
- assertEquals("{type:'integer',format:'int32'}", s.serialize(1));
- assertEquals("{type:'integer',format:'int64'}", s.serialize(1l));
- assertEquals("{type:'number',format:'float'}", s.serialize(1f));
- assertEquals("{type:'number',format:'double'}", s.serialize(1d));
- assertEquals("{type:'boolean'}", s.serialize(true));
- assertEquals("{type:'string'}", s.serialize("foo"));
- assertEquals("{type:'string'}", s.serialize(new StringBuilder("foo")));
- assertEquals("{type:'string'}", s.serialize('c'));
- assertEquals("{type:'string','enum':['one','two','three']}", s.serialize(TestEnumToString.ONE));
- assertEquals("{type:'object',properties:{f1:{type:'string'}}}", s.serialize(new SimpleBean()));
- }
@Test
- public void simpleObjects_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ public void simpleObjects() throws Exception {
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'integer',format:'int16'}", s.getSchema(short.class));
assertObjectEquals("{type:'integer',format:'int16'}", s.getSchema(Short.class));
@@ -80,31 +63,7 @@ public class JsonSchemaSerializerTest {
@Test
public void arrays1d() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-
- assertEquals("{type:'array',items:{type:'integer',format:'int16'}}", s.serialize(new short[]{(short)1}));
- assertEquals("{type:'array',items:{type:'integer',format:'int16'}}", s.serialize(new Short[]{(short)1}));
- assertEquals("{type:'array',items:{type:'integer',format:'int32'}}", s.serialize(new int[]{1}));
- assertEquals("{type:'array',items:{type:'integer',format:'int32'}}", s.serialize(new Integer[]{1}));
- assertEquals("{type:'array',items:{type:'integer',format:'int64'}}", s.serialize(new long[]{1l}));
- assertEquals("{type:'array',items:{type:'integer',format:'int64'}}", s.serialize(new Long[]{1l}));
- assertEquals("{type:'array',items:{type:'number',format:'float'}}", s.serialize(new float[]{1f}));
- assertEquals("{type:'array',items:{type:'number',format:'float'}}", s.serialize(new Float[]{1f}));
- assertEquals("{type:'array',items:{type:'number',format:'double'}}", s.serialize(new double[]{1d}));
- assertEquals("{type:'array',items:{type:'number',format:'double'}}", s.serialize(new Double[]{1d}));
- assertEquals("{type:'array',items:{type:'boolean'}}", s.serialize(new boolean[]{true}));
- assertEquals("{type:'array',items:{type:'boolean'}}", s.serialize(new Boolean[]{true}));
- assertEquals("{type:'array',items:{type:'string'}}", s.serialize(new String[]{"foo"}));
- assertEquals("{type:'array',items:{type:'string'}}", s.serialize(new StringBuilder[]{new StringBuilder("foo")}));
- assertEquals("{type:'array',items:{type:'string'}}", s.serialize(new char[]{'c'}));
- assertEquals("{type:'array',items:{type:'string'}}", s.serialize(new Character[]{'c'}));
- assertEquals("{type:'array',items:{type:'string','enum':['one','two','three']}}", s.serialize(new TestEnumToString[]{TestEnumToString.ONE}));
- assertEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}", s.serialize(new SimpleBean[]{new SimpleBean()}));
- }
-
- @Test
- public void arrays1d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'array',items:{type:'integer',format:'int16'}}", s.getSchema(short[].class));
assertObjectEquals("{type:'array',items:{type:'integer',format:'int16'}}", s.getSchema(Short[].class));
@@ -128,31 +87,7 @@ public class JsonSchemaSerializerTest {
@Test
public void arrays2d() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-
- assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16'}}}", s.serialize(new short[][]{{(short)1}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16'}}}", s.serialize(new Short[][]{{(short)1}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32'}}}", s.serialize(new int[][]{{1}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32'}}}", s.serialize(new Integer[][]{{1}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int64'}}}", s.serialize(new long[][]{{1l}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int64'}}}", s.serialize(new Long[][]{{1l}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'number',format:'float'}}}", s.serialize(new float[][]{{1f}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'number',format:'float'}}}", s.serialize(new Float[][]{{1f}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'number',format:'double'}}}", s.serialize(new double[][]{{1d}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'number',format:'double'}}}", s.serialize(new Double[][]{{1d}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'boolean'}}}", s.serialize(new boolean[][]{{true}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'boolean'}}}", s.serialize(new Boolean[][]{{true}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'string'}}}", s.serialize(new String[][]{{"foo"}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'string'}}}", s.serialize(new StringBuilder[][]{{new StringBuilder("foo")}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'string'}}}", s.serialize(new char[][]{{'c'}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'string'}}}", s.serialize(new Character[][]{{'c'}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['one','two','three']}}}", s.serialize(new TestEnumToString[][]{{TestEnumToString.ONE}}));
- assertEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}}", s.serialize(new SimpleBean[][]{{new SimpleBean()}}));
- }
-
- @Test
- public void arrays2d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16'}}}", s.getSchema(short[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16'}}}", s.getSchema(Short[][].class));
@@ -180,13 +115,7 @@ public class JsonSchemaSerializerTest {
@Test
public void simpleList() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
- assertEquals("{type:'array',items:{type:'integer',format:'int32'}}", s.serialize(new SimpleList()));
- }
-
- @Test
- public void simpleList_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'array',items:{type:'integer',format:'int32'}}", s.getSchema(SimpleList.class));
}
@@ -195,13 +124,7 @@ public class JsonSchemaSerializerTest {
@Test
public void simpleList2d() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
- assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32'}}}", s.serialize(new Simple2dList()));
- }
-
- @Test
- public void simpleList2d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32'}}}", s.getSchema(Simple2dList.class));
}
@@ -214,13 +137,7 @@ public class JsonSchemaSerializerTest {
@Test
public void beanList() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
- assertEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}", s.serialize(new BeanList()));
- }
-
- @Test
- public void beanList_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}", s.getSchema(BeanList.class));
}
@@ -229,13 +146,7 @@ public class JsonSchemaSerializerTest {
@Test
public void beanList2d() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
- assertEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}}", s.serialize(new BeanList2d()));
- }
-
- @Test
- public void beanList2d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}}", s.getSchema(BeanList2d.class));
}
@@ -248,13 +159,7 @@ public class JsonSchemaSerializerTest {
@Test
public void beanMap() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
- assertEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}", s.serialize(new BeanMap()));
- }
-
- @Test
- public void beanMap_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}", s.getSchema(BeanMap.class));
}
@@ -263,13 +168,7 @@ public class JsonSchemaSerializerTest {
@Test
public void beanMap2d() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
- assertEquals("{type:'object',additionalProperties:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}}", s.serialize(new BeanMap2d()));
- }
-
- @Test
- public void beanMap2d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
assertObjectEquals("{type:'object',additionalProperties:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}}", s.getSchema(BeanMap2d.class));
}
@@ -283,46 +182,28 @@ public class JsonSchemaSerializerTest {
@Test
public void useBeanDefs() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build();
- assertEquals("{'$ref':'#/definitions/SimpleBean'}", s.serialize(new SimpleBean()));
- }
-
- @Test
- public void useBeanDefs_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
assertObjectEquals("{'$ref':'#/definitions/SimpleBean'}", s.getSchema(SimpleBean.class));
assertObjectEquals("{SimpleBean:{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
}
@Test
public void useBeanDefs_beanList() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build();
- assertEquals("{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}", s.serialize(new BeanList()));
- }
-
- @Test
- public void useBeanDefs_beanList_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
assertObjectEquals("{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}", s.getSchema(BeanList.class));
assertObjectEquals("{SimpleBean:{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
}
@Test
public void useBeanDefs_beanList2d() throws Exception {
- JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build();
- assertEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.serialize(new BeanList2d()));
- }
-
- @Test
- public void useBeanDefs_beanList2d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.getSchema(BeanList2d.class));
assertObjectEquals("{SimpleBean:{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
}
@Test
- public void useBeanDefs_beanArray2d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+ public void useBeanDefs_beanArray2d() throws Exception {
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.getSchema(SimpleBean[][].class));
assertObjectEquals("{SimpleBean:{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
}
@@ -333,31 +214,31 @@ public class JsonSchemaSerializerTest {
@Test
public void beanDefsPreloaded() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
s.addBeanDef("SimpleBean", new ObjectMap().append("test", 123));
assertObjectEquals("{'$ref':'#/definitions/SimpleBean'}", s.getSchema(SimpleBean.class));
assertObjectEquals("{SimpleBean:{test:123}}", s.getBeanDefs());
}
@Test
- public void useBeanDefsPreloaded_beanList_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+ public void useBeanDefsPreloaded_beanList() throws Exception {
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
s.addBeanDef("SimpleBean", new ObjectMap().append("test", 123));
assertObjectEquals("{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}", s.getSchema(BeanList.class));
assertObjectEquals("{SimpleBean:{test:123}}", s.getBeanDefs());
}
@Test
- public void useBeanDefsPreloaded_beanList2d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+ public void useBeanDefsPreloaded_beanList2d() throws Exception {
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
s.addBeanDef("SimpleBean", new ObjectMap().append("test", 123));
assertObjectEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.getSchema(BeanList2d.class));
assertObjectEquals("{SimpleBean:{test:123}}", s.getBeanDefs());
}
@Test
- public void useBeanDefsPreloaded_beanArray2d_getSchema() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+ public void useBeanDefsPreloaded_beanArray2d() throws Exception {
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
s.addBeanDef("SimpleBean", new ObjectMap().append("test", 123));
assertObjectEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.getSchema(SimpleBean[][].class));
assertObjectEquals("{SimpleBean:{test:123}}", s.getBeanDefs());
@@ -369,16 +250,16 @@ public class JsonSchemaSerializerTest {
@Test
public void customBeanDefMapper() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().beanDefMapper(CustomBeanDefMapper.class).build().createSession();
- assertObjectEquals("{'$ref':'#/definitions/org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
- assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().beanDefMapper(CustomBeanDefMapper.class).build().createSession();
+ assertObjectEquals("{'$ref':'#/definitions/org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+ assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
}
@Test
public void customBeanDefMapperInstance() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().beanDefMapper(new CustomBeanDefMapper()).build().createSession();
- assertObjectEquals("{'$ref':'#/definitions/org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
- assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().beanDefMapper(new CustomBeanDefMapper()).build().createSession();
+ assertObjectEquals("{'$ref':'#/definitions/org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+ assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
}
public static class CustomBeanDefMapper extends BasicBeanDefMapper {
@@ -390,9 +271,9 @@ public class JsonSchemaSerializerTest {
@Test
public void customBeanDefMapper_customURI() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().beanDefMapper(CustomBeanDefMapper2.class).build().createSession();
- assertObjectEquals("{'$ref':'/foo/bar/org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
- assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().beanDefMapper(CustomBeanDefMapper2.class).build().createSession();
+ assertObjectEquals("{'$ref':'/foo/bar/org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+ assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
}
public static class CustomBeanDefMapper2 extends BasicBeanDefMapper {
@@ -412,13 +293,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_BEAN_noBeanExample() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", s.getSchema(SimpleBean.class));
}
@Test
public void addExample_BEAN_exampleMethod() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
}
@@ -426,13 +307,13 @@ public class JsonSchemaSerializerTest {
public void addExample_BEAN_exampleMethod_wDefault() throws Exception {
SimpleBeanWithExampleMethod b = new SimpleBeanWithExampleMethod();
b.f1 = "baz";
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").example(SimpleBeanWithExampleMethod.class, b).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(SimpleBeanWithExampleMethod.class, b).build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
}
@Test
public void addExample_BEAN_exampleMethod_array2d() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleMethod[][].class));
}
@@ -448,13 +329,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_BEAN_exampleField() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleField.class));
}
@Test
public void addExample_BEAN_exampleField_array2d() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleField[][].class));
}
@@ -472,13 +353,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_BEAN_exampleBeanAnnotation() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleAnnotation.class));
}
@Test
public void addExample_BEAN_exampleBeanAnnotation_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleAnnotation[][].class));
}
@@ -489,7 +370,7 @@ public class JsonSchemaSerializerTest {
public void addExample_BEAN_exampleBeanProperty() throws Exception {
SimpleBean b = new SimpleBean();
b.f1 = "foobar";
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBean.class));
}
@@ -497,7 +378,7 @@ public class JsonSchemaSerializerTest {
public void addExample_BEAN_exampleBeanProperty_2darray() throws Exception {
SimpleBean b = new SimpleBean();
b.f1 = "foobar";
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBean[][].class));
}
@@ -507,13 +388,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_MAP_noExample() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}", s.getSchema(BeanMap.class));
}
@Test
public void addExample_MAP_exampleMethod() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
}
@@ -521,7 +402,7 @@ public class JsonSchemaSerializerTest {
public void addExample_MAP_exampleMethod_wDefault() throws Exception {
BeanMapWithExampleMethod b = new BeanMapWithExampleMethod();
b.put(456, SimpleBeanWithExampleMethod.example());
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").example(BeanMapWithExampleMethod.class, b).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMapWithExampleMethod.class, b).build().createSession();
assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'456':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
}
@@ -538,13 +419,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_MAP_exampleField() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleField.class));
}
@Test
public void addExample_MAP_exampleField_array2d() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMapWithExampleField[][].class));
}
@@ -563,13 +444,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_MAP_exampleBeanAnnotation() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}", s.getSchema(BeanMapWithExampleAnnotation.class));
}
@Test
public void addExample_MAP_exampleBeanAnnotation_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}}}", s.getSchema(BeanMapWithExampleAnnotation[][].class));
}
@@ -579,13 +460,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_MAP_exampleBeanProperty() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMap.class));
}
@Test
public void addExample_MAP_exampleBeanProperty_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMap[][].class));
}
@@ -595,13 +476,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_COLLECTION_noExample() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}", s.getSchema(BeanList.class));
}
@Test
public void addExample_COLLECTION_exampleMethod() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
}
@@ -611,7 +492,7 @@ public class JsonSchemaSerializerTest {
SimpleBean sb = new SimpleBean();
sb.f1 = "baz";
b.add(sb);
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").example(BeanListWithExampleMethod.class, b).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").example(BeanListWithExampleMethod.class, b).build().createSession();
assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(BeanListWithExampleMethod.class));
}
@@ -628,13 +509,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_COLLECTION_exampleField() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleField.class));
}
@Test
public void addExample_ARRAY_exampleField_array2d() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("array").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanListWithExampleField[][].class));
}
@@ -653,13 +534,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_COLLECTION_exampleBeanAnnotation() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(BeanListWithExampleAnnotation.class));
}
@Test
public void addExample_ARRAY_exampleBeanAnnotation_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("array").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'baz'}]]]}", s.getSchema(BeanListWithExampleAnnotation[][].class));
}
@@ -669,13 +550,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_COLLECTION_exampleBeanProperty() throws Exception {
- JsonSchemaSerializerSession s =JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
+ JsonSchemaGeneratorSession s =JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanList.class));
}
@Test
public void addExample_ARRAY_exampleBeanProperty_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("array").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanList[][].class));
}
@@ -684,14 +565,14 @@ public class JsonSchemaSerializerTest {
//====================================================================================================
@Test
public void addExample_BOOLEAN() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("boolean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("boolean").build().createSession();
assertObjectEquals("{type:'boolean','x-example':true}", s.getSchema(boolean.class));
assertObjectEquals("{type:'boolean','x-example':true}", s.getSchema(Boolean.class));
}
@Test
public void addExample_BOOLEAN_wDefault() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("boolean")
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("boolean")
.example(boolean.class, false)
.example(Boolean.class, false)
.build().createSession();
@@ -701,7 +582,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_BOOLEAN_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("boolean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("boolean").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean','x-example':true}}}", s.getSchema(boolean[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean','x-example':true}}}", s.getSchema(Boolean[][].class));
}
@@ -711,7 +592,7 @@ public class JsonSchemaSerializerTest {
//====================================================================================================
@Test
public void addExample_NUMBER() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("number").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("number").build().createSession();
assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(short.class));
assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(Short.class));
assertObjectEquals("{type:'integer',format:'int32','x-example':1}", s.getSchema(int.class));
@@ -726,7 +607,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_NUMBER_wDefault() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("number")
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("number")
.example(short.class, (short)2)
.example(Short.class, (short)3)
.example(int.class, 4)
@@ -752,7 +633,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_NUMBER_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("number").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("number").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16','x-example':1}}}", s.getSchema(short[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16','x-example':1}}}", s.getSchema(Short[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32','x-example':1}}}", s.getSchema(int[][].class));
@@ -771,7 +652,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_STRING() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("string").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("string").build().createSession();
assertObjectEquals("{type:'string','x-example':'foo'}", s.getSchema(String.class));
assertObjectEquals("{type:'string','x-example':'foo'}", s.getSchema(StringBuilder.class));
assertObjectEquals("{type:'string','x-example':'a'}", s.getSchema(Character.class));
@@ -780,7 +661,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_STRING_wDefault() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("string")
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("string")
.example(String.class, "bar1")
.example(StringBuilder.class, new StringBuilder("bar2"))
.example(Character.class, 'b')
@@ -794,7 +675,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_STRING_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("string").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("string").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'foo'}}}", s.getSchema(String[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'foo'}}}", s.getSchema(StringBuilder[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'a'}}}", s.getSchema(Character[][].class));
@@ -803,7 +684,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_STRING_2darray_wDefault() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("string")
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("string")
.example(String.class, "bar1")
.example(StringBuilder.class, new StringBuilder("bar2"))
.example(Character.class, 'b')
@@ -821,37 +702,37 @@ public class JsonSchemaSerializerTest {
@Test
public void addExample_ENUM() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("enum").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("enum").build().createSession();
assertObjectEquals("{type:'string','enum':['one','two','three'],'x-example':'one'}", s.getSchema(TestEnumToString.class));
}
@Test
public void addExample_ENUM_wDefault() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("enum").example(TestEnumToString.class, TestEnumToString.TWO).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("enum").example(TestEnumToString.class, TestEnumToString.TWO).build().createSession();
assertObjectEquals("{type:'string','enum':['one','two','three'],'x-example':'two'}", s.getSchema(TestEnumToString.class));
}
@Test
public void addExample_ENUM_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("enum").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("enum").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['one','two','three'],'x-example':'one'}}}", s.getSchema(TestEnumToString[][].class));
}
@Test
public void addExample_ENUM_useEnumNames() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useEnumNames().addExamplesTo("enum").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useEnumNames().addExamplesTo("enum").build().createSession();
assertObjectEquals("{type:'string','enum':['ONE','TWO','THREE'],'x-example':'ONE'}", s.getSchema(TestEnumToString.class));
}
@Test
public void addExample_ENUM_wDefault_useEnumNames() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useEnumNames().addExamplesTo("enum").example(TestEnumToString.class, TestEnumToString.TWO).build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useEnumNames().addExamplesTo("enum").example(TestEnumToString.class, TestEnumToString.TWO).build().createSession();
assertObjectEquals("{type:'string','enum':['ONE','TWO','THREE'],'x-example':'TWO'}", s.getSchema(TestEnumToString.class));
}
@Test
public void addExample_ENUM_2darray_useEnumNames() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useEnumNames().addExamplesTo("enum").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useEnumNames().addExamplesTo("enum").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['ONE','TWO','THREE'],'x-example':'ONE'}}}", s.getSchema(TestEnumToString[][].class));
}
@@ -860,7 +741,7 @@ public class JsonSchemaSerializerTest {
//====================================================================================================
@Test
public void addExample_ANY() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("any").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("any").build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'string','x-example':'foo'}}}", s.getSchema(SimpleBean.class));
assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
@@ -889,14 +770,14 @@ public class JsonSchemaSerializerTest {
@Test
public void addDescription_BEAN() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("bean").build().createSession();
- assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("bean").build().createSession();
+ assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
}
@Test
public void addDescription_BEAN_array2d() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("bean").build().createSession();
- assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}}}", s.getSchema(SimpleBean[][].class));
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("bean").build().createSession();
+ assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}}}", s.getSchema(SimpleBean[][].class));
}
//====================================================================================================
@@ -905,14 +786,14 @@ public class JsonSchemaSerializerTest {
@Test
public void addDescription_MAP() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("map").build().createSession();
- assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanMap.class));
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("map").build().createSession();
+ assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanMap.class));
}
@Test
public void addDescription_MAP_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("map").build().createSession();
- assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}}}", s.getSchema(BeanMap[][].class));
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("map").build().createSession();
+ assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}}}", s.getSchema(BeanMap[][].class));
}
//====================================================================================================
@@ -921,20 +802,20 @@ public class JsonSchemaSerializerTest {
@Test
public void addDescription_COLLECTION() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("collection").build().createSession();
- assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("collection").build().createSession();
+ assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanList.class));
}
@Test
public void addDescription_COLLECTION_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("collection").build().createSession();
- assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}}}", s.getSchema(BeanList[][].class));
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("collection").build().createSession();
+ assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}}}", s.getSchema(BeanList[][].class));
}
@Test
public void addDescription_ARRAY() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("array").build().createSession();
- assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("array").build().createSession();
+ assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
}
//====================================================================================================
@@ -942,14 +823,14 @@ public class JsonSchemaSerializerTest {
//====================================================================================================
@Test
public void addDescription_BOOLEAN() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("boolean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("boolean").build().createSession();
assertObjectEquals("{type:'boolean',description:'boolean'}", s.getSchema(boolean.class));
assertObjectEquals("{type:'boolean',description:'java.lang.Boolean'}", s.getSchema(Boolean.class));
}
@Test
public void addDescription_BOOLEAN_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("boolean").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("boolean").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean',description:'boolean'}}}", s.getSchema(boolean[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean',description:'java.lang.Boolean'}}}", s.getSchema(Boolean[][].class));
}
@@ -959,7 +840,7 @@ public class JsonSchemaSerializerTest {
//====================================================================================================
@Test
public void addDescription_NUMBER() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("number").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("number").build().createSession();
assertObjectEquals("{type:'integer',format:'int16',description:'short'}", s.getSchema(short.class));
assertObjectEquals("{type:'integer',format:'int16',description:'java.lang.Short'}", s.getSchema(Short.class));
assertObjectEquals("{type:'integer',format:'int32',description:'int'}", s.getSchema(int.class));
@@ -974,7 +855,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addDescription_NUMBER_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("number").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("number").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16',description:'short'}}}", s.getSchema(short[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16',description:'java.lang.Short'}}}", s.getSchema(Short[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32',description:'int'}}}", s.getSchema(int[][].class));
@@ -993,7 +874,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addDescription_STRING() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("string").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("string").build().createSession();
assertObjectEquals("{type:'string',description:'java.lang.String'}", s.getSchema(String.class));
assertObjectEquals("{type:'string',description:'java.lang.StringBuilder'}", s.getSchema(StringBuilder.class));
assertObjectEquals("{type:'string',description:'java.lang.Character'}", s.getSchema(Character.class));
@@ -1002,7 +883,7 @@ public class JsonSchemaSerializerTest {
@Test
public void addDescription_STRING_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("string").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("string").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',description:'java.lang.String'}}}", s.getSchema(String[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',description:'java.lang.StringBuilder'}}}", s.getSchema(StringBuilder[][].class));
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',description:'java.lang.Character'}}}", s.getSchema(Character[][].class));
@@ -1015,13 +896,13 @@ public class JsonSchemaSerializerTest {
@Test
public void addDescription_ENUM() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("enum").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("enum").build().createSession();
assertObjectEquals("{type:'string','enum':['one','two','three'],description:'org.apache.juneau.testutils.pojos.TestEnumToString'}", s.getSchema(TestEnumToString.class));
}
@Test
public void addDescription_ENUM_2darray() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("enum").build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("enum").build().createSession();
assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['one','two','three'],description:'org.apache.juneau.testutils.pojos.TestEnumToString'}}}", s.getSchema(TestEnumToString[][].class));
}
@@ -1030,11 +911,11 @@ public class JsonSchemaSerializerTest {
//====================================================================================================
@Test
public void addDescription_ANY() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("any").build().createSession();
- assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
- assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanMap.class));
- assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
- assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("any").build().createSession();
+ assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+ assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanMap.class));
+ assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanList.class));
+ assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
assertObjectEquals("{type:'boolean',description:'boolean'}", s.getSchema(boolean.class));
assertObjectEquals("{type:'boolean',description:'java.lang.Boolean'}", s.getSchema(Boolean.class));
assertObjectEquals("{type:'integer',format:'int16',description:'short'}", s.getSchema(short.class));
@@ -1061,7 +942,7 @@ public class JsonSchemaSerializerTest {
// If default schema contains 'type', it's considered complete.
@Test
public void defaultSchemas() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
.defaultSchema(SimpleBean.class, new ObjectMap().append("type", "bar"))
.defaultSchema(BeanMap.class, new ObjectMap().append("type", "bar"))
.defaultSchema(BeanList.class, new ObjectMap().append("type", "bar"))
@@ -1110,7 +991,7 @@ public class JsonSchemaSerializerTest {
// If default schema does not contain 'type', the value is augmented
@Test
public void defaultSchemasNoType() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
.defaultSchema(SimpleBean.class, new ObjectMap().append("foo", "bar"))
.defaultSchema(BeanMap.class, new ObjectMap().append("foo", "bar"))
.defaultSchema(BeanList.class, new ObjectMap().append("foo", "bar"))
@@ -1162,7 +1043,7 @@ public class JsonSchemaSerializerTest {
@Test
public void allowNestedExamples_enabled() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
.allowNestedExamples()
.example(BeanList.class, new BeanList())
.example(SimpleBean.class, new SimpleBean())
@@ -1174,7 +1055,7 @@ public class JsonSchemaSerializerTest {
@Test
public void allowNestedExamples_disabled() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
.example(BeanList.class, new BeanList())
.example(SimpleBean.class, new SimpleBean())
.addExamplesTo("collection,bean")
@@ -1189,21 +1070,21 @@ public class JsonSchemaSerializerTest {
@Test
public void allowNestedDescriptions_enabled() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
.allowNestedDescriptions()
.addDescriptionsTo("collection,bean")
.build().createSession();
- assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
+ assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanList.class));
}
@Test
public void allowNestedDescriptions_disabled() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
.addDescriptionsTo("collection,bean")
.build().createSession();
- assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
+ assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanList.class));
}
//====================================================================================================
@@ -1212,7 +1093,7 @@ public class JsonSchemaSerializerTest {
@Test
public void swaps_int() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
.pojoSwaps(IntSwap.class)
.build().createSession();
assertObjectEquals("{type:'integer',format:'int32'}", s.getSchema(SimpleBean.class));
@@ -1228,7 +1109,7 @@ public class JsonSchemaSerializerTest {
@Test
public void jsonSchema_onclass() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();
assertObjectEquals("{type:'foo',format:'bar',properties:{f1:{type:'integer',format:'int32'}},description:'baz','x-example':{f1:123}}", s.getSchema(A1.class));
}
@@ -1239,7 +1120,7 @@ public class JsonSchemaSerializerTest {
@Test
public void jsonSchema_onbeanfield() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A2.class));
}
@@ -1250,7 +1131,7 @@ public class JsonSchemaSerializerTest {
@Test
public void jsonSchema_onbeangetter() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A3.class));
}
@@ -1263,7 +1144,7 @@ public class JsonSchemaSerializerTest {
@Test
public void jsonSchema_onbeansetter() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().build().createSession();
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();
assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A4.class));
}
@@ -1282,7 +1163,7 @@ public class JsonSchemaSerializerTest {
@Test
public void jsonschema_onpojoswap() throws Exception {
- JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+ JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
.pojoSwaps(SwapWithAnnotation.class)
.build().createSession();
assertObjectEquals("{type:'foo',format:'bar',description:'baz','x-example':123}", s.getSchema(SimpleBean.class));
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/uon/Common_UonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/uon/Common_UonTest.java
index 3144405..57d80e7 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/uon/Common_UonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/uon/Common_UonTest.java
@@ -266,7 +266,7 @@ public class Common_UonTest {
fail("Exception expected!");
} catch (Exception e) {
String msg = e.getLocalizedMessage();
- assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+ assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
}
// Recursion detection, no ignore
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
index f740f79..c7472c0 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
@@ -268,7 +268,7 @@ public class Common_UrlEncodingTest {
fail("Exception expected!");
} catch (Exception e) {
String msg = e.getLocalizedMessage();
- assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+ assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
}
// Recursion detection, no ignore
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/CommonTest.java
index b866d09..611d3dc 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/CommonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/CommonTest.java
@@ -285,7 +285,7 @@ public class CommonTest {
fail("Exception expected!");
} catch (Exception e) {
String msg = e.getLocalizedMessage();
- assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+ assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
}
// Recursion detection, no ignore
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index f62fbc0..032adde 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -764,7 +764,7 @@ public class BeanContext extends Context {
* When bean getters throws exceptions, the exception includes the object stack information
* in order to determine how that method was invoked.
* <li>
- * Enables {@link Serializer#SERIALIZER_detectRecursions}.
+ * Enables {@link Serializer#BEANTRAVERSE_detectRecursions}.
* </ul>
*
* <p>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
index 138f2d9..64df07b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
@@ -555,7 +555,7 @@ public class BeanContextBuilder extends ContextBuilder {
* When bean getters throws exceptions, the exception includes the object stack information
* in order to determine how that method was invoked.
* <li>
- * Enables {@link Serializer#SERIALIZER_detectRecursions}.
+ * Enables {@link Serializer#BEANTRAVERSE_detectRecursions}.
* </ul>
*
* <h5 class='section'>See Also:</h5>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/package-info.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRecursionException.java
old mode 100755
new mode 100644
similarity index 75%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/package-info.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRecursionException.java
index c900607..798feb0
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/package-info.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRecursionException.java
@@ -1,18 +1,33 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
-// * with the License. You may obtain a copy of the License at *
-// * *
-// * http://www.apache.org/licenses/LICENSE-2.0 *
-// * *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
-// * specific language governing permissions and limitations under the License. *
-// ***************************************************************************************************************************
-
-/**
- * HTML-Schema Marshalling Support
- */
-package org.apache.juneau.htmlschema;
-
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
+// * with the License. You may obtain a copy of the License at *
+// * *
+// * http://www.apache.org/licenses/LICENSE-2.0 *
+// * *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
+// * specific language governing permissions and limitations under the License. *
+// ***************************************************************************************************************************
+package org.apache.juneau;
+
+import java.text.*;
+
+/**
+ * Exception that indicates that a recursion was detected while traversing a POJO model.
+ */
+public class BeanRecursionException extends FormattedException {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Constructor.
+ *
+ * @param message The {@link MessageFormat}-style message.
+ * @param args Optional {@link MessageFormat}-style arguments.
+ */
+ public BeanRecursionException(String message, Object...args) {
+ super(message, args);
+ }
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
new file mode 100644
index 0000000..0f48737
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
@@ -0,0 +1,559 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
+// * with the License. You may obtain a copy of the License at *
+// * *
+// * http://www.apache.org/licenses/LICENSE-2.0 *
+// * *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
+// * specific language governing permissions and limitations under the License. *
+// ***************************************************************************************************************************
+package org.apache.juneau;
+
+import static org.apache.juneau.BeanTraverseContext.*;
+
+import java.util.*;
+
+import org.apache.juneau.http.*;
+
+/**
+ * Builder class for building instances of bean traversals.
+ */
+public class BeanTraverseBuilder extends BeanContextBuilder {
+
+ /**
+ * Constructor, default settings.
+ */
+ public BeanTraverseBuilder() {
+ super();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param ps The initial configuration settings for this builder.
+ */
+ public BeanTraverseBuilder(PropertyStore ps) {
+ super(ps);
+ }
+
+
+ //--------------------------------------------------------------------------------
+ // Properties
+ //--------------------------------------------------------------------------------
+
+ /**
+ * Configuration property: Automatically detect POJO recursions.
+ *
+ * <p>
+ * Specifies that recursions should be checked for during traversal.
+ *
+ * <h5 class='section'>Notes:</h5>
+ * <ul class='spaced-list'>
+ * <li>
+ * Checking for recursion can cause a small performance penalty.
+ * </ul>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
+ * </ul>
+ *
+ * @param value
+ * The new value for this property.
+ * <br>The default is <jk>false</jk>.
+ * @return This object (for method chaining).
+ */
+ public BeanTraverseBuilder detectRecursions(boolean value) {
+ return set(BEANTRAVERSE_detectRecursions, value);
+ }
+
+ /**
+ * Configuration property: Automatically detect POJO recursions.
+ *
+ * <p>
+ * Shortcut for calling <code>detectRecursions(<jk>true</jk>)</code>.
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
+ * </ul>
+ *
+ * @return This object (for method chaining).
+ */
+ public BeanTraverseBuilder detectRecursions() {
+ return set(BEANTRAVERSE_detectRecursions, true);
+ }
+
+ /**
+ * Configuration property: Ignore recursion errors.
+ *
+ * <p>
+ * If <jk>true</jk>, when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+ * Otherwise, an exception is thrown.
+ *
+ * <h5 class='section'>Notes:</h5>
+ * <ul class='spaced-list'>
+ * <li>
+ * Checking for recursion can cause a small performance penalty.
+ * </ul>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
+ * </ul>
+ *
+ * @param value
+ * The new value for this property.
+ * <br>The default is <jk>false</jk>.
+ * @return This object (for method chaining).
+ */
+ public BeanTraverseBuilder ignoreRecursions(boolean value) {
+ return set(BEANTRAVERSE_ignoreRecursions, value);
+ }
+
+ /**
+ * Configuration property: Ignore recursion errors.
+ *
+ * <p>
+ * Shortcut for calling <code>ignoreRecursions(<jk>true</jk>)</code>.
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
+ * </ul>
+ *
+ * @return This object (for method chaining).
+ */
+ public BeanTraverseBuilder ignoreRecursions() {
+ return set(BEANTRAVERSE_ignoreRecursions, true);
+ }
+
+ /**
+ * Configuration property: Initial depth.
+ *
+ * <p>
+ * The initial indentation level at the root.
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
+ * </ul>
+ *
+ * @param value
+ * The new value for this property.
+ * <br>The default is <code>0</code>.
+ * @return This object (for method chaining).
+ */
+ public BeanTraverseBuilder initialDepth(int value) {
+ return set(BEANTRAVERSE_initialDepth, value);
+ }
+
+ /**
+ * Configuration property: Max traversal depth.
+ *
+ * <p>
+ * Abort traversal if specified depth is reached in the POJO tree.
+ * <br>If this depth is exceeded, an exception is thrown.
+ * <br>This prevents stack overflows from occurring when trying to traverse models with recursive references.
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
+ * </ul>
+ *
+ * @param value
+ * The new value for this property.
+ * <br>The default is <code>100</code>.
+ * @return This object (for method chaining).
+ */
+ public BeanTraverseBuilder maxDepth(int value) {
+ return set(BEANTRAVERSE_maxDepth, value);
+ }
+
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanClassVisibility(Visibility value) {
+ super.beanClassVisibility(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanConstructorVisibility(Visibility value) {
+ super.beanConstructorVisibility(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanDictionary(boolean append, Object...values) {
+ super.beanDictionary(append, values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanDictionary(Class<?>...values) {
+ super.beanDictionary(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanDictionary(Object...values) {
+ super.beanDictionary(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanDictionaryRemove(Object...values) {
+ super.beanDictionaryRemove(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanFieldVisibility(Visibility value) {
+ super.beanFieldVisibility(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanFilters(boolean append, Object...values) {
+ super.beanFilters(append, values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanFilters(Class<?>...values) {
+ super.beanFilters(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanFilters(Object...values) {
+ super.beanFilters(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanFiltersRemove(Object...values) {
+ super.beanFiltersRemove(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanMapPutReturnsOldValue(boolean value) {
+ super.beanMapPutReturnsOldValue(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanMapPutReturnsOldValue() {
+ super.beanMapPutReturnsOldValue();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanMethodVisibility(Visibility value) {
+ super.beanMethodVisibility(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beansRequireDefaultConstructor(boolean value) {
+ super.beansRequireDefaultConstructor(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beansRequireDefaultConstructor() {
+ super.beansRequireDefaultConstructor();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beansRequireSerializable(boolean value) {
+ super.beansRequireSerializable(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beansRequireSerializable() {
+ super.beansRequireSerializable();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beansRequireSettersForGetters(boolean value) {
+ super.beansRequireSettersForGetters(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beansRequireSettersForGetters() {
+ super.beansRequireSettersForGetters();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beansRequireSomeProperties(boolean value) {
+ super.beansRequireSomeProperties(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder beanTypePropertyName(String value) {
+ super.beanTypePropertyName(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder debug() {
+ super.debug();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public <T> BeanTraverseBuilder example(Class<T> c, T o) {
+ super.example(c, o);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
+ super.ignoreInvocationExceptionsOnGetters(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder ignoreInvocationExceptionsOnGetters() {
+ super.ignoreInvocationExceptionsOnGetters();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
+ super.ignoreInvocationExceptionsOnSetters(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder ignoreInvocationExceptionsOnSetters() {
+ super.ignoreInvocationExceptionsOnSetters();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder ignorePropertiesWithoutSetters(boolean value) {
+ super.ignorePropertiesWithoutSetters(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder ignoreUnknownBeanProperties(boolean value) {
+ super.ignoreUnknownBeanProperties(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder ignoreUnknownBeanProperties() {
+ super.ignoreUnknownBeanProperties();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder ignoreUnknownNullBeanProperties(boolean value) {
+ super.ignoreUnknownNullBeanProperties(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public <T> BeanTraverseBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+ super.implClass(interfaceClass, implClass);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder implClasses(Map<String,Class<?>> values) {
+ super.implClasses(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder locale(Locale value) {
+ super.locale(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder mediaType(MediaType value) {
+ super.mediaType(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder notBeanClasses(boolean append, Object...values) {
+ super.notBeanClasses(append, values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder notBeanClasses(Class<?>...values) {
+ super.notBeanClasses(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder notBeanClasses(Object...values) {
+ super.notBeanClasses(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder notBeanClassesRemove(Object...values) {
+ super.notBeanClassesRemove(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder notBeanPackages(boolean append, Object...values) {
+ super.notBeanPackages(append, values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder notBeanPackages(Object...values) {
+ super.notBeanPackages(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder notBeanPackages(String...values) {
+ super.notBeanPackages(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder notBeanPackagesRemove(Object...values) {
+ super.notBeanPackagesRemove(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder pojoSwaps(boolean append, Object...values) {
+ super.pojoSwaps(append, values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder pojoSwaps(Class<?>...values) {
+ super.pojoSwaps(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder pojoSwaps(Object...values) {
+ super.pojoSwaps(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder pojoSwapsRemove(Object...values) {
+ super.pojoSwapsRemove(values);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder sortProperties(boolean value) {
+ super.sortProperties(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder sortProperties() {
+ super.sortProperties();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder timeZone(TimeZone value) {
+ super.timeZone(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder useEnumNames() {
+ super.useEnumNames();
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder useInterfaceProxies(boolean value) {
+ super.useInterfaceProxies(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder useJavaBeanIntrospector(boolean value) {
+ super.useJavaBeanIntrospector(value);
+ return this;
+ }
+
+ @Override /* BeanContextBuilder */
+ public BeanTraverseBuilder useJavaBeanIntrospector() {
+ super.useJavaBeanIntrospector();
+ return this;
+ }
+
+ @Override /* ContextBuilder */
+ public BeanTraverseBuilder set(String name, Object value) {
+ super.set(name, value);
+ return this;
+ }
+
+ @Override /* ContextBuilder */
+ public BeanTraverseBuilder set(boolean append, String name, Object value) {
+ super.set(append, name, value);
+ return this;
+ }
+
+ @Override /* ContextBuilder */
+ public BeanTraverseBuilder set(Map<String,Object> properties) {
+ super.set(properties);
+ return this;
+ }
+
+ @Override /* ContextBuilder */
+ public BeanTraverseBuilder add(Map<String,Object> properties) {
+ super.add(properties);
+ return this;
+ }
+
+ @Override /* ContextBuilder */
+ public BeanTraverseBuilder addTo(String name, Object value) {
+ super.addTo(name, value);
+ return this;
+ }
+
+ @Override /* ContextBuilder */
+ public BeanTraverseBuilder addTo(String name, String key, Object value) {
+ super.addTo(name, key, value);
+ return this;
+ }
+
+ @Override /* ContextBuilder */
+ public BeanTraverseBuilder removeFrom(String name, Object value) {
+ super.removeFrom(name, value);
+ return this;
+ }
+
+ @Override /* ContextBuilder */
+ public BeanTraverseBuilder apply(PropertyStore copyFrom) {
+ super.apply(copyFrom);
+ return this;
+ }
+
+ @Override /* Context */
+ public BeanTraverseContext build() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java
new file mode 100644
index 0000000..f69ee5a
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java
@@ -0,0 +1,304 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
+// * with the License. You may obtain a copy of the License at *
+// * *
+// * http://www.apache.org/licenses/LICENSE-2.0 *
+// * *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
+// * specific language governing permissions and limitations under the License. *
+// ***************************************************************************************************************************
+package org.apache.juneau;
+
+
+import org.apache.juneau.parser.*;
+
+/**
+ * Parent class for all classes that traverse POJOs.
+ *
+ * <h5 class='topic'>Description</h5>
+ *
+ * Base class that serves as the parent class for all serializers and other classes that traverse POJOs.
+ */
+public abstract class BeanTraverseContext extends BeanContext {
+
+ //-------------------------------------------------------------------------------------------------------------------
+ // Configurable properties
+ //-------------------------------------------------------------------------------------------------------------------
+
+ private static final String PREFIX = "BeanTraverseContext.";
+
+ /**
+ * Configuration property: Automatically detect POJO recursions.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"BeanTraverseContext.detectRecursions.b"</js>
+ * <li><b>Data type:</b> <code>Boolean</code>
+ * <li><b>Default:</b> <jk>false</jk>
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link BeanTraverseBuilder#detectRecursions(boolean)}
+ * <li class='jm'>{@link BeanTraverseBuilder#detectRecursions()}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Specifies that recursions should be checked for during traversal.
+ *
+ * <p>
+ * Recursions can occur when traversing models that aren't true trees but rather contain loops.
+ * <br>In general, unchecked recursions cause stack-overflow-errors.
+ * <br>These show up as {@link ParseException ParseExceptions} with the message <js>"Depth too deep. Stack overflow occurred."</js>.
+ *
+ * <p>
+ * The behavior when recursions are detected depends on the value for {@link #BEANTRAVERSE_ignoreRecursions}.
+ *
+ * <p>
+ * For example, if a model contains the links A->B->C->A, then the JSON generated will look like
+ * the following when <jsf>BEANTRAVERSE_ignoreRecursions</jsf> is <jk>true</jk>...
+ *
+ * <p class='bcode w800'>
+ * {A:{B:{C:<jk>null</jk>}}}
+ * </p>
+ *
+ * <h5 class='section'>Notes:</h5>
+ * <ul class='spaced-list'>
+ * <li>
+ * Checking for recursion can cause a small performance penalty.
+ * </ul>
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * <jc>// Create a serializer that never adds _type to nodes.</jc>
+ * WriterSerializer s = JsonSerializer
+ * .<jsm>create</jsm>()
+ * .detectRecursions()
+ * .ignoreRecursions()
+ * .build();
+ *
+ * <jc>// Same, but use property.</jc>
+ * WriterSerializer s = JsonSerializer
+ * .<jsm>create</jsm>()
+ * .set(<jsf>BEANTRAVERSE_detectRecursions</jsf>, <jk>true</jk>)
+ * .set(<jsf>BEANTRAVERSE_ignoreRecursions</jsf>, <jk>true</jk>)
+ * .build();
+ *
+ * <jc>// Create a POJO model with a recursive loop.</jc>
+ * <jk>public class</jk> A {
+ * <jk>public</jk> Object <jf>f</jf>;
+ * }
+ * A a = <jk>new</jk> A();
+ * a.<jf>f</jf> = a;
+ *
+ * <jc>// Produces "{f:null}"</jc>
+ * String json = s.serialize(a);
+ * </p>
+ */
+ public static final String BEANTRAVERSE_detectRecursions = PREFIX + "detectRecursions.b";
+
+ /**
+ * Configuration property: Ignore recursion errors.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"BeanTraverseContext.ignoreRecursions.b"</js>
+ * <li><b>Data type:</b> <code>Boolean</code>
+ * <li><b>Default:</b> <jk>false</jk>
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link BeanTraverseBuilder#ignoreRecursions(boolean)}
+ * <li class='jm'>{@link BeanTraverseBuilder#ignoreRecursions()}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Used in conjunction with {@link #BEANTRAVERSE_detectRecursions}.
+ * <br>Setting is ignored if <jsf>BEANTRAVERSE_detectRecursions</jsf> is <jk>false</jk>.
+ *
+ * <p>
+ * If <jk>true</jk>, when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+ * <br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
+ */
+ public static final String BEANTRAVERSE_ignoreRecursions = PREFIX + "ignoreRecursions.b";
+
+ /**
+ * Configuration property: Initial depth.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"BeanTraverseContext.initialDepth.i"</js>
+ * <li><b>Data type:</b> <code>Integer</code>
+ * <li><b>Default:</b> <code>0</code>
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link BeanTraverseBuilder#initialDepth(int)}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * The initial indentation level at the root.
+ * <br>Useful when constructing document fragments that need to be indented at a certain level.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * <jc>// Create a serializer with whitespace enabled and an initial depth of 2.</jc>
+ * WriterSerializer s = JsonSerializer
+ * .<jsm>create</jsm>()
+ * .ws()
+ * .initialDepth(2)
+ * .build();
+ *
+ * <jc>// Same, but use property.</jc>
+ * WriterSerializer s = JsonSerializer
+ * .<jsm>create</jsm>()
+ * .set(<jsf>BEANTRAVERSE_useWhitespace</jsf>, <jk>true</jk>)
+ * .set(<jsf>BEANTRAVERSE_initialDepth</jsf>, 2)
+ * .build();
+ *
+ * <jc>// Produces "\t\t{\n\t\t\t'foo':'bar'\n\t\t}\n"</jc>
+ * String json = s.serialize(<jk>new</jk> MyBean());
+ * </p>
+ */
+ public static final String BEANTRAVERSE_initialDepth = PREFIX + "initialDepth.i";
+
+ /**
+ * Configuration property: Max traversal depth.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"BeanTraverseContext.maxDepth.i"</js>
+ * <li><b>Data type:</b> <code>Integer</code>
+ * <li><b>Default:</b> <code>100</code>
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link BeanTraverseBuilder#maxDepth(int)}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Abort traversal if specified depth is reached in the POJO tree.
+ * <br>If this depth is exceeded, an exception is thrown.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * <jc>// Create a serializer that throws an exception if the depth is greater than 20.</jc>
+ * WriterSerializer s = JsonSerializer
+ * .<jsm>create</jsm>()
+ * .maxDepth(20)
+ * .build();
+ *
+ * <jc>// Same, but use property.</jc>
+ * WriterSerializer s = JsonSerializer
+ * .<jsm>create</jsm>()
+ * .set(<jsf>BEANTRAVERSE_maxDepth</jsf>, 20)
+ * .build();
+ * </p>
+ */
+ public static final String BEANTRAVERSE_maxDepth = PREFIX + "maxDepth.i";
+
+ //-------------------------------------------------------------------------------------------------------------------
+ // Instance
+ //-------------------------------------------------------------------------------------------------------------------
+
+ private final int initialDepth, maxDepth;
+ private final boolean
+ detectRecursions,
+ ignoreRecursions;
+
+ /**
+ * Constructor
+ *
+ * @param ps
+ * The property store containing all the settings for this object.
+ */
+ protected BeanTraverseContext(PropertyStore ps) {
+ super(ps);
+
+ maxDepth = getIntegerProperty(BEANTRAVERSE_maxDepth, 100);
+ initialDepth = getIntegerProperty(BEANTRAVERSE_initialDepth, 0);
+ detectRecursions = getBooleanProperty(BEANTRAVERSE_detectRecursions, false);
+ ignoreRecursions = getBooleanProperty(BEANTRAVERSE_ignoreRecursions, false);
+ }
+
+ @Override /* Context */
+ public BeanTraverseBuilder builder() {
+ return null;
+ }
+
+ @Override /* Context */
+ public BeanTraverseSession createSession(BeanSessionArgs args) {
+ return new BeanTraverseSession(this, args);
+ }
+
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // Properties
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Configuration property: Initial depth.
+ *
+ * @see #BEANTRAVERSE_initialDepth
+ * @return
+ * The initial indentation level at the root.
+ */
+ protected final int getInitialDepth() {
+ return initialDepth;
+ }
+
+ /**
+ * Configuration property: Max traversal depth.
+ *
+ * @see #BEANTRAVERSE_maxDepth
+ * @return
+ * The depth at which traversal is aborted if depth is reached in the POJO tree.
+ * <br>If this depth is exceeded, an exception is thrown.
+ */
+ protected final int getMaxDepth() {
+ return maxDepth;
+ }
+
+ /**
+ * Configuration property: Automatically detect POJO recursions.
+ * @see #BEANTRAVERSE_detectRecursions
+ * @return
+ * <jk>true</jk> if recursions should be checked for during traversal.
+ */
+ protected final boolean isDetectRecursions() {
+ return detectRecursions;
+ }
+
+ /**
+ * Configuration property: Ignore recursion errors.
+ *
+ * @see #BEANTRAVERSE_ignoreRecursions
+ * @return
+ * <jk>true</jk> if when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+ * <br>Otherwise, an exception is thrown with the message <js>"Recursion occurred, stack=..."</js>.
+ */
+ protected final boolean isIgnoreRecursions() {
+ return ignoreRecursions;
+ }
+
+ @Override /* Context */
+ public ObjectMap asMap() {
+ return super.asMap()
+ .append("BeanTraverseContext", new ObjectMap()
+ .append("maxDepth", maxDepth)
+ .append("initialDepth", initialDepth)
+ .append("detectRecursions", detectRecursions)
+ .append("ignoreRecursions", ignoreRecursions)
+ );
+ }
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
new file mode 100644
index 0000000..d5f2db6
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
@@ -0,0 +1,290 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
+// * with the License. You may obtain a copy of the License at *
+// * *
+// * http://www.apache.org/licenses/LICENSE-2.0 *
+// * *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
+// * specific language governing permissions and limitations under the License. *
+// ***************************************************************************************************************************
+package org.apache.juneau;
+
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.text.*;
+import java.util.*;
+
+/**
+ * Session that lives for the duration of a single use of {@link BeanTraverseContext}.
+ *
+ * <p>
+ * Used by serializers and other classes that traverse POJOs for the following purposes:
+ * <ul class='spaced-list'>
+ * <li>
+ * Keeping track of how deep it is in a model for indentation purposes.
+ * <li>
+ * Ensuring infinite loops don't occur by setting a limit on how deep to traverse a model.
+ * <li>
+ * Ensuring infinite loops don't occur from loops in the model (when detectRecursions is enabled.
+ * </ul>
+ *
+ * <p>
+ * This class is NOT thread safe.
+ * It is typically discarded after one-time use although it can be reused within the same thread.
+ */
+public class BeanTraverseSession extends BeanSession {
+
+ private final BeanTraverseContext ctx;
+ private final Map<Object,Object> set; // Contains the current objects in the current branch of the model.
+ private final LinkedList<StackElement> stack = new LinkedList<>(); // Contains the current objects in the current branch of the model.
+
+ // Writable properties
+ private boolean isBottom; // If 'true', then we're at a leaf in the model (i.e. a String, Number, Boolean, or null).
+ private BeanPropertyMeta currentProperty;
+ private ClassMeta<?> currentClass;
+
+ /** The current indentation depth into the model. */
+ public int indent;
+
+
+ /**
+ * Create a new session using properties specified in the context.
+ *
+ * @param ctx
+ * The context creating this session object.
+ * The context contains all the configuration settings for this object.
+ * Can be <jk>null</jk>.
+ * @param args
+ * Runtime arguments.
+ * These specify session-level information such as locale and URI context.
+ * It also include session-level properties that override the properties defined on the bean and
+ * serializer contexts.
+ */
+ protected BeanTraverseSession(BeanTraverseContext ctx, BeanSessionArgs args) {
+ super(ctx, args == null ? BeanSessionArgs.DEFAULT : args);
+ args = args == null ? BeanSessionArgs.DEFAULT : args;
+ this.ctx = ctx;
+ this.indent = getInitialDepth();
+ if (isDetectRecursions() || isDebug()) {
+ set = new IdentityHashMap<>();
+ } else {
+ set = Collections.emptyMap();
+ }
+ }
+
+ /**
+ * Sets the current bean property being traversed for proper error messages.
+ *
+ * @param currentProperty The current property being traversed.
+ */
+ protected final void setCurrentProperty(BeanPropertyMeta currentProperty) {
+ this.currentProperty = currentProperty;
+ }
+
+ /**
+ * Sets the current class being traversed for proper error messages.
+ *
+ * @param currentClass The current class being traversed.
+ */
+ protected final void setCurrentClass(ClassMeta<?> currentClass) {
+ this.currentClass = currentClass;
+ }
+
+ /**
+ * Push the specified object onto the stack.
+ *
+ * @param attrName The attribute name.
+ * @param o The current object being traversed.
+ * @param eType The expected class type.
+ * @return
+ * The {@link ClassMeta} of the object so that <code>instanceof</code> operations only need to be performed
+ * once (since they can be expensive).
+ * @throws BeanRecursionException If recursion occurred.
+ */
+ protected final ClassMeta<?> push(String attrName, Object o, ClassMeta<?> eType) throws BeanRecursionException {
+ indent++;
+ isBottom = true;
+ if (o == null)
+ return null;
+ Class<?> c = o.getClass();
+ ClassMeta<?> cm = (eType != null && c == eType.getInnerClass()) ? eType : getClassMeta(c);
+ if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
+ return cm;
+ if (isDetectRecursions() || isDebug()) {
+ if (stack.size() > getMaxDepth())
+ return null;
+ if (willRecurse(attrName, o, cm))
+ return null;
+ isBottom = false;
+ stack.add(new StackElement(stack.size(), attrName, o, cm));
+ if (isDebug())
+ getLogger().info(getStack(false));
+ set.put(o, o);
+ }
+ return cm;
+ }
+
+ /**
+ * Returns <jk>true</jk> if {@link BeanTraverseContext#BEANTRAVERSE_detectRecursions} is enabled, and the specified
+ * object is already higher up in the traversal chain.
+ *
+ * @param attrName The bean property attribute name, or some other identifier.
+ * @param o The object to check for recursion.
+ * @param cm The metadata on the object class.
+ * @return <jk>true</jk> if recursion detected.
+ * @throws BeanRecursionException If recursion occurred.
+ */
+ protected final boolean willRecurse(String attrName, Object o, ClassMeta<?> cm) throws BeanRecursionException {
+ if (! (isDetectRecursions() || isDebug()))
+ return false;
+ if (! set.containsKey(o))
+ return false;
+ if (isIgnoreRecursions() && ! isDebug())
+ return true;
+
+ stack.add(new StackElement(stack.size(), attrName, o, cm));
+ throw new BeanRecursionException("Recursion occurred, stack={0}", getStack(true));
+ }
+
+ /**
+ * Pop an object off the stack.
+ */
+ protected final void pop() {
+ indent--;
+ if ((isDetectRecursions() || isDebug()) && ! isBottom) {
+ Object o = stack.removeLast().o;
+ Object o2 = set.remove(o);
+ if (o2 == null)
+ onError(null, "Couldn't remove object of type ''{0}'' on attribute ''{1}'' from object stack.",
+ o.getClass().getName(), stack);
+ }
+ isBottom = false;
+ }
+
+ /**
+ * Logs a warning message.
+ *
+ * @param t The throwable that was thrown (if there was one).
+ * @param msg The warning message.
+ * @param args Optional {@link MessageFormat}-style arguments.
+ */
+ protected void onError(Throwable t, String msg, Object... args) {
+ super.addWarning(msg, args);
+ }
+
+ private static final class StackElement {
+ final int depth;
+ final String name;
+ final Object o;
+ final ClassMeta<?> aType;
+
+ StackElement(int depth, String name, Object o, ClassMeta<?> aType) {
+ this.depth = depth;
+ this.name = name;
+ this.o = o;
+ this.aType = aType;
+ }
+
+ String toString(boolean simple) {
+ StringBuilder sb = new StringBuilder().append('[').append(depth).append(']');
+ sb.append(isEmpty(name) ? "<noname>" : name).append(':');
+ sb.append(aType.toString(simple));
+ if (aType != aType.getSerializedClassMeta(null))
+ sb.append('/').append(aType.getSerializedClassMeta(null).toString(simple));
+ return sb.toString();
+ }
+ }
+
+ /**
+ * Returns the current stack trace.
+ *
+ * @param full
+ * If <jk>true</jk>, returns a full stack trace.
+ * @return The current stack trace.
+ */
+ protected String getStack(boolean full) {
+ StringBuilder sb = new StringBuilder();
+ for (StackElement e : stack) {
+ if (full) {
+ sb.append("\n\t");
+ for (int i = 1; i < e.depth; i++)
+ sb.append(" ");
+ if (e.depth > 0)
+ sb.append("->");
+ sb.append(e.toString(false));
+ } else {
+ sb.append(" > ").append(e.toString(true));
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Returns information used to determine at what location in the parse a failure occurred.
+ *
+ * @return A map, typically containing something like <code>{line:123,column:456,currentProperty:"foobar"}</code>
+ */
+ public final ObjectMap getLastLocation() {
+ ObjectMap m = new ObjectMap();
+ if (currentClass != null)
+ m.put("currentClass", currentClass);
+ if (currentProperty != null)
+ m.put("currentProperty", currentProperty);
+ if (stack != null && ! stack.isEmpty())
+ m.put("stack", stack);
+ return m;
+ }
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // Properties
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Configuration property: Initial depth.
+ *
+ * @see BeanTraverseContext#BEANTRAVERSE_initialDepth
+ * @return
+ * The initial indentation level at the root.
+ */
+ protected final int getInitialDepth() {
+ return ctx.getInitialDepth();
+ }
+
+ /**
+ * Configuration property: Max traversal depth.
+ *
+ * @see BeanTraverseContext#BEANTRAVERSE_maxDepth
+ * @return
+ * The depth at which traversal is aborted if depth is reached in the POJO tree.
+ * <br>If this depth is exceeded, an exception is thrown.
+ */
+ protected final int getMaxDepth() {
+ return ctx.getMaxDepth();
+ }
+
+ /**
+ * Configuration property: Automatically detect POJO recursions.
+ *
+ * @see BeanTraverseContext#BEANTRAVERSE_detectRecursions
+ * @return
+ * <jk>true</jk> if recursions should be checked for during traversal.
+ */
+ protected final boolean isDetectRecursions() {
+ return ctx.isDetectRecursions();
+ }
+
+ /**
+ * Configuration property: Ignore recursion errors.
+ *
+ * @see BeanTraverseContext#BEANTRAVERSE_ignoreRecursions
+ * @return
+ * <jk>true</jk> if when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+ * <br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
+ */
+ protected final boolean isIgnoreRecursions() {
+ return ctx.isIgnoreRecursions();
+ }
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
index bee49d7..92a1f35 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
@@ -13,7 +13,6 @@
package org.apache.juneau.html;
import org.apache.juneau.*;
-import org.apache.juneau.htmlschema.*;
import org.apache.juneau.serializer.*;
/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
similarity index 86%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializer.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
index 2e1a172..5e698c4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
@@ -10,10 +10,9 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.html;
import org.apache.juneau.*;
-import org.apache.juneau.html.*;
import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
@@ -28,7 +27,7 @@ import org.apache.juneau.serializer.*;
*
* <h5 class='topic'>Description</h5>
*
- * Essentially the same as {@link HtmlSerializer}, except serializes the POJO metamodel instead of the model itself.
+ * Essentially the same as {@link HtmlDocSerializer}, except serializes the POJO metamodel instead of the model itself.
*
* <p>
* Produces output that describes the POJO metamodel similar to an XML schema document.
@@ -39,7 +38,7 @@ import org.apache.juneau.serializer.*;
*/
public final class HtmlSchemaDocSerializer extends HtmlDocSerializer {
- private final JsonSchemaSerializer jsctx;
+ private final JsonSchemaGenerator generator;
/**
* Constructor.
@@ -81,17 +80,22 @@ public final class HtmlSchemaDocSerializer extends HtmlDocSerializer {
public HtmlSchemaDocSerializer(PropertyStore ps, String produces, String accept) {
super(
ps.builder()
- .set(SERIALIZER_detectRecursions, true)
- .set(SERIALIZER_ignoreRecursions, true)
+ .set(BEANTRAVERSE_detectRecursions, true)
+ .set(BEANTRAVERSE_ignoreRecursions, true)
.build(),
produces,
accept
);
- this.jsctx = new JsonSchemaSerializer(ps);
+
+ generator = JsonSchemaGenerator.create().apply(getPropertyStore()).build();
}
@Override /* Serializer */
public HtmlSchemaDocSerializerSession createSession(SerializerSessionArgs args) {
- return new HtmlSchemaDocSerializerSession(jsctx, this, args);
+ return new HtmlSchemaDocSerializerSession(this, args);
+ }
+
+ JsonSchemaGenerator getGenerator() {
+ return generator;
}
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerSession.java
similarity index 81%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerSession.java
index 4363073..b566092 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerSession.java
@@ -10,10 +10,8 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.html;
-import org.apache.juneau.*;
-import org.apache.juneau.html.*;
import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
@@ -25,27 +23,24 @@ import org.apache.juneau.serializer.*;
*/
public class HtmlSchemaDocSerializerSession extends HtmlDocSerializerSession {
- private final JsonSchemaSerializerSession js;
+ private final JsonSchemaGeneratorSession genSession;
/**
* Create a new session using properties specified in the context.
*
- * @param jsctx
- * The JSON-Schema serializer used to convert a POJO into JSON-Schema metadata.
* @param ctx
* The context creating this session object.
* The context contains all the configuration settings for this object.
* @param args
* Runtime arguments.
*/
- protected HtmlSchemaDocSerializerSession(JsonSchemaSerializer jsctx, HtmlSchemaDocSerializer ctx, SerializerSessionArgs args) {
+ protected HtmlSchemaDocSerializerSession(HtmlSchemaDocSerializer ctx, SerializerSessionArgs args) {
super(ctx, args);
- this.js = jsctx.createSession(args);
+ this.genSession = ctx.getGenerator().createSession(args);
}
@Override /* SerializerSession */
protected void doSerialize(SerializerPipe out, Object o) throws Exception {
- ObjectMap schema = js.getSchema(getClassMetaForObject(o));
- super.doSerialize(out, schema);
+ super.doSerialize(out, genSession.getSchema(o));
}
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializer.java
similarity index 74%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializer.java
index 6c298a4..1a4ff99 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializer.java
@@ -10,10 +10,9 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.html;
import org.apache.juneau.*;
-import org.apache.juneau.html.*;
import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
@@ -51,8 +50,6 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
/** Default serializer, single quotes, simple mode, with whitespace. */
public static final HtmlSchemaSerializer DEFAULT_SIMPLE_READABLE = new SimpleReadable(PropertyStore.DEFAULT);
- private final JsonSchemaSerializer jsctx;
-
//-------------------------------------------------------------------------------------------------------------------
// Predefined subclasses
//-------------------------------------------------------------------------------------------------------------------
@@ -107,6 +104,12 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
}
}
+ //-------------------------------------------------------------------------------------------------------------------
+ // Instance
+ //-------------------------------------------------------------------------------------------------------------------
+
+ private final JsonSchemaGenerator generator;
+
/**
* Constructor.
*
@@ -114,7 +117,15 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
* The property store to use for creating the context for this serializer.
*/
public HtmlSchemaSerializer(PropertyStore ps) {
- this(ps, "text/html", "text/html+schema");
+ super(
+ ps.builder()
+ .set(BEANTRAVERSE_detectRecursions, true)
+ .set(BEANTRAVERSE_ignoreRecursions, true)
+ .build(),
+ "text/html", "text/html+schema"
+ );
+
+ generator = JsonSchemaGenerator.create().apply(getPropertyStore()).build();
}
@Override /* Context */
@@ -122,52 +133,17 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
return new HtmlSchemaSerializerBuilder(getPropertyStore());
}
- /**
- * Constructor.
- *
- * @param ps
- * The property store containing all the settings for this object.
- * @param produces
- * The media type that this serializer produces.
- * @param accept
- * The accept media types that the serializer can handle.
- * <p>
- * Can contain meta-characters per the <code>media-type</code> specification of
- * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a>
- * <p>
- * If empty, then assumes the only media type supported is <code>produces</code>.
- * <p>
- * For example, if this serializer produces <js>"application/json"</js> but should handle media types of
- * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be:
- * <p class='bcode w800'>
- * <jk>super</jk>(ps, <js>"application/json"</js>, <js>"application/json,text/json"</js>);
- * </p>
- * <br>...or...
- * <p class='bcode w800'>
- * <jk>super</jk>(ps, <js>"application/json"</js>, <js>"*​/json"</js>);
- * </p>
- * <p>
- * The accept value can also contain q-values.
- */
- public HtmlSchemaSerializer(PropertyStore ps, String produces, String accept) {
- super(
- ps.builder()
- .set(SERIALIZER_detectRecursions, true)
- .set(SERIALIZER_ignoreRecursions, true)
- .build(),
- produces,
- accept
- );
- this.jsctx = new JsonSchemaSerializer(ps);
- }
-
@Override /* Serializer */
public HtmlSchemaSerializerSession createSession(SerializerSessionArgs args) {
- return new HtmlSchemaSerializerSession(jsctx, this, args);
+ return new HtmlSchemaSerializerSession(this, args);
}
@Override /* Context */
public HtmlSchemaSerializerSession createSession() {
return createSession(createDefaultSessionArgs());
}
+
+ JsonSchemaGenerator getGenerator() {
+ return generator;
+ }
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
similarity index 94%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
index a5d0b47..e1c9c04 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
@@ -10,21 +10,20 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.html;
-import static org.apache.juneau.jsonschema.JsonSchemaSerializer.*;
+import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
-import org.apache.juneau.html.*;
import org.apache.juneau.http.*;
import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
/**
- * Builder class for building instances of JSON Schema serializers.
+ * Builder class for building instances of HTML Schema serializers.
*/
public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
@@ -64,7 +63,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
* </ul>
*
* @param value
@@ -91,7 +90,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
* </ul>
*
* @param value
@@ -111,7 +110,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedDescriptions}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions}
* </ul>
*
* @return This object (for method chaining).
@@ -128,7 +127,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples}
* </ul>
*
* @return This object (for method chaining).
@@ -145,11 +144,11 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* <p>
* Used primarily for defining common definition sections for beans in Swagger JSON.
* <p>
- * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+ * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
* </ul>
*
* @param value
@@ -169,11 +168,11 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* <p>
* Used primarily for defining common definition sections for beans in Swagger JSON.
* <p>
- * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+ * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
* </ul>
*
* @param value
@@ -195,7 +194,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_defaultSchemas}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_defaultSchemas}
* </ul>
*
* @param c
@@ -220,11 +219,6 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* }
* </p>
*
- * <p>
- * The definitions can then be retrieved from the session using {@link JsonSchemaSerializerSession#getBeanDefs()}.
- * <p>
- * Definitions can also be added programmatically using {@link JsonSchemaSerializerSession#addBeanDef(String, ObjectMap)}.
- *
* @return This object (for method chaining).
*/
public HtmlSchemaSerializerBuilder useBeanDefs() {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerSession.java
similarity index 75%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerSession.java
index 92f2dcc..0a53944 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerSession.java
@@ -10,50 +10,37 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.html;
-import java.lang.reflect.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.html.*;
import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
/**
- * Context object that lives for the duration of a single serialization of {@link HtmlSchemaDocSerializer} and its subclasses.
+ * Context object that lives for the duration of a single serialization of {@link HtmlSchemaSerializer} and its subclasses.
*
* <p>
* This class is NOT thread safe. It is meant to be discarded after one-time use.
*/
public class HtmlSchemaSerializerSession extends HtmlSerializerSession {
- private final JsonSchemaSerializerSession js;
+ private final JsonSchemaGeneratorSession genSession;
/**
* Create a new session using properties specified in the context.
*
- * @param jsctx
- * The JSON-Schema serializer used to convert a POJO into JSON-Schema metadata.
* @param ctx
* The context creating this session object.
* The context contains all the configuration settings for this object.
* @param args
* Runtime arguments.
*/
- protected HtmlSchemaSerializerSession(JsonSchemaSerializer jsctx, HtmlSchemaSerializer ctx, SerializerSessionArgs args) {
+ protected HtmlSchemaSerializerSession(HtmlSchemaSerializer ctx, SerializerSessionArgs args) {
super(ctx, args);
- this.js = jsctx.createSession(args);
+ this.genSession = ctx.getGenerator().createSession(args);
}
@Override /* SerializerSession */
protected void doSerialize(SerializerPipe out, Object o) throws Exception {
- ObjectMap schema = js.getSchema(toClassMeta(o));
- super.doSerialize(out, schema);
- }
-
- private ClassMeta<?> toClassMeta(Object o) {
- if (o instanceof Type)
- return getClassMeta((Type)o);
- return getClassMetaForObject(o);
+ super.doSerialize(out, genSession.getSchema(o));
}
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index 182c009..d7f384d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -16,7 +16,6 @@ import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.htmlschema.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.xml.*;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
index a63cfd1..423d572 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
@@ -472,8 +472,8 @@ public @interface Body {
* </ul>
* <li class='jc'>{@link JsonSchemaSerializer}
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
* </ul>
* </ul>
*
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
index cd875e4..f7e84db 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
@@ -22,6 +22,7 @@ import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.httppart.*;
+import org.apache.juneau.json.*;
import org.apache.juneau.jsonschema.*;
/**
@@ -1002,8 +1003,8 @@ public @interface FormData {
* </ul>
* <li class='jc'>{@link JsonSchemaSerializer}
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
* </ul>
* </ul>
*
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
index 46fa2f6..e358b59 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
@@ -21,6 +21,7 @@ import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.httppart.*;
+import org.apache.juneau.json.*;
import org.apache.juneau.jsonschema.*;
/**
@@ -963,8 +964,8 @@ public @interface Header {
* </ul>
* <li class='jc'>{@link JsonSchemaSerializer}
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
* </ul>
* </ul>
*
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
index e66e310..8dcc4b2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
@@ -20,6 +20,7 @@ import java.lang.annotation.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.httppart.*;
+import org.apache.juneau.json.*;
import org.apache.juneau.jsonschema.*;
/**
@@ -820,8 +821,8 @@ public @interface Path {
* </ul>
* <li class='jc'>{@link JsonSchemaSerializer}
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
* </ul>
* </ul>
*
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
index 51f95bf..c1856b1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
@@ -22,6 +22,7 @@ import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.httppart.*;
+import org.apache.juneau.json.*;
import org.apache.juneau.jsonschema.*;
/**
@@ -998,8 +999,8 @@ public @interface Query {
* </ul>
* <li class='jc'>{@link JsonSchemaSerializer}
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
* </ul>
* </ul>
*
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
index 0503a67..6cf9c9d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
@@ -241,8 +241,8 @@ public @interface Response {
* </ul>
* <li class='jc'>{@link JsonSchemaSerializer}
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
* </ul>
* </ul>
*
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
similarity index 53%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
index 6c298a4..a067ac4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
@@ -10,55 +10,51 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.json;
import org.apache.juneau.*;
-import org.apache.juneau.html.*;
import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
/**
- * Serializes POJO metamodels to HTML.
+ * Serializes POJO metadata to HTTP responses as JSON-Schema.
*
* <h5 class='topic'>Media types</h5>
*
- * Handles <code>Accept</code> types: <code><b>text/html+schema</b></code>
+ * Handles <code>Accept</code> types: <code><b>application/json+schema, text/json+schema</b></code>
* <p>
- * Produces <code>Content-Type</code> types: <code><b>text/html</b></code>
+ * Produces <code>Content-Type</code> types: <code><b>application/json</b></code>
*
* <h5 class='topic'>Description</h5>
*
- * Essentially the same as {@link HtmlSerializer}, except serializes the POJO metamodel instead of the model itself.
- *
- * <p>
- * Produces output that describes the POJO metamodel similar to an XML schema document.
- *
- * <p>
- * The easiest way to create instances of this class is through the {@link HtmlSerializer#getSchemaSerializer()},
- * which will create a schema serializer with the same settings as the originating serializer.
+ * Produces the JSON-schema for the JSON produced by the {@link JsonSerializer} class with the same properties.
*/
-public class HtmlSchemaSerializer extends HtmlSerializer {
+public class JsonSchemaSerializer extends JsonSerializer {
+
+
+ //-------------------------------------------------------------------------------------------------------------------
+ // Predefined instances
+ //-------------------------------------------------------------------------------------------------------------------
/** Default serializer, all default settings.*/
- public static final HtmlSchemaSerializer DEFAULT = new HtmlSchemaSerializer(PropertyStore.DEFAULT);
+ public static final JsonSchemaSerializer DEFAULT = new JsonSchemaSerializer(PropertyStore.DEFAULT);
/** Default serializer, all default settings.*/
- public static final HtmlSchemaSerializer DEFAULT_READABLE = new Readable(PropertyStore.DEFAULT);
+ public static final JsonSchemaSerializer DEFAULT_READABLE = new Readable(PropertyStore.DEFAULT);
/** Default serializer, single quotes, simple mode. */
- public static final HtmlSchemaSerializer DEFAULT_SIMPLE = new Simple(PropertyStore.DEFAULT);
+ public static final JsonSchemaSerializer DEFAULT_SIMPLE = new Simple(PropertyStore.DEFAULT);
/** Default serializer, single quotes, simple mode, with whitespace. */
- public static final HtmlSchemaSerializer DEFAULT_SIMPLE_READABLE = new SimpleReadable(PropertyStore.DEFAULT);
+ public static final JsonSchemaSerializer DEFAULT_SIMPLE_READABLE = new SimpleReadable(PropertyStore.DEFAULT);
- private final JsonSchemaSerializer jsctx;
//-------------------------------------------------------------------------------------------------------------------
// Predefined subclasses
//-------------------------------------------------------------------------------------------------------------------
/** Default serializer, with whitespace. */
- public static class Readable extends HtmlSchemaSerializer {
+ public static class Readable extends JsonSchemaSerializer {
/**
* Constructor.
@@ -73,7 +69,7 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
}
/** Default serializer, single quotes, simple mode. */
- public static class Simple extends HtmlSchemaSerializer {
+ public static class Simple extends JsonSchemaSerializer {
/**
* Constructor.
@@ -83,6 +79,7 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
public Simple(PropertyStore ps) {
super(
ps.builder()
+ .set(JSON_simpleMode, true)
.set(WSERIALIZER_quoteChar, '\'')
.build()
);
@@ -90,7 +87,7 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
}
/** Default serializer, single quotes, simple mode, with whitespace. */
- public static class SimpleReadable extends HtmlSchemaSerializer {
+ public static class SimpleReadable extends JsonSchemaSerializer {
/**
* Constructor.
@@ -100,6 +97,7 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
public SimpleReadable(PropertyStore ps) {
super(
ps.builder()
+ .set(JSON_simpleMode, true)
.set(WSERIALIZER_quoteChar, '\'')
.set(SERIALIZER_useWhitespace, true)
.build()
@@ -107,67 +105,58 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
}
}
+
+ //-------------------------------------------------------------------------------------------------------------------
+ // Instance
+ //-------------------------------------------------------------------------------------------------------------------
+
+ private final JsonSchemaGenerator generator;
+
/**
* Constructor.
*
- * @param ps
- * The property store to use for creating the context for this serializer.
+ * @param ps Initialize with the specified config property store.
*/
- public HtmlSchemaSerializer(PropertyStore ps) {
- this(ps, "text/html", "text/html+schema");
+ public JsonSchemaSerializer(PropertyStore ps) {
+ super(
+ ps.builder()
+ .set(BEANTRAVERSE_detectRecursions, true)
+ .set(BEANTRAVERSE_ignoreRecursions, true)
+ .build(),
+ "application/json", "application/json+schema,text/json+schema"
+ );
+
+ generator = JsonSchemaGenerator.create().apply(getPropertyStore()).build();
}
@Override /* Context */
- public HtmlSchemaSerializerBuilder builder() {
- return new HtmlSchemaSerializerBuilder(getPropertyStore());
+ public JsonSchemaSerializerBuilder builder() {
+ return new JsonSchemaSerializerBuilder(getPropertyStore());
}
/**
- * Constructor.
+ * Instantiates a new clean-slate {@link JsonSerializerBuilder} object.
*
- * @param ps
- * The property store containing all the settings for this object.
- * @param produces
- * The media type that this serializer produces.
- * @param accept
- * The accept media types that the serializer can handle.
- * <p>
- * Can contain meta-characters per the <code>media-type</code> specification of
- * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a>
- * <p>
- * If empty, then assumes the only media type supported is <code>produces</code>.
- * <p>
- * For example, if this serializer produces <js>"application/json"</js> but should handle media types of
- * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be:
- * <p class='bcode w800'>
- * <jk>super</jk>(ps, <js>"application/json"</js>, <js>"application/json,text/json"</js>);
- * </p>
- * <br>...or...
- * <p class='bcode w800'>
- * <jk>super</jk>(ps, <js>"application/json"</js>, <js>"*​/json"</js>);
- * </p>
* <p>
- * The accept value can also contain q-values.
+ * This is equivalent to simply calling <code><jk>new</jk> JsonSerializerBuilder()</code>.
+ *
+ * @return A new {@link JsonSerializerBuilder} object.
*/
- public HtmlSchemaSerializer(PropertyStore ps, String produces, String accept) {
- super(
- ps.builder()
- .set(SERIALIZER_detectRecursions, true)
- .set(SERIALIZER_ignoreRecursions, true)
- .build(),
- produces,
- accept
- );
- this.jsctx = new JsonSchemaSerializer(ps);
+ public static JsonSchemaSerializerBuilder create() {
+ return new JsonSchemaSerializerBuilder();
+ }
+
+ @Override /* Context */
+ public JsonSchemaSerializerSession createSession() {
+ return createSession(createDefaultSessionArgs());
}
@Override /* Serializer */
- public HtmlSchemaSerializerSession createSession(SerializerSessionArgs args) {
- return new HtmlSchemaSerializerSession(jsctx, this, args);
+ public JsonSchemaSerializerSession createSession(SerializerSessionArgs args) {
+ return new JsonSchemaSerializerSession(this, args);
}
- @Override /* Context */
- public HtmlSchemaSerializerSession createSession() {
- return createSession(createDefaultSessionArgs());
+ JsonSchemaGenerator getGenerator() {
+ return generator;
}
-}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
similarity index 95%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerBuilder.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
index 119f7f7..de998c9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
@@ -10,16 +10,16 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.jsonschema;
+package org.apache.juneau.json;
-import static org.apache.juneau.jsonschema.JsonSchemaSerializer.*;
+import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.http.*;
-import org.apache.juneau.json.*;
+import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
/**
@@ -63,7 +63,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
* </ul>
*
* @param value
@@ -90,7 +90,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
* </ul>
*
* @param value
@@ -110,7 +110,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedDescriptions}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions}
* </ul>
*
* @return This object (for method chaining).
@@ -127,7 +127,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples}
* </ul>
*
* @return This object (for method chaining).
@@ -144,11 +144,11 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
* <p>
* Used primarily for defining common definition sections for beans in Swagger JSON.
* <p>
- * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+ * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
* </ul>
*
* @param value
@@ -168,11 +168,11 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
* <p>
* Used primarily for defining common definition sections for beans in Swagger JSON.
* <p>
- * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+ * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
* </ul>
*
* @param value
@@ -194,7 +194,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_defaultSchemas}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_defaultSchemas}
* </ul>
*
* @param c
@@ -219,11 +219,6 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
* }
* </p>
*
- * <p>
- * The definitions can then be retrieved from the session using {@link JsonSchemaSerializerSession#getBeanDefs()}.
- * <p>
- * Definitions can also be added programmatically using {@link JsonSchemaSerializerSession#addBeanDef(String, ObjectMap)}.
- *
* @return This object (for method chaining).
*/
public JsonSchemaSerializerBuilder useBeanDefs() {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
similarity index 71%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
index 4363073..b7a5ccf 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
@@ -10,42 +10,41 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.json;
-import org.apache.juneau.*;
-import org.apache.juneau.html.*;
import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
/**
- * Context object that lives for the duration of a single serialization of {@link HtmlSchemaDocSerializer} and its subclasses.
+ * Session object that lives for the duration of a single use of {@link JsonSchemaSerializer}.
*
* <p>
- * This class is NOT thread safe. It is meant to be discarded after one-time use.
+ * This class is NOT thread safe.
+ * It is typically discarded after one-time use although it can be reused within the same thread.
*/
-public class HtmlSchemaDocSerializerSession extends HtmlDocSerializerSession {
+public class JsonSchemaSerializerSession extends JsonSerializerSession {
- private final JsonSchemaSerializerSession js;
+ private final JsonSchemaGeneratorSession genSession;
/**
* Create a new session using properties specified in the context.
*
- * @param jsctx
- * The JSON-Schema serializer used to convert a POJO into JSON-Schema metadata.
* @param ctx
* The context creating this session object.
* The context contains all the configuration settings for this object.
* @param args
* Runtime arguments.
+ * These specify session-level information such as locale and URI context.
+ * It also include session-level properties that override the properties defined on the bean and
+ * serializer contexts.
*/
- protected HtmlSchemaDocSerializerSession(JsonSchemaSerializer jsctx, HtmlSchemaDocSerializer ctx, SerializerSessionArgs args) {
+ protected JsonSchemaSerializerSession(JsonSchemaSerializer ctx, SerializerSessionArgs args) {
super(ctx, args);
- this.js = jsctx.createSession(args);
+ genSession = ctx.getGenerator().createSession(args);
}
@Override /* SerializerSession */
protected void doSerialize(SerializerPipe out, Object o) throws Exception {
- ObjectMap schema = js.getSchema(getClassMetaForObject(o));
- super.doSerialize(out, schema);
+ super.doSerialize(out, genSession.getSchema(o));
}
-}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
index e5f83ef..77b2600 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -15,7 +15,6 @@ package org.apache.juneau.json;
import java.util.*;
import org.apache.juneau.*;
-import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
/**
@@ -295,7 +294,7 @@ public class JsonSerializer extends WriterSerializer {
.set(JSON_simpleMode, true)
.set(WSERIALIZER_quoteChar, '\'')
.set(SERIALIZER_useWhitespace, true)
- .set(SERIALIZER_detectRecursions, true)
+ .set(BEANTRAVERSE_detectRecursions, true)
.build()
);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index 2aab6b9..7c3a3e3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -17,7 +17,6 @@ import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.internal.*;
-import org.apache.juneau.jsonschema.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.transform.*;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
similarity index 76%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializer.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
index c860398..bc265d1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
@@ -1,459 +1,382 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
-// * with the License. You may obtain a copy of the License at *
-// * *
-// * http://www.apache.org/licenses/LICENSE-2.0 *
-// * *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
-// * specific language governing permissions and limitations under the License. *
-// ***************************************************************************************************************************
-package org.apache.juneau.jsonschema;
-
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.json.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Serializes POJO metadata to HTTP responses as JSON.
- *
- * <h5 class='topic'>Media types</h5>
- *
- * Handles <code>Accept</code> types: <code><b>application/json+schema, text/json+schema</b></code>
- * <p>
- * Produces <code>Content-Type</code> types: <code><b>application/json</b></code>
- *
- * <h5 class='topic'>Description</h5>
- *
- * Produces the JSON-schema for the JSON produced by the {@link JsonSerializer} class with the same properties.
- */
-public class JsonSchemaSerializer extends JsonSerializer {
-
- //-------------------------------------------------------------------------------------------------------------------
- // Configurable properties
- //-------------------------------------------------------------------------------------------------------------------
-
- private static final String PREFIX = "JsonSchemaSerializer.";
-
- /**
- * Configuration property: Add descriptions to types.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"JsonSchemaSerializer.addDescriptionsTo.s"</js>
- * <li><b>Data type:</b> <code>String</code>
- * <li><b>Default:</b> Empty string.
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link JsonSchemaSerializerBuilder#addDescriptionsTo(String)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Identifies which categories of types that descriptions should be automatically added to generated schemas.
- * <p>
- * The description is the result of calling {@link ClassMeta#getReadableName()}.
- * <p>
- * The format is a comma-delimited list of any of the following values:
- *
- * <ul class='doctree'>
- * <li class='jf'>{@link TypeCategory#BEAN BEAN}
- * <li class='jf'>{@link TypeCategory#COLLECTION COLLECTION}
- * <li class='jf'>{@link TypeCategory#ARRAY ARRAY}
- * <li class='jf'>{@link TypeCategory#MAP MAP}
- * <li class='jf'>{@link TypeCategory#STRING STRING}
- * <li class='jf'>{@link TypeCategory#NUMBER NUMBER}
- * <li class='jf'>{@link TypeCategory#BOOLEAN BOOLEAN}
- * <li class='jf'>{@link TypeCategory#ANY ANY}
- * <li class='jf'>{@link TypeCategory#OTHER OTHER}
- * </ul>
- */
- public static final String JSONSCHEMA_addDescriptionsTo = PREFIX + "addDescriptionsTo.s";
-
- /**
- * Configuration property: Add examples.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"JsonSchemaSerializer.addExamplesTo.s"</js>
- * <li><b>Data type:</b> <code>String</code>
- * <li><b>Default:</b> Empty string.
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link JsonSchemaSerializerBuilder#addExamplesTo(String)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Identifies which categories of types that examples should be automatically added to generated schemas.
- * <p>
- * The examples come from calling {@link ClassMeta#getExample(BeanSession)} which in turn gets examples
- * from the following:
- * <ul class='doctree'>
- * <li class='ja'>{@link Example}
- * <li class='jf'>{@link BeanContext#BEAN_examples}
- * </ul>
- *
- * <p>
- * The format is a comma-delimited list of any of the following values:
- *
- * <ul class='doctree'>
- * <li class='jf'>{@link TypeCategory#BEAN BEAN}
- * <li class='jf'>{@link TypeCategory#COLLECTION COLLECTION}
- * <li class='jf'>{@link TypeCategory#ARRAY ARRAY}
- * <li class='jf'>{@link TypeCategory#MAP MAP}
- * <li class='jf'>{@link TypeCategory#STRING STRING}
- * <li class='jf'>{@link TypeCategory#NUMBER NUMBER}
- * <li class='jf'>{@link TypeCategory#BOOLEAN BOOLEAN}
- * <li class='jf'>{@link TypeCategory#ANY ANY}
- * <li class='jf'>{@link TypeCategory#OTHER OTHER}
- * </ul>
- */
- public static final String JSONSCHEMA_addExamplesTo = PREFIX + "addExamplesTo.s";
-
- /**
- * Configuration property: Allow nested descriptions.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"JsonSchemaSerializer.allowNestedDescriptions.b"</js>
- * <li><b>Data type:</b> <code>Boolean</code>
- * <li><b>Default:</b> <jk>false</jk>
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link JsonSchemaSerializerBuilder#allowNestedDescriptions()}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Identifies whether nested descriptions are allowed in schema definitions.
- */
- public static final String JSONSCHEMA_allowNestedDescriptions = PREFIX + "allowNestedDescriptions.b";
-
- /**
- * Configuration property: Allow nested examples.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"JsonSchemaSerializer.allowNestedExamples.b"</js>
- * <li><b>Data type:</b> <code>Boolean</code>
- * <li><b>Default:</b> <jk>false</jk>
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link JsonSchemaSerializerBuilder#allowNestedExamples()}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Identifies whether nested examples are allowed in schema definitions.
- */
- public static final String JSONSCHEMA_allowNestedExamples = PREFIX + "allowNestedExamples.b";
-
- /**
- * Configuration property: Bean schema definition mapper.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"JsonSchemaSerializer.beanDefMapper.o"</js>
- * <li><b>Data type:</b> {@link BeanDefMapper}
- * <li><b>Default:</b> {@link BasicBeanDefMapper}
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link JsonSchemaSerializerBuilder#beanDefMapper(Class)}
- * <li class='jm'>{@link JsonSchemaSerializerBuilder#beanDefMapper(BeanDefMapper)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Interface to use for converting Bean classes to definition IDs and URIs.
- * <p>
- * Used primarily for defining common definition sections for beans in Swagger JSON.
- * <p>
- * This setting is ignored if {@link #JSONSCHEMA_useBeanDefs} is not enabled.
- */
- public static final String JSONSCHEMA_beanDefMapper = PREFIX + "beanDefMapper.o";
-
- /**
- * Configuration property: Default schemas.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"JsonSchemaSerializer.defaultSchema.smo"</js>
- * <li><b>Data type:</b> <code>Map<String,ObjectMap></code>
- * <li><b>Default:</b> Empty map.
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link JsonSchemaSerializerBuilder#defaultSchema(Class,ObjectMap)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Allows you to override or provide custom schema information for particular class types.
- * <p>
- * Keys are full class names.
- */
- public static final String JSONSCHEMA_defaultSchemas = PREFIX + "defaultSchemas.smo";
-
- /**
- * Configuration property: Use bean definitions.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"JsonSchemaSerializer.useBeanDefs.o"</js>
- * <li><b>Data type:</b> <code>Boolean</code>
- * <li><b>Default:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link JsonSchemaSerializerBuilder#useBeanDefs()}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * When enabled, schemas on beans will be serialized as the following:
- * <p class='bcode w800'>
- * {
- * type: <js>'object'</js>,
- * <js>'$ref'</js>: <js>'#/definitions/TypeId'</js>
- * }
- * </p>
- *
- * <p>
- * The definitions can then be retrieved from the session using {@link JsonSchemaSerializerSession#getBeanDefs()}.
- * <p>
- * Definitions can also be added programmatically using {@link JsonSchemaSerializerSession#addBeanDef(String, ObjectMap)}.
- */
- public static final String JSONSCHEMA_useBeanDefs = PREFIX + "useBeanDefs.b";
-
-
- //-------------------------------------------------------------------------------------------------------------------
- // Predefined instances
- //-------------------------------------------------------------------------------------------------------------------
-
- /** Default serializer, all default settings.*/
- public static final JsonSchemaSerializer DEFAULT = new JsonSchemaSerializer(PropertyStore.DEFAULT);
-
- /** Default serializer, all default settings.*/
- public static final JsonSchemaSerializer DEFAULT_READABLE = new Readable(PropertyStore.DEFAULT);
-
- /** Default serializer, single quotes, simple mode. */
- public static final JsonSchemaSerializer DEFAULT_SIMPLE = new Simple(PropertyStore.DEFAULT);
-
- /** Default serializer, single quotes, simple mode, with whitespace. */
- public static final JsonSchemaSerializer DEFAULT_SIMPLE_READABLE = new SimpleReadable(PropertyStore.DEFAULT);
-
-
- //-------------------------------------------------------------------------------------------------------------------
- // Predefined subclasses
- //-------------------------------------------------------------------------------------------------------------------
-
- /** Default serializer, with whitespace. */
- public static class Readable extends JsonSchemaSerializer {
-
- /**
- * Constructor.
- *
- * @param ps The property store containing all the settings for this object.
- */
- public Readable(PropertyStore ps) {
- super(
- ps.builder().set(SERIALIZER_useWhitespace, true).build()
- );
- }
- }
-
- /** Default serializer, single quotes, simple mode. */
- public static class Simple extends JsonSchemaSerializer {
-
- /**
- * Constructor.
- *
- * @param ps The property store containing all the settings for this object.
- */
- public Simple(PropertyStore ps) {
- super(
- ps.builder()
- .set(JSON_simpleMode, true)
- .set(WSERIALIZER_quoteChar, '\'')
- .build()
- );
- }
- }
-
- /** Default serializer, single quotes, simple mode, with whitespace. */
- public static class SimpleReadable extends JsonSchemaSerializer {
-
- /**
- * Constructor.
- *
- * @param ps The property store containing all the settings for this object.
- */
- public SimpleReadable(PropertyStore ps) {
- super(
- ps.builder()
- .set(JSON_simpleMode, true)
- .set(WSERIALIZER_quoteChar, '\'')
- .set(SERIALIZER_useWhitespace, true)
- .build()
- );
- }
- }
-
-
- //-------------------------------------------------------------------------------------------------------------------
- // Instance
- //-------------------------------------------------------------------------------------------------------------------
-
- private final boolean useBeanDefs, allowNestedExamples, allowNestedDescriptions;
- private final BeanDefMapper beanDefMapper;
- private final Set<TypeCategory> addExamplesTo, addDescriptionsTo;
- private final Map<String,ObjectMap> defaultSchemas;
-
- /**
- * Constructor.
- *
- * @param ps Initialize with the specified config property store.
- */
- public JsonSchemaSerializer(PropertyStore ps) {
- super(
- ps.builder()
- .set(SERIALIZER_detectRecursions, true)
- .set(SERIALIZER_ignoreRecursions, true)
- .build(),
- "application/json", "application/json+schema,text/json+schema"
- );
-
- useBeanDefs = getBooleanProperty(JSONSCHEMA_useBeanDefs, false);
- allowNestedExamples = getBooleanProperty(JSONSCHEMA_allowNestedExamples, false);
- allowNestedDescriptions = getBooleanProperty(JSONSCHEMA_allowNestedDescriptions, false);
- beanDefMapper = getInstanceProperty(JSONSCHEMA_beanDefMapper, BeanDefMapper.class, BasicBeanDefMapper.class);
- addExamplesTo = TypeCategory.parse(getStringProperty(JSONSCHEMA_addExamplesTo, null));
- addDescriptionsTo = TypeCategory.parse(getStringProperty(JSONSCHEMA_addDescriptionsTo, null));
- defaultSchemas = getMapProperty(JSONSCHEMA_defaultSchemas, ObjectMap.class);
- }
-
- @Override /* Context */
- public JsonSchemaSerializerBuilder builder() {
- return new JsonSchemaSerializerBuilder(getPropertyStore());
- }
-
- /**
- * Instantiates a new clean-slate {@link JsonSerializerBuilder} object.
- *
- * <p>
- * This is equivalent to simply calling <code><jk>new</jk> JsonSerializerBuilder()</code>.
- *
- * @return A new {@link JsonSerializerBuilder} object.
- */
- public static JsonSchemaSerializerBuilder create() {
- return new JsonSchemaSerializerBuilder();
- }
-
- @Override /* Context */
- public JsonSchemaSerializerSession createSession() {
- return createSession(createDefaultSessionArgs());
- }
-
- @Override /* Serializer */
- public JsonSchemaSerializerSession createSession(SerializerSessionArgs args) {
- return new JsonSchemaSerializerSession(this, args);
- }
-
- //-----------------------------------------------------------------------------------------------------------------
- // Properties
- //-----------------------------------------------------------------------------------------------------------------
-
- /**
- * Configuration property: Use bean definitions.
- *
- * @see #JSONSCHEMA_useBeanDefs
- * @return
- * <jk>true</jk> if schemas on beans will be serialized with <js>'$ref'</js> tags.
- */
- protected final boolean isUseBeanDefs() {
- return useBeanDefs;
- }
-
- /**
- * Configuration property: Allow nested examples.
- *
- * @see #JSONSCHEMA_allowNestedExamples
- * @return
- * <jk>true</jk> if nested examples are allowed in schema definitions.
- */
- protected final boolean isAllowNestedExamples() {
- return allowNestedExamples;
- }
-
- /**
- * Configuration property: Allow nested descriptions.
- *
- * @see #JSONSCHEMA_allowNestedDescriptions
- * @return
- * <jk>true</jk> if nested descriptions are allowed in schema definitions.
- */
- protected final boolean isAllowNestedDescriptions() {
- return allowNestedDescriptions;
- }
-
- /**
- * Configuration property: Bean schema definition mapper.
- *
- * @see #JSONSCHEMA_beanDefMapper
- * @return
- * Interface to use for converting Bean classes to definition IDs and URIs.
- */
- protected final BeanDefMapper getBeanDefMapper() {
- return beanDefMapper;
- }
-
- /**
- * Configuration property: Add examples.
- *
- * @see #JSONSCHEMA_addExamplesTo
- * @return
- * Set of categories of types that examples should be automatically added to generated schemas.
- */
- protected final Set<TypeCategory> getAddExamplesTo() {
- return addExamplesTo;
- }
-
- /**
- * Configuration property: Add descriptions to types.
- *
- * @see #JSONSCHEMA_addDescriptionsTo
- * @return
- * Set of categories of types that descriptions should be automatically added to generated schemas.
- */
- protected final Set<TypeCategory> getAddDescriptionsTo() {
- return addDescriptionsTo;
- }
-
- /**
- * Configuration property: Default schemas.
- *
- * @see #JSONSCHEMA_defaultSchemas
- * @return
- * Custom schema information for particular class types.
- */
- protected final Map<String,ObjectMap> getDefaultSchemas() {
- return defaultSchemas;
- }
-}
\ No newline at end of file
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
+// * with the License. You may obtain a copy of the License at *
+// * *
+// * http://www.apache.org/licenses/LICENSE-2.0 *
+// * *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
+// * specific language governing permissions and limitations under the License. *
+// ***************************************************************************************************************************
+package org.apache.juneau.jsonschema;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.json.*;
+
+/**
+ * Generates JSON-schema metadata about POJOs.
+ */
+public class JsonSchemaGenerator extends BeanTraverseContext {
+
+ //-------------------------------------------------------------------------------------------------------------------
+ // Configurable properties
+ //-------------------------------------------------------------------------------------------------------------------
+
+ private static final String PREFIX = "JsonSchemaGenerator.";
+
+ /**
+ * Configuration property: Add descriptions to types.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"JsonSchemaSerializer.addDescriptionsTo.s"</js>
+ * <li><b>Data type:</b> <code>String</code>
+ * <li><b>Default:</b> Empty string.
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link JsonSchemaSerializerBuilder#addDescriptionsTo(String)}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Identifies which categories of types that descriptions should be automatically added to generated schemas.
+ * <p>
+ * The description is the result of calling {@link ClassMeta#getReadableName()}.
+ * <p>
+ * The format is a comma-delimited list of any of the following values:
+ *
+ * <ul class='doctree'>
+ * <li class='jf'>{@link TypeCategory#BEAN BEAN}
+ * <li class='jf'>{@link TypeCategory#COLLECTION COLLECTION}
+ * <li class='jf'>{@link TypeCategory#ARRAY ARRAY}
+ * <li class='jf'>{@link TypeCategory#MAP MAP}
+ * <li class='jf'>{@link TypeCategory#STRING STRING}
+ * <li class='jf'>{@link TypeCategory#NUMBER NUMBER}
+ * <li class='jf'>{@link TypeCategory#BOOLEAN BOOLEAN}
+ * <li class='jf'>{@link TypeCategory#ANY ANY}
+ * <li class='jf'>{@link TypeCategory#OTHER OTHER}
+ * </ul>
+ */
+ public static final String JSONSCHEMA_addDescriptionsTo = PREFIX + "addDescriptionsTo.s";
+
+ /**
+ * Configuration property: Add examples.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"JsonSchemaSerializer.addExamplesTo.s"</js>
+ * <li><b>Data type:</b> <code>String</code>
+ * <li><b>Default:</b> Empty string.
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link JsonSchemaSerializerBuilder#addExamplesTo(String)}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Identifies which categories of types that examples should be automatically added to generated schemas.
+ * <p>
+ * The examples come from calling {@link ClassMeta#getExample(BeanSession)} which in turn gets examples
+ * from the following:
+ * <ul class='doctree'>
+ * <li class='ja'>{@link Example}
+ * <li class='jf'>{@link BeanContext#BEAN_examples}
+ * </ul>
+ *
+ * <p>
+ * The format is a comma-delimited list of any of the following values:
+ *
+ * <ul class='doctree'>
+ * <li class='jf'>{@link TypeCategory#BEAN BEAN}
+ * <li class='jf'>{@link TypeCategory#COLLECTION COLLECTION}
+ * <li class='jf'>{@link TypeCategory#ARRAY ARRAY}
+ * <li class='jf'>{@link TypeCategory#MAP MAP}
+ * <li class='jf'>{@link TypeCategory#STRING STRING}
+ * <li class='jf'>{@link TypeCategory#NUMBER NUMBER}
+ * <li class='jf'>{@link TypeCategory#BOOLEAN BOOLEAN}
+ * <li class='jf'>{@link TypeCategory#ANY ANY}
+ * <li class='jf'>{@link TypeCategory#OTHER OTHER}
+ * </ul>
+ */
+ public static final String JSONSCHEMA_addExamplesTo = PREFIX + "addExamplesTo.s";
+
+ /**
+ * Configuration property: Allow nested descriptions.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"JsonSchemaSerializer.allowNestedDescriptions.b"</js>
+ * <li><b>Data type:</b> <code>Boolean</code>
+ * <li><b>Default:</b> <jk>false</jk>
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link JsonSchemaSerializerBuilder#allowNestedDescriptions()}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Identifies whether nested descriptions are allowed in schema definitions.
+ */
+ public static final String JSONSCHEMA_allowNestedDescriptions = PREFIX + "allowNestedDescriptions.b";
+
+ /**
+ * Configuration property: Allow nested examples.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"JsonSchemaSerializer.allowNestedExamples.b"</js>
+ * <li><b>Data type:</b> <code>Boolean</code>
+ * <li><b>Default:</b> <jk>false</jk>
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link JsonSchemaSerializerBuilder#allowNestedExamples()}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Identifies whether nested examples are allowed in schema definitions.
+ */
+ public static final String JSONSCHEMA_allowNestedExamples = PREFIX + "allowNestedExamples.b";
+
+ /**
+ * Configuration property: Bean schema definition mapper.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"JsonSchemaSerializer.beanDefMapper.o"</js>
+ * <li><b>Data type:</b> {@link BeanDefMapper}
+ * <li><b>Default:</b> {@link BasicBeanDefMapper}
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link JsonSchemaSerializerBuilder#beanDefMapper(Class)}
+ * <li class='jm'>{@link JsonSchemaSerializerBuilder#beanDefMapper(BeanDefMapper)}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Interface to use for converting Bean classes to definition IDs and URIs.
+ * <p>
+ * Used primarily for defining common definition sections for beans in Swagger JSON.
+ * <p>
+ * This setting is ignored if {@link #JSONSCHEMA_useBeanDefs} is not enabled.
+ */
+ public static final String JSONSCHEMA_beanDefMapper = PREFIX + "beanDefMapper.o";
+
+ /**
+ * Configuration property: Default schemas.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"JsonSchemaSerializer.defaultSchema.smo"</js>
+ * <li><b>Data type:</b> <code>Map<String,ObjectMap></code>
+ * <li><b>Default:</b> Empty map.
+ * <li><b>Session property:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link JsonSchemaSerializerBuilder#defaultSchema(Class,ObjectMap)}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Allows you to override or provide custom schema information for particular class types.
+ * <p>
+ * Keys are full class names.
+ */
+ public static final String JSONSCHEMA_defaultSchemas = PREFIX + "defaultSchemas.smo";
+
+ /**
+ * Configuration property: Use bean definitions.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul>
+ * <li><b>Name:</b> <js>"JsonSchemaSerializer.useBeanDefs.o"</js>
+ * <li><b>Data type:</b> <code>Boolean</code>
+ * <li><b>Default:</b> <jk>false</jk>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link JsonSchemaSerializerBuilder#useBeanDefs()}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * When enabled, schemas on beans will be serialized as the following:
+ * <p class='bcode w800'>
+ * {
+ * type: <js>'object'</js>,
+ * <js>'$ref'</js>: <js>'#/definitions/TypeId'</js>
+ * }
+ * </p>
+ *
+ * <p>
+ * The definitions can then be retrieved from the session using {@link JsonSchemaGeneratorSession#getBeanDefs()}.
+ * <p>
+ * Definitions can also be added programmatically using {@link JsonSchemaGeneratorSession#addBeanDef(String, ObjectMap)}.
+ */
+ public static final String JSONSCHEMA_useBeanDefs = PREFIX + "useBeanDefs.b";
+
+
+ //-------------------------------------------------------------------------------------------------------------------
+ // Predefined instances
+ //-------------------------------------------------------------------------------------------------------------------
+
+ /** Default serializer, all default settings.*/
+ public static final JsonSchemaGenerator DEFAULT = new JsonSchemaGenerator(PropertyStore.DEFAULT);
+
+
+ //-------------------------------------------------------------------------------------------------------------------
+ // Instance
+ //-------------------------------------------------------------------------------------------------------------------
+
+ private final boolean useBeanDefs, allowNestedExamples, allowNestedDescriptions;
+ private final BeanDefMapper beanDefMapper;
+ private final Set<TypeCategory> addExamplesTo, addDescriptionsTo;
+ private final Map<String,ObjectMap> defaultSchemas;
+ private final JsonSerializer jsonSerializer;
+
+ /**
+ * Constructor.
+ *
+ * @param ps Initialize with the specified config property store.
+ */
+ public JsonSchemaGenerator(PropertyStore ps) {
+ super(ps);
+
+ useBeanDefs = getBooleanProperty(JSONSCHEMA_useBeanDefs, false);
+ allowNestedExamples = getBooleanProperty(JSONSCHEMA_allowNestedExamples, false);
+ allowNestedDescriptions = getBooleanProperty(JSONSCHEMA_allowNestedDescriptions, false);
+ beanDefMapper = getInstanceProperty(JSONSCHEMA_beanDefMapper, BeanDefMapper.class, BasicBeanDefMapper.class);
+ addExamplesTo = TypeCategory.parse(getStringProperty(JSONSCHEMA_addExamplesTo, null));
+ addDescriptionsTo = TypeCategory.parse(getStringProperty(JSONSCHEMA_addDescriptionsTo, null));
+ defaultSchemas = getMapProperty(JSONSCHEMA_defaultSchemas, ObjectMap.class);
+ jsonSerializer = new JsonSerializer(ps);
+ }
+
+ @Override /* Context */
+ public JsonSchemaGeneratorBuilder builder() {
+ return new JsonSchemaGeneratorBuilder(getPropertyStore());
+ }
+
+ /**
+ * Instantiates a new clean-slate {@link JsonSerializerBuilder} object.
+ *
+ * <p>
+ * This is equivalent to simply calling <code><jk>new</jk> JsonSerializerBuilder()</code>.
+ *
+ * @return A new {@link JsonSerializerBuilder} object.
+ */
+ public static JsonSchemaGeneratorBuilder create() {
+ return new JsonSchemaGeneratorBuilder();
+ }
+
+ @Override
+ public JsonSchemaGeneratorSession createSession(BeanSessionArgs args) {
+ return new JsonSchemaGeneratorSession(this, args);
+ }
+
+ @Override
+ public JsonSchemaGeneratorSession createSession() {
+ return new JsonSchemaGeneratorSession(this, null);
+ }
+
+ JsonSerializer getJsonSerializer() {
+ return jsonSerializer;
+ }
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // Properties
+ //-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Configuration property: Use bean definitions.
+ *
+ * @see #JSONSCHEMA_useBeanDefs
+ * @return
+ * <jk>true</jk> if schemas on beans will be serialized with <js>'$ref'</js> tags.
+ */
+ protected final boolean isUseBeanDefs() {
+ return useBeanDefs;
+ }
+
+ /**
+ * Configuration property: Allow nested examples.
+ *
+ * @see #JSONSCHEMA_allowNestedExamples
+ * @return
+ * <jk>true</jk> if nested examples are allowed in schema definitions.
+ */
+ protected final boolean isAllowNestedExamples() {
+ return allowNestedExamples;
+ }
+
+ /**
+ * Configuration property: Allow nested descriptions.
+ *
+ * @see #JSONSCHEMA_allowNestedDescriptions
+ * @return
+ * <jk>true</jk> if nested descriptions are allowed in schema definitions.
+ */
+ protected final boolean isAllowNestedDescriptions() {
+ return allowNestedDescriptions;
+ }
+
+ /**
+ * Configuration property: Bean schema definition mapper.
+ *
+ * @see #JSONSCHEMA_beanDefMapper
+ * @return
+ * Interface to use for converting Bean classes to definition IDs and URIs.
+ */
+ protected final BeanDefMapper getBeanDefMapper() {
+ return beanDefMapper;
+ }
+
+ /**
+ * Configuration property: Add examples.
+ *
+ * @see #JSONSCHEMA_addExamplesTo
+ * @return
+ * Set of categories of types that examples should be automatically added to generated schemas.
+ */
+ protected final Set<TypeCategory> getAddExamplesTo() {
+ return addExamplesTo;
+ }
+
+ /**
+ * Configuration property: Add descriptions to types.
+ *
+ * @see #JSONSCHEMA_addDescriptionsTo
+ * @return
+ * Set of categories of types that descriptions should be automatically added to generated schemas.
+ */
+ protected final Set<TypeCategory> getAddDescriptionsTo() {
+ return addDescriptionsTo;
+ }
+
+ /**
+ * Configuration property: Default schemas.
+ *
+ * @see #JSONSCHEMA_defaultSchemas
+ * @return
+ * Custom schema information for particular class types.
+ */
+ protected final Map<String,ObjectMap> getDefaultSchemas() {
+ return defaultSchemas;
+ }
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
similarity index 52%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
index a5d0b47..8c4a1cd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
@@ -10,28 +10,25 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
-package org.apache.juneau.htmlschema;
+package org.apache.juneau.jsonschema;
-import static org.apache.juneau.jsonschema.JsonSchemaSerializer.*;
+import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
-import org.apache.juneau.html.*;
import org.apache.juneau.http.*;
-import org.apache.juneau.jsonschema.*;
-import org.apache.juneau.serializer.*;
/**
- * Builder class for building instances of JSON Schema serializers.
+ * Builder class for building instances of JSON Schema generators.
*/
-public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
+public class JsonSchemaGeneratorBuilder extends BeanTraverseBuilder {
/**
* Constructor, default settings.
*/
- public HtmlSchemaSerializerBuilder() {
+ public JsonSchemaGeneratorBuilder() {
super();
}
@@ -40,13 +37,13 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* @param ps The initial configuration settings for this builder.
*/
- public HtmlSchemaSerializerBuilder(PropertyStore ps) {
+ public JsonSchemaGeneratorBuilder(PropertyStore ps) {
super(ps);
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializer build() {
- return build(HtmlSchemaSerializer.class);
+ public JsonSchemaGenerator build() {
+ return build(JsonSchemaGenerator.class);
}
@@ -64,7 +61,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
* </ul>
*
* @param value
@@ -72,7 +69,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* <br>The default is <jk>false</jk>.
* @return This object (for method chaining).
*/
- public HtmlSchemaSerializerBuilder addDescriptionsTo(String value) {
+ public JsonSchemaGeneratorBuilder addDescriptionsTo(String value) {
return set(JSONSCHEMA_addDescriptionsTo, value);
}
@@ -91,7 +88,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
* </ul>
*
* @param value
@@ -99,7 +96,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* <br>The default is <jk>false</jk>.
* @return This object (for method chaining).
*/
- public HtmlSchemaSerializerBuilder addExamplesTo(String value) {
+ public JsonSchemaGeneratorBuilder addExamplesTo(String value) {
return set(JSONSCHEMA_addExamplesTo, value);
}
@@ -111,12 +108,12 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedDescriptions}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions}
* </ul>
*
* @return This object (for method chaining).
*/
- public HtmlSchemaSerializerBuilder allowNestedDescriptions() {
+ public JsonSchemaGeneratorBuilder allowNestedDescriptions() {
return set(JSONSCHEMA_allowNestedDescriptions, true);
}
@@ -128,12 +125,12 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples}
* </ul>
*
* @return This object (for method chaining).
*/
- public HtmlSchemaSerializerBuilder allowNestedExamples() {
+ public JsonSchemaGeneratorBuilder allowNestedExamples() {
return set(JSONSCHEMA_allowNestedExamples, true);
}
@@ -145,11 +142,11 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* <p>
* Used primarily for defining common definition sections for beans in Swagger JSON.
* <p>
- * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+ * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
* </ul>
*
* @param value
@@ -157,7 +154,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* <br>The default is <jk>false</jk>.
* @return This object (for method chaining).
*/
- public HtmlSchemaSerializerBuilder beanDefMapper(Class<? extends BeanDefMapper> value) {
+ public JsonSchemaGeneratorBuilder beanDefMapper(Class<? extends BeanDefMapper> value) {
return set(JSONSCHEMA_beanDefMapper, value);
}
@@ -169,11 +166,11 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* <p>
* Used primarily for defining common definition sections for beans in Swagger JSON.
* <p>
- * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+ * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
* </ul>
*
* @param value
@@ -181,7 +178,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* <br>The default is <jk>false</jk>.
* @return This object (for method chaining).
*/
- public HtmlSchemaSerializerBuilder beanDefMapper(BeanDefMapper value) {
+ public JsonSchemaGeneratorBuilder beanDefMapper(BeanDefMapper value) {
return set(JSONSCHEMA_beanDefMapper, value);
}
@@ -195,7 +192,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_defaultSchemas}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_defaultSchemas}
* </ul>
*
* @param c
@@ -204,7 +201,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* The schema.
* @return This object (for method chaining).
*/
- public HtmlSchemaSerializerBuilder defaultSchema(Class<?> c, ObjectMap schema) {
+ public JsonSchemaGeneratorBuilder defaultSchema(Class<?> c, ObjectMap schema) {
return addTo(JSONSCHEMA_defaultSchemas, c.getName(), schema);
}
@@ -221,576 +218,392 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
* </p>
*
* <p>
- * The definitions can then be retrieved from the session using {@link JsonSchemaSerializerSession#getBeanDefs()}.
+ * The definitions can then be retrieved from the session using {@link JsonSchemaGeneratorSession#getBeanDefs()}.
* <p>
- * Definitions can also be added programmatically using {@link JsonSchemaSerializerSession#addBeanDef(String, ObjectMap)}.
+ * Definitions can also be added programmatically using {@link JsonSchemaGeneratorSession#addBeanDef(String, ObjectMap)}.
*
* @return This object (for method chaining).
*/
- public HtmlSchemaSerializerBuilder useBeanDefs() {
+ public JsonSchemaGeneratorBuilder useBeanDefs() {
return set(JSONSCHEMA_useBeanDefs, true);
}
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder addBeanTypes(boolean value) {
- super.addBeanTypes(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder addBeanTypes() {
- super.addBeanTypes();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder addRootType(boolean value) {
- super.addRootType(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder addRootType() {
- super.addRootType();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder detectRecursions(boolean value) {
- super.detectRecursions(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder detectRecursions() {
- super.detectRecursions();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder ignoreRecursions(boolean value) {
- super.ignoreRecursions(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder ignoreRecursions() {
- super.ignoreRecursions();
- return this;
- }
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder initialDepth(int value) {
- super.initialDepth(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder listener(Class<? extends SerializerListener> value) {
- super.listener(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder maxDepth(int value) {
- super.maxDepth(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder maxIndent(int value) {
- super.maxIndent(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder quoteChar(char value) {
- super.quoteChar(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder sortCollections(boolean value) {
- super.sortCollections(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder sortCollections() {
- super.sortCollections();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder sortMaps(boolean value) {
- super.sortMaps(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder sortMaps() {
- super.sortMaps();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder sq() {
- super.sq();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder trimEmptyCollections(boolean value) {
- super.trimEmptyCollections(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder trimEmptyCollections() {
- super.trimEmptyCollections();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder trimEmptyMaps(boolean value) {
- super.trimEmptyMaps(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder trimEmptyMaps() {
- super.trimEmptyMaps();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder trimNullProperties(boolean value) {
- super.trimNullProperties(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder trimStrings(boolean value) {
- super.trimStrings(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder trimStrings() {
- super.trimStrings();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder uriContext(UriContext value) {
- super.uriContext(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder uriRelativity(UriRelativity value) {
- super.uriRelativity(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder uriResolution(UriResolution value) {
- super.uriResolution(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder useWhitespace(boolean value) {
- super.useWhitespace(value);
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder useWhitespace() {
- super.useWhitespace();
- return this;
- }
-
- @Override /* SerializerBuilder */
- public HtmlSchemaSerializerBuilder ws() {
- super.ws();
- return this;
- }
-
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanClassVisibility(Visibility value) {
+ public JsonSchemaGeneratorBuilder beanClassVisibility(Visibility value) {
super.beanClassVisibility(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanConstructorVisibility(Visibility value) {
+ public JsonSchemaGeneratorBuilder beanConstructorVisibility(Visibility value) {
super.beanConstructorVisibility(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanDictionary(boolean append, Object...values) {
+ public JsonSchemaGeneratorBuilder beanDictionary(boolean append, Object...values) {
super.beanDictionary(append, values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanDictionary(Class<?>...values) {
+ public JsonSchemaGeneratorBuilder beanDictionary(Class<?>...values) {
super.beanDictionary(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanDictionary(Object...values) {
+ public JsonSchemaGeneratorBuilder beanDictionary(Object...values) {
super.beanDictionary(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanDictionaryRemove(Object...values) {
+ public JsonSchemaGeneratorBuilder beanDictionaryRemove(Object...values) {
super.beanDictionaryRemove(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanFieldVisibility(Visibility value) {
+ public JsonSchemaGeneratorBuilder beanFieldVisibility(Visibility value) {
super.beanFieldVisibility(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanFilters(boolean append, Object...values) {
+ public JsonSchemaGeneratorBuilder beanFilters(boolean append, Object...values) {
super.beanFilters(append, values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanFilters(Class<?>...values) {
+ public JsonSchemaGeneratorBuilder beanFilters(Class<?>...values) {
super.beanFilters(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanFilters(Object...values) {
+ public JsonSchemaGeneratorBuilder beanFilters(Object...values) {
super.beanFilters(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanFiltersRemove(Object...values) {
+ public JsonSchemaGeneratorBuilder beanFiltersRemove(Object...values) {
super.beanFiltersRemove(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanMapPutReturnsOldValue(boolean value) {
+ public JsonSchemaGeneratorBuilder beanMapPutReturnsOldValue(boolean value) {
super.beanMapPutReturnsOldValue(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanMapPutReturnsOldValue() {
+ public JsonSchemaGeneratorBuilder beanMapPutReturnsOldValue() {
super.beanMapPutReturnsOldValue();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanMethodVisibility(Visibility value) {
+ public JsonSchemaGeneratorBuilder beanMethodVisibility(Visibility value) {
super.beanMethodVisibility(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beansRequireDefaultConstructor(boolean value) {
+ public JsonSchemaGeneratorBuilder beansRequireDefaultConstructor(boolean value) {
super.beansRequireDefaultConstructor(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beansRequireDefaultConstructor() {
+ public JsonSchemaGeneratorBuilder beansRequireDefaultConstructor() {
super.beansRequireDefaultConstructor();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beansRequireSerializable(boolean value) {
+ public JsonSchemaGeneratorBuilder beansRequireSerializable(boolean value) {
super.beansRequireSerializable(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beansRequireSerializable() {
+ public JsonSchemaGeneratorBuilder beansRequireSerializable() {
super.beansRequireSerializable();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beansRequireSettersForGetters(boolean value) {
+ public JsonSchemaGeneratorBuilder beansRequireSettersForGetters(boolean value) {
super.beansRequireSettersForGetters(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beansRequireSettersForGetters() {
+ public JsonSchemaGeneratorBuilder beansRequireSettersForGetters() {
super.beansRequireSettersForGetters();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beansRequireSomeProperties(boolean value) {
+ public JsonSchemaGeneratorBuilder beansRequireSomeProperties(boolean value) {
super.beansRequireSomeProperties(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder beanTypePropertyName(String value) {
+ public JsonSchemaGeneratorBuilder beanTypePropertyName(String value) {
super.beanTypePropertyName(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder debug() {
+ public JsonSchemaGeneratorBuilder debug() {
super.debug();
return this;
}
@Override /* BeanContextBuilder */
- public <T> HtmlSchemaSerializerBuilder example(Class<T> c, T o) {
+ public <T> JsonSchemaGeneratorBuilder example(Class<T> c, T o) {
super.example(c, o);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
+ public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
super.ignoreInvocationExceptionsOnGetters(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder ignoreInvocationExceptionsOnGetters() {
+ public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnGetters() {
super.ignoreInvocationExceptionsOnGetters();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
+ public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
super.ignoreInvocationExceptionsOnSetters(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder ignoreInvocationExceptionsOnSetters() {
+ public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnSetters() {
super.ignoreInvocationExceptionsOnSetters();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder ignorePropertiesWithoutSetters(boolean value) {
+ public JsonSchemaGeneratorBuilder ignorePropertiesWithoutSetters(boolean value) {
super.ignorePropertiesWithoutSetters(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder ignoreUnknownBeanProperties(boolean value) {
+ public JsonSchemaGeneratorBuilder ignoreUnknownBeanProperties(boolean value) {
super.ignoreUnknownBeanProperties(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder ignoreUnknownBeanProperties() {
+ public JsonSchemaGeneratorBuilder ignoreUnknownBeanProperties() {
super.ignoreUnknownBeanProperties();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder ignoreUnknownNullBeanProperties(boolean value) {
+ public JsonSchemaGeneratorBuilder ignoreUnknownNullBeanProperties(boolean value) {
super.ignoreUnknownNullBeanProperties(value);
return this;
}
@Override /* BeanContextBuilder */
- public <T> HtmlSchemaSerializerBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+ public <T> JsonSchemaGeneratorBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
super.implClass(interfaceClass, implClass);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder implClasses(Map<String,Class<?>> values) {
+ public JsonSchemaGeneratorBuilder implClasses(Map<String,Class<?>> values) {
super.implClasses(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder locale(Locale value) {
+ public JsonSchemaGeneratorBuilder locale(Locale value) {
super.locale(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder mediaType(MediaType value) {
+ public JsonSchemaGeneratorBuilder mediaType(MediaType value) {
super.mediaType(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder notBeanClasses(boolean append, Object...values) {
+ public JsonSchemaGeneratorBuilder notBeanClasses(boolean append, Object...values) {
super.notBeanClasses(append, values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder notBeanClasses(Class<?>...values) {
+ public JsonSchemaGeneratorBuilder notBeanClasses(Class<?>...values) {
super.notBeanClasses(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder notBeanClasses(Object...values) {
+ public JsonSchemaGeneratorBuilder notBeanClasses(Object...values) {
super.notBeanClasses(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder notBeanClassesRemove(Object...values) {
+ public JsonSchemaGeneratorBuilder notBeanClassesRemove(Object...values) {
super.notBeanClassesRemove(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder notBeanPackages(boolean append, Object...values) {
+ public JsonSchemaGeneratorBuilder notBeanPackages(boolean append, Object...values) {
super.notBeanPackages(append, values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder notBeanPackages(Object...values) {
+ public JsonSchemaGeneratorBuilder notBeanPackages(Object...values) {
super.notBeanPackages(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder notBeanPackages(String...values) {
+ public JsonSchemaGeneratorBuilder notBeanPackages(String...values) {
super.notBeanPackages(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder notBeanPackagesRemove(Object...values) {
+ public JsonSchemaGeneratorBuilder notBeanPackagesRemove(Object...values) {
super.notBeanPackagesRemove(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder pojoSwaps(boolean append, Object...values) {
+ public JsonSchemaGeneratorBuilder pojoSwaps(boolean append, Object...values) {
super.pojoSwaps(append, values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder pojoSwaps(Class<?>...values) {
+ public JsonSchemaGeneratorBuilder pojoSwaps(Class<?>...values) {
super.pojoSwaps(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder pojoSwaps(Object...values) {
+ public JsonSchemaGeneratorBuilder pojoSwaps(Object...values) {
super.pojoSwaps(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder pojoSwapsRemove(Object...values) {
+ public JsonSchemaGeneratorBuilder pojoSwapsRemove(Object...values) {
super.pojoSwapsRemove(values);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder sortProperties(boolean value) {
+ public JsonSchemaGeneratorBuilder sortProperties(boolean value) {
super.sortProperties(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder sortProperties() {
+ public JsonSchemaGeneratorBuilder sortProperties() {
super.sortProperties();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder timeZone(TimeZone value) {
+ public JsonSchemaGeneratorBuilder timeZone(TimeZone value) {
super.timeZone(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder useEnumNames() {
+ public JsonSchemaGeneratorBuilder useEnumNames() {
super.useEnumNames();
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder useInterfaceProxies(boolean value) {
+ public JsonSchemaGeneratorBuilder useInterfaceProxies(boolean value) {
super.useInterfaceProxies(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder useJavaBeanIntrospector(boolean value) {
+ public JsonSchemaGeneratorBuilder useJavaBeanIntrospector(boolean value) {
super.useJavaBeanIntrospector(value);
return this;
}
@Override /* BeanContextBuilder */
- public HtmlSchemaSerializerBuilder useJavaBeanIntrospector() {
+ public JsonSchemaGeneratorBuilder useJavaBeanIntrospector() {
super.useJavaBeanIntrospector();
return this;
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializerBuilder set(String name, Object value) {
+ public JsonSchemaGeneratorBuilder set(String name, Object value) {
super.set(name, value);
return this;
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializerBuilder set(boolean append, String name, Object value) {
+ public JsonSchemaGeneratorBuilder set(boolean append, String name, Object value) {
super.set(append, name, value);
return this;
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializerBuilder set(Map<String,Object> properties) {
+ public JsonSchemaGeneratorBuilder set(Map<String,Object> properties) {
super.set(properties);
return this;
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializerBuilder add(Map<String,Object> properties) {
+ public JsonSchemaGeneratorBuilder add(Map<String,Object> properties) {
super.add(properties);
return this;
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializerBuilder addTo(String name, Object value) {
+ public JsonSchemaGeneratorBuilder addTo(String name, Object value) {
super.addTo(name, value);
return this;
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializerBuilder addTo(String name, String key, Object value) {
+ public JsonSchemaGeneratorBuilder addTo(String name, String key, Object value) {
super.addTo(name, key, value);
return this;
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializerBuilder removeFrom(String name, Object value) {
+ public JsonSchemaGeneratorBuilder removeFrom(String name, Object value) {
super.removeFrom(name, value);
return this;
}
@Override /* ContextBuilder */
- public HtmlSchemaSerializerBuilder apply(PropertyStore copyFrom) {
+ public JsonSchemaGeneratorBuilder apply(PropertyStore copyFrom) {
super.apply(copyFrom);
return this;
}
-}
\ No newline at end of file
+
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
similarity index 88%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
index 680afb7..3a8f4be 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
@@ -32,10 +32,11 @@ import org.apache.juneau.transform.*;
* This class is NOT thread safe.
* It is typically discarded after one-time use although it can be reused within the same thread.
*/
-public class JsonSchemaSerializerSession extends JsonSerializerSession {
+public class JsonSchemaGeneratorSession extends BeanTraverseSession {
- private final JsonSchemaSerializer ctx;
+ private final JsonSchemaGenerator ctx;
private final Map<String,ObjectMap> defs;
+ private JsonSerializerSession jsSession;
/**
* Create a new session using properties specified in the context.
@@ -49,22 +50,23 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
* It also include session-level properties that override the properties defined on the bean and
* serializer contexts.
*/
- protected JsonSchemaSerializerSession(JsonSchemaSerializer ctx, SerializerSessionArgs args) {
+ protected JsonSchemaGeneratorSession(JsonSchemaGenerator ctx, BeanSessionArgs args) {
super(ctx, args);
this.ctx = ctx;
defs = isUseBeanDefs() ? new TreeMap<String,ObjectMap>() : null;
}
- @Override /* SerializerSession */
- protected void doSerialize(SerializerPipe out, Object o) throws Exception {
- ObjectMap schema = getSchema(toClassMeta(o), "root", null, false, false, null);
- serializeAnything(getJsonWriter(out), schema, getExpectedRootType(o), "root", null);
- }
-
- private ClassMeta<?> toClassMeta(Object o) {
- if (o instanceof Type)
- return getClassMeta((Type)o);
- return getClassMetaForObject(o);
+ /**
+ * Returns the JSON-schema for the specified object.
+ *
+ * @param o
+ * The object.
+ * <br>Can either be a POJO or a <code>Class</code>/<code>Type</code>.
+ * @return The schema for the type.
+ * @throws Exception
+ */
+ public ObjectMap getSchema(Object o) throws Exception {
+ return getSchema(toClassMeta(o), "root", null, false, false, null);
}
/**
@@ -274,11 +276,17 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
if (canAdd && (getAddExamplesTo().contains(t) || getAddExamplesTo().contains(ANY))) {
Object example = sType.getExample(this);
if (example != null)
- return JsonParser.DEFAULT.parse(serializeJson(example), Object.class);
+ return JsonParser.DEFAULT.parse(toJson(example), Object.class);
}
return null;
}
+ private String toJson(Object o) throws SerializeException {
+ if (jsSession == null)
+ jsSession = ctx.getJsonSerializer().createSession(null);
+ return jsSession.serializeToString(o);
+ }
+
private Object getDescription(ClassMeta<?> sType, TypeCategory t, boolean descriptionAdded) {
boolean canAdd = isAllowNestedDescriptions() || ! descriptionAdded;
if (canAdd && (getAddDescriptionsTo().contains(t) || getAddDescriptionsTo().contains(ANY)))
@@ -323,7 +331,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
* This map is modifiable and affects the map in the session.
*
* @return
- * The definitions that were gathered during this session, or <jk>null</jk> if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} was not enabled.
+ * The definitions that were gathered during this session, or <jk>null</jk> if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} was not enabled.
*/
public Map<String,ObjectMap> getBeanDefs() {
return defs;
@@ -336,7 +344,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
* @param def The definition schema.
* @return This object (for method chaining).
*/
- public JsonSchemaSerializerSession addBeanDef(String id, ObjectMap def) {
+ public JsonSchemaGeneratorSession addBeanDef(String id, ObjectMap def) {
if (defs != null)
defs.put(id, def);
return this;
@@ -349,7 +357,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
/**
* Configuration property: Use bean definitions.
*
- * @see JsonSchemaSerializer#JSONSCHEMA_useBeanDefs
+ * @see JsonSchemaGenerator#JSONSCHEMA_useBeanDefs
* @return
* <jk>true</jk> if schemas on beans will be serialized with <js>'$ref'</js> tags.
*/
@@ -360,7 +368,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
/**
* Configuration property: Allow nested examples.
*
- * @see JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples
+ * @see JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples
* @return
* <jk>true</jk> if nested examples are allowed in schema definitions.
*/
@@ -371,7 +379,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
/**
* Configuration property: Allow nested descriptions.
*
- * @see JsonSchemaSerializer#JSONSCHEMA_allowNestedDescriptions
+ * @see JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions
* @return
* <jk>true</jk> if nested descriptions are allowed in schema definitions.
*/
@@ -382,7 +390,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
/**
* Configuration property: Bean schema definition mapper.
*
- * @see JsonSchemaSerializer#JSONSCHEMA_beanDefMapper
+ * @see JsonSchemaGenerator#JSONSCHEMA_beanDefMapper
* @return
* Interface to use for converting Bean classes to definition IDs and URIs.
*/
@@ -393,7 +401,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
/**
* Configuration property: Add examples.
*
- * @see JsonSchemaSerializer#JSONSCHEMA_addExamplesTo
+ * @see JsonSchemaGenerator#JSONSCHEMA_addExamplesTo
* @return
* Set of categories of types that examples should be automatically added to generated schemas.
*/
@@ -404,7 +412,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
/**
* Configuration property: Add descriptions to types.
*
- * @see JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo
+ * @see JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo
* @return
* Set of categories of types that descriptions should be automatically added to generated schemas.
*/
@@ -415,11 +423,21 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
/**
* Configuration property: Default schemas.
*
- * @see JsonSchemaSerializer#JSONSCHEMA_defaultSchemas
+ * @see JsonSchemaGenerator#JSONSCHEMA_defaultSchemas
* @return
* Custom schema information for particular class types.
*/
protected final Map<String,ObjectMap> getDefaultSchemas() {
return ctx.getDefaultSchemas();
}
+
+ //-----------------------------------------------------------------------------------------------------------------
+ // Utility methods
+ //-----------------------------------------------------------------------------------------------------------------
+
+ private ClassMeta<?> toClassMeta(Object o) {
+ if (o instanceof Type)
+ return getClassMeta((Type)o);
+ return getClassMetaForObject(o);
+ }
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
index 474fd81..89b5950 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
@@ -20,8 +20,8 @@ import org.apache.juneau.internal.*;
* Represents possible values for the following properties:
*
* <ul class='doctree'>
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo}
- * <li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
+ * <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
* </ul>
*/
public enum TypeCategory {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
index 36df881..745b15e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
@@ -17,7 +17,7 @@ import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.*;
-import org.apache.juneau.jsonschema.*;
+import org.apache.juneau.json.*;
/**
* Annotation for specifying various JSON-SCHEMA information for {@link JsonSchemaSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
index 4eb7da3..b5ca65a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -18,7 +18,6 @@ import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.http.*;
import org.apache.juneau.internal.*;
-import org.apache.juneau.parser.*;
/**
* Parent class for all Juneau serializers.
@@ -39,7 +38,7 @@ import org.apache.juneau.parser.*;
* Subclasses should extend directly from {@link OutputStreamSerializer} or {@link WriterSerializer} depending on
* whether it's a stream or character based serializer.
*/
-public abstract class Serializer extends BeanContext {
+public abstract class Serializer extends BeanTraverseContext {
//-------------------------------------------------------------------------------------------------------------------
// Configurable properties
@@ -164,146 +163,6 @@ public abstract class Serializer extends BeanContext {
public static final String SERIALIZER_addRootType = PREFIX + "addRootType.b";
/**
- * Configuration property: Automatically detect POJO recursions.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"Serializer.detectRecursions.b"</js>
- * <li><b>Data type:</b> <code>Boolean</code>
- * <li><b>Default:</b> <jk>false</jk>
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link SerializerBuilder#detectRecursions(boolean)}
- * <li class='jm'>{@link SerializerBuilder#detectRecursions()}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Specifies that recursions should be checked for during serialization.
- *
- * <p>
- * Recursions can occur when serializing models that aren't true trees but rather contain loops.
- * <br>In general, unchecked recursions cause stack-overflow-errors.
- * <br>These show up as {@link ParseException ParseExceptions} with the message <js>"Depth too deep. Stack overflow occurred."</js>.
- *
- * <p>
- * The behavior when recursions are detected depends on the value for {@link #SERIALIZER_ignoreRecursions}.
- *
- * <p>
- * For example, if a model contains the links A->B->C->A, then the JSON generated will look like
- * the following when <jsf>SERIALIZER_ignoreRecursions</jsf> is <jk>true</jk>...
- *
- * <p class='bcode w800'>
- * {A:{B:{C:<jk>null</jk>}}}
- * </p>
- *
- * <h5 class='section'>Notes:</h5>
- * <ul class='spaced-list'>
- * <li>
- * Checking for recursion can cause a small performance penalty.
- * </ul>
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Create a serializer that never adds _type to nodes.</jc>
- * WriterSerializer s = JsonSerializer
- * .<jsm>create</jsm>()
- * .detectRecursions()
- * .ignoreRecursions()
- * .build();
- *
- * <jc>// Same, but use property.</jc>
- * WriterSerializer s = JsonSerializer
- * .<jsm>create</jsm>()
- * .set(<jsf>SERIALIZER_detectRecursions</jsf>, <jk>true</jk>)
- * .set(<jsf>SERIALIZER_ignoreRecursions</jsf>, <jk>true</jk>)
- * .build();
- *
- * <jc>// Create a POJO model with a recursive loop.</jc>
- * <jk>public class</jk> A {
- * <jk>public</jk> Object <jf>f</jf>;
- * }
- * A a = <jk>new</jk> A();
- * a.<jf>f</jf> = a;
- *
- * <jc>// Produces "{f:null}"</jc>
- * String json = s.serialize(a);
- * </p>
- */
- public static final String SERIALIZER_detectRecursions = PREFIX + "detectRecursions.b";
-
- /**
- * Configuration property: Ignore recursion errors.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"Serializer.ignoreRecursions.b"</js>
- * <li><b>Data type:</b> <code>Boolean</code>
- * <li><b>Default:</b> <jk>false</jk>
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link SerializerBuilder#ignoreRecursions(boolean)}
- * <li class='jm'>{@link SerializerBuilder#ignoreRecursions()}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Used in conjunction with {@link #SERIALIZER_detectRecursions}.
- * <br>Setting is ignored if <jsf>SERIALIZER_detectRecursions</jsf> is <jk>false</jk>.
- *
- * <p>
- * If <jk>true</jk>, when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
- * <br>Otherwise, a {@link SerializeException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
- */
- public static final String SERIALIZER_ignoreRecursions = PREFIX + "ignoreRecursions.b";
-
- /**
- * Configuration property: Initial depth.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"Serializer.initialDepth.i"</js>
- * <li><b>Data type:</b> <code>Integer</code>
- * <li><b>Default:</b> <code>0</code>
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link SerializerBuilder#initialDepth(int)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * The initial indentation level at the root.
- * <br>Useful when constructing document fragments that need to be indented at a certain level.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Create a serializer with whitespace enabled and an initial depth of 2.</jc>
- * WriterSerializer s = JsonSerializer
- * .<jsm>create</jsm>()
- * .ws()
- * .initialDepth(2)
- * .build();
- *
- * <jc>// Same, but use property.</jc>
- * WriterSerializer s = JsonSerializer
- * .<jsm>create</jsm>()
- * .set(<jsf>SERIALIZER_useWhitespace</jsf>, <jk>true</jk>)
- * .set(<jsf>SERIALIZER_initialDepth</jsf>, 2)
- * .build();
- *
- * <jc>// Produces "\t\t{\n\t\t\t'foo':'bar'\n\t\t}\n"</jc>
- * String json = s.serialize(<jk>new</jk> MyBean());
- * </p>
- */
- public static final String SERIALIZER_initialDepth = PREFIX + "initialDepth.i";
-
- /**
* Configuration property: Serializer listener.
*
* <h5 class='section'>Property:</h5>
@@ -367,43 +226,6 @@ public abstract class Serializer extends BeanContext {
public static final String SERIALIZER_listener = PREFIX + "listener.c";
/**
- * Configuration property: Max serialization depth.
- *
- * <h5 class='section'>Property:</h5>
- * <ul>
- * <li><b>Name:</b> <js>"Serializer.maxDepth.i"</js>
- * <li><b>Data type:</b> <code>Integer</code>
- * <li><b>Default:</b> <code>100</code>
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link SerializerBuilder#maxDepth(int)}
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Abort serialization if specified depth is reached in the POJO tree.
- * <br>If this depth is exceeded, an exception is thrown.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Create a serializer that throws an exception if the depth is greater than 20.</jc>
- * WriterSerializer s = JsonSerializer
- * .<jsm>create</jsm>()
- * .maxDepth(20)
- * .build();
- *
- * <jc>// Same, but use property.</jc>
- * WriterSerializer s = JsonSerializer
- * .<jsm>create</jsm>()
- * .set(<jsf>SERIALIZER_maxDepth</jsf>, 20)
- * .build();
- * </p>
- */
- public static final String SERIALIZER_maxDepth = PREFIX + "maxDepth.i";
-
- /**
* Configuration property: Sort arrays and collections alphabetically.
*
* <h5 class='section'>Property:</h5>
@@ -880,10 +702,7 @@ public abstract class Serializer extends BeanContext {
// Instance
//-------------------------------------------------------------------------------------------------------------------
- private final int initialDepth, maxDepth;
private final boolean
- detectRecursions,
- ignoreRecursions,
addBeanTypes,
trimNullProperties,
trimEmptyCollections,
@@ -932,10 +751,6 @@ public abstract class Serializer extends BeanContext {
protected Serializer(PropertyStore ps, String produces, String accept) {
super(ps);
- maxDepth = getIntegerProperty(SERIALIZER_maxDepth, 100);
- initialDepth = getIntegerProperty(SERIALIZER_initialDepth, 0);
- detectRecursions = getBooleanProperty(SERIALIZER_detectRecursions, false);
- ignoreRecursions = getBooleanProperty(SERIALIZER_ignoreRecursions, false);
addBeanTypes = getBooleanProperty(SERIALIZER_addBeanTypes, false);
trimNullProperties = getBooleanProperty(SERIALIZER_trimNullProperties, true);
trimEmptyCollections = getBooleanProperty(SERIALIZER_trimEmptyCollections, false);
@@ -1124,51 +939,6 @@ public abstract class Serializer extends BeanContext {
//-----------------------------------------------------------------------------------------------------------------
/**
- * Configuration property: Initial depth.
- *
- * @see #SERIALIZER_initialDepth
- * @return
- * The initial indentation level at the root.
- */
- protected final int getInitialDepth() {
- return initialDepth;
- }
-
- /**
- * Configuration property: Max serialization depth.
- *
- * @see #SERIALIZER_maxDepth
- * @return
- * The depth at which serialization is aborted if depth is reached in the POJO tree.
- * <br>If this depth is exceeded, an exception is thrown.
- */
- protected final int getMaxDepth() {
- return maxDepth;
- }
-
- /**
- * Configuration property: Automatically detect POJO recursions.
- * @see #SERIALIZER_detectRecursions
- * @return
- * <jk>true</jk> if recursions should be checked for during serialization.
- */
- protected final boolean isDetectRecursions() {
- return detectRecursions;
- }
-
- /**
- * Configuration property: Ignore recursion errors.
- *
- * @see #SERIALIZER_ignoreRecursions
- * @return
- * <jk>true</jk> if when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
- * <br>Otherwise, a {@link SerializeException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
- */
- protected final boolean isIgnoreRecursions() {
- return ignoreRecursions;
- }
-
- /**
* Configuration property: Add <js>"_type"</js> properties when needed.
*
* @see #SERIALIZER_addBeanTypes
@@ -1316,10 +1086,6 @@ public abstract class Serializer extends BeanContext {
public ObjectMap asMap() {
return super.asMap()
.append("Serializer", new ObjectMap()
- .append("maxDepth", maxDepth)
- .append("initialDepth", initialDepth)
- .append("detectRecursions", detectRecursions)
- .append("ignoreRecursions", ignoreRecursions)
.append("addBeanTypes", addBeanTypes)
.append("trimNullProperties", trimNullProperties)
.append("trimEmptyCollections", trimEmptyCollections)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
index e9e28c0..b019c46 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
@@ -22,7 +22,7 @@ import org.apache.juneau.http.*;
/**
* Builder class for building instances of serializers.
*/
-public class SerializerBuilder extends BeanContextBuilder {
+public class SerializerBuilder extends BeanTraverseBuilder {
/**
* Constructor, default settings.
@@ -122,113 +122,6 @@ public class SerializerBuilder extends BeanContextBuilder {
}
/**
- * Configuration property: Automatically detect POJO recursions.
- *
- * <p>
- * Specifies that recursions should be checked for during serialization.
- *
- * <h5 class='section'>Notes:</h5>
- * <ul class='spaced-list'>
- * <li>
- * Checking for recursion can cause a small performance penalty.
- * </ul>
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
- * </ul>
- *
- * @param value
- * The new value for this property.
- * <br>The default is <jk>false</jk>.
- * @return This object (for method chaining).
- */
- public SerializerBuilder detectRecursions(boolean value) {
- return set(SERIALIZER_detectRecursions, value);
- }
-
- /**
- * Configuration property: Automatically detect POJO recursions.
- *
- * <p>
- * Shortcut for calling <code>detectRecursions(<jk>true</jk>)</code>.
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
- * </ul>
- *
- * @return This object (for method chaining).
- */
- public SerializerBuilder detectRecursions() {
- return set(SERIALIZER_detectRecursions, true);
- }
-
- /**
- * Configuration property: Ignore recursion errors.
- *
- * <p>
- * If <jk>true</jk>, when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
- * Otherwise, an exception is thrown.
- *
- * <h5 class='section'>Notes:</h5>
- * <ul class='spaced-list'>
- * <li>
- * Checking for recursion can cause a small performance penalty.
- * </ul>
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
- * </ul>
- *
- * @param value
- * The new value for this property.
- * <br>The default is <jk>false</jk>.
- * @return This object (for method chaining).
- */
- public SerializerBuilder ignoreRecursions(boolean value) {
- return set(SERIALIZER_ignoreRecursions, value);
- }
-
- /**
- * Configuration property: Ignore recursion errors.
- *
- * <p>
- * Shortcut for calling <code>ignoreRecursions(<jk>true</jk>)</code>.
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
- * </ul>
- *
- * @return This object (for method chaining).
- */
- public SerializerBuilder ignoreRecursions() {
- return set(SERIALIZER_ignoreRecursions, true);
- }
-
- /**
- * Configuration property: Initial depth.
- *
- * <p>
- * The initial indentation level at the root.
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_initialDepth}
- * </ul>
- *
- * @param value
- * The new value for this property.
- * <br>The default is <code>0</code>.
- * @return This object (for method chaining).
- */
- public SerializerBuilder initialDepth(int value) {
- return set(SERIALIZER_initialDepth, value);
- }
-
- /**
* Configuration property: Serializer listener.
*
* <p>
@@ -248,28 +141,6 @@ public class SerializerBuilder extends BeanContextBuilder {
}
/**
- * Configuration property: Max serialization depth.
- *
- * <p>
- * Abort serialization if specified depth is reached in the POJO tree.
- * <br>If this depth is exceeded, an exception is thrown.
- * <br>This prevents stack overflows from occurring when trying to serialize models with recursive references.
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_maxDepth}
- * </ul>
- *
- * @param value
- * The new value for this property.
- * <br>The default is <code>100</code>.
- * @return This object (for method chaining).
- */
- public SerializerBuilder maxDepth(int value) {
- return set(SERIALIZER_maxDepth, value);
- }
-
- /**
* Configuration property: Sort arrays and collections alphabetically.
*
* <p>
@@ -667,6 +538,42 @@ public class SerializerBuilder extends BeanContextBuilder {
return useWhitespace();
}
+ @Override /* BeanTraverseBuilder */
+ public SerializerBuilder detectRecursions(boolean value) {
+ super.detectRecursions(value);
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerBuilder detectRecursions() {
+ super.detectRecursions();
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerBuilder ignoreRecursions(boolean value) {
+ super.ignoreRecursions(value);
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerBuilder ignoreRecursions() {
+ super.ignoreRecursions();
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerBuilder initialDepth(int value) {
+ super.initialDepth(value);
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerBuilder maxDepth(int value) {
+ super.maxDepth(value);
+ return this;
+ }
+
@Override /* BeanContextBuilder */
public SerializerBuilder beanClassVisibility(Visibility value) {
super.beanClassVisibility(value);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
index 695bbb8..bc5d439 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
@@ -63,7 +63,7 @@ import org.apache.juneau.http.*;
* String json = s.serialize(addressBook);
* </p>
*/
-public final class SerializerGroup extends BeanContext {
+public final class SerializerGroup extends BeanTraverseContext {
/**
* An unmodifiable empty serializer group.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
index 9f1d5c2..0d4343b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
@@ -25,7 +25,7 @@ import org.apache.juneau.internal.*;
/**
* Builder class for creating instances of {@link SerializerGroup}.
*/
-public class SerializerGroupBuilder extends BeanContextBuilder {
+public class SerializerGroupBuilder extends BeanTraverseBuilder {
private final List<Object> serializers;
@@ -208,113 +208,6 @@ public class SerializerGroupBuilder extends BeanContextBuilder {
}
/**
- * Configuration property: Automatically detect POJO recursions.
- *
- * <p>
- * Specifies that recursions should be checked for during serialization.
- *
- * <h5 class='section'>Notes:</h5>
- * <ul class='spaced-list'>
- * <li>
- * Checking for recursion can cause a small performance penalty.
- * </ul>
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
- * </ul>
- *
- * @param value
- * The new value for this property.
- * <br>The default is <jk>false</jk>.
- * @return This object (for method chaining).
- */
- public SerializerGroupBuilder detectRecursions(boolean value) {
- return set(SERIALIZER_detectRecursions, value);
- }
-
- /**
- * Configuration property: Automatically detect POJO recursions.
- *
- * <p>
- * Shortcut for calling <code>detectRecursions(<jk>true</jk>)</code>.
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
- * </ul>
- *
- * @return This object (for method chaining).
- */
- public SerializerGroupBuilder detectRecursions() {
- return set(SERIALIZER_detectRecursions, true);
- }
-
- /**
- * Configuration property: Ignore recursion errors.
- *
- * <p>
- * If <jk>true</jk>, when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
- * Otherwise, an exception is thrown.
- *
- * <h5 class='section'>Notes:</h5>
- * <ul class='spaced-list'>
- * <li>
- * Checking for recursion can cause a small performance penalty.
- * </ul>
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
- * </ul>
- *
- * @param value
- * The new value for this property.
- * <br>The default is <jk>false</jk>.
- * @return This object (for method chaining).
- */
- public SerializerGroupBuilder ignoreRecursions(boolean value) {
- return set(SERIALIZER_ignoreRecursions, value);
- }
-
- /**
- * Configuration property: Ignore recursion errors.
- *
- * <p>
- * Shortcut for calling <code>ignoreRecursions(<jk>true</jk>)</code>.
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
- * </ul>
- *
- * @return This object (for method chaining).
- */
- public SerializerGroupBuilder ignoreRecursions() {
- return set(SERIALIZER_ignoreRecursions, true);
- }
-
- /**
- * Configuration property: Initial depth.
- *
- * <p>
- * The initial indentation level at the root.
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_initialDepth}
- * </ul>
- *
- * @param value
- * The new value for this property.
- * <br>The default is <code>0</code>.
- * @return This object (for method chaining).
- */
- public SerializerGroupBuilder initialDepth(int value) {
- return set(SERIALIZER_initialDepth, value);
- }
-
- /**
* Configuration property: Serializer listener.
*
* <p>
@@ -334,28 +227,6 @@ public class SerializerGroupBuilder extends BeanContextBuilder {
}
/**
- * Configuration property: Max serialization depth.
- *
- * <p>
- * Abort serialization if specified depth is reached in the POJO tree.
- * <br>If this depth is exceeded, an exception is thrown.
- * <br>This prevents stack overflows from occurring when trying to serialize models with recursive references.
- *
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_maxDepth}
- * </ul>
- *
- * @param value
- * The new value for this property.
- * <br>The default is <code>100</code>.
- * @return This object (for method chaining).
- */
- public SerializerGroupBuilder maxDepth(int value) {
- return set(SERIALIZER_maxDepth, value);
- }
-
- /**
* Configuration property: Sort arrays and collections alphabetically.
*
* <h5 class='section'>See Also:</h5>
@@ -746,6 +617,42 @@ public class SerializerGroupBuilder extends BeanContextBuilder {
return set(OSSERIALIZER_binaryFormat, value);
}
+ @Override /* BeanTraverseBuilder */
+ public SerializerGroupBuilder detectRecursions(boolean value) {
+ super.detectRecursions(value);
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerGroupBuilder detectRecursions() {
+ super.detectRecursions();
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerGroupBuilder ignoreRecursions(boolean value) {
+ super.ignoreRecursions(value);
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerGroupBuilder ignoreRecursions() {
+ super.ignoreRecursions();
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerGroupBuilder initialDepth(int value) {
+ super.initialDepth(value);
+ return this;
+ }
+
+ @Override /* BeanTraverseBuilder */
+ public SerializerGroupBuilder maxDepth(int value) {
+ super.maxDepth(value);
+ return this;
+ }
+
@Override /* BeanContextBuilder */
public SerializerGroupBuilder beanClassVisibility(Visibility value) {
super.beanClassVisibility(value);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index e4a6bfc..327699d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -46,26 +46,17 @@ import org.apache.juneau.transform.*;
* This class is NOT thread safe.
* It is typically discarded after one-time use although it can be reused within the same thread.
*/
-public abstract class SerializerSession extends BeanSession {
+public abstract class SerializerSession extends BeanTraverseSession {
private final Serializer ctx;
private final UriResolver uriResolver;
- private final Map<Object,Object> set; // Contains the current objects in the current branch of the model.
- private final LinkedList<StackElement> stack = new LinkedList<>(); // Contains the current objects in the current branch of the model.
private final Method javaMethod; // Java method that invoked this serializer.
// Writable properties
- private boolean isBottom; // If 'true', then we're at a leaf in the model (i.e. a String, Number, Boolean, or null).
- private BeanPropertyMeta currentProperty;
- private ClassMeta<?> currentClass;
private final boolean useWhitespace;
private final SerializerListener listener;
- /** The current indentation depth into the model. */
- public int indent;
-
-
/**
* Create a new session using properties specified in the context.
*
@@ -87,13 +78,6 @@ public abstract class SerializerSession extends BeanSession {
this.uriResolver = new UriResolver(ctx.getUriResolution(), ctx.getUriRelativity(), args.uriContext == null ? ctx.getUriContext() : args.uriContext);
this.listener = newInstance(SerializerListener.class, ctx.getListener());
this.useWhitespace = args.useWhitespace != null ? args.useWhitespace : ctx.isUseWhitespace();
-
- this.indent = getInitialDepth();
- if (isDetectRecursions() || isDebug()) {
- set = new IdentityHashMap<>();
- } else {
- set = Collections.emptyMap();
- }
}
/**
@@ -210,7 +194,7 @@ public abstract class SerializerSession extends BeanSession {
throw e;
} catch (StackOverflowError e) {
throw new SerializeException(this,
- "Stack overflow occurred. This can occur when trying to serialize models containing loops. It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop.").initCause(e);
+ "Stack overflow occurred. This can occur when trying to serialize models containing loops. It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.").initCause(e);
} catch (Exception e) {
throw new SerializeException(this, e);
} finally {
@@ -219,24 +203,6 @@ public abstract class SerializerSession extends BeanSession {
}
/**
- * Sets the current bean property being serialized for proper error messages.
- *
- * @param currentProperty The current property being serialized.
- */
- protected final void setCurrentProperty(BeanPropertyMeta currentProperty) {
- this.currentProperty = currentProperty;
- }
-
- /**
- * Sets the current class being serialized for proper error messages.
- *
- * @param currentClass The current class being serialized.
- */
- protected final void setCurrentClass(ClassMeta<?> currentClass) {
- this.currentClass = currentClass;
- }
-
- /**
* Returns the Java method that invoked this serializer.
*
* <p>
@@ -259,77 +225,6 @@ public abstract class SerializerSession extends BeanSession {
}
/**
- * Push the specified object onto the stack.
- *
- * @param attrName The attribute name.
- * @param o The current object being serialized.
- * @param eType The expected class type.
- * @return
- * The {@link ClassMeta} of the object so that <code>instanceof</code> operations only need to be performed
- * once (since they can be expensive).
- * @throws SerializeException If recursion occurred.
- */
- protected final ClassMeta<?> push(String attrName, Object o, ClassMeta<?> eType) throws SerializeException {
- indent++;
- isBottom = true;
- if (o == null)
- return null;
- Class<?> c = o.getClass();
- ClassMeta<?> cm = (eType != null && c == eType.getInnerClass()) ? eType : getClassMeta(c);
- if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
- return cm;
- if (isDetectRecursions() || isDebug()) {
- if (stack.size() > getMaxDepth())
- return null;
- if (willRecurse(attrName, o, cm))
- return null;
- isBottom = false;
- stack.add(new StackElement(stack.size(), attrName, o, cm));
- if (isDebug())
- getLogger().info(getStack(false));
- set.put(o, o);
- }
- return cm;
- }
-
- /**
- * Returns <jk>true</jk> if {@link Serializer#SERIALIZER_detectRecursions} is enabled, and the specified
- * object is already higher up in the serialization chain.
- *
- * @param attrName The bean property attribute name, or some other identifier.
- * @param o The object to check for recursion.
- * @param cm The metadata on the object class.
- * @return <jk>true</jk> if recursion detected.
- * @throws SerializeException If recursion occurred.
- */
- protected final boolean willRecurse(String attrName, Object o, ClassMeta<?> cm) throws SerializeException {
- if (! (isDetectRecursions() || isDebug()))
- return false;
- if (! set.containsKey(o))
- return false;
- if (isIgnoreRecursions() && ! isDebug())
- return true;
-
- stack.add(new StackElement(stack.size(), attrName, o, cm));
- throw new SerializeException("Recursion occurred, stack={0}", getStack(true));
- }
-
- /**
- * Pop an object off the stack.
- */
- protected final void pop() {
- indent--;
- if ((isDetectRecursions() || isDebug()) && ! isBottom) {
- Object o = stack.removeLast().o;
- Object o2 = set.remove(o);
- if (o2 == null)
- onError(null, "Couldn't remove object of type ''{0}'' on attribute ''{1}'' from object stack.",
- o.getClass().getName(), stack);
- }
- isBottom = false;
- }
-
- /**
* Specialized warning when an exception is thrown while executing a bean getter.
*
* @param p The bean map entry representing the bean property.
@@ -350,10 +245,11 @@ public abstract class SerializerSession extends BeanSession {
* @param msg The warning message.
* @param args Optional {@link MessageFormat}-style arguments.
*/
- protected final void onError(Throwable t, String msg, Object... args) {
+ @Override
+ protected void onError(Throwable t, String msg, Object... args) {
if (listener != null)
listener.onError(this, t, format(msg, args));
- super.addWarning(msg, args);
+ super.onError(t, msg, args);
}
/**
@@ -433,8 +329,12 @@ public abstract class SerializerSession extends BeanSession {
}
}
- if (isTrimNullProperties() && willRecurse(attrName, value, cm))
- return true;
+ try {
+ if (isTrimNullProperties() && willRecurse(attrName, value, cm))
+ return true;
+ } catch (BeanRecursionException e) {
+ throw new SerializeException(e);
+ }
return false;
}
@@ -585,62 +485,6 @@ public abstract class SerializerSession extends BeanSession {
return s;
}
- private static final class StackElement {
- final int depth;
- final String name;
- final Object o;
- final ClassMeta<?> aType;
-
- StackElement(int depth, String name, Object o, ClassMeta<?> aType) {
- this.depth = depth;
- this.name = name;
- this.o = o;
- this.aType = aType;
- }
-
- String toString(boolean simple) {
- StringBuilder sb = new StringBuilder().append('[').append(depth).append(']');
- sb.append(isEmpty(name) ? "<noname>" : name).append(':');
- sb.append(aType.toString(simple));
- if (aType != aType.getSerializedClassMeta(null))
- sb.append('/').append(aType.getSerializedClassMeta(null).toString(simple));
- return sb.toString();
- }
- }
-
- private String getStack(boolean full) {
- StringBuilder sb = new StringBuilder();
- for (StackElement e : stack) {
- if (full) {
- sb.append("\n\t");
- for (int i = 1; i < e.depth; i++)
- sb.append(" ");
- if (e.depth > 0)
- sb.append("->");
- sb.append(e.toString(false));
- } else {
- sb.append(" > ").append(e.toString(true));
- }
- }
- return sb.toString();
- }
-
- /**
- * Returns information used to determine at what location in the parse a failure occurred.
- *
- * @return A map, typically containing something like <code>{line:123,column:456,currentProperty:"foobar"}</code>
- */
- protected final ObjectMap getLastLocation() {
- ObjectMap m = new ObjectMap();
- if (currentClass != null)
- m.put("currentClass", currentClass);
- if (currentProperty != null)
- m.put("currentProperty", currentProperty);
- if (stack != null && ! stack.isEmpty())
- m.put("stack", stack);
- return m;
- }
-
/**
* Create a "_type" property that contains the dictionary name of the bean.
*
@@ -774,52 +618,6 @@ public abstract class SerializerSession extends BeanSession {
}
/**
- * Configuration property: Initial depth.
- *
- * @see Serializer#SERIALIZER_initialDepth
- * @return
- * The initial indentation level at the root.
- */
- protected final int getInitialDepth() {
- return ctx.getInitialDepth();
- }
-
- /**
- * Configuration property: Max serialization depth.
- *
- * @see Serializer#SERIALIZER_maxDepth
- * @return
- * The depth at which serialization is aborted if depth is reached in the POJO tree.
- * <br>If this depth is exceeded, an exception is thrown.
- */
- protected final int getMaxDepth() {
- return ctx.getMaxDepth();
- }
-
- /**
- * Configuration property: Automatically detect POJO recursions.
- *
- * @see Serializer#SERIALIZER_detectRecursions
- * @return
- * <jk>true</jk> if recursions should be checked for during serialization.
- */
- protected final boolean isDetectRecursions() {
- return ctx.isDetectRecursions();
- }
-
- /**
- * Configuration property: Ignore recursion errors.
- *
- * @see Serializer#SERIALIZER_ignoreRecursions
- * @return
- * <jk>true</jk> if when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
- * <br>Otherwise, a {@link SerializeException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
- */
- protected final boolean isIgnoreRecursions() {
- return ctx.isIgnoreRecursions();
- }
-
- /**
* Configuration property: Add <js>"_type"</js> properties when needed.
*
* @see Serializer#SERIALIZER_addBeanTypes
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index 8af3a0a..08a6e17 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -150,7 +150,12 @@ public class XmlSerializerSession extends WriterSerializerSession {
*/
protected final void findNsfMappings(Object o) throws SerializeException {
ClassMeta<?> aType = null; // The actual type
- aType = push(null, o, null);
+
+ try {
+ aType = push(null, o, null);
+ } catch (BeanRecursionException e) {
+ throw new SerializeException(e);
+ }
if (aType != null) {
Namespace ns = cXml(aType).getNamespace();
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 8299a9a..c529e62 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -97,7 +97,7 @@
<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties'>Configurable Properties</a></p>
<ol>
<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties.Common'>Common Serializer Properties</a></p>
- <li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a></p>
+ <li><p class='updated'><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a></p>
<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonParser'>Common Parser Properties</a></p>
</ol>
<li><p class=''><a class='doclink' href='#juneau-marshall.ObjectMap'>ObjectMap and ObjectList</a></p>
@@ -858,7 +858,7 @@
<ul>
<li class='jc'>{@link org.apache.juneau.json.JsonSerializer}
<ul>
- <li class='jc'>{@link org.apache.juneau.jsonschema.JsonSchemaSerializer}
+ <li class='jc'>{@link org.apache.juneau.json.JsonSchemaSerializer}
<li class='jc'>{@link org.apache.juneau.json.SimpleJsonSerializer}
</ul>
<li class='jc'>{@link org.apache.juneau.plaintext.PlainTextSerializer}
@@ -883,11 +883,12 @@
<ul>
<li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}
<ul>
+ <li class='jc'>{@link org.apache.juneau.html.HtmlSchemaSerializer}
<li class='jc'>{@link org.apache.juneau.html.HtmlStrippedDocSerializer}
<ul>
<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}
<ul>
- <li class='jc'>{@link org.apache.juneau.htmlschema.HtmlSchemaDocSerializer}
+ <li class='jc'>{@link org.apache.juneau.html.HtmlSchemaDocSerializer}
</ul>
</ul>
</ul>
@@ -1306,39 +1307,42 @@
<!-- ==================================================================================================== -->
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.CommonSerializer' id='juneau-marshall.ConfigurableProperties.CommonSerializer'>2.6.2 - Common Serializer Properties</a></h4>
+<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.CommonSerializer' id='juneau-marshall.ConfigurableProperties.CommonSerializer'>2.6.2 - Common Serializer Properties</a></h4>
<div class='topic'><!-- START: 2.6.2 - juneau-marshall.ConfigurableProperties.CommonSerializer -->
<p>
In addition to the common properties above, the following properties are common to all serializers:
</p>
<ul class='doctree'>
- <li class='jc'>{@link org.apache.juneau.serializer.Serializer}
+ <li class='jc'>{@link org.apache.juneau.BeanTraverseContext}
<ul>
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions SERIALIZER_ignoreRecursions}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_initialDepth SERIALIZER_initialDepth}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_maxDepth SERIALIZER_maxDepth}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace}
- <li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
- <ul>
- <li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
- <li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
- </ul>
- <li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
- <ul>
- <li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
+ <li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions}
+ <li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_ignoreRecursions BEANTRAVERSE_ignoreRecursions}
+ <li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_initialDepth BEANTRAVERSE_initialDepth}
+ <li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth BEANTRAVERSE_maxDepth}
+ <li class='jc'>{@link org.apache.juneau.serializer.Serializer}
+ <ul>
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace}
+ <li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
+ <ul>
+ <li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
+ <li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
+ </ul>
+ <li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
+ <ul>
+ <li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
+ </ul>
</ul>
</ul>
</ul>
@@ -3520,12 +3524,12 @@
The Juneau Serializer API is designed to be used against POJO tree structures.
<br>It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).
<br>If you try to serialize models with loops, you will usually cause a <code>StackOverflowError</code> to
- be thrown (if {@link org.apache.juneau.serializer.Serializer#SERIALIZER_maxDepth} is not reached
+ be thrown (if {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth} is not reached
first).
</p>
<p>
If you still want to use the Juneau serializers on such models, Juneau provides the
- {@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions} setting.
+ {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions} setting.
<br>It tells the serializer to look for instances of an object in the current branch of the tree and skip
serialization when a duplicate is encountered.
</p>
@@ -4631,7 +4635,7 @@
<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.JsonSchema' id='juneau-marshall.JsonDetails.JsonSchema'>2.19.6 - JSON-Schema Support</a></h4>
<div class='topic'><!-- START: 2.19.6 - juneau-marshall.JsonDetails.JsonSchema -->
<p>
- Juneau provides the {@link org.apache.juneau.jsonschema.JsonSchemaSerializer} class for generating JSON-Schema
+ Juneau provides the {@link org.apache.juneau.json.JsonSchemaSerializer} class for generating JSON-Schema
documents that describe the output generated by the {@link org.apache.juneau.json.JsonSerializer} class.
<br>This class shares the same properties as <code>JsonSerializer</code>.
<br>For convenience the {@link org.apache.juneau.json.JsonSerializer#getSchemaSerializer()} method has been
@@ -7904,8 +7908,8 @@
<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlSchema' id='juneau-marshall.HtmlDetails.HtmlSchema'>2.21.9 - HTML-Schema Support</a></h4>
<div class='topic'><!-- START: 2.21.9 - juneau-marshall.HtmlDetails.HtmlSchema -->
<p>
- The {@link org.apache.juneau.htmlschema.HtmlSchemaSerializer} class is the HTML-equivalent to the
- {@link org.apache.juneau.jsonschema.JsonSchemaSerializer} class.
+ The {@link org.apache.juneau.html.HtmlSchemaSerializer} class is the HTML-equivalent to the
+ {@link org.apache.juneau.json.JsonSchemaSerializer} class.
It's used to generate HTML versions of JSON-Schema documents that describe the output generated by the
{@link org.apache.juneau.json.JsonSerializer} class.
</p>
@@ -9556,7 +9560,7 @@ TODO(7.2.0)
Reuse instances of serializers and parsers whenever possible.
<br>They are designed to be thread safe and maintain internal caches of bean metadata to increase performance.
<li>
- The {@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions}
+ The {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions}
option on the {@link org.apache.juneau.serializer.Serializer} class can cause a performance penalty of
around 20%.
<br>Therefore, it's recommended that this option be used only when necessary.
@@ -22846,8 +22850,8 @@ TODO(7.2.0)
}
),
properties={
- <ja>@Property</ja>(name=<jsf>SERIALIZER_maxDepth</jsf>, value=<js>"5"</js>),
- <ja>@Property</ja>(name=<jsf>SERIALIZER_detectRecursions</jsf>, value="<js>true"</js>)
+ <ja>@Property</ja>(name=<jsf>BEANTRAVERSE_maxDepth</jsf>, value=<js>"5"</js>),
+ <ja>@Property</ja>(name=<jsf>BEANTRAVERSE_detectRecursions</jsf>, value="<js>true"</js>)
},
beanFilters={
<jc>// Interpret these as their parent classes, not subclasses</jc>
@@ -27232,7 +27236,7 @@ TODO(7.2.0)
<li>Improved error handling.
<li>New <code><del>ParserContext.PARSER_debug</del></code> and <code><del>SerializerContext.SERIALIZER_debug</del></code>.
settings for logging additional information for debugging problems.
- <li>New {@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions} setting for explicitely ignoring recursions when
+ <li>New <code><del>SERIALIZER_ignoreRecursions</del></code> setting for explicitly ignoring recursions when
serializing models. Previously, the <jsf>SERIALIZER_detectRecursions</jsf> setting did this, but now it simply looks for recursions
and throws exceptions when they occur.
<li>Improved handling of <code>StackOverflowErrors</code>. When <jsf>SERIALIZER_detectRecursions</jsf> is enabled, a useful error message
@@ -31013,13 +31017,6 @@ TODO(7.2.0)
If a bean has both a <code>getX()</code> and <code>isX()</code> method, the <code>getX()</code> method takes precedence.
<br>The previous behavior was arbitrary.
<li>
- The schema serializers have been moved into their own packages:
- <ul class='doctree'>
- <li class='jp'>{@link org.apache.juneau.jsonschema}
- <li class='jp'>{@link org.apache.juneau.htmlschema}
- <li class='jp'>{@link org.apache.juneau.xmlschema}
- </ul>
- <li>
Significant improvements to JSON-Schema serialization support.
<ul>
<li>New {@link org.apache.juneau.jsonschema.annotation.JsonSchema @JsonSchema} annotation.
diff --git a/juneau-doc/src/main/resources/ReleaseNotes/5.1.0.07.html b/juneau-doc/src/main/resources/ReleaseNotes/5.1.0.07.html
index babc3eb..0624f90 100644
--- a/juneau-doc/src/main/resources/ReleaseNotes/5.1.0.07.html
+++ b/juneau-doc/src/main/resources/ReleaseNotes/5.1.0.07.html
@@ -22,7 +22,7 @@
<li>Improved error handling.
<li>New <code><del>ParserContext.PARSER_debug</del></code> and <code><del>SerializerContext.SERIALIZER_debug</del></code>.
settings for logging additional information for debugging problems.
- <li>New {@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions} setting for explicitely ignoring recursions when
+ <li>New <code><del>SERIALIZER_ignoreRecursions</del></code> setting for explicitly ignoring recursions when
serializing models. Previously, the <jsf>SERIALIZER_detectRecursions</jsf> setting did this, but now it simply looks for recursions
and throws exceptions when they occur.
<li>Improved handling of <code>StackOverflowErrors</code>. When <jsf>SERIALIZER_detectRecursions</jsf> is enabled, a useful error message
diff --git a/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html b/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
index 1539fc1..d251087 100644
--- a/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
+++ b/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
@@ -128,13 +128,6 @@
If a bean has both a <code>getX()</code> and <code>isX()</code> method, the <code>getX()</code> method takes precedence.
<br>The previous behavior was arbitrary.
<li>
- The schema serializers have been moved into their own packages:
- <ul class='doctree'>
- <li class='jp'>{@link org.apache.juneau.jsonschema}
- <li class='jp'>{@link org.apache.juneau.htmlschema}
- <li class='jp'>{@link org.apache.juneau.xmlschema}
- </ul>
- <li>
Significant improvements to JSON-Schema serialization support.
<ul>
<li>New {@link org.apache.juneau.jsonschema.annotation.JsonSchema @JsonSchema} annotation.
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/01.Serializers.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/01.Serializers.html
index e8c4175..d8f4b07 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/01.Serializers.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/01.Serializers.html
@@ -108,7 +108,7 @@ Serializers
<ul>
<li class='jc'>{@link org.apache.juneau.json.JsonSerializer}
<ul>
- <li class='jc'>{@link org.apache.juneau.jsonschema.JsonSchemaSerializer}
+ <li class='jc'>{@link org.apache.juneau.json.JsonSchemaSerializer}
<li class='jc'>{@link org.apache.juneau.json.SimpleJsonSerializer}
</ul>
<li class='jc'>{@link org.apache.juneau.plaintext.PlainTextSerializer}
@@ -133,11 +133,12 @@ Serializers
<ul>
<li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}
<ul>
+ <li class='jc'>{@link org.apache.juneau.html.HtmlSchemaSerializer}
<li class='jc'>{@link org.apache.juneau.html.HtmlStrippedDocSerializer}
<ul>
<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}
<ul>
- <li class='jc'>{@link org.apache.juneau.htmlschema.HtmlSchemaDocSerializer}
+ <li class='jc'>{@link org.apache.juneau.html.HtmlSchemaDocSerializer}
</ul>
</ul>
</ul>
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
index ce8d031..a6e8c2c 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
@@ -13,39 +13,42 @@
***************************************************************************************************************************/
-->
-Common Serializer Properties
+{updated} Common Serializer Properties
<p>
In addition to the common properties above, the following properties are common to all serializers:
</p>
<ul class='doctree'>
- <li class='jc'>{@link org.apache.juneau.serializer.Serializer}
+ <li class='jc'>{@link org.apache.juneau.BeanTraverseContext}
<ul>
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions SERIALIZER_ignoreRecursions}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_initialDepth SERIALIZER_initialDepth}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_maxDepth SERIALIZER_maxDepth}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
- <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace}
- <li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
+ <li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions}
+ <li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_ignoreRecursions BEANTRAVERSE_ignoreRecursions}
+ <li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_initialDepth BEANTRAVERSE_initialDepth}
+ <li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth BEANTRAVERSE_maxDepth}
+ <li class='jc'>{@link org.apache.juneau.serializer.Serializer}
<ul>
- <li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
- <li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
- </ul>
- <li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
- <ul>
- <li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
+ <li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace}
+ <li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
+ <ul>
+ <li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
+ <li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
+ </ul>
+ <li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
+ <ul>
+ <li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
+ </ul>
</ul>
</ul>
</ul>
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/13.Recursion.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/13.Recursion.html
index 498e0f3..a1cfaf4 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/13.Recursion.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/13.Recursion.html
@@ -19,12 +19,12 @@ Non-Tree Models and Recursion Detection
The Juneau Serializer API is designed to be used against POJO tree structures.
<br>It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).
<br>If you try to serialize models with loops, you will usually cause a <code>StackOverflowError</code> to
- be thrown (if {@link org.apache.juneau.serializer.Serializer#SERIALIZER_maxDepth} is not reached
+ be thrown (if {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth} is not reached
first).
</p>
<p>
If you still want to use the Juneau serializers on such models, Juneau provides the
- {@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions} setting.
+ {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions} setting.
<br>It tells the serializer to look for instances of an object in the current branch of the tree and skip
serialization when a duplicate is encountered.
</p>
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/19.JsonDetails/06.JsonSchema.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/19.JsonDetails/06.JsonSchema.html
index da2b50a..73e4146 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/19.JsonDetails/06.JsonSchema.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/19.JsonDetails/06.JsonSchema.html
@@ -16,7 +16,7 @@
JSON-Schema Support
<p>
- Juneau provides the {@link org.apache.juneau.jsonschema.JsonSchemaSerializer} class for generating JSON-Schema
+ Juneau provides the {@link org.apache.juneau.json.JsonSchemaSerializer} class for generating JSON-Schema
documents that describe the output generated by the {@link org.apache.juneau.json.JsonSerializer} class.
<br>This class shares the same properties as <code>JsonSerializer</code>.
<br>For convenience the {@link org.apache.juneau.json.JsonSerializer#getSchemaSerializer()} method has been
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/21.HtmlDetails/09.HtmlSchema.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/21.HtmlDetails/09.HtmlSchema.html
index ac53781..cfe7cf1 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/21.HtmlDetails/09.HtmlSchema.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/21.HtmlDetails/09.HtmlSchema.html
@@ -16,8 +16,8 @@
{new} HTML-Schema Support
<p>
- The {@link org.apache.juneau.htmlschema.HtmlSchemaSerializer} class is the HTML-equivalent to the
- {@link org.apache.juneau.jsonschema.JsonSchemaSerializer} class.
+ The {@link org.apache.juneau.html.HtmlSchemaSerializer} class is the HTML-equivalent to the
+ {@link org.apache.juneau.json.JsonSchemaSerializer} class.
It's used to generate HTML versions of JSON-Schema documents that describe the output generated by the
{@link org.apache.juneau.json.JsonSerializer} class.
</p>
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/29.BestPractices.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/29.BestPractices.html
index 9314c47..0055ee3 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/29.BestPractices.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/29.BestPractices.html
@@ -20,7 +20,7 @@ Best Practices
Reuse instances of serializers and parsers whenever possible.
<br>They are designed to be thread safe and maintain internal caches of bean metadata to increase performance.
<li>
- The {@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions}
+ The {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions}
option on the {@link org.apache.juneau.serializer.Serializer} class can cause a performance penalty of
around 20%.
<br>Therefore, it's recommended that this option be used only when necessary.
diff --git a/juneau-doc/src/main/resources/Topics/12.juneau-examples-rest/06.RequestEchoResource.html b/juneau-doc/src/main/resources/Topics/12.juneau-examples-rest/06.RequestEchoResource.html
index 25a182c..c5a5ee0 100644
--- a/juneau-doc/src/main/resources/Topics/12.juneau-examples-rest/06.RequestEchoResource.html
+++ b/juneau-doc/src/main/resources/Topics/12.juneau-examples-rest/06.RequestEchoResource.html
@@ -69,8 +69,8 @@ RequestEchoResource
}
),
properties={
- <ja>@Property</ja>(name=<jsf>SERIALIZER_maxDepth</jsf>, value=<js>"5"</js>),
- <ja>@Property</ja>(name=<jsf>SERIALIZER_detectRecursions</jsf>, value="<js>true"</js>)
+ <ja>@Property</ja>(name=<jsf>BEANTRAVERSE_maxDepth</jsf>, value=<js>"5"</js>),
+ <ja>@Property</ja>(name=<jsf>BEANTRAVERSE_detectRecursions</jsf>, value="<js>true"</js>)
},
beanFilters={
<jc>// Interpret these as their parent classes, not subclasses</jc>
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
index 6cfec56..6808e4d 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
@@ -53,8 +53,8 @@ import org.apache.juneau.transforms.*;
nowrap="false"
),
properties={
- @Property(name=SERIALIZER_maxDepth, value="5"),
- @Property(name=SERIALIZER_detectRecursions, value="true")
+ @Property(name=BEANTRAVERSE_maxDepth, value="5"),
+ @Property(name=BEANTRAVERSE_detectRecursions, value="true")
},
beanFilters={
// Interpret these as their parent classes, not subclasses
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
index 44daa6b..e624c4e 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.internal.StringUtils.*;
import static org.apache.juneau.parser.InputStreamParser.*;
import static org.apache.juneau.parser.ReaderParser.*;
import static org.apache.juneau.rest.client.RestClient.*;
+import static org.apache.juneau.BeanTraverseContext.*;
import static org.apache.juneau.serializer.OutputStreamSerializer.*;
import static org.apache.juneau.serializer.WriterSerializer.*;
import static org.apache.juneau.uon.UonSerializer.*;
@@ -1381,7 +1382,7 @@ public class RestClientBuilder extends BeanContextBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
* </ul>
*
* @param value
@@ -1390,7 +1391,7 @@ public class RestClientBuilder extends BeanContextBuilder {
* @return This object (for method chaining).
*/
public RestClientBuilder detectRecursions(boolean value) {
- return set(SERIALIZER_detectRecursions, value);
+ return set(BEANTRAVERSE_detectRecursions, value);
}
/**
@@ -1401,13 +1402,13 @@ public class RestClientBuilder extends BeanContextBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
* </ul>
*
* @return This object (for method chaining).
*/
public RestClientBuilder detectRecursions() {
- return set(SERIALIZER_detectRecursions, true);
+ return set(BEANTRAVERSE_detectRecursions, true);
}
/**
@@ -1425,7 +1426,7 @@ public class RestClientBuilder extends BeanContextBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
* </ul>
*
* @param value
@@ -1434,7 +1435,7 @@ public class RestClientBuilder extends BeanContextBuilder {
* @return This object (for method chaining).
*/
public RestClientBuilder ignoreRecursions(boolean value) {
- return set(SERIALIZER_ignoreRecursions, value);
+ return set(BEANTRAVERSE_ignoreRecursions, value);
}
/**
@@ -1445,13 +1446,13 @@ public class RestClientBuilder extends BeanContextBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
* </ul>
*
* @return This object (for method chaining).
*/
public RestClientBuilder ignoreRecursions() {
- return set(SERIALIZER_ignoreRecursions, true);
+ return set(BEANTRAVERSE_ignoreRecursions, true);
}
/**
@@ -1462,7 +1463,7 @@ public class RestClientBuilder extends BeanContextBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_initialDepth}
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
* </ul>
*
* @param value
@@ -1471,7 +1472,7 @@ public class RestClientBuilder extends BeanContextBuilder {
* @return This object (for method chaining).
*/
public RestClientBuilder initialDepth(int value) {
- return set(SERIALIZER_initialDepth, value);
+ return set(BEANTRAVERSE_initialDepth, value);
}
/**
@@ -1503,7 +1504,7 @@ public class RestClientBuilder extends BeanContextBuilder {
*
* <h5 class='section'>See Also:</h5>
* <ul>
- * <li class='jf'>{@link Serializer#SERIALIZER_maxDepth}
+ * <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
* </ul>
*
* @param value
@@ -1512,7 +1513,7 @@ public class RestClientBuilder extends BeanContextBuilder {
* @return This object (for method chaining).
*/
public RestClientBuilder maxDepth(int value) {
- return set(SERIALIZER_maxDepth, value);
+ return set(BEANTRAVERSE_maxDepth, value);
}
/**
diff --git a/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BasicProvider.java b/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BasicProvider.java
index e2107e6..d1476d6 100644
--- a/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BasicProvider.java
+++ b/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BasicProvider.java
@@ -18,7 +18,6 @@ import javax.ws.rs.ext.*;
import org.apache.juneau.html.*;
import org.apache.juneau.jso.*;
import org.apache.juneau.json.*;
-import org.apache.juneau.jsonschema.*;
import org.apache.juneau.rest.*;
import org.apache.juneau.soap.*;
import org.apache.juneau.urlencoding.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
index b02c226..b650528 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
@@ -15,9 +15,7 @@ package org.apache.juneau.rest;
import static org.apache.juneau.serializer.Serializer.*;
import org.apache.juneau.html.*;
-import org.apache.juneau.htmlschema.*;
import org.apache.juneau.json.*;
-import org.apache.juneau.jsonschema.*;
import org.apache.juneau.msgpack.*;
import org.apache.juneau.plaintext.*;
import org.apache.juneau.rest.annotation.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
index d27436e..1330195 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
@@ -13,7 +13,7 @@
package org.apache.juneau.rest;
import static org.apache.juneau.http.HttpMethodName.*;
-import static org.apache.juneau.jsonschema.JsonSchemaSerializer.*;
+import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
import static org.apache.juneau.rest.BasicRestInfoProvider.*;
import org.apache.juneau.dto.swagger.*;
@@ -21,7 +21,6 @@ import org.apache.juneau.dto.swagger.ui.*;
import org.apache.juneau.html.*;
import org.apache.juneau.jso.*;
import org.apache.juneau.json.*;
-import org.apache.juneau.jsonschema.*;
import org.apache.juneau.plaintext.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.soap.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 273015c..161b7ad 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -35,7 +35,6 @@ import org.apache.juneau.*;
import org.apache.juneau.config.*;
import org.apache.juneau.encoders.*;
import org.apache.juneau.html.*;
-import org.apache.juneau.htmlschema.*;
import org.apache.juneau.http.*;
import org.apache.juneau.http.annotation.*;
import org.apache.juneau.httppart.*;
@@ -2991,7 +2990,7 @@ public final class RestContext extends BeanContext {
private final ParserGroup parsers;
private final HttpPartSerializer partSerializer;
private final HttpPartParser partParser;
- private final JsonSchemaSerializer jsonSchemaSerializer;
+ private final JsonSchemaGenerator jsonSchemaGenerator;
private final EncoderGroup encoders;
private final List<MediaType>
consumes,
@@ -3154,7 +3153,7 @@ public final class RestContext extends BeanContext {
parsers = ParserGroup.create().append(getInstanceArrayProperty(REST_parsers, Parser.class, new Parser[0], true, resource, ps)).build();
partSerializer = getInstanceProperty(REST_partSerializer, HttpPartSerializer.class, OpenApiPartSerializer.class, true, resource, ps);
partParser = getInstanceProperty(REST_partParser, HttpPartParser.class, OpenApiPartParser.class, true, resource, ps);
- jsonSchemaSerializer = new JsonSchemaSerializer(ps);
+ jsonSchemaGenerator = new JsonSchemaGenerator(ps);
encoders = new EncoderGroupBuilder().append(getInstanceArrayProperty(REST_encoders, Encoder.class, new Encoder[0], true, resource, ps)).build();
beanContext = BeanContext.create().apply(ps).build();
@@ -4254,8 +4253,8 @@ public final class RestContext extends BeanContext {
* The JSON-Schema serializer associated with this resource.
* <br>Never <jk>null</jk>.
*/
- public JsonSchemaSerializer getJsonSchemaSerializer() {
- return jsonSchemaSerializer;
+ public JsonSchemaGenerator getJsonSchemaGenerator() {
+ return jsonSchemaGenerator;
}
/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
index f57923e..9a54032 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
@@ -62,7 +62,7 @@ final class SwaggerGenerator {
private final Locale locale;
private final RestContext context;
private final JsonParser jp = JsonParser.DEFAULT;
- private final JsonSchemaSerializerSession js;
+ private final JsonSchemaGeneratorSession js;
private final Class<?> c;
private final Object resource;
private final MessageBundle mb;
@@ -79,7 +79,7 @@ final class SwaggerGenerator {
this.ignoreTypes = ignoreTypes;
this.locale = req.getLocale();
this.context = req.getContext();
- this.js = context.getJsonSchemaSerializer().createSession();
+ this.js = context.getJsonSchemaGenerator().createSession();
this.c = context.getResource().getClass();
this.resource = context.getResource();
this.mb = context.getMessages();