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.io.*;
020import java.lang.reflect.*;
021import java.nio.charset.*;
022import java.util.*;
023import java.util.function.*;
024
025import org.apache.juneau.*;
026import org.apache.juneau.httppart.*;
027import org.apache.juneau.internal.*;
028import org.apache.juneau.jsonschema.*;
029import org.apache.juneau.serializer.*;
030import org.apache.juneau.svl.*;
031
032/**
033 * Context object that lives for the duration of a single serialization of {@link HtmlSchemaSerializer} and its subclasses.
034 *
035 * <h5 class='section'>Notes:</h5><ul>
036 *    <li class='warn'>This class is not thread safe and is typically discarded after one use.
037 * </ul>
038 *
039 * <h5 class='section'>See Also:</h5><ul>
040 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/HtmlBasics">HTML Basics</a>
041 * </ul>
042 */
043public class HtmlSchemaSerializerSession extends HtmlSerializerSession {
044
045   //-----------------------------------------------------------------------------------------------------------------
046   // Static
047   //-----------------------------------------------------------------------------------------------------------------
048
049   /**
050    * Creates a new builder for this object.
051    *
052    * @param ctx The context creating this session.
053    * @return A new builder.
054    */
055   public static Builder create(HtmlSchemaSerializer ctx) {
056      return new Builder(ctx);
057   }
058
059   //-----------------------------------------------------------------------------------------------------------------
060   // Builder
061   //-----------------------------------------------------------------------------------------------------------------
062
063   /**
064    * Builder class.
065    */
066   public static class Builder extends HtmlSerializerSession.Builder {
067
068      HtmlSchemaSerializer ctx;
069
070      /**
071       * Constructor
072       *
073       * @param ctx The context creating this session.
074       */
075      protected Builder(HtmlSchemaSerializer ctx) {
076         super(ctx);
077         this.ctx = ctx;
078      }
079
080      @Override
081      public HtmlSchemaSerializerSession build() {
082         return new HtmlSchemaSerializerSession(this);
083      }
084      @Override /* Overridden from Builder */
085      public <T> Builder apply(Class<T> type, Consumer<T> apply) {
086         super.apply(type, apply);
087         return this;
088      }
089
090      @Override /* Overridden from Builder */
091      public Builder debug(Boolean value) {
092         super.debug(value);
093         return this;
094      }
095
096      @Override /* Overridden from Builder */
097      public Builder properties(Map<String,Object> value) {
098         super.properties(value);
099         return this;
100      }
101
102      @Override /* Overridden from Builder */
103      public Builder property(String key, Object value) {
104         super.property(key, value);
105         return this;
106      }
107
108      @Override /* Overridden from Builder */
109      public Builder unmodifiable() {
110         super.unmodifiable();
111         return this;
112      }
113
114      @Override /* Overridden from Builder */
115      public Builder locale(Locale value) {
116         super.locale(value);
117         return this;
118      }
119
120      @Override /* Overridden from Builder */
121      public Builder localeDefault(Locale value) {
122         super.localeDefault(value);
123         return this;
124      }
125
126      @Override /* Overridden from Builder */
127      public Builder mediaType(MediaType value) {
128         super.mediaType(value);
129         return this;
130      }
131
132      @Override /* Overridden from Builder */
133      public Builder mediaTypeDefault(MediaType value) {
134         super.mediaTypeDefault(value);
135         return this;
136      }
137
138      @Override /* Overridden from Builder */
139      public Builder timeZone(TimeZone value) {
140         super.timeZone(value);
141         return this;
142      }
143
144      @Override /* Overridden from Builder */
145      public Builder timeZoneDefault(TimeZone value) {
146         super.timeZoneDefault(value);
147         return this;
148      }
149
150      @Override /* Overridden from Builder */
151      public Builder javaMethod(Method value) {
152         super.javaMethod(value);
153         return this;
154      }
155
156      @Override /* Overridden from Builder */
157      public Builder resolver(VarResolverSession value) {
158         super.resolver(value);
159         return this;
160      }
161
162      @Override /* Overridden from Builder */
163      public Builder schema(HttpPartSchema value) {
164         super.schema(value);
165         return this;
166      }
167
168      @Override /* Overridden from Builder */
169      public Builder schemaDefault(HttpPartSchema value) {
170         super.schemaDefault(value);
171         return this;
172      }
173
174      @Override /* Overridden from Builder */
175      public Builder uriContext(UriContext value) {
176         super.uriContext(value);
177         return this;
178      }
179
180      @Override /* Overridden from Builder */
181      public Builder fileCharset(Charset value) {
182         super.fileCharset(value);
183         return this;
184      }
185
186      @Override /* Overridden from Builder */
187      public Builder streamCharset(Charset value) {
188         super.streamCharset(value);
189         return this;
190      }
191
192      @Override /* Overridden from Builder */
193      public Builder useWhitespace(Boolean value) {
194         super.useWhitespace(value);
195         return this;
196      }
197   }
198
199   //-----------------------------------------------------------------------------------------------------------------
200   // Instance
201   //-----------------------------------------------------------------------------------------------------------------
202
203   private final JsonSchemaGeneratorSession genSession;
204
205   /**
206    * Constructor.
207    *
208    * @param builder The builder for this object.
209    */
210   protected HtmlSchemaSerializerSession(Builder builder) {
211      super(builder);
212      this.genSession = builder.ctx.getGenerator().getSession();
213   }
214
215   @Override /* SerializerSession */
216   protected void doSerialize(SerializerPipe out, Object o) throws IOException, SerializeException {
217      try {
218         super.doSerialize(out, genSession.getSchema(o));
219      } catch (BeanRecursionException e) {
220         throw new SerializeException(e);
221      }
222   }
223}