Add example for howto wiki
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 8d09667..1cb59aa 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,10 @@
</properties>
<body>
<release version="1.8-SNAPSHOT" date="in Mercurial" description="Performance improvement">
+ <action dev="py4fun" type="add">
+ Add example to howto Wiki:
+ How_to_substitute_object_in_YAML_document_with_a_custom_object (2011-01-27)
+ </action>
<action dev="py4fun" type="update">
When the YAML document to be loaded is provided as String parse it directly
without making a Reader first (2011-01-23)
diff --git a/src/test/java/examples/SelectiveConstructorTest.java b/src/test/java/examples/SelectiveConstructorTest.java
new file mode 100644
index 0000000..1689dc1
--- /dev/null
+++ b/src/test/java/examples/SelectiveConstructorTest.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2008-2011, 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 examples;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.nodes.MappingNode;
+import org.yaml.snakeyaml.nodes.NodeId;
+
+/**
+ * Example for http://code.google.com/p/snakeyaml/wiki/howto
+ */
+public class SelectiveConstructorTest extends TestCase {
+ class SelectiveConstructor extends Constructor {
+ public SelectiveConstructor() {
+ // define a custom way to create a mapping node
+ yamlClassConstructors.put(NodeId.mapping, new MyPersistentObjectConstruct());
+ }
+
+ class MyPersistentObjectConstruct extends Constructor.ConstructMapping {
+ @Override
+ protected Object constructJavaBean2ndStep(MappingNode node, Object object) {
+ Class type = node.getType();
+ if (type.equals(MyPersistentObject.class)) {
+ // create a map
+ Map map = constructMapping(node);
+ String id = (String) map.get("id");
+ return new MyPersistentObject(id, 17);
+ } else {
+ // create JavaBean
+ return super.constructJavaBean2ndStep(node, object);
+ }
+ }
+ }
+ }
+
+ public void testConstructor() throws IOException {
+ Yaml yaml = new Yaml(new SelectiveConstructor());
+ List<?> data = (List<?>) yaml
+ .load("- 1\n- 2\n- !!examples.MyPersistentObject {amount: 222, id: persistent}");
+ // System.out.println(data);
+ assertEquals(3, data.size());
+ MyPersistentObject myObject = (MyPersistentObject) data.get(2);
+ assertEquals(17, myObject.getAmount());
+ assertEquals("persistent", myObject.getId());
+ }
+}
+
+class MyPersistentObject {
+ private String id;
+ private int amount;
+
+ public MyPersistentObject() {
+ this.id = "noid";
+ this.amount = 222;
+ }
+
+ public MyPersistentObject(String id, int amount) {
+ this.id = id;
+ this.amount = amount;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public int getAmount() {
+ return amount;
+ }
+
+ public void setAmount(int amount) {
+ this.amount = amount;
+ }
+
+ @Override
+ public String toString() {
+ return "MyPersistentObject [id=" + id + ", amount=" + amount + "]";
+ }
+}