1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/**
* Copyright (c) 2008, http://www.snakeyaml.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.yaml.snakeyaml.emitter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.yaml.snakeyaml.DumperOptions.Version;
import org.yaml.snakeyaml.constructor.AbstractConstruct;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.events.AliasEvent;
import org.yaml.snakeyaml.events.DocumentEndEvent;
import org.yaml.snakeyaml.events.DocumentStartEvent;
import org.yaml.snakeyaml.events.Event;
import org.yaml.snakeyaml.events.ImplicitTuple;
import org.yaml.snakeyaml.events.MappingEndEvent;
import org.yaml.snakeyaml.events.MappingStartEvent;
import org.yaml.snakeyaml.events.ScalarEvent;
import org.yaml.snakeyaml.events.SequenceEndEvent;
import org.yaml.snakeyaml.events.SequenceStartEvent;
import org.yaml.snakeyaml.events.StreamEndEvent;
import org.yaml.snakeyaml.events.StreamStartEvent;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.ScalarNode;
public class EventConstructor extends Constructor {
public EventConstructor() {
this.yamlConstructors.put(null, new ConstructEvent());
}
private class ConstructEvent extends AbstractConstruct {
@SuppressWarnings("unchecked")
public Object construct(Node node) {
Map<Object, Object> mapping;
if (node instanceof ScalarNode) {
mapping = new HashMap<Object, Object>();
} else {
mapping = constructMapping((MappingNode) node);
}
String className = node.getTag().getValue().substring(1) + "Event";
Event value;
if (className.equals("AliasEvent")) {
value = new AliasEvent((String) mapping.get("anchor"), null, null);
} else if (className.equals("ScalarEvent")) {
String tag = (String) mapping.get("tag");
String v = (String) mapping.get("value");
if (v == null) {
v = "";
}
List<Boolean> implicitList = (List<Boolean>) mapping.get("implicit");
ImplicitTuple implicit;
if (implicitList == null) {
implicit = new ImplicitTuple(false, true);
} else {
implicit = new ImplicitTuple((Boolean) implicitList.get(0),
(Boolean) implicitList.get(1));
}
value = new ScalarEvent((String) mapping.get("anchor"), tag, implicit, v, null,
null, null);
} else if (className.equals("SequenceStartEvent")) {
String tag = (String) mapping.get("tag");
Boolean implicit = (Boolean) mapping.get("implicit");
if (implicit == null) {
implicit = true;
}
value = new SequenceStartEvent((String) mapping.get("anchor"), tag, implicit, null,
null, false);
} else if (className.equals("MappingStartEvent")) {
String tag = (String) mapping.get("tag");
Boolean implicit = (Boolean) mapping.get("implicit");
if (implicit == null) {
implicit = true;
}
value = new MappingStartEvent((String) mapping.get("anchor"), tag, implicit, null,
null, false);
} else if (className.equals("DocumentEndEvent")) {
value = new DocumentEndEvent(null, null, false);
} else if (className.equals("DocumentStartEvent")) {
Map<String, String> tags = (Map<String, String>) mapping.get("tags");
List<Integer> versionList = (List<Integer>) mapping.get("version");
Version version = null;
// TODO ???
if (versionList != null) {
Integer major = versionList.get(0).intValue();
if (major != 1) {
throw new YAMLException("Unsupported version.");
}
Integer minor = versionList.get(1).intValue();
if (minor == 0) {
version = Version.V1_0;
} else {
version = Version.V1_1;
}
}
value = new DocumentStartEvent(null, null, false, version, tags);
} else if (className.equals("MappingEndEvent")) {
value = new MappingEndEvent(null, null);
} else if (className.equals("SequenceEndEvent")) {
value = new SequenceEndEvent(null, null);
} else if (className.equals("StreamEndEvent")) {
value = new StreamEndEvent(null, null);
} else if (className.equals("StreamStartEvent")) {
value = new StreamStartEvent(null, null);
} else {
throw new UnsupportedOperationException();
}
return value;
}
}
}
|