make ConfigValue.toString create a single-line compact string

while render() creates the formatted verbose string with comments.
This commit is contained in:
Havoc Pennington 2011-11-25 15:58:15 -05:00
parent 69b5a765df
commit ff2a5064aa
9 changed files with 95 additions and 57 deletions

View File

@ -261,22 +261,34 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
}
@Override
protected void render(StringBuilder sb, int indent) {
protected void render(StringBuilder sb, int indent, boolean formatted) {
if (isEmpty()) {
sb.append("{}");
} else {
sb.append("{\n");
sb.append("{");
if (formatted)
sb.append('\n');
for (String k : keySet()) {
AbstractConfigValue v = peek(k);
indent(sb, indent + 1);
sb.append("# ");
sb.append(v.origin().description());
sb.append("\n");
indent(sb, indent + 1);
v.render(sb, indent + 1, k);
sb.append(",\n");
if (formatted) {
indent(sb, indent + 1);
sb.append("# ");
sb.append(v.origin().description());
sb.append("\n");
indent(sb, indent + 1);
}
v.render(sb, indent + 1, k, formatted);
sb.append(",");
if (formatted)
sb.append('\n');
}
// chop comma or newline
sb.setLength(sb.length() - 1);
if (formatted) {
sb.setLength(sb.length() - 1); // also chop comma
sb.append("\n"); // put a newline back
indent(sb, indent);
}
indent(sb, indent);
sb.append("}");
}
}

View File

@ -163,7 +163,9 @@ abstract class AbstractConfigValue implements ConfigValue {
@Override
public final String toString() {
return getClass().getSimpleName() + "(" + render() + ")";
StringBuilder sb = new StringBuilder();
render(sb, 0, null /* atKey */, false /* formatted */);
return getClass().getSimpleName() + "(" + sb.toString() + ")";
}
protected static void indent(StringBuilder sb, int indent) {
@ -174,15 +176,15 @@ abstract class AbstractConfigValue implements ConfigValue {
}
}
protected void render(StringBuilder sb, int indent, String atKey) {
protected void render(StringBuilder sb, int indent, String atKey, boolean formatted) {
if (atKey != null) {
sb.append(ConfigUtil.renderJsonString(atKey));
sb.append(" : ");
}
render(sb, indent);
render(sb, indent, formatted);
}
protected void render(StringBuilder sb, int indent) {
protected void render(StringBuilder sb, int indent, boolean formatted) {
Object u = unwrapped();
sb.append(u.toString());
}
@ -191,7 +193,7 @@ abstract class AbstractConfigValue implements ConfigValue {
@Override
public final String render() {
StringBuilder sb = new StringBuilder();
render(sb, 0, null);
render(sb, 0, null, true /* formatted */);
return sb.toString();
}

View File

@ -161,17 +161,20 @@ final class ConfigDelayedMerge extends AbstractConfigValue implements
}
@Override
protected void render(StringBuilder sb, int indent, String atKey) {
render(stack, sb, indent, atKey);
protected void render(StringBuilder sb, int indent, String atKey, boolean formatted) {
render(stack, sb, indent, atKey, formatted);
}
// static method also used by ConfigDelayedMergeObject.
static void render(List<AbstractConfigValue> stack, StringBuilder sb, int indent, String atKey) {
sb.append("# unresolved merge of " + stack.size() + " values follows (\n");
if (atKey == null) {
indent(sb, indent);
sb.append("# this unresolved merge will not be parseable because it's at the root of the object\n");
sb.append("# the HOCON format has no way to list multiple root objects in a single file\n");
static void render(List<AbstractConfigValue> stack, StringBuilder sb, int indent, String atKey,
boolean formatted) {
if (formatted) {
sb.append("# unresolved merge of " + stack.size() + " values follows (\n");
if (atKey == null) {
indent(sb, indent);
sb.append("# this unresolved merge will not be parseable because it's at the root of the object\n");
sb.append("# the HOCON format has no way to list multiple root objects in a single file\n");
}
}
List<AbstractConfigValue> reversed = new ArrayList<AbstractConfigValue>();
@ -180,27 +183,36 @@ final class ConfigDelayedMerge extends AbstractConfigValue implements
int i = 0;
for (AbstractConfigValue v : reversed) {
indent(sb, indent);
if (atKey != null) {
sb.append("# unmerged value " + i + " for key "
+ ConfigUtil.renderJsonString(atKey) + " from ");
} else {
sb.append("# unmerged value " + i + " from ");
if (formatted) {
indent(sb, indent);
if (atKey != null) {
sb.append("# unmerged value " + i + " for key "
+ ConfigUtil.renderJsonString(atKey) + " from ");
} else {
sb.append("# unmerged value " + i + " from ");
}
i += 1;
sb.append(v.origin().description());
sb.append("\n");
indent(sb, indent);
}
i += 1;
sb.append(v.origin().description());
sb.append("\n");
indent(sb, indent);
if (atKey != null) {
sb.append(ConfigUtil.renderJsonString(atKey));
sb.append(" : ");
}
v.render(sb, indent);
sb.append(",\n");
v.render(sb, indent, formatted);
sb.append(",");
if (formatted)
sb.append('\n');
}
// chop comma or newline
sb.setLength(sb.length() - 1);
if (formatted) {
sb.setLength(sb.length() - 1); // also chop comma
sb.append("\n"); // put a newline back
indent(sb, indent);
sb.append("# ) end of unresolved merge\n");
}
sb.setLength(sb.length() - 2); // chop comma and newline
sb.append("\n");
indent(sb, indent);
sb.append("# ) end of unresolved merge\n");
}
}

View File

@ -139,8 +139,8 @@ class ConfigDelayedMergeObject extends AbstractConfigObject implements
}
@Override
protected void render(StringBuilder sb, int indent, String atKey) {
ConfigDelayedMerge.render(stack, sb, indent, atKey);
protected void render(StringBuilder sb, int indent, String atKey, boolean formatted) {
ConfigDelayedMerge.render(stack, sb, indent, atKey, formatted);
}
private static ConfigException notResolved() {

View File

@ -36,7 +36,7 @@ final class ConfigNull extends AbstractConfigValue {
}
@Override
protected void render(StringBuilder sb, int indent) {
protected void render(StringBuilder sb, int indent, boolean formatted) {
sb.append("null");
}
}

View File

@ -31,7 +31,7 @@ final class ConfigString extends AbstractConfigValue {
}
@Override
protected void render(StringBuilder sb, int indent) {
protected void render(StringBuilder sb, int indent, boolean formatted) {
sb.append(ConfigUtil.renderJsonString(value));
}
}

View File

@ -244,7 +244,7 @@ final class ConfigSubstitution extends AbstractConfigValue implements
}
@Override
protected void render(StringBuilder sb, int indent) {
protected void render(StringBuilder sb, int indent, boolean formatted) {
for (Object p : pieces) {
if (p instanceof Path) {
sb.append("${");

View File

@ -135,24 +135,32 @@ final class SimpleConfigList extends AbstractConfigValue implements ConfigList {
}
@Override
protected void render(StringBuilder sb, int indent) {
protected void render(StringBuilder sb, int indent, boolean formatted) {
if (value.isEmpty()) {
sb.append("[]");
} else {
sb.append("[\n");
sb.append("[");
if (formatted)
sb.append('\n');
for (AbstractConfigValue v : value) {
indent(sb, indent + 1);
sb.append("# ");
sb.append(v.origin().description());
sb.append("\n");
indent(sb, indent + 1);
v.render(sb, indent + 1);
sb.append(",\n");
if (formatted) {
indent(sb, indent + 1);
sb.append("# ");
sb.append(v.origin().description());
sb.append("\n");
indent(sb, indent + 1);
}
v.render(sb, indent + 1, formatted);
sb.append(",");
if (formatted)
sb.append('\n');
}
sb.setLength(sb.length() - 1); // chop or newline
if (formatted) {
sb.setLength(sb.length() - 1); // also chop comma
sb.append('\n');
indent(sb, indent);
}
sb.setLength(sb.length() - 2); // chop comma and newline
sb.append("\n");
indent(sb, indent);
sb.append("]");
}
}

View File

@ -11,6 +11,10 @@ object RenderExample extends App {
println("=== BEGIN RESOLVED " + what)
println(conf.resolve().root.render())
println("=== END RESOLVED " + what)
println("=== BEGIN UNRESOLVED toString() " + what)
println(conf.root.toString())
println("=== END UNRESOLVED toString() " + what)
}
render("test01")