Skip to content

Commit b83601e

Browse files
committed
Draft: Switch to snakeyaml-engine (tests failing)
1 parent d59f31f commit b83601e

10 files changed

Lines changed: 140 additions & 93 deletions

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,9 @@
184184
<dependencies>
185185
<!-- SnakeYAML library -->
186186
<dependency>
187-
<groupId>org.yaml</groupId>
188-
<artifactId>snakeyaml</artifactId>
189-
<version>2.6</version>
187+
<groupId>org.snakeyaml</groupId>
188+
<artifactId>snakeyaml-engine</artifactId>
189+
<version>2.10</version>
190190
</dependency>
191191

192192
<!-- TypeInfo and other utils -->

src/main/java/ch/jalu/configme/resource/YamlFileReader.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
import ch.jalu.configme.internal.PathUtils;
55
import org.jetbrains.annotations.NotNull;
66
import org.jetbrains.annotations.Nullable;
7-
import org.yaml.snakeyaml.Yaml;
8-
import org.yaml.snakeyaml.error.YAMLException;
7+
import org.snakeyaml.engine.v2.api.Load;
8+
import org.snakeyaml.engine.v2.api.LoadSettings;
9+
import org.snakeyaml.engine.v2.exceptions.YamlEngineException;
910

1011
import java.io.IOException;
1112
import java.io.InputStream;
@@ -138,13 +139,15 @@ private static boolean isLeafValue(@Nullable Object o) {
138139
protected @Nullable Map<String, Object> loadFile() {
139140
try (InputStream is = Files.newInputStream(path);
140141
InputStreamReader isr = new InputStreamReader(is, charset)) {
141-
Map<Object, Object> rootMap = new Yaml().load(isr);
142+
LoadSettings settings = LoadSettings.builder().build();
143+
Load load = new Load(settings);
144+
Map<Object, Object> rootMap = (Map) load.loadFromReader(isr);
142145
return normalizeMap(rootMap);
143146
} catch (IOException e) {
144147
throw new ConfigMeException("Could not read file '" + path + "'", e);
145148
} catch (ClassCastException e) {
146149
throw new ConfigMeException("Top-level is not a map in '" + path + "'", e);
147-
} catch (YAMLException e) {
150+
} catch (YamlEngineException e) {
148151
throw new ConfigMeException("YAML error while trying to load file '" + path + "'", e);
149152
}
150153
}

src/main/java/ch/jalu/configme/resource/YamlFileResource.java

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,20 @@
1010
import ch.jalu.configme.resource.yaml.SnakeYamlNodeBuilderImpl;
1111
import ch.jalu.configme.resource.yaml.SnakeYamlNodeContainer;
1212
import ch.jalu.configme.resource.yaml.SnakeYamlNodeContainerImpl;
13-
1413
import org.jetbrains.annotations.NotNull;
1514
import org.jetbrains.annotations.Nullable;
16-
import org.yaml.snakeyaml.DumperOptions;
17-
import org.yaml.snakeyaml.Yaml;
18-
import org.yaml.snakeyaml.comments.CommentLine;
19-
import org.yaml.snakeyaml.nodes.Node;
15+
import org.snakeyaml.engine.v2.api.Dump;
16+
import org.snakeyaml.engine.v2.api.DumpSettings;
17+
import org.snakeyaml.engine.v2.api.YamlOutputStreamWriter;
18+
import org.snakeyaml.engine.v2.comments.CommentLine;
19+
import org.snakeyaml.engine.v2.common.FlowStyle;
20+
import org.snakeyaml.engine.v2.emitter.Emitter;
21+
import org.snakeyaml.engine.v2.nodes.Node;
22+
import org.snakeyaml.engine.v2.serializer.Serializer;
2023

2124
import java.io.IOException;
2225
import java.io.OutputStream;
23-
import java.io.OutputStreamWriter;
26+
import java.io.StringWriter;
2427
import java.nio.file.Files;
2528
import java.nio.file.Path;
2629
import java.util.List;
@@ -81,8 +84,36 @@ public void exportProperties(@NotNull ConfigurationData configurationData) {
8184
rootNode.setEndComments(footerCommentLines);
8285

8386
try (OutputStream os = Files.newOutputStream(path);
84-
OutputStreamWriter writer = new OutputStreamWriter(os, options.getCharset())) {
85-
createSnakeYamlInstance().serialize(rootNode, writer);
87+
YamlOutputStreamWriter writer = new YamlOutputStreamWriter(os, options.getCharset())) {
88+
createDumper().dump(rootNode, writer);
89+
90+
// GEMINI
91+
92+
/*
93+
Since you already have the Node, you only need the second half of the pipeline:
94+
Node -> Events -> String, which is handled by combining the Serializer and the Emitter.
95+
*/
96+
97+
// 1. Setup your settings
98+
DumpSettings settings = DumpSettings.builder()
99+
.setDumpComments(true)
100+
.setIndent(this.options.getIndentationSize())
101+
.setDefaultFlowStyle(FlowStyle.BLOCK)
102+
.build();
103+
104+
StringWriter writer = new StringWriter();
105+
106+
// 2. Instantiate the Serializer and Emitter manually
107+
Serializer serializer = new Serializer(settings, new Emitter(settings, writer));
108+
109+
// 3. Serialize your root node
110+
serializer.open();
111+
serializer.serialize(rootNode);
112+
serializer.close();
113+
114+
// Your YAML is now in the writer
115+
String yamlOutput = writer.toString();
116+
// END GEMINI
86117
} catch (IOException e) {
87118
throw new ConfigMeException("Could not save config to '" + path + "'", e);
88119
}
@@ -130,18 +161,29 @@ protected List<String> getCommentsForPathElement(@NotNull ConfigurationData conf
130161
return path;
131162
}
132163

133-
/**
134-
* Creates a new SnakeYAML object with the appropriate options.
135-
*
136-
* @return the YAML instance for exporting values
137-
*/
138-
protected @NotNull Yaml createSnakeYamlInstance() {
139-
DumperOptions options = new DumperOptions();
140-
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
141-
options.setAllowUnicode(true);
142-
options.setProcessComments(true);
143-
options.setIndent(this.options.getIndentationSize());
144-
return new Yaml(options);
164+
// TODO - check what needs to be taken over, rename method, etc.
165+
// /**
166+
// * Creates a new SnakeYAML object with the appropriate options.
167+
// *
168+
// * @return the YAML instance for exporting values
169+
// */
170+
// protected @NotNull Yaml createSnakeYamlInstance() {
171+
// DumperOptions options = new DumperOptions();
172+
// options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
173+
// options.setAllowUnicode(true);
174+
// options.setProcessComments(true);
175+
// options.setIndent(this.options.getIndentationSize());
176+
// return new Yaml(options);
177+
// }
178+
179+
protected Dump createDumper() {
180+
DumpSettings settings = DumpSettings.builder()
181+
.setDumpComments(true)
182+
.setIndent(this.options.getIndentationSize())
183+
.setDefaultFlowStyle(FlowStyle.BLOCK)
184+
.build();
185+
Dump dump = new Dump(settings);
186+
return dump;
145187
}
146188

147189
protected final @NotNull YamlFileResourceOptions getOptions() {

src/main/java/ch/jalu/configme/resource/yaml/SnakeYamlNodeBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import ch.jalu.configme.configurationdata.ConfigurationData;
44
import org.jetbrains.annotations.NotNull;
5-
import org.yaml.snakeyaml.comments.CommentLine;
6-
import org.yaml.snakeyaml.nodes.Node;
5+
import org.snakeyaml.engine.v2.comments.CommentLine;
6+
import org.snakeyaml.engine.v2.nodes.Node;
77

88
import java.util.stream.Stream;
99

src/main/java/ch/jalu/configme/resource/yaml/SnakeYamlNodeBuilderImpl.java

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
import ch.jalu.configme.configurationdata.ConfigurationData;
44
import ch.jalu.configme.internal.StreamUtils;
55
import ch.jalu.configme.properties.convertresult.ValueWithComments;
6-
76
import org.jetbrains.annotations.NotNull;
8-
import org.yaml.snakeyaml.DumperOptions;
9-
import org.yaml.snakeyaml.comments.CommentLine;
10-
import org.yaml.snakeyaml.comments.CommentType;
11-
import org.yaml.snakeyaml.nodes.MappingNode;
12-
import org.yaml.snakeyaml.nodes.Node;
13-
import org.yaml.snakeyaml.nodes.NodeTuple;
14-
import org.yaml.snakeyaml.nodes.ScalarNode;
15-
import org.yaml.snakeyaml.nodes.SequenceNode;
16-
import org.yaml.snakeyaml.nodes.Tag;
7+
import org.snakeyaml.engine.v2.comments.CommentLine;
8+
import org.snakeyaml.engine.v2.comments.CommentType;
9+
import org.snakeyaml.engine.v2.common.FlowStyle;
10+
import org.snakeyaml.engine.v2.common.ScalarStyle;
11+
import org.snakeyaml.engine.v2.nodes.MappingNode;
12+
import org.snakeyaml.engine.v2.nodes.Node;
13+
import org.snakeyaml.engine.v2.nodes.NodeTuple;
14+
import org.snakeyaml.engine.v2.nodes.ScalarNode;
15+
import org.snakeyaml.engine.v2.nodes.SequenceNode;
16+
import org.snakeyaml.engine.v2.nodes.Tag;
1717

1818
import java.math.BigDecimal;
1919
import java.util.ArrayList;
@@ -22,6 +22,7 @@
2222
import java.util.HashSet;
2323
import java.util.List;
2424
import java.util.Map;
25+
import java.util.Optional;
2526
import java.util.Set;
2627
import java.util.UUID;
2728
import java.util.concurrent.atomic.AtomicInteger;
@@ -82,11 +83,11 @@ public class SnakeYamlNodeBuilderImpl implements SnakeYamlNodeBuilder {
8283
@Override
8384
public @NotNull Stream<CommentLine> createCommentLines(@NotNull String comment) {
8485
if ("\n".equals(comment)) {
85-
return Stream.of(new CommentLine(null, null, "", CommentType.BLANK_LINE));
86+
return Stream.of(new CommentLine(Optional.empty(), Optional.empty(), "", CommentType.BLANK_LINE));
8687
}
8788

8889
return Arrays.stream(comment.split("\\n", -1))
89-
.map(text -> new CommentLine(null, null, " ".concat(text), CommentType.BLOCK));
90+
.map(text -> new CommentLine(Optional.empty(), Optional.empty(), " ".concat(text), CommentType.BLOCK));
9091
}
9192

9293
@Override
@@ -98,21 +99,21 @@ public void transferComments(@NotNull Node valueNode, @NotNull Node keyNode) {
9899
}
99100

100101
protected @NotNull Node createStringNode(@NotNull String value) {
101-
DumperOptions.ScalarStyle scalarStyle = value.contains("\n")
102-
? DumperOptions.ScalarStyle.LITERAL // Used for strings that span multiple lines
103-
: DumperOptions.ScalarStyle.PLAIN; // Used for single line string
104-
return new ScalarNode(Tag.STR, value, null, null, scalarStyle);
102+
ScalarStyle scalarStyle = value.contains("\n")
103+
? ScalarStyle.LITERAL // Used for strings that span multiple lines
104+
: ScalarStyle.PLAIN; // Used for single line string
105+
return new ScalarNode(Tag.STR, value, scalarStyle);
105106
}
106107

107108
protected @NotNull Node createNumberNode(@NotNull Number value) {
108109
Tag tag = (value instanceof Double || value instanceof Float || value instanceof BigDecimal)
109110
? Tag.FLOAT
110111
: Tag.INT;
111-
return new ScalarNode(tag, value.toString(), null, null, DumperOptions.ScalarStyle.PLAIN);
112+
return new ScalarNode(tag, value.toString(), ScalarStyle.PLAIN);
112113
}
113114

114115
protected @NotNull Node createBooleanNode(boolean value) {
115-
return new ScalarNode(Tag.BOOL, String.valueOf(value), null, null, DumperOptions.ScalarStyle.PLAIN);
116+
return new ScalarNode(Tag.BOOL, String.valueOf(value), ScalarStyle.PLAIN);
116117
}
117118

118119
/**
@@ -134,7 +135,7 @@ public void transferComments(@NotNull Node valueNode, @NotNull Node keyNode) {
134135
})
135136
.collect(Collectors.toList());
136137

137-
return new SequenceNode(Tag.SEQ, values, DumperOptions.FlowStyle.BLOCK);
138+
return new SequenceNode(Tag.SEQ, values, FlowStyle.BLOCK);
138139
}
139140

140141
/**
@@ -158,7 +159,7 @@ public void transferComments(@NotNull Node valueNode, @NotNull Node keyNode) {
158159
nodeEntries.add(new NodeTuple(keyNode, valueNode));
159160
}
160161

161-
return new MappingNode(Tag.MAP, nodeEntries, DumperOptions.FlowStyle.BLOCK);
162+
return new MappingNode(Tag.MAP, nodeEntries, FlowStyle.BLOCK);
162163
}
163164

164165
/**

src/main/java/ch/jalu/configme/resource/yaml/SnakeYamlNodeContainer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package ch.jalu.configme.resource.yaml;
22

33
import org.jetbrains.annotations.NotNull;
4-
import org.yaml.snakeyaml.nodes.Node;
4+
import org.snakeyaml.engine.v2.nodes.Node;
55

66
import java.util.List;
77
import java.util.function.Supplier;

src/main/java/ch/jalu/configme/resource/yaml/SnakeYamlNodeContainerImpl.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package ch.jalu.configme.resource.yaml;
22

33
import org.jetbrains.annotations.NotNull;
4-
import org.yaml.snakeyaml.DumperOptions;
5-
import org.yaml.snakeyaml.comments.CommentLine;
6-
import org.yaml.snakeyaml.nodes.MappingNode;
7-
import org.yaml.snakeyaml.nodes.Node;
8-
import org.yaml.snakeyaml.nodes.NodeTuple;
9-
import org.yaml.snakeyaml.nodes.Tag;
4+
import org.snakeyaml.engine.v2.comments.CommentLine;
5+
import org.snakeyaml.engine.v2.common.FlowStyle;
6+
import org.snakeyaml.engine.v2.nodes.MappingNode;
7+
import org.snakeyaml.engine.v2.nodes.Node;
8+
import org.snakeyaml.engine.v2.nodes.NodeTuple;
9+
import org.snakeyaml.engine.v2.nodes.Tag;
1010

1111
import java.util.ArrayList;
1212
import java.util.LinkedHashMap;
@@ -76,7 +76,7 @@ public void putNode(@NotNull String name, @NotNull Node node) {
7676
}
7777

7878
protected @NotNull Node createRootNode(@NotNull List<NodeTuple> entryNodes) {
79-
return new MappingNode(Tag.MAP, entryNodes, DumperOptions.FlowStyle.BLOCK);
79+
return new MappingNode(Tag.MAP, entryNodes, FlowStyle.BLOCK);
8080
}
8181

8282
protected final @NotNull List<String> getComments() {

src/test/java/ch/jalu/configme/resource/YamlFileReaderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import org.junit.jupiter.api.extension.ExtendWith;
1111
import org.junit.jupiter.api.io.TempDir;
1212
import org.mockito.junit.jupiter.MockitoExtension;
13-
import org.yaml.snakeyaml.error.YAMLException;
13+
import org.snakeyaml.engine.v2.exceptions.YamlEngineException;
1414

1515
import java.io.IOException;
1616
import java.nio.charset.StandardCharsets;
@@ -190,7 +190,7 @@ void shouldWrapYamlException() throws IOException {
190190

191191
// then
192192
assertThat(ex.getMessage(), equalTo("YAML error while trying to load file '" + file + "'"));
193-
assertThat(ex.getCause(), instanceOf(YAMLException.class));
193+
assertThat(ex.getCause(), instanceOf(YamlEngineException.class));
194194
}
195195

196196
@Test

src/test/java/ch/jalu/configme/resource/yaml/SnakeYamlNodeBuilderImplTest.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
import org.junit.jupiter.api.Test;
1010
import org.junit.jupiter.api.extension.ExtendWith;
1111
import org.mockito.junit.jupiter.MockitoExtension;
12-
import org.yaml.snakeyaml.DumperOptions;
13-
import org.yaml.snakeyaml.comments.CommentLine;
14-
import org.yaml.snakeyaml.comments.CommentType;
15-
import org.yaml.snakeyaml.nodes.MappingNode;
16-
import org.yaml.snakeyaml.nodes.Node;
17-
import org.yaml.snakeyaml.nodes.NodeTuple;
18-
import org.yaml.snakeyaml.nodes.ScalarNode;
19-
import org.yaml.snakeyaml.nodes.SequenceNode;
20-
import org.yaml.snakeyaml.nodes.Tag;
12+
import org.snakeyaml.engine.v2.comments.CommentLine;
13+
import org.snakeyaml.engine.v2.comments.CommentType;
14+
import org.snakeyaml.engine.v2.common.ScalarStyle;
15+
import org.snakeyaml.engine.v2.nodes.MappingNode;
16+
import org.snakeyaml.engine.v2.nodes.Node;
17+
import org.snakeyaml.engine.v2.nodes.NodeTuple;
18+
import org.snakeyaml.engine.v2.nodes.ScalarNode;
19+
import org.snakeyaml.engine.v2.nodes.SequenceNode;
20+
import org.snakeyaml.engine.v2.nodes.Tag;
2121

2222
import java.math.BigDecimal;
2323
import java.util.ArrayList;
@@ -70,7 +70,7 @@ void shouldCreateNodeForString() {
7070
ScalarNode scalarNode = (ScalarNode) node;
7171
assertThat(scalarNode.getTag(), equalTo(Tag.STR));
7272
assertThat(scalarNode.getValue(), equalTo(value));
73-
assertThat(scalarNode.getScalarStyle(), equalTo(DumperOptions.ScalarStyle.PLAIN));
73+
assertThat(scalarNode.getScalarStyle(), equalTo(ScalarStyle.PLAIN));
7474

7575
assertThat(scalarNode.getInLineComments(), nullValue());
7676
assertThat(scalarNode.getEndComments(), nullValue());
@@ -96,7 +96,7 @@ void shouldCreateStringNodeWithLiteralStyle() {
9696
ScalarNode scalarNode = (ScalarNode) node;
9797
assertThat(scalarNode.getTag(), equalTo(Tag.STR));
9898
assertThat(scalarNode.getValue(), equalTo(value));
99-
assertThat(scalarNode.getScalarStyle(), equalTo(DumperOptions.ScalarStyle.LITERAL));
99+
assertThat(scalarNode.getScalarStyle(), equalTo(ScalarStyle.LITERAL));
100100

101101
assertThat(scalarNode.getInLineComments(), nullValue());
102102
assertThat(scalarNode.getEndComments(), nullValue());
@@ -119,7 +119,7 @@ void shouldCreateNodeForEnum() {
119119
ScalarNode scalarNode = (ScalarNode) node;
120120
assertThat(scalarNode.getTag(), equalTo(Tag.STR));
121121
assertThat(scalarNode.getValue(), equalTo("DAYS"));
122-
assertThat(scalarNode.getScalarStyle(), equalTo(DumperOptions.ScalarStyle.PLAIN));
122+
assertThat(scalarNode.getScalarStyle(), equalTo(ScalarStyle.PLAIN));
123123

124124
assertThat(scalarNode.getInLineComments(), nullValue());
125125
assertThat(scalarNode.getEndComments(), nullValue());
@@ -452,10 +452,10 @@ void shouldCreateCommentNodesForTextWithNewLines() {
452452
@Test
453453
void shouldTransferCommentsFromValueToKey() {
454454
// given
455-
Node keyNode = new ScalarNode(Tag.STR, "key", null, null, DumperOptions.ScalarStyle.PLAIN);
456-
Node valueNode = new ScalarNode(Tag.INT, "34", null, null, DumperOptions.ScalarStyle.PLAIN);
455+
Node keyNode = new ScalarNode(Tag.STR, "key", ScalarStyle.PLAIN);
456+
Node valueNode = new ScalarNode(Tag.INT, "34", ScalarStyle.PLAIN);
457457
valueNode.setBlockComments(new ArrayList<>());
458-
CommentLine commentLine = new CommentLine(null, null, "Test", CommentType.BLOCK);
458+
CommentLine commentLine = new CommentLine(Optional.empty(), Optional.empty(), "Test", CommentType.BLOCK);
459459
valueNode.getBlockComments().add(commentLine);
460460

461461
// when

0 commit comments

Comments
 (0)