Skip to content

Commit 3a19aff

Browse files
committed
Support fully rendered config in toString()
1 parent 6e5d848 commit 3a19aff

File tree

8 files changed

+102
-25
lines changed

8 files changed

+102
-25
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* [new] Support returning tree nodes from functions, allowing to pass subtrees between functions.
44
* [new] A new `safeValue()` function allows to obtain the value of a node without any exception being raised. If an
55
error occurs it is returned as the value.
6+
* [new] The `toString()` method on the `Coffig` class will now return a fully evaluated YAML by default.
67

78
# Version 3.1.7 (2021-05-05)
89

src/main/java/org/seedstack/coffig/Coffig.java

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,16 @@
77
*/
88
package org.seedstack.coffig;
99

10-
import static org.seedstack.shed.reflect.Classes.instantiateDefault;
11-
import static org.seedstack.shed.reflect.Types.rawClassOf;
10+
import org.seedstack.coffig.internal.ConfigurationErrorCode;
11+
import org.seedstack.coffig.internal.ConfigurationException;
12+
import org.seedstack.coffig.node.MapNode;
13+
import org.seedstack.coffig.node.UnmodifiableTreeNode;
14+
import org.seedstack.coffig.spi.ConfigurationMapper;
15+
import org.seedstack.coffig.spi.ConfigurationProcessor;
16+
import org.seedstack.coffig.spi.ConfigurationProvider;
17+
import org.seedstack.coffig.spi.ConfigurationWatcher;
18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
1220

1321
import java.lang.reflect.AnnotatedElement;
1422
import java.lang.reflect.Type;
@@ -23,16 +31,9 @@
2331
import java.util.Optional;
2432
import java.util.Set;
2533
import java.util.TreeMap;
26-
import org.seedstack.coffig.internal.ConfigurationErrorCode;
27-
import org.seedstack.coffig.internal.ConfigurationException;
28-
import org.seedstack.coffig.node.MapNode;
29-
import org.seedstack.coffig.node.UnmodifiableTreeNode;
30-
import org.seedstack.coffig.spi.ConfigurationMapper;
31-
import org.seedstack.coffig.spi.ConfigurationProcessor;
32-
import org.seedstack.coffig.spi.ConfigurationProvider;
33-
import org.seedstack.coffig.spi.ConfigurationWatcher;
34-
import org.slf4j.Logger;
35-
import org.slf4j.LoggerFactory;
34+
35+
import static org.seedstack.shed.reflect.Classes.instantiateDefault;
36+
import static org.seedstack.shed.reflect.Types.rawClassOf;
3637

