
org.snakeyaml.engine.v2.api.DumpSettingsBuilder Maven / Gradle / Ivy
/**
* Copyright (c) 2018, http://www.snakeyaml.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.snakeyaml.engine.v2.api;
import org.snakeyaml.engine.v2.common.FlowStyle;
import org.snakeyaml.engine.v2.common.NonPrintableStyle;
import org.snakeyaml.engine.v2.common.ScalarStyle;
import org.snakeyaml.engine.v2.common.SpecVersion;
import org.snakeyaml.engine.v2.emitter.Emitter;
import org.snakeyaml.engine.v2.exceptions.EmitterException;
import org.snakeyaml.engine.v2.exceptions.YamlEngineException;
import org.snakeyaml.engine.v2.nodes.Tag;
import org.snakeyaml.engine.v2.resolver.JsonScalarResolver;
import org.snakeyaml.engine.v2.resolver.ScalarResolver;
import org.snakeyaml.engine.v2.serializer.AnchorGenerator;
import org.snakeyaml.engine.v2.serializer.NumberAnchorGenerator;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
/**
* Builder pattern implementation for DumpSettings
*/
public final class DumpSettingsBuilder {
private boolean explicitStart;
private boolean explicitEnd;
private NonPrintableStyle nonPrintableStyle;
private Optional explicitRootTag;
private AnchorGenerator anchorGenerator;
private Optional yamlDirective;
private Map tagDirective;
private ScalarResolver scalarResolver;
private FlowStyle defaultFlowStyle;
private ScalarStyle defaultScalarStyle;
//emitter
private boolean canonical;
private boolean multiLineFlow;
private boolean useUnicodeEncoding;
private int indent;
private int indicatorIndent;
private int width;
private String bestLineBreak;
private boolean splitLines;
private int maxSimpleKeyLength;
private boolean indentWithIndicator;
//general
Map customProperties = new HashMap();
/**
* Create builder
*/
DumpSettingsBuilder() {
this.explicitRootTag = Optional.empty();
this.tagDirective = new HashMap<>();
this.scalarResolver = new JsonScalarResolver();
this.anchorGenerator = new NumberAnchorGenerator(1);
this.bestLineBreak = "\n";
this.canonical = false;
this.useUnicodeEncoding = true;
this.indent = 2;
this.indicatorIndent = 0;
this.width = 80;
this.splitLines = true;
this.explicitStart = false;
this.explicitEnd = false;
this.yamlDirective = Optional.empty();
this.defaultFlowStyle = FlowStyle.AUTO;
this.defaultScalarStyle = ScalarStyle.PLAIN;
this.maxSimpleKeyLength = 128;
this.indentWithIndicator = false;
}
/**
* Define flow style
*
* @param defaultFlowStyle - specify the style
* @return the builder with the provided value
*/
public DumpSettingsBuilder setDefaultFlowStyle(FlowStyle defaultFlowStyle) {
this.defaultFlowStyle = defaultFlowStyle;
return this;
}
/**
* Define default scalar style
*
* @param defaultScalarStyle - specify the scalar style
* @return the builder with the provided value
*/
public DumpSettingsBuilder setDefaultScalarStyle(ScalarStyle defaultScalarStyle) {
this.defaultScalarStyle = defaultScalarStyle;
return this;
}
/**
* Add '---' in the beginning of the document
*
* @param explicitStart - true if the document start must be explicitly indicated
* @return the builder with the provided value
*/
public DumpSettingsBuilder setExplicitStart(boolean explicitStart) {
this.explicitStart = explicitStart;
return this;
}
/**
* Define anchor name generator (by default 'id' + number)
*
* @param anchorGenerator - specified function to create anchor names
* @return the builder with the provided value
*/
public DumpSettingsBuilder setAnchorGenerator(AnchorGenerator anchorGenerator) {
Objects.requireNonNull(anchorGenerator, "anchorGenerator cannot be null");
this.anchorGenerator = anchorGenerator;
return this;
}
/**
* Define {@link ScalarResolver} or use JSON resolver by default
*
* @param scalarResolver - specify the scalar resolver
* @return the builder with the provided value
*/
public DumpSettingsBuilder setScalarResolver(ScalarResolver scalarResolver) {
Objects.requireNonNull(scalarResolver, "scalarResolver cannot be null");
this.scalarResolver = scalarResolver;
return this;
}
/**
* Define root {@link Tag} or let the tag to be detected automatically
*
* @param explicitRootTag - specify the root tag
* @return the builder with the provided value
*/
public DumpSettingsBuilder setExplicitRootTag(Optional explicitRootTag) {
Objects.requireNonNull(explicitRootTag, "explicitRootTag cannot be null");
this.explicitRootTag = explicitRootTag;
return this;
}
/**
* Add '...' in the end of the document
*
* @param explicitEnd - true if the document end must be explicitly indicated
* @return the builder with the provided value
*/
public DumpSettingsBuilder setExplicitEnd(boolean explicitEnd) {
this.explicitEnd = explicitEnd;
return this;
}
/**
* Add YAML directive (http://yaml.org/spec/1.2/spec.html#id2781553)
*
* @param yamlDirective - the version to be used in the directive
* @return the builder with the provided value
*/
public DumpSettingsBuilder setYamlDirective(Optional yamlDirective) {
Objects.requireNonNull(yamlDirective, "yamlDirective cannot be null");
this.yamlDirective = yamlDirective;
return this;
}
/**
* Add TAG directive (http://yaml.org/spec/1.2/spec.html#id2782090)
*
* @param tagDirective - the data to create TAG directive
* @return the builder with the provided value
*/
public DumpSettingsBuilder setTagDirective(Map tagDirective) {
Objects.requireNonNull(tagDirective, "tagDirective cannot be null");
this.tagDirective = tagDirective;
return this;
}
/**
* Enforce canonical representation
*
* @param canonical - specify if the canonical representation must be used
* @return the builder with the provided value
*/
public DumpSettingsBuilder setCanonical(boolean canonical) {
this.canonical = canonical;
return this;
}
/**
* Use pretty flow style when every value in the flow context gets a separate line.
*
* @param multiLineFlow - set false to output all values in a single line.
* @return the builder with the provided value
*/
public DumpSettingsBuilder setMultiLineFlow(boolean multiLineFlow) {
this.multiLineFlow = multiLineFlow;
return this;
}
/**
* Specify whether to emit non-ASCII printable Unicode characters
* (emit Unicode char or escape sequence starting with '\\u')
* The default value is true.
* When set to false then printable non-ASCII characters (Cyrillic, Chinese etc)
* will be not printed but escaped (to support ASCII terminals)
*
* @param useUnicodeEncoding - true to use Unicode for "Я", false to use "\u0427" for the same char
* (if useUnicodeEncoding is false then all non-ASCII characters are escaped)
* @return the builder with the provided value
*/
public DumpSettingsBuilder setUseUnicodeEncoding(boolean useUnicodeEncoding) {
this.useUnicodeEncoding = useUnicodeEncoding;
return this;
}
/**
* Define the amount of the spaces for the indent in the block flow style. Default is 2.
*
* @param indent - the number of spaces. Must be within the range org.snakeyaml.engine.v2.emitter.Emitter.MIN_INDENT
* and org.snakeyaml.engine.v2.emitter.Emitter.MAX_INDENT
* @return the builder with the provided value
*/
public DumpSettingsBuilder setIndent(int indent) {
if (indent < Emitter.MIN_INDENT) {
throw new EmitterException("Indent must be at least " + Emitter.MIN_INDENT);
}
if (indent > Emitter.MAX_INDENT) {
throw new EmitterException("Indent must be at most " + Emitter.MAX_INDENT);
}
this.indent = indent;
return this;
}
/**
* It adds the specified indent for sequence indicator in the block flow.
* Default is 0.
* For better visual results it should be by 2 less than the indent (which is 2 by default)
* It is 2 chars less because the first char is '-' and the second char is the space after it.
*
* @param indicatorIndent - must be non-negative and less than org.snakeyaml.engine.v2.emitter.Emitter.MAX_INDENT - 1
* @return the builder with the provided value
*/
public DumpSettingsBuilder setIndicatorIndent(int indicatorIndent) {
if (indicatorIndent < 0) {
throw new EmitterException("Indicator indent must be non-negative.");
}
if (indicatorIndent > Emitter.MAX_INDENT - 1) {
throw new EmitterException("Indicator indent must be at most Emitter.MAX_INDENT-1: " + (Emitter.MAX_INDENT - 1));
}
this.indicatorIndent = indicatorIndent;
return this;
}
/**
* Set max width for literal scalars. When the scalar
* representation takes more then the preferred with the scalar will be
* split into a few lines. The default is 80.
*
* @param width - the width
* @return the builder with the provided value
*/
public DumpSettingsBuilder setWidth(int width) {
this.width = width;
return this;
}
/**
* If the YAML is created for another platform (for instance on Windows to be consumed under Linux) than
* this setting is used to define the line ending. The platform line end is used by default.
*
* @param bestLineBreak - "\r\n" or "\n"
* @return the builder with the provided value
*/
public DumpSettingsBuilder setBestLineBreak(String bestLineBreak) {
Objects.requireNonNull(bestLineBreak, "bestLineBreak cannot be null");
this.bestLineBreak = bestLineBreak;
return this;
}
/**
* Define whether to split long lines
*
* @param splitLines - true to split long lines
* @return the builder with the provided value
*/
public DumpSettingsBuilder setSplitLines(boolean splitLines) {
this.splitLines = splitLines;
return this;
}
/**
* Define max key length to use simple key (without '?')
* More info https://yaml.org/spec/1.2/spec.html#id2798057
*
* @param maxSimpleKeyLength - the limit after which the key gets explicit key indicator '?'
* @return the builder with the provided value
*/
public DumpSettingsBuilder setMaxSimpleKeyLength(int maxSimpleKeyLength) {
if (maxSimpleKeyLength > 1024) {
throw new YamlEngineException("The simple key must not span more than 1024 stream characters. See https://yaml.org/spec/1.2/spec.html#id2798057");
}
this.maxSimpleKeyLength = maxSimpleKeyLength;
return this;
}
/**
* When String object contains non-printable characters, they are escaped with \\u or \\x notation.
* Sometimes it is better to transform this data to binary (with the !!binary tag).
* String objects with printable data are non affected by this setting.
*
* @param nonPrintableStyle - set this to BINARY to force non-printable String to represented as binary (byte array)
* @return the builder with the provided value
*/
public DumpSettingsBuilder setNonPrintableStyle(NonPrintableStyle nonPrintableStyle) {
this.nonPrintableStyle = nonPrintableStyle;
return this;
}
public DumpSettingsBuilder setCustomProperty(SettingKey key, Object value) {
customProperties.put(key, value);
return this;
}
/**
* Set to true to add the indent for sequences to the general indent
*
* @param indentWithIndicator - true when indent for sequences is added to general
*/
public DumpSettingsBuilder setIndentWithIndicator(boolean indentWithIndicator) {
this.indentWithIndicator = indentWithIndicator;
return this;
}
/**
* Create immutable DumpSettings
*
* @return DumpSettings with the provided values
*/
public DumpSettings build() {
return new DumpSettings(explicitStart, explicitEnd, explicitRootTag,
anchorGenerator, yamlDirective, tagDirective,
scalarResolver, defaultFlowStyle, defaultScalarStyle, nonPrintableStyle,
//emitter
canonical, multiLineFlow, useUnicodeEncoding,
indent, indicatorIndent, width, bestLineBreak, splitLines, maxSimpleKeyLength,
customProperties, indentWithIndicator);
}
}