/** | |
* Copyright (c) 2008-2010, http://code.google.com/p/snakeyaml/ | |
* | |
* 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.Loader; | |
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 Loader(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; | |
} | |
} | |
} |