1/**
2 * Copyright (c) 2008, http://www.snakeyaml.org
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package examples.staticstate;
17
18import java.util.ArrayList;
19import java.util.List;
20import java.util.Set;
21
22import junit.framework.TestCase;
23
24import org.yaml.snakeyaml.DumperOptions;
25import org.yaml.snakeyaml.Yaml;
26import org.yaml.snakeyaml.constructor.Constructor;
27import org.yaml.snakeyaml.introspector.Property;
28import org.yaml.snakeyaml.nodes.MappingNode;
29import org.yaml.snakeyaml.nodes.Node;
30import org.yaml.snakeyaml.nodes.NodeTuple;
31import org.yaml.snakeyaml.nodes.ScalarNode;
32import org.yaml.snakeyaml.representer.Representer;
33
34/**
35 * Example with static fields
36 */
37public class StaticFieldsTest extends TestCase {
38    public void testAsJavaBean() {
39        JavaBeanWithStaticState bean = new JavaBeanWithStaticState();
40        bean.setName("Bahrack");
41        bean.setAge(-47);
42        JavaBeanWithStaticState.setType("Represent");
43        JavaBeanWithStaticState.color = "Black";
44        Yaml yaml = new Yaml();
45        String output = yaml.dump(bean);
46        // System.out.println(output);
47        assertEquals("!!examples.staticstate.JavaBeanWithStaticState {age: -47, name: Bahrack}\n",
48                output);
49        // parse back to instance
50        JavaBeanWithStaticState bean2 = (JavaBeanWithStaticState) yaml.load(output);
51        assertEquals(-47, bean2.getAge());
52        assertEquals("Bahrack", bean2.getName());
53    }
54
55    public void testCustomDump() {
56        JavaBeanWithStaticState bean = new JavaBeanWithStaticState();
57        bean.setName("Lui");
58        bean.setAge(25);
59        JavaBeanWithStaticState.setType("Represent");
60        JavaBeanWithStaticState.color = "Black";
61        Yaml yaml = new Yaml(new MyRepresenter(), new DumperOptions());
62        String output = yaml.dump(bean);
63        // System.out.println(output);
64        assertEquals(
65                "!!examples.staticstate.JavaBeanWithStaticState {age: 25, name: Lui, color: Black,\n  type: Represent}\n",
66                output);
67    }
68
69    public void testCustomLoad() {
70        Yaml yaml = new Yaml(new MyConstructor());
71        String output = "!!examples.staticstate.JavaBeanWithStaticState {age: 25, name: Lui, color: Oranje,\n  type: King}\n";
72        JavaBeanWithStaticState bean2 = (JavaBeanWithStaticState) yaml.load(output);
73        assertEquals(25, bean2.getAge());
74        assertEquals("Lui", bean2.getName());
75        assertEquals("Oranje", JavaBeanWithStaticState.color);
76        assertEquals("King", JavaBeanWithStaticState.getType());
77    }
78
79    private class MyRepresenter extends Representer {
80        @Override
81        protected MappingNode representJavaBean(Set<Property> properties, Object javaBean) {
82            MappingNode node = super.representJavaBean(properties, javaBean);
83            if (javaBean instanceof JavaBeanWithStaticState) {
84                List<NodeTuple> value = node.getValue();
85                value.add(new NodeTuple(representData("color"),
86                        representData(JavaBeanWithStaticState.color)));
87                value.add(new NodeTuple(representData("type"),
88                        representData(JavaBeanWithStaticState.getType())));
89            }
90            return node;
91        }
92    }
93
94    private class MyConstructor extends Constructor {
95        protected Object constructObject(Node node) {
96            if (node.getType().isAssignableFrom(JavaBeanWithStaticState.class)) {
97                MappingNode beanNode = (MappingNode) node;
98                List<NodeTuple> value = beanNode.getValue();
99                List<NodeTuple> removed = new ArrayList<NodeTuple>();
100                for (NodeTuple tuple : value) {
101                    ScalarNode keyNode = (ScalarNode) tuple.getKeyNode();
102                    if (keyNode.getValue().equals("color")) {
103                        ScalarNode valueNode = (ScalarNode) tuple.getValueNode();
104                        JavaBeanWithStaticState.color = valueNode.getValue();
105                    } else if (keyNode.getValue().equals("type")) {
106                        ScalarNode valueNode = (ScalarNode) tuple.getValueNode();
107                        JavaBeanWithStaticState.setType(valueNode.getValue());
108                    } else
109                        removed.add(tuple);
110                }
111                beanNode.setValue(removed);
112                JavaBeanWithStaticState bean = (JavaBeanWithStaticState) super
113                        .constructObject(beanNode);
114
115                return bean;
116            } else {
117                return super.constructObject(node);
118            }
119        }
120    }
121}
122