3738
public class Coffig {
3839
private static final Logger LOGGER = LoggerFactory.getLogger(Coffig.class);
@@ -41,6 +42,7 @@ public class Coffig {
4142
private final ConfigurationProcessor processor;
4243
private final Map<String, List<ConfigChangeListener>> listeners = new TreeMap<>(Comparator.reverseOrder());
4344
private final Set<ConfigurationWatcher> configurationWatchers = new HashSet<>();
45+
private boolean toStringMapping = true;
4446
private volatile boolean dirty = true;
4547
private volatile TreeNode configurationTree = new MapNode();
4648

@@ -65,6 +67,14 @@ public class Coffig {
6567
}
6668
}
6769

70+
public boolean isToStringMapping() {
71+
return toStringMapping;
72+
}
73+
74+
public void setToStringMapping(boolean toStringMapping) {
75+
this.toStringMapping = toStringMapping;
76+
}
77+
6878
public static CoffigBuilder builder() {
6979
return new CoffigBuilder();
7080
}
@@ -230,7 +240,15 @@ public TreeNode getTree() {
230240

231241
@Override
232242
public String toString() {
233-
return "---\n" + configurationTree.toString();
243+
if (toStringMapping) {
244+
return toMappedString();
245+
} else {
246+
return "---\n" + configurationTree.toString();
247+
}
248+
}
249+
250+
public String toMappedString() {
251+
return "---\n" + configurationTree.toMappedString(mapper);
234252
}
235253

236254
public ConfigurationMapper getMapper() {

src/main/java/org/seedstack/coffig/CoffigBuilder.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,6 @@
77
*/
88
package org.seedstack.coffig;
99

10-
import java.util.ArrayList;
11-
import java.util.Arrays;
12-
import java.util.Collection;
13-
import java.util.HashSet;
14-
import java.util.List;
15-
import java.util.ServiceLoader;
16-
import java.util.Set;
1710
import org.seedstack.coffig.evaluator.CompositeEvaluator;
1811
import org.seedstack.coffig.mapper.CompositeMapper;
1912
import org.seedstack.coffig.mapper.EvaluatingMapper;
@@ -26,6 +19,14 @@
2619
import org.seedstack.coffig.spi.ConfigurationProvider;
2720
import org.seedstack.shed.ClassLoaders;
2821

22+
import java.util.ArrayList;
23+
import java.util.Arrays;
24+
import java.util.Collection;
25+
import java.util.HashSet;
26+
import java.util.List;
27+
import java.util.ServiceLoader;
28+
import java.util.Set;
29+
2930
public class CoffigBuilder {
3031
private static final ClassLoader MOST_COMPLETE_CLASS_LOADER = ClassLoaders.findMostCompleteClassLoader
3132
(CoffigBuilder.class);
@@ -38,6 +39,7 @@ public class CoffigBuilder {
3839
private boolean processorDetection = true;
3940
private boolean evaluatorDetection = true;
4041
private boolean providerDetection = true;
42+
private boolean toStringMapping = true;
4143
private Object validatorFactory;
4244

4345
CoffigBuilder() {
@@ -68,6 +70,11 @@ public CoffigBuilder disableProviderDetection() {
6870
return this;
6971
}
7072

73+
public CoffigBuilder disableToStringMapping() {
74+
toStringMapping = false;
75+
return this;
76+
}
77+
7178
public CoffigBuilder enableValidation(Object validatorFactory) {
7279
this.validatorFactory = validatorFactory;
7380
return this;

src/main/java/org/seedstack/coffig/TreeNode.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package org.seedstack.coffig;
99

1010
import org.seedstack.coffig.node.NamedNode;
11+
import org.seedstack.coffig.spi.ConfigurationMapper;
1112

1213
import java.util.Optional;
1314
import java.util.stream.Stream;
@@ -40,6 +41,8 @@ public interface TreeNode {
4041

4142
TreeNode remove(String path);
4243

44+
String toMappedString(ConfigurationMapper mapper);
45+
4346
default String safeValue() {
4447
try {
4548
return value();

src/main/java/org/seedstack/coffig/node/ArrayNode.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
import java.util.List;
1515
import java.util.Optional;
1616
import java.util.stream.Stream;
17+
1718
import org.seedstack.coffig.TreeNode;
1819
import org.seedstack.coffig.internal.ConfigurationErrorCode;
1920
import org.seedstack.coffig.internal.ConfigurationException;
2021
import org.seedstack.coffig.internal.PropertyNotFoundException;
22+
import org.seedstack.coffig.spi.ConfigurationMapper;
2123

2224
public class ArrayNode extends AbstractTreeNode {
2325
private final List<TreeNode> children;
@@ -172,10 +174,21 @@ public int hashCode() {
172174

173175
@Override
174176
public String toString() {
177+
return toMappedString(null);
178+
}
179+
180+
@Override
181+
public String toMappedString(ConfigurationMapper mapper) {
175182
if (isHidden()) {
176183
return "\"" + HIDDEN_PLACEHOLDER + "\"";
177184
} else if (children.size() > 0 && children.get(0).type() == Type.VALUE_NODE) {
178-
return children.stream().map(item -> "- " + item.toString()).collect(joining("\n"));
185+
return children.stream().map(item -> {
186+
if (mapper != null) {
187+
return "- " + mapper.map(item, String.class);
188+
} else {
189+
return "- " + item.toString();
190+
}
191+
}).collect(joining("\n"));
179192
} else {
180193
return children.stream().map(item -> "-\n" + indent(item.toString())).collect(joining("\n"));
181194
}

src/main/java/org/seedstack/coffig/node/MapNode.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.seedstack.coffig.internal.ConfigurationErrorCode;
1919
import org.seedstack.coffig.internal.ConfigurationException;
2020
import org.seedstack.coffig.internal.PropertyNotFoundException;
21+
import org.seedstack.coffig.spi.ConfigurationMapper;
2122

2223
public class MapNode extends AbstractTreeNode {
2324
private final Map<String, TreeNode> children;
@@ -166,12 +167,21 @@ public int hashCode() {
166167

167168
@Override
168169
public String toString() {
170+
return toMappedString(null);
171+
}
172+
173+
@Override
174+
public String toMappedString(ConfigurationMapper mapper) {
169175
if (isHidden()) {
170176
return "\"" + HIDDEN_PLACEHOLDER + "\"";
171177
} else {
172178
return children.entrySet().stream().map(entry -> {
173179
if (entry.getValue().type() == Type.VALUE_NODE) {
174-
return entry.getKey() + ": " + entry.getValue().toString();
180+
if (mapper != null) {
181+
return entry.getKey() + ": " + mapper.map(entry.getValue(), String.class);
182+
} else {
183+
return entry.getKey() + ": " + entry.getValue().toString();
184+
}
175185
} else {
176186
return entry.getKey() + ":\n" + indent(entry.getValue().toString());
177187
}

src/main/java/org/seedstack/coffig/node/UnmodifiableTreeNode.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.Optional;
1111
import java.util.stream.Stream;
1212
import org.seedstack.coffig.TreeNode;
13+
import org.seedstack.coffig.spi.ConfigurationMapper;
1314

1415
public class UnmodifiableTreeNode implements TreeNode {
1516
private final TreeNode treeNode;
@@ -129,4 +130,9 @@ public boolean equals(Object o) {
129130
public String toString() {
130131
return treeNode.toString();
131132
}
133+
134+
@Override
135+
public String toMappedString(ConfigurationMapper mapper) {
136+
return treeNode.toMappedString(mapper);
137+
}
132138
}

src/main/java/org/seedstack/coffig/node/ValueNode.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
*/
88
package org.seedstack.coffig.node;
99

10-
import java.util.Objects;
11-
import java.util.Optional;
12-
import java.util.stream.Stream;
1310
import org.seedstack.coffig.TreeNode;
1411
import org.seedstack.coffig.internal.ConfigurationErrorCode;
1512
import org.seedstack.coffig.internal.ConfigurationException;
13+
import org.seedstack.coffig.spi.ConfigurationMapper;
14+
15+
import java.util.Objects;
16+
import java.util.Optional;
17+
import java.util.stream.Stream;
1618

1719
public class ValueNode extends AbstractTreeNode {
1820
private final String value;
@@ -121,4 +123,21 @@ public int hashCode() {
121123
public String toString() {
122124
return value == null ? "~" : "\"" + (isHidden() ? HIDDEN_PLACEHOLDER : quote(value)) + "\"";
123125
}
126+
127+
@Override
128+
public String toMappedString(ConfigurationMapper mapper) {
129+
if (value == null) {
130+
return "~";
131+
} else {
132+
if (isHidden()) {
133+
return "\"" + HIDDEN_PLACEHOLDER + "\"";
134+
} else {
135+
if (mapper != null) {
136+
return "\"" + quote(String.valueOf(mapper.map(this, String.class))) + "\"";
137+
} else {
138+
return "\"" + quote(value) + "\"";
139+
}
140+
}
141+
}
142+
}
124143
}

0 commit comments

Comments
 (0)