diff --git a/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java b/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java index 12bd9b031..33acbe4c8 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java +++ b/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java @@ -63,8 +63,12 @@ public class CommentStore { public void storeComments(InputStream inputStream) throws IOException { InputStreamReader reader = new InputStreamReader(inputStream); - String contents = CharStreams.toString(reader); - + String contents; + try { + contents = CharStreams.toString(reader); + } finally { + reader.close(); + } StringBuilder memoryData = new StringBuilder(); // Parse headers final String pathSeparator = Character.toString(this.pathSeperator); diff --git a/common/src/main/java/us/myles/ViaVersion/util/Config.java b/common/src/main/java/us/myles/ViaVersion/util/Config.java index b07985ab7..7d6e1edca 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/Config.java +++ b/common/src/main/java/us/myles/ViaVersion/util/Config.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion.util; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.representer.Representer; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import java.io.*; @@ -10,7 +11,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; public abstract class Config implements ConfigurationProvider { private static ThreadLocal yaml = new ThreadLocal() { @@ -18,12 +19,14 @@ public abstract class Config implements ConfigurationProvider { protected Yaml initialValue() { DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - return new Yaml(options); + options.setPrettyFlow(false); + options.setIndent(2); + return new Yaml(new YamlConstructor(), new Representer(), options); } }; private CommentStore commentStore = new CommentStore('.', 2); private final File configFile; - private ConcurrentHashMap config; + private ConcurrentSkipListMap config; public Config(File configFile) { this.configFile = configFile; @@ -108,7 +111,7 @@ public abstract class Config implements ConfigurationProvider { @Override public void reloadConfig() { this.configFile.getParentFile().mkdirs(); - this.config = new ConcurrentHashMap<>(loadConfig(this.configFile)); + this.config = new ConcurrentSkipListMap<>(loadConfig(this.configFile)); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/util/YamlConstructor.java b/common/src/main/java/us/myles/ViaVersion/util/YamlConstructor.java new file mode 100644 index 000000000..4bc53061a --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/util/YamlConstructor.java @@ -0,0 +1,38 @@ +package us.myles.ViaVersion.util; + +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.NodeId; +import org.yaml.snakeyaml.nodes.Tag; + +import java.util.concurrent.ConcurrentSkipListMap; + +public class YamlConstructor extends SafeConstructor { + public YamlConstructor() { + super(); + yamlClassConstructors.put(NodeId.mapping, new YamlConstructor.ConstructYamlMap()); + yamlConstructors.put(Tag.OMAP, new YamlConstructor.ConstructYamlOmap()); + } + + class Map extends Constructor.ConstructYamlMap { + @Override + public Object construct(Node node) { + Object o = super.construct(node); + if (o instanceof Map && !(o instanceof ConcurrentSkipListMap)) { + return new ConcurrentSkipListMap<>((java.util.Map) o); + } + return o; + } + } + + class ConstructYamlOmap extends Constructor.ConstructYamlOmap { + public Object construct(Node node) { + Object o = super.construct(node); + if (o instanceof Map && !(o instanceof ConcurrentSkipListMap)) { + return new ConcurrentSkipListMap<>((java.util.Map) o); + } + return o; + } + } +}