blob: feb773d9aa8f602c71abe15ec8dd6bd5dffff27b [file] [log] [blame]
/**
* 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;
}
}
}