diff --git a/config/src/main/java/com/typesafe/config/ConfigRenderOptions.java b/config/src/main/java/com/typesafe/config/ConfigRenderOptions.java index 99730789..8ee8c1cb 100644 --- a/config/src/main/java/com/typesafe/config/ConfigRenderOptions.java +++ b/config/src/main/java/com/typesafe/config/ConfigRenderOptions.java @@ -22,14 +22,21 @@ public final class ConfigRenderOptions { private final boolean formatted; private final boolean json; private final boolean showEnvVariableValues; + private final boolean keepOriginOrder; + private final boolean doubleIndent; + private final boolean doubleColonAssign; private ConfigRenderOptions(boolean originComments, boolean comments, boolean formatted, - boolean json, boolean showEnvVariableValues) { + boolean json, boolean showEnvVariableValues, boolean keepOriginOrder, + boolean doubleIndent, boolean doubleColonAssign) { this.originComments = originComments; this.comments = comments; this.formatted = formatted; this.json = json; this.showEnvVariableValues = showEnvVariableValues; + this.keepOriginOrder = keepOriginOrder; + this.doubleIndent = doubleIndent; + this.doubleColonAssign = doubleColonAssign; } /** @@ -40,7 +47,7 @@ private ConfigRenderOptions(boolean originComments, boolean comments, boolean fo * @return the default render options */ public static ConfigRenderOptions defaults() { - return new ConfigRenderOptions(true, true, true, true, true); + return new ConfigRenderOptions(true, true, true, true, true, false, true, false); } /** @@ -50,7 +57,7 @@ public static ConfigRenderOptions defaults() { * @return the concise render options */ public static ConfigRenderOptions concise() { - return new ConfigRenderOptions(false, false, false, true, true); + return new ConfigRenderOptions(false, false, false, true, true, false, true, false); } /** @@ -66,7 +73,8 @@ public ConfigRenderOptions setComments(boolean value) { if (value == comments) return this; else - return new ConfigRenderOptions(originComments, value, formatted, json, showEnvVariableValues); + return new ConfigRenderOptions(originComments, value, formatted, json, showEnvVariableValues, + keepOriginOrder, doubleIndent, doubleColonAssign); } /** @@ -99,7 +107,8 @@ public ConfigRenderOptions setOriginComments(boolean value) { if (value == originComments) return this; else - return new ConfigRenderOptions(value, comments, formatted, json, showEnvVariableValues); + return new ConfigRenderOptions(value, comments, formatted, json, showEnvVariableValues, + keepOriginOrder, doubleIndent, doubleColonAssign); } /** @@ -112,6 +121,27 @@ public boolean getOriginComments() { return originComments; } + /** + * TODO + * @param value + * @return + */ + public ConfigRenderOptions setKeepOriginOrder(boolean value) { + if (value == keepOriginOrder) + return this; + else + return new ConfigRenderOptions(originComments, comments, formatted, json, showEnvVariableValues, + value, doubleIndent, doubleColonAssign); + } + + /** + * TODO + * @return + */ + public boolean getKeepOriginOrder() { + return keepOriginOrder; + } + /** * Returns options with formatting toggled. Formatting means indentation and * whitespace, enabling formatting makes things prettier but larger. @@ -124,7 +154,8 @@ public ConfigRenderOptions setFormatted(boolean value) { if (value == formatted) return this; else - return new ConfigRenderOptions(originComments, comments, value, json, showEnvVariableValues); + return new ConfigRenderOptions(originComments, comments, value, json, showEnvVariableValues, + keepOriginOrder, doubleIndent, doubleColonAssign); } /** @@ -152,7 +183,8 @@ public ConfigRenderOptions setJson(boolean value) { if (value == json) return this; else - return new ConfigRenderOptions(originComments, comments, formatted, value, showEnvVariableValues); + return new ConfigRenderOptions(originComments, comments, formatted, value, showEnvVariableValues, + keepOriginOrder, doubleIndent, doubleColonAssign); } /** @@ -167,7 +199,8 @@ public ConfigRenderOptions setShowEnvVariableValues(boolean value) { if (value == showEnvVariableValues) return this; else - return new ConfigRenderOptions(originComments, comments, formatted, json, value); + return new ConfigRenderOptions(originComments, comments, formatted, json, + value, keepOriginOrder, doubleIndent, doubleColonAssign); } /** @@ -190,6 +223,28 @@ public boolean getJson() { return json; } + public ConfigRenderOptions setDoubleIndent(boolean value) { + if (value == doubleIndent) + return this; + else + return new ConfigRenderOptions(originComments, comments, formatted, json, + showEnvVariableValues, keepOriginOrder, value, doubleColonAssign); + } + + public boolean getDoubleIndent() { + return doubleIndent; + } + + public ConfigRenderOptions setDoubleColonAssign(boolean value) { + if (value == doubleColonAssign) + return this; + else + return new ConfigRenderOptions(originComments, comments, formatted, json, + showEnvVariableValues, keepOriginOrder, doubleIndent, value); + } + + public boolean getDoubleColonAssign() {return doubleColonAssign;} + @Override public String toString() { StringBuilder sb = new StringBuilder("ConfigRenderOptions("); @@ -203,6 +258,12 @@ public String toString() { sb.append("json,"); if (showEnvVariableValues) sb.append("showEnvVariableValues,"); + if (keepOriginOrder) + sb.append("keepOriginOrder,"); + if (doubleIndent) + sb.append("doubleIndent,"); + if (doubleColonAssign) + sb.append("equalsAssign,"); if (sb.charAt(sb.length() - 1) == ',') sb.setLength(sb.length() - 1); sb.append(")"); diff --git a/config/src/main/java/com/typesafe/config/impl/AbstractConfigValue.java b/config/src/main/java/com/typesafe/config/impl/AbstractConfigValue.java index 67728e25..298f5507 100644 --- a/config/src/main/java/com/typesafe/config/impl/AbstractConfigValue.java +++ b/config/src/main/java/com/typesafe/config/impl/AbstractConfigValue.java @@ -322,7 +322,7 @@ protected static void indent(StringBuilder sb, int indent, ConfigRenderOptions o if (options.getFormatted()) { int remaining = indent; while (remaining > 0) { - sb.append(" "); + sb.append(options.getDoubleIndent() ? " " : " "); --remaining; } } @@ -349,7 +349,7 @@ protected void render(StringBuilder sb, int indent, boolean atRoot, String atKey if (options.getFormatted()) sb.append(' '); } else { - sb.append("="); + sb.append(options.getDoubleColonAssign() ? ":" : "="); } } } diff --git a/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java b/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java index e7a6dc99..3dd5efdf 100644 --- a/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java +++ b/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java @@ -290,7 +290,7 @@ static void render(List stack, StringBuilder sb, int indent } List reversed = new ArrayList(); - reversed.addAll(stack); + reversed.addAll(stack); // TODO Collections.reverse(reversed); int i = 0; diff --git a/config/src/main/java/com/typesafe/config/impl/SimpleConfigObject.java b/config/src/main/java/com/typesafe/config/impl/SimpleConfigObject.java index ef69c688..937a90a7 100644 --- a/config/src/main/java/com/typesafe/config/impl/SimpleConfigObject.java +++ b/config/src/main/java/com/typesafe/config/impl/SimpleConfigObject.java @@ -6,16 +6,7 @@ import java.io.ObjectStreamException; import java.io.Serializable; import java.math.BigInteger; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import com.typesafe.config.ConfigException; import com.typesafe.config.ConfigObject; @@ -420,7 +411,7 @@ public AbstractConfigValue modifyChild(String key, AbstractConfigValue v) { } // this is only Serializable to chill out a findbugs warning - static final private class RenderComparator implements java.util.Comparator, Serializable { + static private class RenderComparator implements java.util.Comparator, Serializable { private static final long serialVersionUID = 1L; private static boolean isAllDigits(String s) { @@ -460,6 +451,30 @@ public int compare(String a, String b) { } } + private class KeepOriginRenderComparator extends RenderComparator { + private SimpleConfigOrigin getOriginFor(String key) { + return value.get(key).origin(); + } + private final RenderComparator delegate = new RenderComparator(); + @Override + public int compare(String a, String b) { + SimpleConfigOrigin aOrigin = getOriginFor(a); + SimpleConfigOrigin bOrigin = getOriginFor(b); + + String aFilename = Objects.toString(aOrigin.filename(), ""); + String bFilename = Objects.toString(bOrigin.filename(), ""); + int compareFiles = aFilename.compareTo(bFilename); + if (compareFiles == 0) { + int compareLines = Integer.compare(aOrigin.lineNumber(), bOrigin.lineNumber()); + if (compareLines == 0) + return delegate.compare(a, b); + else return compareLines; + } else + return compareFiles; + } + } + + @Override protected void render(StringBuilder sb, int indent, boolean atRoot, ConfigRenderOptions options) { if (isEmpty()) { @@ -480,7 +495,8 @@ protected void render(StringBuilder sb, int indent, boolean atRoot, ConfigRender int separatorCount = 0; String[] keys = keySet().toArray(new String[size()]); - Arrays.sort(keys, new RenderComparator()); + Comparator ordering = options.getKeepOriginOrder() ? new KeepOriginRenderComparator() : new RenderComparator(); + Arrays.sort(keys, ordering); for (String k : keys) { AbstractConfigValue v; v = value.get(k);