001// ***************************************************************************************************************************
002// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
003// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
004// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
005// * with the License.  You may obtain a copy of the License at                                                              *
006// *                                                                                                                         *
007// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
008// *                                                                                                                         *
009// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
010// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
011// * specific language governing permissions and limitations under the License.                                              *
012// ***************************************************************************************************************************
013package org.apache.juneau.jsonschema;
014
015import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
016
017import java.util.*;
018
019import org.apache.juneau.*;
020import org.apache.juneau.annotation.*;
021import org.apache.juneau.http.*;
022
023/**
024 * Builder class for building instances of JSON Schema generators.
025 */
026public class JsonSchemaGeneratorBuilder extends BeanTraverseBuilder {
027
028   /**
029    * Constructor, default settings.
030    */
031   public JsonSchemaGeneratorBuilder() {
032      super();
033   }
034
035   /**
036    * Constructor.
037    *
038    * @param ps The initial configuration settings for this builder.
039    */
040   public JsonSchemaGeneratorBuilder(PropertyStore ps) {
041      super(ps);
042   }
043
044   @Override /* ContextBuilder */
045   public JsonSchemaGenerator build() {
046      return build(JsonSchemaGenerator.class);
047   }
048
049
050   //-----------------------------------------------------------------------------------------------------------------
051   // Properties
052   //-----------------------------------------------------------------------------------------------------------------
053
054   /**
055    * Configuration property:  Add descriptions.
056    *
057    * <p>
058    * Identifies which categories of types that descriptions should be automatically added to generated schemas.
059    * <p>
060    * The description is the result of calling {@link ClassMeta#getReadableName()}.
061    *
062    * <h5 class='section'>See Also:</h5>
063    * <ul>
064    *    <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
065    * </ul>
066    *
067    * @param value
068    *    The new value for this property.
069    *    <br>The default is <jk>false</jk>.
070    * @return This object (for method chaining).
071    */
072   public JsonSchemaGeneratorBuilder addDescriptionsTo(String value) {
073      return set(JSONSCHEMA_addDescriptionsTo, value);
074   }
075
076   /**
077    * Configuration property:  Add examples.
078    *
079    * <p>
080    * Identifies which categories of types that examples should be automatically added to generated schemas.
081    * <p>
082    * The examples come from calling {@link ClassMeta#getExample(BeanSession)} which in turn gets examples
083    * from the following:
084    * <ul class='doctree'>
085    *    <li class='ja'>{@link Example}
086    *    <li class='jf'>{@link BeanContext#BEAN_examples}
087    * </ul>
088    *
089    * <h5 class='section'>See Also:</h5>
090    * <ul>
091    *    <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
092    * </ul>
093    *
094    * @param value
095    *    The new value for this property.
096    *    <br>The default is <jk>false</jk>.
097    * @return This object (for method chaining).
098    */
099   public JsonSchemaGeneratorBuilder addExamplesTo(String value) {
100      return set(JSONSCHEMA_addExamplesTo, value);
101   }
102
103   /**
104    * Configuration property:  Allow nested descriptions.
105    *
106    * <p>
107    * Identifies whether nested descriptions are allowed in schema definitions.
108    *
109    * <h5 class='section'>See Also:</h5>
110    * <ul>
111    *    <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions}
112    * </ul>
113    *
114    * @return This object (for method chaining).
115    */
116   public JsonSchemaGeneratorBuilder allowNestedDescriptions() {
117      return set(JSONSCHEMA_allowNestedDescriptions, true);
118   }
119
120   /**
121    * Configuration property:  Allow nested examples.
122    *
123    * <p>
124    * Identifies whether nested examples are allowed in schema definitions.
125    *
126    * <h5 class='section'>See Also:</h5>
127    * <ul>
128    *    <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples}
129    * </ul>
130    *
131    * @return This object (for method chaining).
132    */
133   public JsonSchemaGeneratorBuilder allowNestedExamples() {
134      return set(JSONSCHEMA_allowNestedExamples, true);
135   }
136
137   /**
138    * Configuration property:  Schema definition mapper.
139    *
140    * <p>
141    * Interface to use for converting Bean classes to definition IDs and URIs.
142    * <p>
143    * Used primarily for defining common definition sections for beans in Swagger JSON.
144    * <p>
145    * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
146    *
147    * <h5 class='section'>See Also:</h5>
148    * <ul>
149    *    <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
150    * </ul>
151    *
152    * @param value
153    *    The new value for this property.
154    *    <br>The default is <jk>false</jk>.
155    * @return This object (for method chaining).
156    */
157   public JsonSchemaGeneratorBuilder beanDefMapper(Class<? extends BeanDefMapper> value) {
158      return set(JSONSCHEMA_beanDefMapper, value);
159   }
160
161   /**
162    * Configuration property:  Bean schema definition mapper.
163    *
164    * <p>
165    * Interface to use for converting Bean classes to definition IDs and URIs.
166    * <p>
167    * Used primarily for defining common definition sections for beans in Swagger JSON.
168    * <p>
169    * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
170    *
171    * <h5 class='section'>See Also:</h5>
172    * <ul>
173    *    <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
174    * </ul>
175    *
176    * @param value
177    *    The new value for this property.
178    *    <br>The default is <jk>false</jk>.
179    * @return This object (for method chaining).
180    */
181   public JsonSchemaGeneratorBuilder beanDefMapper(BeanDefMapper value) {
182      return set(JSONSCHEMA_beanDefMapper, value);
183   }
184
185   /**
186    * Configuration property:  Default schemas.
187    *
188    * <p>
189    * Allows you to override or provide custom schema information for particular class types.
190    * <p>
191    * Keys are full class names.
192    *
193    * <h5 class='section'>See Also:</h5>
194    * <ul>
195    *    <li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_defaultSchemas}
196    * </ul>
197    *
198    * @param c
199    *    The class to define a default schema for.
200    * @param schema
201    *    The schema.
202    * @return This object (for method chaining).
203    */
204   public JsonSchemaGeneratorBuilder defaultSchema(Class<?> c, ObjectMap schema) {
205      return addTo(JSONSCHEMA_defaultSchemas, c.getName(), schema);
206   }
207
208   /**
209    * Configuration property:  Use bean definitions.
210    *
211    * <p>
212    * When enabled, schemas on beans will be serialized as the following:
213    * <p class='bcode w800'>
214    *    {
215    *       type: <js>'object'</js>,
216    *       <js>'$ref'</js>: <js>'#/definitions/TypeId'</js>
217    *    }
218    * </p>
219    *
220    * <p>
221    * The definitions can then be retrieved from the session using {@link JsonSchemaGeneratorSession#getBeanDefs()}.
222    * <p>
223    * Definitions can also be added programmatically using {@link JsonSchemaGeneratorSession#addBeanDef(String, ObjectMap)}.
224    *
225    * @return This object (for method chaining).
226    */
227   public JsonSchemaGeneratorBuilder useBeanDefs() {
228      return set(JSONSCHEMA_useBeanDefs, true);
229   }
230
231   @Override /* BeanContextBuilder */
232   public JsonSchemaGeneratorBuilder beanClassVisibility(Visibility value) {
233      super.beanClassVisibility(value);
234      return this;
235   }
236
237   @Override /* BeanContextBuilder */
238   public JsonSchemaGeneratorBuilder beanConstructorVisibility(Visibility value) {
239      super.beanConstructorVisibility(value);
240      return this;
241   }
242
243   @Override /* BeanContextBuilder */
244   public JsonSchemaGeneratorBuilder beanDictionary(boolean append, Object...values) {
245      super.beanDictionary(append, values);
246      return this;
247   }
248
249   @Override /* BeanContextBuilder */
250   public JsonSchemaGeneratorBuilder beanDictionary(Class<?>...values) {
251      super.beanDictionary(values);
252      return this;
253   }
254
255   @Override /* BeanContextBuilder */
256   public JsonSchemaGeneratorBuilder beanDictionary(Object...values) {
257      super.beanDictionary(values);
258      return this;
259   }
260
261   @Override /* BeanContextBuilder */
262   public JsonSchemaGeneratorBuilder beanDictionaryRemove(Object...values) {
263      super.beanDictionaryRemove(values);
264      return this;
265   }
266
267   @Override /* BeanContextBuilder */
268   public JsonSchemaGeneratorBuilder beanFieldVisibility(Visibility value) {
269      super.beanFieldVisibility(value);
270      return this;
271   }
272
273   @Override /* BeanContextBuilder */
274   public JsonSchemaGeneratorBuilder beanFilters(boolean append, Object...values) {
275      super.beanFilters(append, values);
276      return this;
277   }
278
279   @Override /* BeanContextBuilder */
280   public JsonSchemaGeneratorBuilder beanFilters(Class<?>...values) {
281      super.beanFilters(values);
282      return this;
283   }
284
285   @Override /* BeanContextBuilder */
286   public JsonSchemaGeneratorBuilder beanFilters(Object...values) {
287      super.beanFilters(values);
288      return this;
289   }
290
291   @Override /* BeanContextBuilder */
292   public JsonSchemaGeneratorBuilder beanFiltersRemove(Object...values) {
293      super.beanFiltersRemove(values);
294      return this;
295   }
296
297   @Override /* BeanContextBuilder */
298   public JsonSchemaGeneratorBuilder beanMapPutReturnsOldValue(boolean value) {
299      super.beanMapPutReturnsOldValue(value);
300      return this;
301   }
302
303   @Override /* BeanContextBuilder */
304   public JsonSchemaGeneratorBuilder beanMapPutReturnsOldValue() {
305      super.beanMapPutReturnsOldValue();
306      return this;
307   }
308
309   @Override /* BeanContextBuilder */
310   public JsonSchemaGeneratorBuilder beanMethodVisibility(Visibility value) {
311      super.beanMethodVisibility(value);
312      return this;
313   }
314
315   @Override /* BeanContextBuilder */
316   public JsonSchemaGeneratorBuilder beansRequireDefaultConstructor(boolean value) {
317      super.beansRequireDefaultConstructor(value);
318      return this;
319   }
320
321   @Override /* BeanContextBuilder */
322   public JsonSchemaGeneratorBuilder beansRequireDefaultConstructor() {
323      super.beansRequireDefaultConstructor();
324      return this;
325   }
326
327   @Override /* BeanContextBuilder */
328   public JsonSchemaGeneratorBuilder beansRequireSerializable(boolean value) {
329      super.beansRequireSerializable(value);
330      return this;
331   }
332
333   @Override /* BeanContextBuilder */
334   public JsonSchemaGeneratorBuilder beansRequireSerializable() {
335      super.beansRequireSerializable();
336      return this;
337   }
338
339   @Override /* BeanContextBuilder */
340   public JsonSchemaGeneratorBuilder beansRequireSettersForGetters(boolean value) {
341      super.beansRequireSettersForGetters(value);
342      return this;
343   }
344
345   @Override /* BeanContextBuilder */
346   public JsonSchemaGeneratorBuilder beansRequireSettersForGetters() {
347      super.beansRequireSettersForGetters();
348      return this;
349   }
350
351   @Override /* BeanContextBuilder */
352   public JsonSchemaGeneratorBuilder beansRequireSomeProperties(boolean value) {
353      super.beansRequireSomeProperties(value);
354      return this;
355   }
356
357   @Override /* BeanContextBuilder */
358   public JsonSchemaGeneratorBuilder beanTypePropertyName(String value) {
359      super.beanTypePropertyName(value);
360      return this;
361   }
362
363   @Override /* BeanContextBuilder */
364   public JsonSchemaGeneratorBuilder debug() {
365      super.debug();
366      return this;
367   }
368
369   @Override /* BeanContextBuilder */
370   public <T> JsonSchemaGeneratorBuilder example(Class<T> c, T o) {
371      super.example(c, o);
372      return this;
373   }
374
375   @Override /* BeanContextBuilder */
376   public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
377      super.ignoreInvocationExceptionsOnGetters(value);
378      return this;
379   }
380
381   @Override /* BeanContextBuilder */
382   public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnGetters() {
383      super.ignoreInvocationExceptionsOnGetters();
384      return this;
385   }
386
387   @Override /* BeanContextBuilder */
388   public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
389      super.ignoreInvocationExceptionsOnSetters(value);
390      return this;
391   }
392
393   @Override /* BeanContextBuilder */
394   public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnSetters() {
395      super.ignoreInvocationExceptionsOnSetters();
396      return this;
397   }
398
399   @Override /* BeanContextBuilder */
400   public JsonSchemaGeneratorBuilder ignorePropertiesWithoutSetters(boolean value) {
401      super.ignorePropertiesWithoutSetters(value);
402      return this;
403   }
404
405   @Override /* BeanContextBuilder */
406   public JsonSchemaGeneratorBuilder ignoreUnknownBeanProperties(boolean value) {
407      super.ignoreUnknownBeanProperties(value);
408      return this;
409   }
410
411   @Override /* BeanContextBuilder */
412   public JsonSchemaGeneratorBuilder ignoreUnknownBeanProperties() {
413      super.ignoreUnknownBeanProperties();
414      return this;
415   }
416
417   @Override /* BeanContextBuilder */
418   public JsonSchemaGeneratorBuilder ignoreUnknownNullBeanProperties(boolean value) {
419      super.ignoreUnknownNullBeanProperties(value);
420      return this;
421   }
422
423   @Override /* BeanContextBuilder */
424   public <T> JsonSchemaGeneratorBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
425      super.implClass(interfaceClass, implClass);
426      return this;
427   }
428
429   @Override /* BeanContextBuilder */
430   public JsonSchemaGeneratorBuilder implClasses(Map<String,Class<?>> values) {
431      super.implClasses(values);
432      return this;
433   }
434
435   @Override /* BeanContextBuilder */
436   public JsonSchemaGeneratorBuilder locale(Locale value) {
437      super.locale(value);
438      return this;
439   }
440
441   @Override /* BeanContextBuilder */
442   public JsonSchemaGeneratorBuilder mediaType(MediaType value) {
443      super.mediaType(value);
444      return this;
445   }
446
447   @Override /* BeanContextBuilder */
448   public JsonSchemaGeneratorBuilder notBeanClasses(boolean append, Object...values) {
449      super.notBeanClasses(append, values);
450      return this;
451   }
452
453   @Override /* BeanContextBuilder */
454   public JsonSchemaGeneratorBuilder notBeanClasses(Class<?>...values) {
455      super.notBeanClasses(values);
456      return this;
457   }
458
459   @Override /* BeanContextBuilder */
460   public JsonSchemaGeneratorBuilder notBeanClasses(Object...values) {
461      super.notBeanClasses(values);
462      return this;
463   }
464
465   @Override /* BeanContextBuilder */
466   public JsonSchemaGeneratorBuilder notBeanClassesRemove(Object...values) {
467      super.notBeanClassesRemove(values);
468      return this;
469   }
470
471   @Override /* BeanContextBuilder */
472   public JsonSchemaGeneratorBuilder notBeanPackages(boolean append, Object...values) {
473      super.notBeanPackages(append, values);
474      return this;
475   }
476
477   @Override /* BeanContextBuilder */
478   public JsonSchemaGeneratorBuilder notBeanPackages(Object...values) {
479      super.notBeanPackages(values);
480      return this;
481   }
482
483   @Override /* BeanContextBuilder */
484   public JsonSchemaGeneratorBuilder notBeanPackages(String...values) {
485      super.notBeanPackages(values);
486      return this;
487   }
488
489   @Override /* BeanContextBuilder */
490   public JsonSchemaGeneratorBuilder notBeanPackagesRemove(Object...values) {
491      super.notBeanPackagesRemove(values);
492      return this;
493   }
494
495   @Override /* BeanContextBuilder */
496   public JsonSchemaGeneratorBuilder pojoSwaps(boolean append, Object...values) {
497      super.pojoSwaps(append, values);
498      return this;
499   }
500
501   @Override /* BeanContextBuilder */
502   public JsonSchemaGeneratorBuilder pojoSwaps(Class<?>...values) {
503      super.pojoSwaps(values);
504      return this;
505   }
506
507   @Override /* BeanContextBuilder */
508   public JsonSchemaGeneratorBuilder pojoSwaps(Object...values) {
509      super.pojoSwaps(values);
510      return this;
511   }
512
513   @Override /* BeanContextBuilder */
514   public JsonSchemaGeneratorBuilder pojoSwapsRemove(Object...values) {
515      super.pojoSwapsRemove(values);
516      return this;
517   }
518
519   @Override /* BeanContextBuilder */
520   public JsonSchemaGeneratorBuilder sortProperties(boolean value) {
521      super.sortProperties(value);
522      return this;
523   }
524
525   @Override /* BeanContextBuilder */
526   public JsonSchemaGeneratorBuilder sortProperties() {
527      super.sortProperties();
528      return this;
529   }
530
531   @Override /* BeanContextBuilder */
532   public JsonSchemaGeneratorBuilder timeZone(TimeZone value) {
533      super.timeZone(value);
534      return this;
535   }
536
537   @Override /* BeanContextBuilder */
538   public JsonSchemaGeneratorBuilder useEnumNames() {
539      super.useEnumNames();
540      return this;
541   }
542
543   @Override /* BeanContextBuilder */
544   public JsonSchemaGeneratorBuilder useInterfaceProxies(boolean value) {
545      super.useInterfaceProxies(value);
546      return this;
547   }
548
549   @Override /* BeanContextBuilder */
550   public JsonSchemaGeneratorBuilder useJavaBeanIntrospector(boolean value) {
551      super.useJavaBeanIntrospector(value);
552      return this;
553   }
554
555   @Override /* BeanContextBuilder */
556   public JsonSchemaGeneratorBuilder useJavaBeanIntrospector() {
557      super.useJavaBeanIntrospector();
558      return this;
559   }
560
561   @Override /* ContextBuilder */
562   public JsonSchemaGeneratorBuilder set(String name, Object value) {
563      super.set(name, value);
564      return this;
565   }
566
567   @Override /* ContextBuilder */
568   public JsonSchemaGeneratorBuilder set(boolean append, String name, Object value) {
569      super.set(append, name, value);
570      return this;
571   }
572
573   @Override /* ContextBuilder */
574   public JsonSchemaGeneratorBuilder set(Map<String,Object> properties) {
575      super.set(properties);
576      return this;
577   }
578
579   @Override /* ContextBuilder */
580   public JsonSchemaGeneratorBuilder add(Map<String,Object> properties) {
581      super.add(properties);
582      return this;
583   }
584
585   @Override /* ContextBuilder */
586   public JsonSchemaGeneratorBuilder addTo(String name, Object value) {
587      super.addTo(name, value);
588      return this;
589   }
590
591   @Override /* ContextBuilder */
592   public JsonSchemaGeneratorBuilder addTo(String name, String key, Object value) {
593      super.addTo(name, key, value);
594      return this;
595   }
596
597   @Override /* ContextBuilder */
598   public JsonSchemaGeneratorBuilder removeFrom(String name, Object value) {
599      super.removeFrom(name, value);
600      return this;
601   }
602
603   @Override /* ContextBuilder */
604   public JsonSchemaGeneratorBuilder apply(PropertyStore copyFrom) {
605      super.apply(copyFrom);
606      return this;
607   }
608
609}