blob: d294662170976b5dd5ce0034a14bc2575ff3919b [file] [log] [blame]
/**
* Copyright (c) 2008-2013, 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.constructor;
import java.util.List;
import junit.framework.TestCase;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.ScalarNode;
import org.yaml.snakeyaml.nodes.SequenceNode;
import org.yaml.snakeyaml.nodes.Tag;
/**
* Example to process a family of tags with the same prefix with one constructor
* (PrefixConstruct)
*/
public class PrefixConstructorTest extends TestCase {
@SuppressWarnings("unchecked")
public void test1() {
Yaml yaml = new Yaml(new CustomConstructor());
String input = "- !org.yaml.Foo 123\n- !org.yaml.Bar 456\n- !org.yaml.Exact 789\n- !Immutable [aaa, bbb]";
List<Extra> list = (List<Extra>) yaml.load(input);
assertEquals(4, list.size());
Extra foo = list.get(0);
assertEquals("Foo", foo.getName());
assertEquals("123", foo.getValue());
//
Extra bar = list.get(1);
assertEquals("Bar", bar.getName());
assertEquals("456", bar.getValue());
//
Extra item = list.get(2);
assertEquals("Item", item.getName());
assertEquals("789", item.getValue());
//
Extra immut = list.get(3);
assertEquals("aaa", immut.getName());
assertEquals("bbb", immut.getValue());
}
private class CustomConstructor extends SafeConstructor {
public CustomConstructor() {
// define tags which begin with !org.yaml.
String prefix = "!org.yaml.";
this.yamlMultiConstructors.put(prefix, new PrefixConstruct(prefix,
CustomConstructor.this));
this.yamlConstructors.put(null, new ConstructUnknown(CustomConstructor.this));
this.yamlConstructors.put(new Tag("!org.yaml.Exact"), new ExactConstruct(
CustomConstructor.this));
}
}
/**
* Process tags which start with '!org.yaml.'
*/
private class PrefixConstruct extends AbstractConstruct {
private String prefix;
private BaseConstructor con;
public PrefixConstruct(String prefix, BaseConstructor con) {
this.prefix = prefix;
this.con = con;
}
public Object construct(Node node) {
String suffix = node.getTag().getValue().substring(prefix.length());
return new Extra(suffix, con.constructScalar((ScalarNode) node).toString());
}
}
/**
* This has more priority then PrefixConstruct
*/
private class ExactConstruct extends AbstractConstruct {
private BaseConstructor con;
public ExactConstruct(BaseConstructor con) {
this.con = con;
}
public Object construct(Node node) {
return new Extra("Item", con.constructScalar((ScalarNode) node).toString());
}
}
/**
* Process unrecognised tags
*/
private class ConstructUnknown extends AbstractConstruct {
private BaseConstructor con;
public ConstructUnknown(BaseConstructor con) {
this.con = con;
}
@SuppressWarnings("unchecked")
public Object construct(Node node) {
List<String> list = (List<String>) con.constructSequence((SequenceNode) node);
return new Extra(list.get(0), list.get(1));
}
}
private class Extra {
private String name;
private String value;
public Extra(String name, String value) {
this.name = name;
this.value = value;
}
public String getValue() {
return value;
}
public String getName() {
return name;
}
}
}