Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 69 additions & 8 deletions config/src/main/java/com/typesafe/config/ConfigRenderOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand Down Expand Up @@ -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);
}

/**
Expand All @@ -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.
Expand All @@ -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);
}

/**
Expand Down Expand Up @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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(");
Expand All @@ -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(")");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand All @@ -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() ? ":" : "=");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ static void render(List<AbstractConfigValue> stack, StringBuilder sb, int indent
}

List<AbstractConfigValue> reversed = new ArrayList<AbstractConfigValue>();
reversed.addAll(stack);
reversed.addAll(stack); // TODO
Collections.reverse(reversed);

int i = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<String>, Serializable {
static private class RenderComparator implements java.util.Comparator<String>, Serializable {
private static final long serialVersionUID = 1L;

private static boolean isAllDigits(String s) {
Expand Down Expand Up @@ -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()) {
Expand All @@ -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<String> ordering = options.getKeepOriginOrder() ? new KeepOriginRenderComparator() : new RenderComparator();
Arrays.sort(keys, ordering);
for (String k : keys) {
AbstractConfigValue v;
v = value.get(k);
Expand Down