1b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov/**
211a89b445f3bde56bf07e6a0d04f0b0256dcb215Andrey Somov * Copyright (c) 2008, http://www.snakeyaml.org
3b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov *
4b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * Licensed under the Apache License, Version 2.0 (the "License");
5b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * you may not use this file except in compliance with the License.
6b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * You may obtain a copy of the License at
7b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov *
8b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov *     http://www.apache.org/licenses/LICENSE-2.0
9b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov *
10b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * Unless required by applicable law or agreed to in writing, software
11b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * distributed under the License is distributed on an "AS IS" BASIS,
12b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * See the License for the specific language governing permissions and
14b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * limitations under the License.
15b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov */
16b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovpackage org.yaml.snakeyaml;
17b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
18b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.io.IOException;
19b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.io.InputStream;
20b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.io.Reader;
21b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.io.StringReader;
22b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.io.StringWriter;
23b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.io.Writer;
24b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.util.ArrayList;
25b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.util.Iterator;
26b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.util.List;
27b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport java.util.regex.Pattern;
28b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
29b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.DumperOptions.FlowStyle;
30b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.composer.Composer;
31b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.constructor.BaseConstructor;
32b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.constructor.Constructor;
33b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.emitter.Emitable;
34b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.emitter.Emitter;
35b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.error.YAMLException;
36b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.events.Event;
37b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.introspector.BeanAccess;
38b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.nodes.Node;
39b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.nodes.Tag;
40b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.parser.Parser;
41b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.parser.ParserImpl;
42b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.reader.StreamReader;
43b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.reader.UnicodeReader;
44b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.representer.Representer;
45b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.resolver.Resolver;
46b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovimport org.yaml.snakeyaml.serializer.Serializer;
47b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
48b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov/**
49b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov * Public YAML interface. Each Thread must have its own instance.
50b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov */
51b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somovpublic class Yaml {
52b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    protected final Resolver resolver;
53b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    private String name;
54b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    protected BaseConstructor constructor;
55b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    protected Representer representer;
56b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    protected DumperOptions dumperOptions;
57b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
58b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
59b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Create Yaml instance. It is safe to create a few instances and use them
60b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * in different Threads.
61b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
62b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Yaml() {
6334f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        this(new Constructor(), new Representer(), new DumperOptions(), new Resolver());
64b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
65b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
6634f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov    /**
67b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Create Yaml instance.
68b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
69b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param dumperOptions
70b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            DumperOptions to configure outgoing objects
71b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
72b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Yaml(DumperOptions dumperOptions) {
73b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        this(new Constructor(), new Representer(), dumperOptions);
74b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
75b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
76b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
77b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Create Yaml instance. It is safe to create a few instances and use them
78b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * in different Threads.
79b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
80b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param representer
81b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Representer to emit outgoing objects
82b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
83b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Yaml(Representer representer) {
84b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        this(new Constructor(), representer);
85b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
86b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
87b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
88b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Create Yaml instance. It is safe to create a few instances and use them
89b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * in different Threads.
90b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
91b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param constructor
92b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            BaseConstructor to construct incoming documents
93b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
94b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Yaml(BaseConstructor constructor) {
95b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        this(constructor, new Representer());
96b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
97b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
98b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
99b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Create Yaml instance. It is safe to create a few instances and use them
100b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * in different Threads.
101b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
102b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param constructor
103b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            BaseConstructor to construct incoming documents
104b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param representer
105b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Representer to emit outgoing objects
106b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
107b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Yaml(BaseConstructor constructor, Representer representer) {
108b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        this(constructor, representer, new DumperOptions());
109b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
110b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
111b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
112b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Create Yaml instance. It is safe to create a few instances and use them
113b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * in different Threads.
114b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
115b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param representer
116b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Representer to emit outgoing objects
117b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param dumperOptions
118b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            DumperOptions to configure outgoing objects
119b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
120b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Yaml(Representer representer, DumperOptions dumperOptions) {
121b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        this(new Constructor(), representer, dumperOptions, new Resolver());
122b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
123b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
124b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
125b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Create Yaml instance. It is safe to create a few instances and use them
126b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * in different Threads.
127b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
128b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param constructor
129b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            BaseConstructor to construct incoming documents
130b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param representer
131b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Representer to emit outgoing objects
132b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param dumperOptions
133b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            DumperOptions to configure outgoing objects
134b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
135b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Yaml(BaseConstructor constructor, Representer representer, DumperOptions dumperOptions) {
136b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        this(constructor, representer, dumperOptions, new Resolver());
137b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
138b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
139b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
140b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Create Yaml instance. It is safe to create a few instances and use them
141b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * in different Threads.
142b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
143b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param constructor
144b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            BaseConstructor to construct incoming documents
145b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param representer
146b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Representer to emit outgoing objects
147b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param dumperOptions
148b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            DumperOptions to configure outgoing objects
149b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param resolver
150b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Resolver to detect implicit type
151b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
152b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Yaml(BaseConstructor constructor, Representer representer, DumperOptions dumperOptions,
153b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            Resolver resolver) {
15434f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        if (!constructor.isExplicitPropertyUtils()) {
15534f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov            constructor.setPropertyUtils(representer.getPropertyUtils());
15634f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        } else if (!representer.isExplicitPropertyUtils()) {
15734f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov            representer.setPropertyUtils(constructor.getPropertyUtils());
15834f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        }
15934f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        this.constructor = constructor;
16034f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        representer.setDefaultFlowStyle(dumperOptions.getDefaultFlowStyle());
16134f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        representer.setDefaultScalarStyle(dumperOptions.getDefaultScalarStyle());
16234f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        representer.getPropertyUtils().setAllowReadOnlyProperties(
16334f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov                dumperOptions.isAllowReadOnlyProperties());
16401941860274d824eea6368593d45680755608374Andrey Somov        representer.setTimeZone(dumperOptions.getTimeZone());
16534f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        this.representer = representer;
16634f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        this.dumperOptions = dumperOptions;
16734f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        this.resolver = resolver;
16834f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov        this.name = "Yaml:" + System.identityHashCode(this);
169b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
170b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
171b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
172b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Serialize a Java object into a YAML String.
173b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
174b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param data
175b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Java object to be Serialized to YAML
176b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return YAML String
177b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
178b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public String dump(Object data) {
179b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        List<Object> list = new ArrayList<Object>(1);
180b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        list.add(data);
181b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return dumpAll(list.iterator());
182b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
183b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
184b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
185b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Produce the corresponding representation tree for a given Object.
186b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
187f3549a5225ecec53c9b130e4222fa478380b693bAndrey Somov     * @see <a href="http://yaml.org/spec/1.1/#id859333">Figure 3.1. Processing
188f3549a5225ecec53c9b130e4222fa478380b693bAndrey Somov     *      Overview</a>
189b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param data
190b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            instance to build the representation tree for
191b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return representation tree
192b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
193b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Node represent(Object data) {
194b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return representer.represent(data);
195b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
196b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
197b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
198b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Serialize a sequence of Java objects into a YAML String.
199b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
200b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param data
201b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Iterator with Objects
202b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return YAML String with all the objects in proper sequence
203b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
204b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public String dumpAll(Iterator<? extends Object> data) {
205b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        StringWriter buffer = new StringWriter();
206615d3719f75e5aad70d1598ef160123705008216Andrey Somov        dumpAll(data, buffer, null);
207b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return buffer.toString();
208b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
209b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
210b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
211b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Serialize a Java object into a YAML stream.
212b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
213b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param data
214b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Java object to be serialized to YAML
215b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param output
216b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            stream to write to
217b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
218b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public void dump(Object data, Writer output) {
219b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        List<Object> list = new ArrayList<Object>(1);
220b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        list.add(data);
221615d3719f75e5aad70d1598ef160123705008216Andrey Somov        dumpAll(list.iterator(), output, null);
222b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
223b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
224b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
225b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Serialize a sequence of Java objects into a YAML stream.
226b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
227b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param data
228b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Iterator with Objects
229b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param output
230b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            stream to write to
231b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
232b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public void dumpAll(Iterator<? extends Object> data, Writer output) {
233615d3719f75e5aad70d1598ef160123705008216Andrey Somov        dumpAll(data, output, null);
234b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
235b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
236b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    private void dumpAll(Iterator<? extends Object> data, Writer output, Tag rootTag) {
237b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        Serializer serializer = new Serializer(new Emitter(output, dumperOptions), resolver,
238b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                dumperOptions, rootTag);
239b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        try {
240b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            serializer.open();
241b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            while (data.hasNext()) {
242b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                Node node = representer.represent(data.next());
243b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                serializer.serialize(node);
244b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
245b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            serializer.close();
24625ac3b280b35ddb9167e0528626e2ec14488f173Andrey Somov        } catch (IOException e) {
247b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            throw new YAMLException(e);
248b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
249b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
250b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
251b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
252b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * <p>
253b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Serialize a Java object into a YAML string. Override the default root tag
254b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * with <code>rootTag</code>.
255b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * </p>
256b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
257b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * <p>
258b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * This method is similar to <code>Yaml.dump(data)</code> except that the
259b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * root tag for the whole document is replaced with the given tag. This has
260b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * two main uses.
261b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * </p>
262b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
263b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * <p>
264b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * First, if the root tag is replaced with a standard YAML tag, such as
265b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * <code>Tag.MAP</code>, then the object will be dumped as a map. The root
266b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * tag will appear as <code>!!map</code>, or blank (implicit !!map).
267b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * </p>
268b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
269b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * <p>
270b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Second, if the root tag is replaced by a different custom tag, then the
271b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * document appears to be a different type when loaded. For example, if an
272b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * instance of MyClass is dumped with the tag !!YourClass, then it will be
273b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * handled as an instance of YourClass when loaded.
274b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * </p>
275b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
276b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param data
277b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Java object to be serialized to YAML
278b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param rootTag
279b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            the tag for the whole YAML document. The tag should be Tag.MAP
280b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            for a JavaBean to make the tag disappear (to use implicit tag
281b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            !!map). If <code>null</code> is provided then the standard tag
282b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            with the full class name is used.
283b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param flowStyle
284b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            flow style for the whole document. See Chapter 10. Collection
285b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Styles http://yaml.org/spec/1.1/#id930798. If
286b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            <code>null</code> is provided then the flow style from
287b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            DumperOptions is used.
288b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
289b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return YAML String
290b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
291b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public String dumpAs(Object data, Tag rootTag, FlowStyle flowStyle) {
292b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        FlowStyle oldStyle = representer.getDefaultFlowStyle();
293b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        if (flowStyle != null) {
294b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            representer.setDefaultFlowStyle(flowStyle);
295b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
296b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        List<Object> list = new ArrayList<Object>(1);
297b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        list.add(data);
298b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        StringWriter buffer = new StringWriter();
299b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        dumpAll(list.iterator(), buffer, rootTag);
300b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        representer.setDefaultFlowStyle(oldStyle);
301b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return buffer.toString();
302b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
303b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
304b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
305b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * <p>
306b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Serialize a Java object into a YAML string. Override the default root tag
307b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * with <code>Tag.MAP</code>.
308b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * </p>
309b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * <p>
310b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * This method is similar to <code>Yaml.dump(data)</code> except that the
311b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * root tag for the whole document is replaced with <code>Tag.MAP</code> tag
312b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * (implicit !!map).
313b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * </p>
314b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * <p>
315b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Block Mapping is used as the collection style. See 10.2.2. Block Mappings
316b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * (http://yaml.org/spec/1.1/#id934537)
317b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * </p>
318b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
319b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param data
320b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Java object to be serialized to YAML
321b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return YAML String
322b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
323b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public String dumpAsMap(Object data) {
324b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return dumpAs(data, Tag.MAP, FlowStyle.BLOCK);
325b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
326b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
327b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
328b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Serialize the representation tree into Events.
329b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
330f3549a5225ecec53c9b130e4222fa478380b693bAndrey Somov     * @see <a href="http://yaml.org/spec/1.1/#id859333">Processing Overview</a>
331b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param data
332b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            representation tree
333b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return Event list
334b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
335b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public List<Event> serialize(Node data) {
336b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        SilentEmitter emitter = new SilentEmitter();
337615d3719f75e5aad70d1598ef160123705008216Andrey Somov        Serializer serializer = new Serializer(emitter, resolver, dumperOptions, null);
338b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        try {
339b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            serializer.open();
340b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            serializer.serialize(data);
341b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            serializer.close();
34225ac3b280b35ddb9167e0528626e2ec14488f173Andrey Somov        } catch (IOException e) {
343b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            throw new YAMLException(e);
344b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
345b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return emitter.getEvents();
346b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
347b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
34834f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov    private static class SilentEmitter implements Emitable {
349b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        private List<Event> events = new ArrayList<Event>(100);
350b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
351b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        public List<Event> getEvents() {
352b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            return events;
353b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
354b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
355b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        public void emit(Event event) throws IOException {
356b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            events.add(event);
357b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
358b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
359b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
360b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
361b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse the only YAML document in a String and produce the corresponding
362b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Java object. (Because the encoding in known BOM is not respected.)
363b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
364b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param yaml
365b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            YAML data to load from (BOM must not be present)
366b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed object
367b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
368b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Object load(String yaml) {
369b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return loadFromReader(new StreamReader(yaml), Object.class);
370b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
371b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
372b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
373b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse the only YAML document in a stream and produce the corresponding
374b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Java object.
375b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
376b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param io
377b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            data to load from (BOM is respected and removed)
378b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed object
379b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
380b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Object load(InputStream io) {
381b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return loadFromReader(new StreamReader(new UnicodeReader(io)), Object.class);
382b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
383b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
384b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
385b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse the only YAML document in a stream and produce the corresponding
386b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Java object.
387b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
388b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param io
389b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            data to load from (BOM must not be present)
390b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed object
391b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
392b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Object load(Reader io) {
393b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return loadFromReader(new StreamReader(io), Object.class);
394b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
395b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
396b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
397b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse the only YAML document in a stream and produce the corresponding
398b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Java object.
399b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
400b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param <T>
401b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Class is defined by the second argument
402b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param io
403b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            data to load from (BOM must not be present)
404b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param type
405b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Class of the object to be created
406b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed object
407b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
408b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    @SuppressWarnings("unchecked")
409b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public <T> T loadAs(Reader io, Class<T> type) {
410b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return (T) loadFromReader(new StreamReader(io), type);
411b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
412b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
413b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
414b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse the only YAML document in a String and produce the corresponding
415b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Java object. (Because the encoding in known BOM is not respected.)
416b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
417b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param <T>
418b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Class is defined by the second argument
419b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param yaml
420b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            YAML data to load from (BOM must not be present)
421b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param type
422b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Class of the object to be created
423b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed object
424b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
425b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    @SuppressWarnings("unchecked")
426b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public <T> T loadAs(String yaml, Class<T> type) {
427b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return (T) loadFromReader(new StreamReader(yaml), type);
428b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
429b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
430b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
431b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse the only YAML document in a stream and produce the corresponding
432b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Java object.
433b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
434b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param <T>
435b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Class is defined by the second argument
436b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param input
437b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            data to load from (BOM is respected and removed)
438b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param type
439b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            Class of the object to be created
440b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed object
441b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
442b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    @SuppressWarnings("unchecked")
443b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public <T> T loadAs(InputStream input, Class<T> type) {
444b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return (T) loadFromReader(new StreamReader(new UnicodeReader(input)), type);
445b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
446b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
447b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    private Object loadFromReader(StreamReader sreader, Class<?> type) {
448b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        Composer composer = new Composer(new ParserImpl(sreader), resolver);
449b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        constructor.setComposer(composer);
450b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return constructor.getSingleData(type);
451b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
452b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
453b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
454b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse all YAML documents in a String and produce corresponding Java
455b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * objects. The documents are parsed only when the iterator is invoked.
456b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
457b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param yaml
458b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            YAML data to load from (BOM must not be present)
459b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return an iterator over the parsed Java objects in this String in proper
460b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *         sequence
461b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
462b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Iterable<Object> loadAll(Reader yaml) {
463b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
464b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        constructor.setComposer(composer);
465b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        Iterator<Object> result = new Iterator<Object>() {
466b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public boolean hasNext() {
467b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                return constructor.checkData();
468b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
469b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
470b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public Object next() {
471b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                return constructor.getData();
472b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
473b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
474b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public void remove() {
475b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                throw new UnsupportedOperationException();
476b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
477b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        };
478b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return new YamlIterable(result);
479b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
480b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
48134f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov    private static class YamlIterable implements Iterable<Object> {
482b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        private Iterator<Object> iterator;
483b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
484b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        public YamlIterable(Iterator<Object> iterator) {
485b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            this.iterator = iterator;
486b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
487b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
488b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        public Iterator<Object> iterator() {
489b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            return iterator;
490b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
491b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
492b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
493b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
494b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse all YAML documents in a String and produce corresponding Java
495b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * objects. (Because the encoding in known BOM is not respected.) The
496b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * documents are parsed only when the iterator is invoked.
497b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
498b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param yaml
499b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            YAML data to load from (BOM must not be present)
500b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return an iterator over the parsed Java objects in this String in proper
501b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *         sequence
502b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
503b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Iterable<Object> loadAll(String yaml) {
504b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return loadAll(new StringReader(yaml));
505b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
506b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
507b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
508b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse all YAML documents in a stream and produce corresponding Java
509b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * objects. The documents are parsed only when the iterator is invoked.
510b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
511b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param yaml
512b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            YAML data to load from (BOM is respected and ignored)
513b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return an iterator over the parsed Java objects in this stream in proper
514b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *         sequence
515b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
516b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Iterable<Object> loadAll(InputStream yaml) {
517b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return loadAll(new UnicodeReader(yaml));
518b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
519b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
520b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
521b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse the first YAML document in a stream and produce the corresponding
522b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * representation tree. (This is the opposite of the represent() method)
523b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
524f3549a5225ecec53c9b130e4222fa478380b693bAndrey Somov     * @see <a href="http://yaml.org/spec/1.1/#id859333">Figure 3.1. Processing
525f3549a5225ecec53c9b130e4222fa478380b693bAndrey Somov     *      Overview</a>
526b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param yaml
527b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            YAML document
528b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed root Node for the specified YAML document
529b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
530b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Node compose(Reader yaml) {
531b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
532b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        constructor.setComposer(composer);
533b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return composer.getSingleNode();
534b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
535b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
536b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
537b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse all YAML documents in a stream and produce corresponding
538b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * representation trees.
539b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
540f3549a5225ecec53c9b130e4222fa478380b693bAndrey Somov     * @see <a href="http://yaml.org/spec/1.1/#id859333">Processing Overview</a>
541b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param yaml
542b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            stream of YAML documents
543b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed root Nodes for all the specified YAML documents
544b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
545b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Iterable<Node> composeAll(Reader yaml) {
546b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        final Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
547b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        constructor.setComposer(composer);
548b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        Iterator<Node> result = new Iterator<Node>() {
549b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public boolean hasNext() {
550b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                return composer.checkNode();
551b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
552b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
553b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public Node next() {
554b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                return composer.getNode();
555b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
556b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
557b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public void remove() {
558b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                throw new UnsupportedOperationException();
559b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
560b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        };
561b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return new NodeIterable(result);
562b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
563b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
56434f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov    private static class NodeIterable implements Iterable<Node> {
565b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        private Iterator<Node> iterator;
566b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
567b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        public NodeIterable(Iterator<Node> iterator) {
568b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            this.iterator = iterator;
569b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
570b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
571b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        public Iterator<Node> iterator() {
572b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            return iterator;
573b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
574b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
575b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
576b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
577b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Add an implicit scalar detector. If an implicit scalar value matches the
578b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * given regexp, the corresponding tag is assigned to the scalar.
579b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
580b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param tag
581b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            tag to assign to the node
582b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param regexp
583b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            regular expression to match against
584b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param first
585b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            a sequence of possible initial characters or null (which means
586b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            any).
587b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
588b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public void addImplicitResolver(Tag tag, Pattern regexp, String first) {
589b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        resolver.addImplicitResolver(tag, regexp, first);
590b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
591b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
592b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    @Override
593b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public String toString() {
594b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return name;
595b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
596b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
597b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
598b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Get a meaningful name. It simplifies debugging in a multi-threaded
599b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * environment. If nothing is set explicitly the address of the instance is
600b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * returned.
601b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
602b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return human readable name
603b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
604b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public String getName() {
605b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return name;
606b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
607b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
608b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
609b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Set a meaningful name to be shown in toString()
610b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
611b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param name
612b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            human readable name
613b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
614b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public void setName(String name) {
615b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        this.name = name;
616b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
617b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
618b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    /**
619b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * Parse a YAML stream and produce parsing events.
620b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *
621f3549a5225ecec53c9b130e4222fa478380b693bAndrey Somov     * @see <a href="http://yaml.org/spec/1.1/#id859333">Processing Overview</a>
622b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @param yaml
623b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     *            YAML document(s)
624b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     * @return parsed events
625b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov     */
626b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public Iterable<Event> parse(Reader yaml) {
627b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        final Parser parser = new ParserImpl(new StreamReader(yaml));
628b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        Iterator<Event> result = new Iterator<Event>() {
629b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public boolean hasNext() {
630b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                return parser.peekEvent() != null;
631b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
632b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
633b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public Event next() {
634b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                return parser.getEvent();
635b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
636b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
637b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            public void remove() {
638b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov                throw new UnsupportedOperationException();
639b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            }
640b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        };
641b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        return new EventIterable(result);
642b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
643b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
64434f59d77fd0a29b085d4c642eb1db6b8925fc3c3Andrey Somov    private static class EventIterable implements Iterable<Event> {
645b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        private Iterator<Event> iterator;
646b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
647b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        public EventIterable(Iterator<Event> iterator) {
648b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            this.iterator = iterator;
649b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
650b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
651b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        public Iterator<Event> iterator() {
652b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov            return iterator;
653b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        }
654b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
655b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
656b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    public void setBeanAccess(BeanAccess beanAccess) {
657b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        constructor.getPropertyUtils().setBeanAccess(beanAccess);
658b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov        representer.getPropertyUtils().setBeanAccess(beanAccess);
659b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov    }
660b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov
661b5f4ec3dfb1a49968ebcc1243da10af9a2dc54a2Andrey Somov}
662