001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.juneau.html;
018
019import java.lang.annotation.*;
020import java.nio.charset.*;
021import java.util.*;
022
023import org.apache.juneau.*;
024import org.apache.juneau.annotation.*;
025import org.apache.juneau.internal.*;
026import org.apache.juneau.json.*;
027import org.apache.juneau.jsonschema.*;
028import org.apache.juneau.utils.*;
029import org.apache.juneau.xml.*;
030
031/**
032 * Serializes POJO metamodels to HTML.
033 *
034 * <h5 class='topic'>Media types</h5>
035 *
036 * Handles <c>Accept</c> types:  <bc>text/html+schema</bc>
037 * <p>
038 * Produces <c>Content-Type</c> types:  <bc>text/html</bc>
039 *
040 * <h5 class='topic'>Description</h5>
041 *
042 * Essentially the same as {@link HtmlDocSerializer}, except serializes the POJO metamodel instead of the model itself.
043 *
044 * <p>
045 * Produces output that describes the POJO metamodel similar to an XML schema document.
046 *
047 * <p>
048 * The easiest way to create instances of this class is through the {@link HtmlSerializer#getSchemaSerializer()},
049 * which will create a schema serializer with the same settings as the originating serializer.
050 *
051 * <h5 class='section'>Notes:</h5><ul>
052 *    <li class='note'>This class is thread safe and reusable.
053 * </ul>
054 *
055 * <h5 class='section'>See Also:</h5><ul>
056 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/HtmlBasics">HTML Basics</a>
057
058 * </ul>
059 */
060public class HtmlSchemaDocSerializer extends HtmlDocSerializer {
061
062   //-----------------------------------------------------------------------------------------------------------------
063   // Static
064   //-----------------------------------------------------------------------------------------------------------------
065
066   /**
067    * Creates a new builder for this object.
068    *
069    * @return A new builder.
070    */
071   public static Builder create() {
072      return new Builder();
073   }
074
075   //-----------------------------------------------------------------------------------------------------------------
076   // Builder
077   //-----------------------------------------------------------------------------------------------------------------
078
079   /**
080    * Builder class.
081    */
082   public static class Builder extends HtmlDocSerializer.Builder {
083
084      JsonSchemaGenerator.Builder generatorBuilder;
085
086      /**
087       * Constructor, default settings.
088       */
089      protected Builder() {
090         produces("text/html");
091         accept("text/html+schema");
092         generatorBuilder = JsonSchemaGenerator.create().beanContext(beanContext());
093      }
094
095      /**
096       * Copy constructor.
097       *
098       * @param copyFrom The bean to copy from.
099       */
100      protected Builder(HtmlSchemaDocSerializer copyFrom) {
101         super(copyFrom);
102         generatorBuilder = copyFrom.generator.copy().beanContext(beanContext());
103      }
104
105      /**
106       * Copy constructor.
107       *
108       * @param copyFrom The builder to copy from.
109       */
110      protected Builder(Builder copyFrom) {
111         super(copyFrom);
112         generatorBuilder = copyFrom.generatorBuilder.copy().beanContext(beanContext());
113      }
114
115      @Override /* Context.Builder */
116      public Builder copy() {
117         return new Builder(this);
118      }
119
120      @Override /* Context.Builder */
121      public HtmlSchemaDocSerializer build() {
122         return build(HtmlSchemaDocSerializer.class);
123      }
124
125      //-----------------------------------------------------------------------------------------------------------------
126      // Properties
127      //-----------------------------------------------------------------------------------------------------------------
128
129      /**
130       * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  Add descriptions.
131       *
132       * <p>
133       * Identifies which categories of types that descriptions should be automatically added to generated schemas.
134       * <p>
135       * The description is the result of calling {@link ClassMeta#getFullName()}.
136       *
137       * <h5 class='section'>See Also:</h5><ul>
138       *    <li class='jm'>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator.Builder#addDescriptionsTo(TypeCategory...)}
139       * </ul>
140       *
141       * @param values
142       *    The values to add to this setting.
143       *    <br>The default is an empty string.
144       * @return This object.
145       */
146      public Builder addDescriptionsTo(TypeCategory...values) {
147         generatorBuilder.addDescriptionsTo(values);
148         return this;
149      }
150
151      /**
152       * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  Add examples.
153       *
154       * <p>
155       * Identifies which categories of types that examples should be automatically added to generated schemas.
156       * <p>
157       * The examples come from calling {@link ClassMeta#getExample(BeanSession,JsonParserSession)} which in turn gets examples
158       * from the following:
159       * <ul class='javatree'>
160       *    <li class='ja'>{@link Example}
161       *    <li class='ja'>{@link Marshalled#example() Marshalled(example)}
162       * </ul>
163       *
164       * <h5 class='section'>See Also:</h5><ul>
165       *    <li class='jm'>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator.Builder#addExamplesTo(TypeCategory...)}
166       * </ul>
167       *
168       * @param values
169       *    The values to add to this setting.
170       *    <br>The default is an empty string.
171       * @return This object.
172       */
173      public Builder addExamplesTo(TypeCategory...values) {
174         generatorBuilder.addExamplesTo(values);
175         return this;
176      }
177
178      /**
179       * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  Allow nested descriptions.
180       *
181       * <p>
182       * Identifies whether nested descriptions are allowed in schema definitions.
183       *
184       * <h5 class='section'>See Also:</h5><ul>
185       *    <li class='jm'>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator.Builder#allowNestedDescriptions()}
186       * </ul>
187       *
188       * @return This object.
189       */
190      public Builder allowNestedDescriptions() {
191         generatorBuilder.allowNestedDescriptions();
192         return this;
193      }
194
195      /**
196       * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  Allow nested examples.
197       *
198       * <p>
199       * Identifies whether nested examples are allowed in schema definitions.
200       *
201       * <h5 class='section'>See Also:</h5><ul>
202       *    <li class='jm'>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator.Builder#allowNestedExamples()}
203       * </ul>
204       *
205       * @return This object.
206       */
207      public Builder allowNestedExamples() {
208         generatorBuilder.allowNestedExamples();
209         return this;
210      }
211
212      /**
213       * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  Schema definition mapper.
214       *
215       * <p>
216       * Interface to use for converting Bean classes to definition IDs and URIs.
217       * <p>
218       * Used primarily for defining common definition sections for beans in Swagger JSON.
219       * <p>
220       * This setting is ignored if {@link org.apache.juneau.jsonschema.JsonSchemaGenerator.Builder#useBeanDefs()} is not enabled.
221       *
222       * <h5 class='section'>See Also:</h5><ul>
223       *    <li class='jm'>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator.Builder#beanDefMapper(Class)}
224       * </ul>
225       *
226       * @param value
227       *    The new value for this property.
228       *    <br>The default is {@link org.apache.juneau.jsonschema.BasicBeanDefMapper}.
229       * @return This object.
230       */
231      public Builder beanDefMapper(Class<? extends BeanDefMapper> value) {
232         generatorBuilder.beanDefMapper(value);
233         return this;
234      }
235
236      /**
237       * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  Use bean definitions.
238       *
239       * <p>
240       * When enabled, schemas on beans will be serialized as the following:
241       * <p class='bjson'>
242       *    {
243       *       type: <js>'object'</js>,
244       *       <js>'$ref'</js>: <js>'#/definitions/TypeId'</js>
245       *    }
246       * </p>
247       *
248       * @return This object.
249       */
250      public Builder useBeanDefs() {
251         generatorBuilder.useBeanDefs();
252         return this;
253      }
254      @Override /* Overridden from Builder */
255      public Builder annotations(Annotation...values) {
256         super.annotations(values);
257         return this;
258      }
259
260      @Override /* Overridden from Builder */
261      public Builder apply(AnnotationWorkList work) {
262         super.apply(work);
263         return this;
264      }
265
266      @Override /* Overridden from Builder */
267      public Builder applyAnnotations(Object...from) {
268         super.applyAnnotations(from);
269         return this;
270      }
271
272      @Override /* Overridden from Builder */
273      public Builder applyAnnotations(Class<?>...from) {
274         super.applyAnnotations(from);
275         return this;
276      }
277
278      @Override /* Overridden from Builder */
279      public Builder cache(Cache<HashKey,? extends org.apache.juneau.Context> value) {
280         super.cache(value);
281         return this;
282      }
283
284      @Override /* Overridden from Builder */
285      public Builder debug() {
286         super.debug();
287         return this;
288      }
289
290      @Override /* Overridden from Builder */
291      public Builder debug(boolean value) {
292         super.debug(value);
293         return this;
294      }
295
296      @Override /* Overridden from Builder */
297      public Builder impl(Context value) {
298         super.impl(value);
299         return this;
300      }
301
302      @Override /* Overridden from Builder */
303      public Builder type(Class<? extends org.apache.juneau.Context> value) {
304         super.type(value);
305         return this;
306      }
307
308      @Override /* Overridden from Builder */
309      public Builder beanClassVisibility(Visibility value) {
310         super.beanClassVisibility(value);
311         return this;
312      }
313
314      @Override /* Overridden from Builder */
315      public Builder beanConstructorVisibility(Visibility value) {
316         super.beanConstructorVisibility(value);
317         return this;
318      }
319
320      @Override /* Overridden from Builder */
321      public Builder beanContext(BeanContext value) {
322         super.beanContext(value);
323         return this;
324      }
325
326      @Override /* Overridden from Builder */
327      public Builder beanContext(BeanContext.Builder value) {
328         super.beanContext(value);
329         return this;
330      }
331
332      @Override /* Overridden from Builder */
333      public Builder beanDictionary(java.lang.Class<?>...values) {
334         super.beanDictionary(values);
335         return this;
336      }
337
338      @Override /* Overridden from Builder */
339      public Builder beanFieldVisibility(Visibility value) {
340         super.beanFieldVisibility(value);
341         return this;
342      }
343
344      @Override /* Overridden from Builder */
345      public Builder beanInterceptor(Class<?> on, Class<? extends org.apache.juneau.swap.BeanInterceptor<?>> value) {
346         super.beanInterceptor(on, value);
347         return this;
348      }
349
350      @Override /* Overridden from Builder */
351      public Builder beanMapPutReturnsOldValue() {
352         super.beanMapPutReturnsOldValue();
353         return this;
354      }
355
356      @Override /* Overridden from Builder */
357      public Builder beanMethodVisibility(Visibility value) {
358         super.beanMethodVisibility(value);
359         return this;
360      }
361
362      @Override /* Overridden from Builder */
363      public Builder beanProperties(Map<String,Object> values) {
364         super.beanProperties(values);
365         return this;
366      }
367
368      @Override /* Overridden from Builder */
369      public Builder beanProperties(Class<?> beanClass, String properties) {
370         super.beanProperties(beanClass, properties);
371         return this;
372      }
373
374      @Override /* Overridden from Builder */
375      public Builder beanProperties(String beanClassName, String properties) {
376         super.beanProperties(beanClassName, properties);
377         return this;
378      }
379
380      @Override /* Overridden from Builder */
381      public Builder beanPropertiesExcludes(Map<String,Object> values) {
382         super.beanPropertiesExcludes(values);
383         return this;
384      }
385
386      @Override /* Overridden from Builder */
387      public Builder beanPropertiesExcludes(Class<?> beanClass, String properties) {
388         super.beanPropertiesExcludes(beanClass, properties);
389         return this;
390      }
391
392      @Override /* Overridden from Builder */
393      public Builder beanPropertiesExcludes(String beanClassName, String properties) {
394         super.beanPropertiesExcludes(beanClassName, properties);
395         return this;
396      }
397
398      @Override /* Overridden from Builder */
399      public Builder beanPropertiesReadOnly(Map<String,Object> values) {
400         super.beanPropertiesReadOnly(values);
401         return this;
402      }
403
404      @Override /* Overridden from Builder */
405      public Builder beanPropertiesReadOnly(Class<?> beanClass, String properties) {
406         super.beanPropertiesReadOnly(beanClass, properties);
407         return this;
408      }
409
410      @Override /* Overridden from Builder */
411      public Builder beanPropertiesReadOnly(String beanClassName, String properties) {
412         super.beanPropertiesReadOnly(beanClassName, properties);
413         return this;
414      }
415
416      @Override /* Overridden from Builder */
417      public Builder beanPropertiesWriteOnly(Map<String,Object> values) {
418         super.beanPropertiesWriteOnly(values);
419         return this;
420      }
421
422      @Override /* Overridden from Builder */
423      public Builder beanPropertiesWriteOnly(Class<?> beanClass, String properties) {
424         super.beanPropertiesWriteOnly(beanClass, properties);
425         return this;
426      }
427
428      @Override /* Overridden from Builder */
429      public Builder beanPropertiesWriteOnly(String beanClassName, String properties) {
430         super.beanPropertiesWriteOnly(beanClassName, properties);
431         return this;
432      }
433
434      @Override /* Overridden from Builder */
435      public Builder beansRequireDefaultConstructor() {
436         super.beansRequireDefaultConstructor();
437         return this;
438      }
439
440      @Override /* Overridden from Builder */
441      public Builder beansRequireSerializable() {
442         super.beansRequireSerializable();
443         return this;
444      }
445
446      @Override /* Overridden from Builder */
447      public Builder beansRequireSettersForGetters() {
448         super.beansRequireSettersForGetters();
449         return this;
450      }
451
452      @Override /* Overridden from Builder */
453      public Builder dictionaryOn(Class<?> on, java.lang.Class<?>...values) {
454         super.dictionaryOn(on, values);
455         return this;
456      }
457
458      @Override /* Overridden from Builder */
459      public Builder disableBeansRequireSomeProperties() {
460         super.disableBeansRequireSomeProperties();
461         return this;
462      }
463
464      @Override /* Overridden from Builder */
465      public Builder disableIgnoreMissingSetters() {
466         super.disableIgnoreMissingSetters();
467         return this;
468      }
469
470      @Override /* Overridden from Builder */
471      public Builder disableIgnoreTransientFields() {
472         super.disableIgnoreTransientFields();
473         return this;
474      }
475
476      @Override /* Overridden from Builder */
477      public Builder disableIgnoreUnknownNullBeanProperties() {
478         super.disableIgnoreUnknownNullBeanProperties();
479         return this;
480      }
481
482      @Override /* Overridden from Builder */
483      public Builder disableInterfaceProxies() {
484         super.disableInterfaceProxies();
485         return this;
486      }
487
488      @Override /* Overridden from Builder */
489      public <T> Builder example(Class<T> pojoClass, T o) {
490         super.example(pojoClass, o);
491         return this;
492      }
493
494      @Override /* Overridden from Builder */
495      public <T> Builder example(Class<T> pojoClass, String json) {
496         super.example(pojoClass, json);
497         return this;
498      }
499
500      @Override /* Overridden from Builder */
501      public Builder findFluentSetters() {
502         super.findFluentSetters();
503         return this;
504      }
505
506      @Override /* Overridden from Builder */
507      public Builder findFluentSetters(Class<?> on) {
508         super.findFluentSetters(on);
509         return this;
510      }
511
512      @Override /* Overridden from Builder */
513      public Builder ignoreInvocationExceptionsOnGetters() {
514         super.ignoreInvocationExceptionsOnGetters();
515         return this;
516      }
517
518      @Override /* Overridden from Builder */
519      public Builder ignoreInvocationExceptionsOnSetters() {
520         super.ignoreInvocationExceptionsOnSetters();
521         return this;
522      }
523
524      @Override /* Overridden from Builder */
525      public Builder ignoreUnknownBeanProperties() {
526         super.ignoreUnknownBeanProperties();
527         return this;
528      }
529
530      @Override /* Overridden from Builder */
531      public Builder ignoreUnknownEnumValues() {
532         super.ignoreUnknownEnumValues();
533         return this;
534      }
535
536      @Override /* Overridden from Builder */
537      public Builder implClass(Class<?> interfaceClass, Class<?> implClass) {
538         super.implClass(interfaceClass, implClass);
539         return this;
540      }
541
542      @Override /* Overridden from Builder */
543      public Builder implClasses(Map<Class<?>,Class<?>> values) {
544         super.implClasses(values);
545         return this;
546      }
547
548      @Override /* Overridden from Builder */
549      public Builder interfaceClass(Class<?> on, Class<?> value) {
550         super.interfaceClass(on, value);
551         return this;
552      }
553
554      @Override /* Overridden from Builder */
555      public Builder interfaces(java.lang.Class<?>...value) {
556         super.interfaces(value);
557         return this;
558      }
559
560      @Override /* Overridden from Builder */
561      public Builder locale(Locale value) {
562         super.locale(value);
563         return this;
564      }
565
566      @Override /* Overridden from Builder */
567      public Builder mediaType(MediaType value) {
568         super.mediaType(value);
569         return this;
570      }
571
572      @Override /* Overridden from Builder */
573      public Builder notBeanClasses(java.lang.Class<?>...values) {
574         super.notBeanClasses(values);
575         return this;
576      }
577
578      @Override /* Overridden from Builder */
579      public Builder notBeanPackages(String...values) {
580         super.notBeanPackages(values);
581         return this;
582      }
583
584      @Override /* Overridden from Builder */
585      public Builder propertyNamer(Class<? extends org.apache.juneau.PropertyNamer> value) {
586         super.propertyNamer(value);
587         return this;
588      }
589
590      @Override /* Overridden from Builder */
591      public Builder propertyNamer(Class<?> on, Class<? extends org.apache.juneau.PropertyNamer> value) {
592         super.propertyNamer(on, value);
593         return this;
594      }
595
596      @Override /* Overridden from Builder */
597      public Builder sortProperties() {
598         super.sortProperties();
599         return this;
600      }
601
602      @Override /* Overridden from Builder */
603      public Builder sortProperties(java.lang.Class<?>...on) {
604         super.sortProperties(on);
605         return this;
606      }
607
608      @Override /* Overridden from Builder */
609      public Builder stopClass(Class<?> on, Class<?> value) {
610         super.stopClass(on, value);
611         return this;
612      }
613
614      @Override /* Overridden from Builder */
615      public <T, S> Builder swap(Class<T> normalClass, Class<S> swappedClass, ThrowingFunction<T,S> swapFunction) {
616         super.swap(normalClass, swappedClass, swapFunction);
617         return this;
618      }
619
620      @Override /* Overridden from Builder */
621      public <T, S> Builder swap(Class<T> normalClass, Class<S> swappedClass, ThrowingFunction<T,S> swapFunction, ThrowingFunction<S,T> unswapFunction) {
622         super.swap(normalClass, swappedClass, swapFunction, unswapFunction);
623         return this;
624      }
625
626      @Override /* Overridden from Builder */
627      public Builder swaps(Object...values) {
628         super.swaps(values);
629         return this;
630      }
631
632      @Override /* Overridden from Builder */
633      public Builder swaps(Class<?>...values) {
634         super.swaps(values);
635         return this;
636      }
637
638      @Override /* Overridden from Builder */
639      public Builder timeZone(TimeZone value) {
640         super.timeZone(value);
641         return this;
642      }
643
644      @Override /* Overridden from Builder */
645      public Builder typeName(Class<?> on, String value) {
646         super.typeName(on, value);
647         return this;
648      }
649
650      @Override /* Overridden from Builder */
651      public Builder typePropertyName(String value) {
652         super.typePropertyName(value);
653         return this;
654      }
655
656      @Override /* Overridden from Builder */
657      public Builder typePropertyName(Class<?> on, String value) {
658         super.typePropertyName(on, value);
659         return this;
660      }
661
662      @Override /* Overridden from Builder */
663      public Builder useEnumNames() {
664         super.useEnumNames();
665         return this;
666      }
667
668      @Override /* Overridden from Builder */
669      public Builder useJavaBeanIntrospector() {
670         super.useJavaBeanIntrospector();
671         return this;
672      }
673
674      @Override /* Overridden from Builder */
675      public Builder detectRecursions() {
676         super.detectRecursions();
677         return this;
678      }
679
680      @Override /* Overridden from Builder */
681      public Builder detectRecursions(boolean value) {
682         super.detectRecursions(value);
683         return this;
684      }
685
686      @Override /* Overridden from Builder */
687      public Builder ignoreRecursions() {
688         super.ignoreRecursions();
689         return this;
690      }
691
692      @Override /* Overridden from Builder */
693      public Builder ignoreRecursions(boolean value) {
694         super.ignoreRecursions(value);
695         return this;
696      }
697
698      @Override /* Overridden from Builder */
699      public Builder initialDepth(int value) {
700         super.initialDepth(value);
701         return this;
702      }
703
704      @Override /* Overridden from Builder */
705      public Builder maxDepth(int value) {
706         super.maxDepth(value);
707         return this;
708      }
709
710      @Override /* Overridden from Builder */
711      public Builder accept(String value) {
712         super.accept(value);
713         return this;
714      }
715
716      @Override /* Overridden from Builder */
717      public Builder addBeanTypes() {
718         super.addBeanTypes();
719         return this;
720      }
721
722      @Override /* Overridden from Builder */
723      public Builder addBeanTypes(boolean value) {
724         super.addBeanTypes(value);
725         return this;
726      }
727
728      @Override /* Overridden from Builder */
729      public Builder addRootType() {
730         super.addRootType();
731         return this;
732      }
733
734      @Override /* Overridden from Builder */
735      public Builder addRootType(boolean value) {
736         super.addRootType(value);
737         return this;
738      }
739
740      @Override /* Overridden from Builder */
741      public Builder keepNullProperties() {
742         super.keepNullProperties();
743         return this;
744      }
745
746      @Override /* Overridden from Builder */
747      public Builder keepNullProperties(boolean value) {
748         super.keepNullProperties(value);
749         return this;
750      }
751
752      @Override /* Overridden from Builder */
753      public Builder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
754         super.listener(value);
755         return this;
756      }
757
758      @Override /* Overridden from Builder */
759      public Builder produces(String value) {
760         super.produces(value);
761         return this;
762      }
763
764      @Override /* Overridden from Builder */
765      public Builder sortCollections() {
766         super.sortCollections();
767         return this;
768      }
769
770      @Override /* Overridden from Builder */
771      public Builder sortCollections(boolean value) {
772         super.sortCollections(value);
773         return this;
774      }
775
776      @Override /* Overridden from Builder */
777      public Builder sortMaps() {
778         super.sortMaps();
779         return this;
780      }
781
782      @Override /* Overridden from Builder */
783      public Builder sortMaps(boolean value) {
784         super.sortMaps(value);
785         return this;
786      }
787
788      @Override /* Overridden from Builder */
789      public Builder trimEmptyCollections() {
790         super.trimEmptyCollections();
791         return this;
792      }
793
794      @Override /* Overridden from Builder */
795      public Builder trimEmptyCollections(boolean value) {
796         super.trimEmptyCollections(value);
797         return this;
798      }
799
800      @Override /* Overridden from Builder */
801      public Builder trimEmptyMaps() {
802         super.trimEmptyMaps();
803         return this;
804      }
805
806      @Override /* Overridden from Builder */
807      public Builder trimEmptyMaps(boolean value) {
808         super.trimEmptyMaps(value);
809         return this;
810      }
811
812      @Override /* Overridden from Builder */
813      public Builder trimStrings() {
814         super.trimStrings();
815         return this;
816      }
817
818      @Override /* Overridden from Builder */
819      public Builder trimStrings(boolean value) {
820         super.trimStrings(value);
821         return this;
822      }
823
824      @Override /* Overridden from Builder */
825      public Builder uriContext(UriContext value) {
826         super.uriContext(value);
827         return this;
828      }
829
830      @Override /* Overridden from Builder */
831      public Builder uriRelativity(UriRelativity value) {
832         super.uriRelativity(value);
833         return this;
834      }
835
836      @Override /* Overridden from Builder */
837      public Builder uriResolution(UriResolution value) {
838         super.uriResolution(value);
839         return this;
840      }
841
842      @Override /* Overridden from Builder */
843      public Builder fileCharset(Charset value) {
844         super.fileCharset(value);
845         return this;
846      }
847
848      @Override /* Overridden from Builder */
849      public Builder maxIndent(int value) {
850         super.maxIndent(value);
851         return this;
852      }
853
854      @Override /* Overridden from Builder */
855      public Builder quoteChar(char value) {
856         super.quoteChar(value);
857         return this;
858      }
859
860      @Override /* Overridden from Builder */
861      public Builder quoteCharOverride(char value) {
862         super.quoteCharOverride(value);
863         return this;
864      }
865
866      @Override /* Overridden from Builder */
867      public Builder sq() {
868         super.sq();
869         return this;
870      }
871
872      @Override /* Overridden from Builder */
873      public Builder streamCharset(Charset value) {
874         super.streamCharset(value);
875         return this;
876      }
877
878      @Override /* Overridden from Builder */
879      public Builder useWhitespace() {
880         super.useWhitespace();
881         return this;
882      }
883
884      @Override /* Overridden from Builder */
885      public Builder useWhitespace(boolean value) {
886         super.useWhitespace(value);
887         return this;
888      }
889
890      @Override /* Overridden from Builder */
891      public Builder ws() {
892         super.ws();
893         return this;
894      }
895
896      @Override /* Overridden from Builder */
897      public Builder addBeanTypesXml() {
898         super.addBeanTypesXml();
899         return this;
900      }
901
902      @Override /* Overridden from Builder */
903      public Builder addBeanTypesXml(boolean value) {
904         super.addBeanTypesXml(value);
905         return this;
906      }
907
908      @Override /* Overridden from Builder */
909      public Builder addNamespaceUrisToRoot() {
910         super.addNamespaceUrisToRoot();
911         return this;
912      }
913
914      @Override /* Overridden from Builder */
915      public Builder addNamespaceUrisToRoot(boolean value) {
916         super.addNamespaceUrisToRoot(value);
917         return this;
918      }
919
920      @Override /* Overridden from Builder */
921      public Builder defaultNamespace(Namespace value) {
922         super.defaultNamespace(value);
923         return this;
924      }
925
926      @Override /* Overridden from Builder */
927      public Builder disableAutoDetectNamespaces() {
928         super.disableAutoDetectNamespaces();
929         return this;
930      }
931
932      @Override /* Overridden from Builder */
933      public Builder disableAutoDetectNamespaces(boolean value) {
934         super.disableAutoDetectNamespaces(value);
935         return this;
936      }
937
938      @Override /* Overridden from Builder */
939      public Builder enableNamespaces() {
940         super.enableNamespaces();
941         return this;
942      }
943
944      @Override /* Overridden from Builder */
945      public Builder enableNamespaces(boolean value) {
946         super.enableNamespaces(value);
947         return this;
948      }
949
950      @Override /* Overridden from Builder */
951      public Builder namespaces(Namespace...values) {
952         super.namespaces(values);
953         return this;
954      }
955
956      @Override /* Overridden from Builder */
957      public Builder ns() {
958         super.ns();
959         return this;
960      }
961
962      @Override /* Overridden from Builder */
963      public Builder addBeanTypesHtml() {
964         super.addBeanTypesHtml();
965         return this;
966      }
967
968      @Override /* Overridden from Builder */
969      public Builder addBeanTypesHtml(boolean value) {
970         super.addBeanTypesHtml(value);
971         return this;
972      }
973
974      @Override /* Overridden from Builder */
975      public Builder addKeyValueTableHeaders() {
976         super.addKeyValueTableHeaders();
977         return this;
978      }
979
980      @Override /* Overridden from Builder */
981      public Builder addKeyValueTableHeaders(boolean value) {
982         super.addKeyValueTableHeaders(value);
983         return this;
984      }
985
986      @Override /* Overridden from Builder */
987      public Builder disableDetectLabelParameters() {
988         super.disableDetectLabelParameters();
989         return this;
990      }
991
992      @Override /* Overridden from Builder */
993      public Builder disableDetectLabelParameters(boolean value) {
994         super.disableDetectLabelParameters(value);
995         return this;
996      }
997
998      @Override /* Overridden from Builder */
999      public Builder disableDetectLinksInStrings() {
1000         super.disableDetectLinksInStrings();
1001         return this;
1002      }
1003
1004      @Override /* Overridden from Builder */
1005      public Builder disableDetectLinksInStrings(boolean value) {
1006         super.disableDetectLinksInStrings(value);
1007         return this;
1008      }
1009
1010      @Override /* Overridden from Builder */
1011      public Builder labelParameter(String value) {
1012         super.labelParameter(value);
1013         return this;
1014      }
1015
1016      @Override /* Overridden from Builder */
1017      public Builder uriAnchorText(AnchorText value) {
1018         super.uriAnchorText(value);
1019         return this;
1020      }
1021
1022      @Override /* Overridden from Builder */
1023      public Builder aside(String...value) {
1024         super.aside(value);
1025         return this;
1026      }
1027
1028      @Override /* Overridden from Builder */
1029      public Builder asideFloat(AsideFloat value) {
1030         super.asideFloat(value);
1031         return this;
1032      }
1033
1034      @Override /* Overridden from Builder */
1035      public Builder footer(String...value) {
1036         super.footer(value);
1037         return this;
1038      }
1039
1040      @Override /* Overridden from Builder */
1041      public Builder head(String...value) {
1042         super.head(value);
1043         return this;
1044      }
1045
1046      @Override /* Overridden from Builder */
1047      public Builder header(String...value) {
1048         super.header(value);
1049         return this;
1050      }
1051
1052      @Override /* Overridden from Builder */
1053      public Builder nav(String...value) {
1054         super.nav(value);
1055         return this;
1056      }
1057
1058      @Override /* Overridden from Builder */
1059      public Builder navlinks(String...value) {
1060         super.navlinks(value);
1061         return this;
1062      }
1063
1064      @Override /* Overridden from Builder */
1065      public Builder noResultsMessage(String value) {
1066         super.noResultsMessage(value);
1067         return this;
1068      }
1069
1070      @Override /* Overridden from Builder */
1071      public Builder nowrap() {
1072         super.nowrap();
1073         return this;
1074      }
1075
1076      @Override /* Overridden from Builder */
1077      public Builder nowrap(boolean value) {
1078         super.nowrap(value);
1079         return this;
1080      }
1081
1082      @Override /* Overridden from Builder */
1083      public Builder script(String...value) {
1084         super.script(value);
1085         return this;
1086      }
1087
1088      @Override /* Overridden from Builder */
1089      public Builder style(String...value) {
1090         super.style(value);
1091         return this;
1092      }
1093
1094      @Override /* Overridden from Builder */
1095      public Builder stylesheet(String...value) {
1096         super.stylesheet(value);
1097         return this;
1098      }
1099
1100      @Override /* Overridden from Builder */
1101      public Builder template(Class<? extends org.apache.juneau.html.HtmlDocTemplate> value) {
1102         super.template(value);
1103         return this;
1104      }
1105
1106      @Override /* Overridden from Builder */
1107      @SuppressWarnings("unchecked")
1108      public Builder widgets(java.lang.Class<? extends org.apache.juneau.html.HtmlWidget>...values) {
1109         super.widgets(values);
1110         return this;
1111      }
1112   }
1113
1114   //-----------------------------------------------------------------------------------------------------------------
1115   // Instance
1116   //-----------------------------------------------------------------------------------------------------------------
1117
1118   final JsonSchemaGenerator generator;
1119
1120   /**
1121    * Constructor.
1122    *
1123    * @param builder
1124    *    The builder for this object.
1125    */
1126   public HtmlSchemaDocSerializer(HtmlDocSerializer.Builder builder) {
1127      super(builder.detectRecursions().ignoreRecursions());
1128
1129      generator = JsonSchemaGenerator.create().beanContext(getBeanContext()).build();
1130   }
1131
1132   @Override /* Context */
1133   public Builder copy() {
1134      return new Builder(this);
1135   }
1136
1137   @Override /* Context */
1138   public HtmlSchemaDocSerializerSession.Builder createSession() {
1139      return HtmlSchemaDocSerializerSession.create(this);
1140   }
1141
1142   @Override /* Context */
1143   public HtmlSchemaDocSerializerSession getSession() {
1144      return createSession().build();
1145   }
1146
1147   JsonSchemaGenerator getGenerator() {
1148      return generator;
1149   }
1150}