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