diff --git a/core/pom.xml b/core/pom.xml index bb8fc32..24204bf 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.1.0 + 1.2.0 4.0.0 diff --git a/impl/yaml/pom.xml b/impl/yaml/pom.xml index 4f2b2d0..cde3c23 100644 --- a/impl/yaml/pom.xml +++ b/impl/yaml/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.1.0 + 1.2.0 ../../pom.xml 4.0.0 diff --git a/platform/bungee/pom.xml b/platform/bungee/pom.xml deleted file mode 100644 index 727e720..0000000 --- a/platform/bungee/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - easyconfiguration-parent - cc.carm.lib - 1.1.0 - ../../pom.xml - - 4.0.0 - - ${java.version} - ${java.version} - - - easyconfiguration-bungee - jar - - - - - ${project.parent.groupId} - easyconfiguration-core - ${project.parent.version} - compile - - - - net.md-5 - bungeecord-api - 1.18-R0.1-SNAPSHOT - jar - provided - - - - net.md-5 - bungeecord-api - 1.18-R0.1-SNAPSHOT - javadoc - provided - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - org.apache.maven.plugins - maven-jar-plugin - - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - - - - - \ No newline at end of file diff --git a/platform/bungee/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java b/platform/bungee/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java deleted file mode 100644 index 8e017e4..0000000 --- a/platform/bungee/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java +++ /dev/null @@ -1,34 +0,0 @@ -package cc.carm.lib.configuration; - -import cc.carm.lib.configuration.bungee.BungeeConfigProvider; - -import java.io.File; -import java.io.IOException; - -public class EasyConfiguration { - - public static BungeeConfigProvider from(File file, String source) { - BungeeConfigProvider provider = new BungeeConfigProvider(file); - try { - provider.initializeFile(source); - provider.initializeConfig(); - } catch (IOException e) { - e.printStackTrace(); - } - return provider; - } - - public static BungeeConfigProvider from(File file) { - return from(file, file.getName()); - } - - public static BungeeConfigProvider from(String fileName) { - return from(fileName, fileName); - } - - public static BungeeConfigProvider from(String fileName, String source) { - return from(new File(fileName), source); - } - - -} diff --git a/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeConfigProvider.java b/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeConfigProvider.java deleted file mode 100644 index a303e38..0000000 --- a/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeConfigProvider.java +++ /dev/null @@ -1,61 +0,0 @@ -package cc.carm.lib.configuration.bungee; - -import cc.carm.lib.configuration.core.ConfigInitializer; -import cc.carm.lib.configuration.core.source.impl.FileConfigProvider; -import net.md_5.bungee.config.Configuration; -import net.md_5.bungee.config.ConfigurationProvider; -import net.md_5.bungee.config.YamlConfiguration; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.io.IOException; - -public class BungeeConfigProvider extends FileConfigProvider { - - protected Configuration configuration; - protected ConfigInitializer initializer; - - public BungeeConfigProvider(@NotNull File file) { - super(file); - } - - public void initializeConfig() throws IOException { - this.configuration = getLoader().load(file); - this.initializer = new ConfigInitializer<>(this); - } - - @Override - public @NotNull BungeeSectionWrapper getConfiguration() { - return BungeeSectionWrapper.of(configuration); - } - - @Override - public void reload() throws Exception { - this.configuration = getLoader().load(file); - } - - @Override - public void save() throws Exception { - getLoader().save(configuration, file); - } - - @Override - public void setComments(@NotNull String path, @NotNull String... comments) { - } - - @Override - public @Nullable String[] getComments(@NotNull String path) { - return null; - } - - @Override - public @NotNull ConfigInitializer getInitializer() { - return this.initializer; - } - - public static ConfigurationProvider getLoader() { - return ConfigurationProvider.getProvider(YamlConfiguration.class); - } - -} diff --git a/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeSectionWrapper.java b/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeSectionWrapper.java deleted file mode 100644 index fe9498e..0000000 --- a/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeSectionWrapper.java +++ /dev/null @@ -1,70 +0,0 @@ -package cc.carm.lib.configuration.bungee; - -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; -import net.md_5.bungee.config.Configuration; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.stream.Collectors; - -public class BungeeSectionWrapper implements ConfigurationWrapper { - - private final Configuration section; - - private BungeeSectionWrapper(Configuration section) { - this.section = section; - } - - @Contract("!null->!null") - public static @Nullable BungeeSectionWrapper of(@Nullable Configuration section) { - return section == null ? null : new BungeeSectionWrapper(section); - } - - @Override - public @NotNull Set getKeys(boolean deep) { - return new LinkedHashSet<>(section.getKeys()); - } - - @Override - public @NotNull Map getValues(boolean deep) { - return section.getKeys().stream() - .collect(Collectors.toMap(key -> key, section::get, (a, b) -> b, LinkedHashMap::new)); - } - - @Override - public void set(@NotNull String path, @Nullable Object value) { - this.section.set(path, value); - } - - @Override - public boolean contains(@NotNull String path) { - return this.section.contains(path); - } - - @Override - public @Nullable Object get(@NotNull String path) { - return this.section.get(path); - } - - @Override - public boolean isList(@NotNull String path) { - return get(path) instanceof List; - } - - @Override - public @Nullable List getList(@NotNull String path) { - return this.section.getList(path); - } - - @Override - public boolean isConfigurationSection(@NotNull String path) { - return true; // No provided functions :( SRY - } - - @Override - public @Nullable ConfigurationWrapper getConfigurationSection(@NotNull String path) { - return of(this.section.getSection(path)); - } -} diff --git a/platform/spigot/pom.xml b/platform/spigot/pom.xml deleted file mode 100644 index 230003d..0000000 --- a/platform/spigot/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - easyconfiguration-parent - cc.carm.lib - 1.1.0 - ../../pom.xml - - 4.0.0 - - ${java.version} - ${java.version} - - - easyconfiguration-spigot - jar - - - - - ${project.parent.groupId} - easyconfiguration-core - ${project.parent.version} - compile - - - - org.spigotmc - spigot-api - 1.18.2-R0.1-SNAPSHOT - provided - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - org.apache.maven.plugins - maven-jar-plugin - - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - - - - - - \ No newline at end of file diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java deleted file mode 100644 index bbfac47..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -package cc.carm.lib.configuration; - -import cc.carm.lib.configuration.spigot.SpigotConfigProvider; - -import java.io.File; -import java.io.IOException; - -public class EasyConfiguration { - - - public static SpigotConfigProvider from(File file, String source) { - SpigotConfigProvider provider = new SpigotConfigProvider(file); - try { - provider.initializeFile(source); - provider.initializeConfig(); - } catch (IOException e) { - e.printStackTrace(); - } - return provider; - } - - public static SpigotConfigProvider from(File file) { - return from(file, file.getName()); - } - - public static SpigotConfigProvider from(String fileName) { - return from(fileName, fileName); - } - - public static SpigotConfigProvider from(String fileName, String source) { - return from(new File(fileName), source); - } - - -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedEmitter.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedEmitter.java deleted file mode 100644 index 06963ce..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedEmitter.java +++ /dev/null @@ -1,1513 +0,0 @@ -/* - * Copyright (c) 2008, 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 cc.carm.lib.configuration.commented; - -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.DumperOptions.Version; -import org.yaml.snakeyaml.emitter.Emitable; -import org.yaml.snakeyaml.emitter.EmitterException; -import org.yaml.snakeyaml.emitter.ScalarAnalysis; -import org.yaml.snakeyaml.error.YAMLException; -import org.yaml.snakeyaml.events.*; -import org.yaml.snakeyaml.nodes.Tag; -import org.yaml.snakeyaml.reader.StreamReader; -import org.yaml.snakeyaml.scanner.Constant; -import org.yaml.snakeyaml.util.ArrayStack; - -import java.io.IOException; -import java.io.Writer; -import java.util.*; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.regex.Pattern; - -/** - * Copy of {@link org.yaml.snakeyaml.emitter.Emitter} with some ugly hooks. - */ -public final class CommentedEmitter implements Emitable { - public static final int MIN_INDENT = 1; - public static final int MAX_INDENT = 10; - private static final Map ESCAPE_REPLACEMENTS = new HashMap<>(); - private static final char[] SPACE = {' '}; - private final static Map DEFAULT_TAG_PREFIXES = new LinkedHashMap<>(); - private final static Pattern HANDLE_FORMAT = Pattern.compile("^![-_\\w]*!$"); - private final static Pattern ANCHOR_FORMAT = Pattern.compile("^[-_\\w]*$"); - - static { - ESCAPE_REPLACEMENTS.put('\0', "0"); - ESCAPE_REPLACEMENTS.put('\u0007', "a"); - ESCAPE_REPLACEMENTS.put('\u0008', "b"); - ESCAPE_REPLACEMENTS.put('\u0009', "t"); - ESCAPE_REPLACEMENTS.put('\n', "n"); - ESCAPE_REPLACEMENTS.put('\u000B', "v"); - ESCAPE_REPLACEMENTS.put('\u000C', "f"); - ESCAPE_REPLACEMENTS.put('\r', "r"); - ESCAPE_REPLACEMENTS.put('\u001B', "e"); - ESCAPE_REPLACEMENTS.put('"', "\""); - ESCAPE_REPLACEMENTS.put('\\', "\\"); - ESCAPE_REPLACEMENTS.put('\u0085', "N"); - ESCAPE_REPLACEMENTS.put('\u00A0', "_"); - ESCAPE_REPLACEMENTS.put('\u2028', "L"); - ESCAPE_REPLACEMENTS.put('\u2029', "P"); - } - - // Encoding is defined by Writer (cannot be overriden by STREAM-START.) - // private Charset encoding; - - static { - DEFAULT_TAG_PREFIXES.put("!", "!"); - DEFAULT_TAG_PREFIXES.put(Tag.PREFIX, "!!"); - } - - // The stream should have the methods `write` and possibly `flush`. - private final Writer stream; - // Emitter is a state machine with a stack of states to handle nested - // structures. - private final ArrayStack states; - // Current event and the event queue. - private final Queue events; - // The current indentation level and the stack of previous indents. - private final ArrayStack indents; - // wytrem start - CommentsProvider commentsProvider; - // wytrem start - boolean isInSequence = false; - Stack paths = new Stack<>(); - String lastSimpleKey; - private EmitterState state; - private Event event; - private Integer indent; - // Flow level. - private int flowLevel; - // Contexts. - private boolean rootContext; - private boolean mappingContext; - private boolean simpleKeyContext; - // - // Characteristics of the last emitted character: - // - current position. - // - is it a whitespace? - // - is it an indention character - // (indentation space, '-', '?', or ':')? - // private int line; this variable is not used - private int column; - private boolean whitespace; - private boolean indention; - private boolean openEnded; - // Formatting details. - private final Boolean canonical; - // pretty print flow by adding extra line breaks - private final Boolean prettyFlow; - private final boolean allowUnicode; - private int bestIndent; - private final int indicatorIndent; - private int bestWidth; - private final char[] bestLineBreak; - private final boolean splitLines; - // wytrem end - // Tag prefixes. - private Map tagPrefixes; - // Prepared anchor and tag. - private String preparedAnchor; - private String preparedTag; - // Scalar analysis and style. - private ScalarAnalysis analysis; - // wytrem end - private DumperOptions.ScalarStyle style; - - // In some cases, we wait for a few next events before emitting. - - public CommentedEmitter(Writer stream, DumperOptions opts, CommentsProvider commentsProvider) { // wytrem - // wytrem start - this.commentsProvider = commentsProvider; - // wytrem end - - // The stream should have the methods `write` and possibly `flush`. - this.stream = stream; - // Emitter is a state machine with a stack of states to handle nested - // structures. - this.states = new ArrayStack<>(100); - this.state = new ExpectStreamStart(); - // Current event and the event queue. - this.events = new ArrayBlockingQueue<>(100); - this.event = null; - // The current indentation level and the stack of previous indents. - this.indents = new ArrayStack<>(10); - this.indent = null; - // Flow level. - this.flowLevel = 0; - // Contexts. - mappingContext = false; - simpleKeyContext = false; - - // - // Characteristics of the last emitted character: - // - current position. - // - is it a whitespace? - // - is it an indention character - // (indentation space, '-', '?', or ':')? - column = 0; - whitespace = true; - indention = true; - - // Whether the document requires an explicit document indicator - openEnded = false; - - // Formatting details. - this.canonical = opts.isCanonical(); - this.prettyFlow = opts.isPrettyFlow(); - this.allowUnicode = opts.isAllowUnicode(); - this.bestIndent = 2; - if ((opts.getIndent() > MIN_INDENT) && (opts.getIndent() < MAX_INDENT)) { - this.bestIndent = opts.getIndent(); - } - this.indicatorIndent = opts.getIndicatorIndent(); - this.bestWidth = 80; - if (opts.getWidth() > this.bestIndent * 2) { - this.bestWidth = opts.getWidth(); - } - this.bestLineBreak = opts.getLineBreak().getString().toCharArray(); - this.splitLines = opts.getSplitLines(); - - // Tag prefixes. - this.tagPrefixes = new LinkedHashMap<>(); - - // Prepared anchor and tag. - this.preparedAnchor = null; - this.preparedTag = null; - - // Scalar analysis and style. - this.analysis = null; - this.style = null; - } - - static String prepareAnchor(String anchor) { - if (anchor.length() == 0) { - throw new EmitterException("anchor must not be empty"); - } - if (!ANCHOR_FORMAT.matcher(anchor).matches()) { - throw new EmitterException("invalid character in the anchor: " + anchor); - } - return anchor; - } - - public void emit(Event event) throws IOException { - this.events.add(event); - - while (!needMoreEvents()) { - this.event = this.events.poll(); - // wytrem start - if (this.event instanceof SequenceStartEvent) { - this.isInSequence = true; - } - - if (this.event instanceof SequenceEndEvent) { - this.isInSequence = false; - } - - if (this.event instanceof MappingStartEvent) { - if (!this.isInSequence) { - if (lastSimpleKey != null) { - this.paths.push(lastSimpleKey); - } - } - } - - if (this.event instanceof MappingEndEvent) { - if (!this.isInSequence) { - if (!this.paths.isEmpty()) { - this.paths.pop(); - } - } - } - // wytrem end - this.state.expect(); - this.event = null; - } - } - - // States - - // Stream handlers. - - private boolean needMoreEvents() { - if (events.isEmpty()) { - return true; - } - Event event = events.peek(); - if (event instanceof DocumentStartEvent) { - return needEvents(1); - } else if (event instanceof SequenceStartEvent) { - return needEvents(2); - } else if (event instanceof MappingStartEvent) { - return needEvents(3); - } else { - return false; - } - } - - private boolean needEvents(int count) { - int level = 0; - Iterator iter = events.iterator(); - iter.next(); - while (iter.hasNext()) { - Event event = iter.next(); - if (event instanceof DocumentStartEvent || event instanceof CollectionStartEvent) { - level++; - } else if (event instanceof DocumentEndEvent || event instanceof CollectionEndEvent) { - level--; - } else if (event instanceof StreamEndEvent) { - level = -1; - } - if (level < 0) { - return false; - } - } - return events.size() < count + 1; - } - - // Document handlers. - - private void increaseIndent(boolean flow, boolean indentless) { - indents.push(indent); - if (indent == null) { - if (flow) { - indent = bestIndent; - } else { - indent = 0; - } - } else if (!indentless) { - this.indent += bestIndent; - } - } - - private void expectNode(boolean root, boolean mapping, boolean simpleKey) throws IOException { - rootContext = root; - mappingContext = mapping; - simpleKeyContext = simpleKey; - if (event instanceof AliasEvent) { - expectAlias(); - } else if (event instanceof ScalarEvent || event instanceof CollectionStartEvent) { - processAnchor("&"); - processTag(); - if (event instanceof ScalarEvent) { - expectScalar(); - } else if (event instanceof SequenceStartEvent) { - if (flowLevel != 0 || canonical || ((SequenceStartEvent) event).isFlow() - || checkEmptySequence()) { - expectFlowSequence(); - } else { - expectBlockSequence(); - } - } else {// MappingStartEvent - if (flowLevel != 0 || canonical || ((MappingStartEvent) event).isFlow() - || checkEmptyMapping()) { - expectFlowMapping(); - } else { - expectBlockMapping(); - } - } - } else { - throw new EmitterException("expected NodeEvent, but got " + event); - } - } - - private void expectAlias() throws IOException { - if (((NodeEvent) event).getAnchor() == null) { - throw new EmitterException("anchor is not specified for alias"); - } - processAnchor("*"); - state = states.pop(); - } - - private void expectScalar() throws IOException { - // wytrem start - if (simpleKeyContext) { - String scalar = analyzeScalar(((ScalarEvent) event).getValue()).getScalar(); - String path = scalar; - - if (!this.paths.isEmpty()) { - path = String.join(".", this.paths) + "." + path; - } - - String[] comments = this.commentsProvider.apply(path); - if (comments != null && comments.length > 0) { - writeLineBreak(null); - for (String line : comments) { - if (line.contains("\n")) { - throw new IllegalArgumentException("Unexpected \\n in comment line."); - } - writeIndent(); - stream.write("# " + line); - writeLineBreak(null); - } - writeIndent(); - } - - lastSimpleKey = scalar; - } - // wytrem end - - increaseIndent(true, false); - processScalar(); - indent = indents.pop(); - state = states.pop(); - } - - // Node handlers. - - private void expectFlowSequence() throws IOException { - writeIndicator("[", true, true, false); - flowLevel++; - increaseIndent(true, false); - if (prettyFlow) { - writeIndent(); - } - state = new ExpectFirstFlowSequenceItem(); - } - - private void expectFlowMapping() throws IOException { - writeIndicator("{", true, true, false); - flowLevel++; - increaseIndent(true, false); - if (prettyFlow) { - writeIndent(); - } - state = new ExpectFirstFlowMappingKey(); - } - - private void expectBlockSequence() { - boolean indentless = mappingContext && !indention; - increaseIndent(false, indentless); - state = new ExpectFirstBlockSequenceItem(); - } - - // Flow sequence handlers. - - // Block mapping handlers. - private void expectBlockMapping() { - increaseIndent(false, false); - state = new ExpectFirstBlockMappingKey(); - } - - private boolean checkEmptySequence() { - return event instanceof SequenceStartEvent && !events.isEmpty() && events.peek() instanceof SequenceEndEvent; - } - - private boolean checkEmptyMapping() { - return event instanceof MappingStartEvent && !events.isEmpty() && events.peek() instanceof MappingEndEvent; - } - - // Flow mapping handlers. - - private boolean checkEmptyDocument() { - if (!(event instanceof DocumentStartEvent) || events.isEmpty()) { - return false; - } - Event event = events.peek(); - if (event instanceof ScalarEvent) { - ScalarEvent e = (ScalarEvent) event; - return e.getAnchor() == null && e.getTag() == null && e.getImplicit() != null && e - .getValue().length() == 0; - } - return false; - } - - private boolean checkSimpleKey() { - int length = 0; - if (event instanceof NodeEvent && ((NodeEvent) event).getAnchor() != null) { - if (preparedAnchor == null) { - preparedAnchor = prepareAnchor(((NodeEvent) event).getAnchor()); - } - length += preparedAnchor.length(); - } - String tag = null; - if (event instanceof ScalarEvent) { - tag = ((ScalarEvent) event).getTag(); - } else if (event instanceof CollectionStartEvent) { - tag = ((CollectionStartEvent) event).getTag(); - } - if (tag != null) { - if (preparedTag == null) { - preparedTag = prepareTag(tag); - } - length += preparedTag.length(); - } - if (event instanceof ScalarEvent) { - if (analysis == null) { - analysis = analyzeScalar(((ScalarEvent) event).getValue()); - } - length += analysis.getScalar().length(); - } - return length < 128 && (event instanceof AliasEvent - || (event instanceof ScalarEvent && !analysis.isEmpty() && !analysis.isMultiline()) - || checkEmptySequence() || checkEmptyMapping()); - } - - private void processAnchor(String indicator) throws IOException { - NodeEvent ev = (NodeEvent) event; - if (ev.getAnchor() == null) { - preparedAnchor = null; - return; - } - if (preparedAnchor == null) { - preparedAnchor = prepareAnchor(ev.getAnchor()); - } - writeIndicator(indicator + preparedAnchor, true, false, false); - preparedAnchor = null; - } - - private void processTag() throws IOException { - String tag; - if (event instanceof ScalarEvent) { - ScalarEvent ev = (ScalarEvent) event; - tag = ev.getTag(); - if (style == null) { - style = chooseScalarStyle(); - } - if ((!canonical || tag == null) && ((style == null && ev.getImplicit() - .canOmitTagInPlainScalar()) || (style != null && ev.getImplicit() - .canOmitTagInNonPlainScalar()))) { - preparedTag = null; - return; - } - if (ev.getImplicit().canOmitTagInPlainScalar() && tag == null) { - tag = "!"; - preparedTag = null; - } - } else { - CollectionStartEvent ev = (CollectionStartEvent) event; - tag = ev.getTag(); - if ((!canonical || tag == null) && ev.getImplicit()) { - preparedTag = null; - return; - } - } - if (tag == null) { - throw new EmitterException("tag is not specified"); - } - if (preparedTag == null) { - preparedTag = prepareTag(tag); - } - writeIndicator(preparedTag, true, false, false); - preparedTag = null; - } - - private DumperOptions.ScalarStyle chooseScalarStyle() { - ScalarEvent ev = (ScalarEvent) event; - if (analysis == null) { - analysis = analyzeScalar(ev.getValue()); - } - - if (!ev.isPlain() && ev.getScalarStyle() == DumperOptions.ScalarStyle.DOUBLE_QUOTED || this.canonical) { - return DumperOptions.ScalarStyle.DOUBLE_QUOTED; - } - if (ev.isPlain() && ev.getImplicit().canOmitTagInPlainScalar()) { - if (!(simpleKeyContext && (analysis.isEmpty() || analysis.isMultiline())) - && ((flowLevel != 0 && analysis.isAllowFlowPlain()) || (flowLevel == 0 && analysis.isAllowBlockPlain()))) { - return null; - } - } - if (!ev.isPlain() && (ev.getScalarStyle() == DumperOptions.ScalarStyle.LITERAL || ev.getScalarStyle() == DumperOptions.ScalarStyle.FOLDED)) { - if (flowLevel == 0 && !simpleKeyContext && analysis.isAllowBlock()) { - return ev.getScalarStyle(); - } - } - if (ev.isPlain() || ev.getScalarStyle() == DumperOptions.ScalarStyle.SINGLE_QUOTED) { - if (analysis.isAllowSingleQuoted() && !(simpleKeyContext && analysis.isMultiline())) { - return DumperOptions.ScalarStyle.SINGLE_QUOTED; - } - } - return DumperOptions.ScalarStyle.DOUBLE_QUOTED; - } - - // Block sequence handlers. - - private void processScalar() throws IOException { - ScalarEvent ev = (ScalarEvent) event; - - if (analysis == null) { - analysis = analyzeScalar(ev.getValue()); - } - if (style == null) { - style = chooseScalarStyle(); - } - boolean split = !simpleKeyContext && splitLines; - if (style == null) { - - writePlain(analysis.getScalar(), split); - } else { - switch (style) { - case DOUBLE_QUOTED: - writeDoubleQuoted(analysis.getScalar(), split); - break; - case SINGLE_QUOTED: - writeSingleQuoted(analysis.getScalar(), split); - break; - case FOLDED: - writeFolded(analysis.getScalar(), split); - break; - case LITERAL: - writeLiteral(analysis.getScalar()); - break; - default: - throw new YAMLException("Unexpected style: " + style); - } - } - analysis = null; - style = null; - } - - private String prepareVersion(Version version) { - if (version.major() != 1) { - throw new EmitterException("unsupported YAML version: " + version); - } - return version.getRepresentation(); - } - - private String prepareTagHandle(String handle) { - if (handle.length() == 0) { - throw new EmitterException("tag handle must not be empty"); - } else if (handle.charAt(0) != '!' || handle.charAt(handle.length() - 1) != '!') { - throw new EmitterException("tag handle must start and end with '!': " + handle); - } else if (!"!".equals(handle) && !HANDLE_FORMAT.matcher(handle).matches()) { - throw new EmitterException("invalid character in the tag handle: " + handle); - } - return handle; - } - - private String prepareTagPrefix(String prefix) { - if (prefix.length() == 0) { - throw new EmitterException("tag prefix must not be empty"); - } - StringBuilder chunks = new StringBuilder(); - int start = 0; - int end = 0; - if (prefix.charAt(0) == '!') { - end = 1; - } - while (end < prefix.length()) { - end++; - } - chunks.append(prefix, start, end); - return chunks.toString(); - } - - private String prepareTag(String tag) { - if (tag.length() == 0) { - throw new EmitterException("tag must not be empty"); - } - if ("!".equals(tag)) { - return tag; - } - String handle = null; - String suffix = tag; - // shall the tag prefixes be sorted as in PyYAML? - for (String prefix : tagPrefixes.keySet()) { - if (tag.startsWith(prefix) && ("!".equals(prefix) || prefix.length() < tag.length())) { - handle = prefix; - } - } - if (handle != null) { - suffix = tag.substring(handle.length()); - handle = tagPrefixes.get(handle); - } - - int end = suffix.length(); - String suffixText = end > 0 ? suffix.substring(0, end) : ""; - - if (handle != null) { - return handle + suffixText; - } - return "!<" + suffixText + ">"; - } - - private ScalarAnalysis analyzeScalar(String scalar) { - // Empty scalar is a special case. - if (scalar.length() == 0) { - return new ScalarAnalysis(scalar, true, false, false, true, true, false); - } - // Indicators and special characters. - boolean blockIndicators = false; - boolean flowIndicators = false; - boolean lineBreaks = false; - boolean specialCharacters = false; - - // Important whitespace combinations. - boolean leadingSpace = false; - boolean leadingBreak = false; - boolean trailingSpace = false; - boolean trailingBreak = false; - boolean breakSpace = false; - boolean spaceBreak = false; - - // Check document indicators. - if (scalar.startsWith("---") || scalar.startsWith("...")) { - blockIndicators = true; - flowIndicators = true; - } - // First character or preceded by a whitespace. - boolean preceededByWhitespace = true; - boolean followedByWhitespace = scalar.length() == 1 || Constant.NULL_BL_T_LINEBR.has(scalar.codePointAt(1)); - // The previous character is a space. - boolean previousSpace = false; - - // The previous character is a break. - boolean previousBreak = false; - - int index = 0; - - while (index < scalar.length()) { - int c = scalar.codePointAt(index); - // Check for indicators. - if (index == 0) { - // Leading indicators are special characters. - if ("#,[]{}&*!|>'\"%@`".indexOf(c) != -1) { - flowIndicators = true; - blockIndicators = true; - } - if (c == '?' || c == ':') { - flowIndicators = true; - if (followedByWhitespace) { - blockIndicators = true; - } - } - if (c == '-' && followedByWhitespace) { - flowIndicators = true; - blockIndicators = true; - } - } else { - // Some indicators cannot appear within a scalar as well. - if (",?[]{}".indexOf(c) != -1) { - flowIndicators = true; - } - if (c == ':') { - flowIndicators = true; - if (followedByWhitespace) { - blockIndicators = true; - } - } - if (c == '#' && preceededByWhitespace) { - flowIndicators = true; - blockIndicators = true; - } - } - // Check for line breaks, special, and unicode characters. - boolean isLineBreak = Constant.LINEBR.has(c); - if (isLineBreak) { - lineBreaks = true; - } - if (!(c == '\n' || (0x20 <= c && c <= 0x7E))) { - if (c == 0x85 || (c >= 0xA0 && c <= 0xD7FF) - || (c >= 0xE000 && c <= 0xFFFD) - || (c >= 0x10000 && c <= 0x10FFFF)) { - // unicode is used - if (!this.allowUnicode) { - specialCharacters = true; - } - } else { - specialCharacters = true; - } - } - // Detect important whitespace combinations. - if (c == ' ') { - if (index == 0) { - leadingSpace = true; - } - if (index == scalar.length() - 1) { - trailingSpace = true; - } - if (previousBreak) { - breakSpace = true; - } - previousSpace = true; - previousBreak = false; - } else if (isLineBreak) { - if (index == 0) { - leadingBreak = true; - } - if (index == scalar.length() - 1) { - trailingBreak = true; - } - if (previousSpace) { - spaceBreak = true; - } - previousSpace = false; - previousBreak = true; - } else { - previousSpace = false; - previousBreak = false; - } - - // Prepare for the next character. - index += Character.charCount(c); - preceededByWhitespace = Constant.NULL_BL_T.has(c) || isLineBreak; - followedByWhitespace = true; - if (index + 1 < scalar.length()) { - int nextIndex = index + Character.charCount(scalar.codePointAt(index)); - if (nextIndex < scalar.length()) { - followedByWhitespace = (Constant.NULL_BL_T.has(scalar.codePointAt(nextIndex))) || isLineBreak; - } - } - } - // Let's decide what styles are allowed. - boolean allowFlowPlain = true; - boolean allowBlockPlain = true; - boolean allowSingleQuoted = true; - boolean allowBlock = true; - // Leading and trailing whitespaces are bad for plain scalars. - if (leadingSpace || leadingBreak || trailingSpace || trailingBreak) { - allowFlowPlain = allowBlockPlain = false; - } - // We do not permit trailing spaces for block scalars. - if (trailingSpace) { - allowBlock = false; - } - // Spaces at the beginning of a new line are only acceptable for block - // scalars. - if (breakSpace) { - allowFlowPlain = allowBlockPlain = allowSingleQuoted = false; - } - // Spaces followed by breaks, as well as special character are only - // allowed for double quoted scalars. - if (spaceBreak || specialCharacters) { - allowFlowPlain = allowBlockPlain = allowSingleQuoted = allowBlock = false; - } - // Although the plain scalar writer supports breaks, we never emit - // multiline plain scalars in the flow context. - if (lineBreaks) { - allowFlowPlain = false; - } - // Flow indicators are forbidden for flow plain scalars. - if (flowIndicators) { - allowFlowPlain = false; - } - // Block indicators are forbidden for block plain scalars. - if (blockIndicators) { - allowBlockPlain = false; - } - - return new ScalarAnalysis(scalar, false, lineBreaks, allowFlowPlain, allowBlockPlain, - allowSingleQuoted, allowBlock); - } - - void flushStream() throws IOException { - stream.flush(); - } - - void writeStreamStart() { - // BOM is written by Writer. - } - - // Checkers. - - void writeStreamEnd() throws IOException { - flushStream(); - } - - void writeIndicator(String indicator, boolean needWhitespace, boolean whitespace, - boolean indentation) throws IOException { - if (!this.whitespace && needWhitespace) { - this.column++; - stream.write(SPACE); - } - this.whitespace = whitespace; - this.indention = this.indention && indentation; - this.column += indicator.length(); - openEnded = false; - stream.write(indicator); - } - - void writeIndent() throws IOException { - int indent; - if (this.indent != null) { - indent = this.indent; - } else { - indent = 0; - } - - if (!this.indention || this.column > indent || (this.column == indent && !this.whitespace)) { - writeLineBreak(null); - } - - writeWhitespace(indent - this.column); - } - - private void writeWhitespace(int length) throws IOException { - if (length <= 0) { - return; - } - this.whitespace = true; - char[] data = new char[length]; - Arrays.fill(data, ' '); - this.column += length; - stream.write(data); - } - - // Anchor, Tag, and Scalar processors. - - private void writeLineBreak(String data) throws IOException { - this.whitespace = true; - this.indention = true; - this.column = 0; - if (data == null) { - stream.write(this.bestLineBreak); - } else { - stream.write(data); - } - } - - void writeVersionDirective(String versionText) throws IOException { - stream.write("%YAML "); - stream.write(versionText); - writeLineBreak(null); - } - - void writeTagDirective(String handleText, String prefixText) throws IOException { - // XXX: not sure 4 invocations better than StringBuilders created by str - // + str - stream.write("%TAG "); - stream.write(handleText); - stream.write(SPACE); - stream.write(prefixText); - writeLineBreak(null); - } - - // Scalar streams. - private void writeSingleQuoted(String text, boolean split) throws IOException { - writeIndicator("'", true, false, false); - boolean spaces = false; - boolean breaks = false; - int start = 0, end = 0; - char ch; - while (end <= text.length()) { - ch = 0; - if (end < text.length()) { - ch = text.charAt(end); - } - if (spaces) { - if (ch != ' ') { - if (start + 1 == end && this.column > this.bestWidth && split && start != 0 - && end != text.length()) { - writeIndent(); - } else { - int len = end - start; - this.column += len; - stream.write(text, start, len); - } - start = end; - } - } else if (breaks) { - if (ch == 0 || Constant.LINEBR.hasNo(ch)) { - nextLine(text, start, end); - start = end; - } - } else { - if (Constant.LINEBR.has(ch, "\0 '")) { - if (start < end) { - int len = end - start; - this.column += len; - stream.write(text, start, len); - start = end; - } - } - } - if (ch == '\'') { - this.column += 2; - stream.write("''"); - start = end + 1; - } - if (ch != 0) { - spaces = ch == ' '; - breaks = Constant.LINEBR.has(ch); - } - end++; - } - writeIndicator("'", false, false, false); - } - - private void nextLine(String text, int start, int end) throws IOException { - if (text.charAt(start) == '\n') { - writeLineBreak(null); - } - String data = text.substring(start, end); - for (char br : data.toCharArray()) { - if (br == '\n') { - writeLineBreak(null); - } else { - writeLineBreak(String.valueOf(br)); - } - } - writeIndent(); - } - - // Analyzers. - - private void writeDoubleQuoted(String text, boolean split) throws IOException { - writeIndicator("\"", true, false, false); - int start = 0; - int end = 0; - while (end <= text.length()) { - Character ch = null; - if (end < text.length()) { - ch = text.charAt(end); - } - if (ch == null || "\"\\\u0085\u2028\u2029\uFEFF".indexOf(ch) != -1 - || !('\u0020' <= ch && ch <= '\u007E')) { - if (start < end) { - int len = end - start; - this.column += len; - stream.write(text, start, len); - start = end; - } - if (ch != null) { - String data; - if (ESCAPE_REPLACEMENTS.containsKey(ch)) { - data = "\\" + ESCAPE_REPLACEMENTS.get(ch); - } else if (!this.allowUnicode || !StreamReader.isPrintable(ch)) { - // if !allowUnicode or the character is not printable, - // we must encode it - if (ch <= '\u00FF') { - String s = "0" + Integer.toString(ch, 16); - data = "\\x" + s.substring(s.length() - 2); - } else if (ch >= '\uD800' && ch <= '\uDBFF') { - if (end + 1 < text.length()) { - char ch2 = text.charAt(++end); - String s = "000" + Long.toHexString(Character.toCodePoint(ch, ch2)); - data = "\\U" + s.substring(s.length() - 8); - } else { - String s = "000" + Integer.toString(ch, 16); - data = "\\u" + s.substring(s.length() - 4); - } - } else { - String s = "000" + Integer.toString(ch, 16); - data = "\\u" + s.substring(s.length() - 4); - } - } else { - data = String.valueOf(ch); - } - this.column += data.length(); - stream.write(data); - start = end + 1; - } - } - if ((0 < end && end < (text.length() - 1)) && (ch == ' ' || start >= end) - && (this.column + (end - start)) > this.bestWidth && split) { - String data; - if (start >= end) { - data = "\\"; - } else { - data = text.substring(start, end) + "\\"; - } - if (start < end) { - start = end; - } - this.column += data.length(); - stream.write(data); - writeIndent(); - this.whitespace = false; - this.indention = false; - if (text.charAt(start) == ' ') { - data = "\\"; - this.column += data.length(); - stream.write(data); - } - } - end += 1; - } - writeIndicator("\"", false, false, false); - } - - private String determineBlockHints(String text) { - StringBuilder hints = new StringBuilder(); - if (Constant.LINEBR.has(text.charAt(0), " ")) { - hints.append(bestIndent); - } - char ch1 = text.charAt(text.length() - 1); - if (Constant.LINEBR.hasNo(ch1)) { - hints.append("-"); - } else if (text.length() == 1 || Constant.LINEBR.has(text.charAt(text.length() - 2))) { - hints.append("+"); - } - return hints.toString(); - } - - void writeFolded(String text, boolean split) throws IOException { - String hints = determineBlockHints(text); - writeIndicator(">" + hints, true, false, false); - if (hints.length() > 0 && (hints.charAt(hints.length() - 1) == '+')) { - openEnded = true; - } - writeLineBreak(null); - boolean leadingSpace = true; - boolean spaces = false; - boolean breaks = true; - int start = 0, end = 0; - while (end <= text.length()) { - char ch = 0; - if (end < text.length()) { - ch = text.charAt(end); - } - if (breaks) { - if (ch == 0 || Constant.LINEBR.hasNo(ch)) { - if (!leadingSpace && ch != 0 && ch != ' ' && text.charAt(start) == '\n') { - writeLineBreak(null); - } - leadingSpace = ch == ' '; - String data = text.substring(start, end); - for (char br : data.toCharArray()) { - if (br == '\n') { - writeLineBreak(null); - } else { - writeLineBreak(String.valueOf(br)); - } - } - if (ch != 0) { - writeIndent(); - } - start = end; - } - } else if (spaces) { - if (ch != ' ') { - if (start + 1 == end && this.column > this.bestWidth && split) { - writeIndent(); - } else { - int len = end - start; - this.column += len; - stream.write(text, start, len); - } - start = end; - } - } else { - if (Constant.LINEBR.has(ch, "\0 ")) { - int len = end - start; - this.column += len; - stream.write(text, start, len); - if (ch == 0) { - writeLineBreak(null); - } - start = end; - } - } - if (ch != 0) { - breaks = Constant.LINEBR.has(ch); - spaces = ch == ' '; - } - end++; - } - } - - void writeLiteral(String text) throws IOException { - String hints = determineBlockHints(text); - writeIndicator("|" + hints, true, false, false); - if (hints.length() > 0 && (hints.charAt(hints.length() - 1)) == '+') { - openEnded = true; - } - writeLineBreak(null); - boolean breaks = true; - int start = 0, end = 0; - while (end <= text.length()) { - char ch = 0; - if (end < text.length()) { - ch = text.charAt(end); - } - if (breaks) { - if (ch == 0 || Constant.LINEBR.hasNo(ch)) { - String data = text.substring(start, end); - for (char br : data.toCharArray()) { - if (br == '\n') { - writeLineBreak(null); - } else { - writeLineBreak(String.valueOf(br)); - } - } - if (ch != 0) { - writeIndent(); - } - start = end; - } - } else { - if (ch == 0 || Constant.LINEBR.has(ch)) { - stream.write(text, start, end - start); - if (ch == 0) { - writeLineBreak(null); - } - start = end; - } - } - if (ch != 0) { - breaks = Constant.LINEBR.has(ch); - } - end++; - } - } - - void writePlain(String text, boolean split) throws IOException { - if (rootContext) { - openEnded = true; - } - if (text.length() == 0) { - return; - } - if (!this.whitespace) { - this.column++; - stream.write(SPACE); - } - this.whitespace = false; - this.indention = false; - boolean spaces = false; - boolean breaks = false; - int start = 0, end = 0; - while (end <= text.length()) { - char ch = 0; - if (end < text.length()) { - ch = text.charAt(end); - } - if (spaces) { - if (ch != ' ') { - if (start + 1 == end && this.column > this.bestWidth && split) { - writeIndent(); - this.whitespace = false; - this.indention = false; - } else { - int len = end - start; - this.column += len; - stream.write(text, start, len); - } - start = end; - } - } else if (breaks) { - if (Constant.LINEBR.hasNo(ch)) { - nextLine(text, start, end); - this.whitespace = false; - this.indention = false; - start = end; - } - } else { - if (Constant.LINEBR.has(ch, "\0 ")) { - int len = end - start; - this.column += len; - stream.write(text, start, len); - start = end; - } - } - if (ch != 0) { - spaces = ch == ' '; - breaks = Constant.LINEBR.has(ch); - } - end++; - } - } - - /** - * - */ - public interface EmitterState { - void expect() throws IOException; - } - - private class ExpectStreamStart implements EmitterState { - public void expect() { - if (event instanceof StreamStartEvent) { - writeStreamStart(); - state = new ExpectFirstDocumentStart(); - } else { - throw new EmitterException("expected StreamStartEvent, but got " + event); - } - } - } - - private class ExpectNothing implements EmitterState { - public void expect() { - throw new EmitterException("expecting nothing, but got " + event); - } - } - - // Writers. - - private class ExpectFirstDocumentStart implements EmitterState { - public void expect() throws IOException { - new ExpectDocumentStart(true).expect(); - } - } - - private class ExpectDocumentStart implements EmitterState { - private final boolean first; - - public ExpectDocumentStart(boolean first) { - this.first = first; - } - - public void expect() throws IOException { - if (event instanceof DocumentStartEvent) { - DocumentStartEvent ev = (DocumentStartEvent) event; - if ((ev.getVersion() != null || ev.getTags() != null) && openEnded) { - writeIndicator("...", true, false, false); - writeIndent(); - } - if (ev.getVersion() != null) { - String versionText = prepareVersion(ev.getVersion()); - writeVersionDirective(versionText); - } - tagPrefixes = new LinkedHashMap<>(DEFAULT_TAG_PREFIXES); - if (ev.getTags() != null) { - Set handles = new TreeSet<>(ev.getTags().keySet()); - for (String handle : handles) { - String prefix = ev.getTags().get(handle); - tagPrefixes.put(prefix, handle); - String handleText = prepareTagHandle(handle); - String prefixText = prepareTagPrefix(prefix); - writeTagDirective(handleText, prefixText); - } - } - boolean implicit = first && !ev.getExplicit() && !canonical - && ev.getVersion() == null - && (ev.getTags() == null || ev.getTags().isEmpty()) - && !checkEmptyDocument(); - if (!implicit) { - writeIndent(); - writeIndicator("---", true, false, false); - if (canonical) { - writeIndent(); - } - } - state = new ExpectDocumentRoot(); - } else if (event instanceof StreamEndEvent) { - // fix 313 PyYAML changeset - // if (openEnded) { - // writeIndicator("...", true, false, false); - // writeIndent(); - // } - writeStreamEnd(); - state = new ExpectNothing(); - } else { - throw new EmitterException("expected DocumentStartEvent, but got " + event); - } - } - } - - private class ExpectDocumentEnd implements EmitterState { - public void expect() throws IOException { - if (event instanceof DocumentEndEvent) { - writeIndent(); - if (((DocumentEndEvent) event).getExplicit()) { - writeIndicator("...", true, false, false); - writeIndent(); - } - flushStream(); - state = new ExpectDocumentStart(false); - } else { - throw new EmitterException("expected DocumentEndEvent, but got " + event); - } - } - } - - private class ExpectDocumentRoot implements EmitterState { - public void expect() throws IOException { - states.push(new ExpectDocumentEnd()); - expectNode(true, false, false); - } - } - - private class ExpectFirstFlowSequenceItem implements EmitterState { - public void expect() throws IOException { - if (event instanceof SequenceEndEvent) { - indent = indents.pop(); - flowLevel--; - writeIndicator("]", false, false, false); - state = states.pop(); - } else { - if (canonical || (column > bestWidth && splitLines) || prettyFlow) { - writeIndent(); - } - states.push(new ExpectFlowSequenceItem()); - expectNode(false, false, false); - } - } - } - - private class ExpectFlowSequenceItem implements EmitterState { - public void expect() throws IOException { - if (event instanceof SequenceEndEvent) { - indent = indents.pop(); - flowLevel--; - if (canonical) { - writeIndicator(",", false, false, false); - writeIndent(); - } - writeIndicator("]", false, false, false); - if (prettyFlow) { - writeIndent(); - } - state = states.pop(); - } else { - writeIndicator(",", false, false, false); - if (canonical || (column > bestWidth && splitLines) || prettyFlow) { - writeIndent(); - } - states.push(new ExpectFlowSequenceItem()); - expectNode(false, false, false); - } - } - } - - private class ExpectFirstFlowMappingKey implements EmitterState { - public void expect() throws IOException { - if (event instanceof MappingEndEvent) { - indent = indents.pop(); - flowLevel--; - writeIndicator("}", false, false, false); - state = states.pop(); - } else { - if (canonical || (column > bestWidth && splitLines) || prettyFlow) { - writeIndent(); - } - if (!canonical && checkSimpleKey()) { - states.push(new ExpectFlowMappingSimpleValue()); - expectNode(false, true, true); - } else { - writeIndicator("?", true, false, false); - states.push(new ExpectFlowMappingValue()); - expectNode(false, true, false); - } - } - } - } - - private class ExpectFlowMappingKey implements EmitterState { - public void expect() throws IOException { - if (event instanceof MappingEndEvent) { - indent = indents.pop(); - flowLevel--; - if (canonical) { - writeIndicator(",", false, false, false); - writeIndent(); - } - if (prettyFlow) { - writeIndent(); - } - writeIndicator("}", false, false, false); - state = states.pop(); - } else { - writeIndicator(",", false, false, false); - if (canonical || (column > bestWidth && splitLines) || prettyFlow) { - writeIndent(); - } - if (!canonical && checkSimpleKey()) { - states.push(new ExpectFlowMappingSimpleValue()); - expectNode(false, true, true); - } else { - writeIndicator("?", true, false, false); - states.push(new ExpectFlowMappingValue()); - expectNode(false, true, false); - } - } - } - } - - private class ExpectFlowMappingSimpleValue implements EmitterState { - public void expect() throws IOException { - writeIndicator(":", false, false, false); - states.push(new ExpectFlowMappingKey()); - expectNode(false, true, false); - } - } - - private class ExpectFlowMappingValue implements EmitterState { - public void expect() throws IOException { - if (canonical || (column > bestWidth) || prettyFlow) { - writeIndent(); - } - writeIndicator(":", true, false, false); - states.push(new ExpectFlowMappingKey()); - expectNode(false, true, false); - } - } - - private class ExpectFirstBlockSequenceItem implements EmitterState { - public void expect() throws IOException { - new ExpectBlockSequenceItem(true).expect(); - } - } - - private class ExpectBlockSequenceItem implements EmitterState { - private final boolean first; - - public ExpectBlockSequenceItem(boolean first) { - this.first = first; - } - - public void expect() throws IOException { - if (!this.first && event instanceof SequenceEndEvent) { - indent = indents.pop(); - state = states.pop(); - } else { - writeIndent(); - writeWhitespace(indicatorIndent); - writeIndicator("-", true, false, true); - states.push(new ExpectBlockSequenceItem(false)); - expectNode(false, false, false); - } - } - } - - private class ExpectFirstBlockMappingKey implements EmitterState { - public void expect() throws IOException { - new ExpectBlockMappingKey(true).expect(); - } - } - - private class ExpectBlockMappingKey implements EmitterState { - private final boolean first; - - public ExpectBlockMappingKey(boolean first) { - this.first = first; - } - - public void expect() throws IOException { - if (!this.first && event instanceof MappingEndEvent) { - indent = indents.pop(); - state = states.pop(); - } else { - writeIndent(); - if (checkSimpleKey()) { - states.push(new ExpectBlockMappingSimpleValue()); - expectNode(false, true, true); - } else { - writeIndicator("?", true, false, true); - states.push(new ExpectBlockMappingValue()); - expectNode(false, true, false); - } - } - } - } - - private class ExpectBlockMappingSimpleValue implements EmitterState { - public void expect() throws IOException { - writeIndicator(":", false, false, false); - states.push(new ExpectBlockMappingKey(false)); - expectNode(false, true, false); - } - } - - private class ExpectBlockMappingValue implements EmitterState { - public void expect() throws IOException { - writeIndent(); - writeIndicator(":", true, false, true); - states.push(new ExpectBlockMappingKey(false)); - expectNode(false, true, false); - } - } -} \ No newline at end of file diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYaml.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYaml.java deleted file mode 100644 index 43ad57a..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYaml.java +++ /dev/null @@ -1,73 +0,0 @@ -package cc.carm.lib.configuration.commented; - -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.BaseConstructor; -import org.yaml.snakeyaml.error.YAMLException; -import org.yaml.snakeyaml.nodes.Node; -import org.yaml.snakeyaml.nodes.Tag; -import org.yaml.snakeyaml.representer.Representer; -import org.yaml.snakeyaml.serializer.Serializer; - -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * A hacky extension of {@link Yaml} that allows to write comments when dumping. - */ -public class CommentedYaml extends Yaml { - - private final CommentsProvider commentsProvider; - - public CommentedYaml(BaseConstructor constructor, Representer representer, DumperOptions dumperOptions, CommentsProvider commentsProvider) { - super(constructor, representer, dumperOptions); - this.commentsProvider = commentsProvider; - } - - @Override - public String dump(Object data) { - List list = new ArrayList<>(1); - list.add(data); - return this.dumpAll(list.iterator()); - } - - @Override - public void dump(Object data, Writer output) { - List list = new ArrayList<>(1); - list.add(data); - this.dumpAll(list.iterator(), output, null); - } - - @Override - public String dumpAll(Iterator data) { - StringWriter buffer = new StringWriter(); - this.dumpAll(data, buffer, null); - return buffer.toString(); - } - - @Override - public void dumpAll(Iterator data, Writer output) { - this.dumpAll(data, output, null); - } - - private void dumpAll(Iterator data, Writer output, Tag rootTag) { - Serializer serializer = new Serializer(new CommentedEmitter(output, this.dumperOptions, this.commentsProvider), this.resolver, this.dumperOptions, rootTag); - - try { - serializer.open(); - - while (data.hasNext()) { - Node node = this.representer.represent(data.next()); - serializer.serialize(node); - } - - serializer.close(); - } catch (IOException var6) { - throw new YAMLException(var6); - } - } -} \ No newline at end of file diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYamlConfiguration.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYamlConfiguration.java deleted file mode 100644 index d356200..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYamlConfiguration.java +++ /dev/null @@ -1,69 +0,0 @@ -package cc.carm.lib.configuration.commented; - -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.configuration.file.YamlConstructor; -import org.bukkit.configuration.file.YamlRepresenter; -import org.jetbrains.annotations.NotNull; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.representer.Representer; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.Reader; - -/** - * A yaml file with comments on certain properties, as returned by the given {@link CommentsProvider}. - * Unlike {@link YamlConfiguration}, this class does not provide a header support. - */ -public class CommentedYamlConfiguration extends YamlConfiguration { - - private final DumperOptions yamlOptions = new DumperOptions(); - private final Representer yamlRepresenter = new YamlRepresenter(); - private final CommentedYaml yaml; - - public CommentedYamlConfiguration(CommentsProvider commentsProvider) { - this.yaml = new CommentedYaml(new YamlConstructor(), this.yamlRepresenter, this.yamlOptions, commentsProvider); - } - - public static CommentedYamlConfiguration loadConfiguration(CommentsProvider commentsProvider, File file) { - CommentedYamlConfiguration config = new CommentedYamlConfiguration(commentsProvider); - - try { - config.load(file); - } catch (FileNotFoundException ignored) { - } catch (IOException | InvalidConfigurationException var4) { - var4.printStackTrace(); - } - - return config; - } - - public static CommentedYamlConfiguration loadConfiguration(CommentsProvider commentsProvider, Reader reader) { - CommentedYamlConfiguration config = new CommentedYamlConfiguration(commentsProvider); - - try { - config.load(reader); - } catch (IOException | InvalidConfigurationException ex) { - ex.printStackTrace(); - } - - return config; - } - - @Override - public @NotNull String saveToString() { - this.yamlOptions.setIndent(this.options().indent()); - this.yamlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - this.yamlRepresenter.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - String dump = this.yaml.dump(this.getValues(false)); - if (dump.equals("{}\n")) { - dump = ""; - } - - // No header support. - - return dump; - } -} \ No newline at end of file diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentsProvider.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentsProvider.java deleted file mode 100644 index c1c17b1..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentsProvider.java +++ /dev/null @@ -1,7 +0,0 @@ -package cc.carm.lib.configuration.commented; - -import java.util.function.Function; - - -public interface CommentsProvider extends Function { -} \ No newline at end of file diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/ConfigComments.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/ConfigComments.java deleted file mode 100644 index 42d6516..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/ConfigComments.java +++ /dev/null @@ -1,35 +0,0 @@ -package cc.carm.lib.configuration.spigot; - -import cc.carm.lib.configuration.commented.CommentsProvider; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.Map; - -public class ConfigComments implements CommentsProvider { - - Map comments = new HashMap<>(); - - protected Map getComments() { - return comments; - } - - public void set(@NotNull String path, @NotNull String... comments) { - if (comments.length == 0) { - getComments().remove(path); - } else { - getComments().put(path, comments); - } - } - - public @Nullable String[] get(@NotNull String path) { - return getComments().get(path); - } - - @Override - public String[] apply(String s) { - return get(s); - } - -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotConfigProvider.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotConfigProvider.java deleted file mode 100644 index 7ad2727..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotConfigProvider.java +++ /dev/null @@ -1,60 +0,0 @@ -package cc.carm.lib.configuration.spigot; - -import cc.carm.lib.configuration.core.ConfigInitializer; -import cc.carm.lib.configuration.core.source.impl.FileConfigProvider; -import cc.carm.lib.configuration.commented.CommentedYamlConfiguration; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; - -public class SpigotConfigProvider extends FileConfigProvider { - - protected final ConfigComments comments = new ConfigComments(); - protected ConfigInitializer initializer; - protected CommentedYamlConfiguration configuration; - - public SpigotConfigProvider(@NotNull File file) { - super(file); - } - - public void initializeConfig() { - this.configuration = CommentedYamlConfiguration.loadConfiguration(comments, file); - this.initializer = new ConfigInitializer<>(this); - } - - public void say() { - System.out.println("Hello"); - } - - @Override - public @NotNull SpigotSectionWrapper getConfiguration() { - return SpigotSectionWrapper.of(configuration); - } - - @Override - public void reload() throws Exception { - configuration.load(getFile()); - } - - @Override - public void save() throws Exception { - configuration.save(getFile()); - } - - @Override - public void setComments(@NotNull String path, @NotNull String... comments) { - this.comments.set(path, comments); - } - - @Override - public @Nullable String[] getComments(@NotNull String path) { - return this.comments.get(path); - } - - @Override - public @NotNull ConfigInitializer getInitializer() { - return this.initializer; - } - -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotSectionWrapper.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotSectionWrapper.java deleted file mode 100644 index 55451f5..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotSectionWrapper.java +++ /dev/null @@ -1,85 +0,0 @@ -package cc.carm.lib.configuration.spigot; - -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.serialization.ConfigurationSerializable; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class SpigotSectionWrapper implements ConfigurationWrapper { - - private final ConfigurationSection section; - - private SpigotSectionWrapper(ConfigurationSection section) { - this.section = section; - } - - @Contract("!null->!null") - public static @Nullable SpigotSectionWrapper of(@Nullable ConfigurationSection section) { - return section == null ? null : new SpigotSectionWrapper(section); - } - - @Override - public @NotNull Set getKeys(boolean deep) { - return new LinkedHashSet<>(section.getKeys(deep)); - } - - @Override - public @NotNull Map getValues(boolean deep) { - return section.getValues(deep); - } - - @Override - public void set(@NotNull String path, @Nullable Object value) { - this.section.set(path, value); - } - - @Override - public boolean contains(@NotNull String path) { - return this.section.contains(path); - } - - @Override - public @Nullable Object get(@NotNull String path) { - return this.section.get(path); - } - - @Override - public boolean isList(@NotNull String path) { - return this.section.isList(path); - } - - @Override - public @Nullable List getList(@NotNull String path) { - return this.section.getList(path); - } - - @Override - public boolean isConfigurationSection(@NotNull String path) { - return this.section.isConfigurationSection(path); - } - - @Override - public @Nullable ConfigurationWrapper getConfigurationSection(@NotNull String path) { - return of(this.section.getConfigurationSection(path)); - } - - - @Nullable - public T getSerializable(@NotNull String path, @NotNull Class clazz) { - return getSerializable(path, clazz, null); - } - - @Nullable - @Contract("_, _, !null -> !null") - public T getSerializable(@NotNull String path, @NotNull Class clazz, @Nullable T defaultValue) { - return this.section.getSerializable(path, clazz, defaultValue); - } - -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotValue.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotValue.java deleted file mode 100644 index f41b6d1..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotValue.java +++ /dev/null @@ -1,32 +0,0 @@ -package cc.carm.lib.configuration.spigot; - -import cc.carm.lib.configuration.core.source.ConfigurationProvider; -import cc.carm.lib.configuration.core.value.impl.CachedConfigValue; -import cc.carm.lib.configuration.spigot.builder.SpigotConfigBuilder; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public abstract class SpigotValue extends CachedConfigValue { - - public static @NotNull SpigotConfigBuilder builder() { - return new SpigotConfigBuilder(); - } - - - public SpigotValue(@Nullable SpigotConfigProvider provider, - @Nullable String configPath, @NotNull String[] comments, @Nullable T defaultValue) { - super(provider, configPath, comments, defaultValue); - } - - public SpigotConfigProvider getSpigotProvider() { - ConfigurationProvider provider = getProvider(); - if (provider instanceof SpigotConfigProvider) return (SpigotConfigProvider) getProvider(); - else throw new IllegalStateException("Provider is not a SpigotConfigProvider"); - } - - public SpigotSectionWrapper getSpigotConfig() { - return getSpigotProvider().getConfiguration(); - } - - -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/AbstractSpigotBuilder.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/AbstractSpigotBuilder.java deleted file mode 100644 index bd3753a..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/AbstractSpigotBuilder.java +++ /dev/null @@ -1,13 +0,0 @@ -package cc.carm.lib.configuration.spigot.builder; - -import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder; -import cc.carm.lib.configuration.spigot.SpigotConfigProvider; - -public abstract class AbstractSpigotBuilder> - extends AbstractConfigBuilder { - - public AbstractSpigotBuilder() { - super(SpigotConfigProvider.class); - } - -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/SpigotConfigBuilder.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/SpigotConfigBuilder.java deleted file mode 100644 index 690e4ad..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/SpigotConfigBuilder.java +++ /dev/null @@ -1,14 +0,0 @@ -package cc.carm.lib.configuration.spigot.builder; - -import cc.carm.lib.configuration.core.builder.ConfigBuilder; -import cc.carm.lib.configuration.spigot.builder.serializable.SerializableBuilder; -import org.bukkit.configuration.serialization.ConfigurationSerializable; -import org.jetbrains.annotations.NotNull; - -public class SpigotConfigBuilder extends ConfigBuilder { - - public @NotNull SerializableBuilder ofSerializable(@NotNull Class valueClass) { - return new SerializableBuilder<>(valueClass); - } - -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/serializable/SerializableBuilder.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/serializable/SerializableBuilder.java deleted file mode 100644 index 8007b2f..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/serializable/SerializableBuilder.java +++ /dev/null @@ -1,29 +0,0 @@ -package cc.carm.lib.configuration.spigot.builder.serializable; - -import cc.carm.lib.configuration.spigot.builder.AbstractSpigotBuilder; -import cc.carm.lib.configuration.spigot.value.ConfiguredSerializable; -import org.bukkit.configuration.serialization.ConfigurationSerializable; -import org.jetbrains.annotations.NotNull; - -public class SerializableBuilder - extends AbstractSpigotBuilder> { - - protected final @NotNull Class valueClass; - - public SerializableBuilder(@NotNull Class valueClass) { - this.valueClass = valueClass; - } - - @Override - protected @NotNull SerializableBuilder getThis() { - return this; - } - - @Override - public @NotNull ConfiguredSerializable build() { - return new ConfiguredSerializable<>(this.provider, this.path, this.comments, this.valueClass, this.defaultValue); - } - - -} - diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/item/ItemConfiguration.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/item/ItemConfiguration.java deleted file mode 100644 index 2a3c5e9..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/item/ItemConfiguration.java +++ /dev/null @@ -1,4 +0,0 @@ -package cc.carm.lib.configuration.spigot.item; - -public class ItemConfiguration { -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredItem.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredItem.java deleted file mode 100644 index b34501a..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredItem.java +++ /dev/null @@ -1,4 +0,0 @@ -package cc.carm.lib.configuration.spigot.value; - -public class ConfiguredItem { -} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredSerializable.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredSerializable.java deleted file mode 100644 index 516ca82..0000000 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredSerializable.java +++ /dev/null @@ -1,52 +0,0 @@ -package cc.carm.lib.configuration.spigot.value; - -import cc.carm.lib.configuration.spigot.SpigotConfigProvider; -import cc.carm.lib.configuration.spigot.SpigotValue; -import org.bukkit.configuration.serialization.ConfigurationSerializable; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -public class ConfiguredSerializable extends SpigotValue { - - public static ConfiguredSerializable of(@NotNull Class valueClass) { - return of(valueClass, null); - } - - public static ConfiguredSerializable of(@NotNull Class valueClass, - @Nullable V defaultValue) { - return builder().ofSerializable(valueClass).defaults(defaultValue).build(); - } - - protected final @NotNull Class valueClass; - - public ConfiguredSerializable(@Nullable SpigotConfigProvider provider, - @Nullable String configPath, @NotNull String[] comments, - @NotNull Class valueClass, @Nullable T defaultValue) { - super(provider, configPath, comments, defaultValue); - this.valueClass = valueClass; - } - - @Override - public @Nullable T get() { - if (isExpired()) { // 已过时的数据,需要重新解析一次。 - try { - // 若未出现错误,则直接更新缓存并返回。 - return updateCache(getSpigotConfig().getSerializable(getConfigPath(), valueClass, getDefaultValue())); - } catch (Exception e) { - // 出现了解析错误,提示并返回默认值。 - e.printStackTrace(); - return useDefault(); - } - } else return Optional.ofNullable(getCachedValue()).orElse(defaultValue); - } - - @Override - public void set(@Nullable T value) { - updateCache(value); - setValue(value); - } - - -} diff --git a/pom.xml b/pom.xml index c5fa3c3..4297fee 100644 --- a/pom.xml +++ b/pom.xml @@ -15,14 +15,10 @@ cc.carm.lib easyconfiguration-parent pom - 1.1.0 + 1.2.0 core - impl/yaml - - platform/spigot - platform/bungee EasyConfiguration @@ -93,7 +89,7 @@ https://github.com/CarmJos/EasyConfiguration/releases javadoc - EasySQL JavaDoc (on Github Pages) + EasyConfiguration JavaDoc (on Github Pages) https://CarmJos.github.io/EasyConfiguration