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