restore removed code back to Constructor, add more tests
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index c63c800..77cfcf5 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -324,6 +324,10 @@
private Object createEmptyJavaBean(Node node) {
try {
+ Class<? extends Object> type = node.getType();
+ if (Modifier.isAbstract(type.getModifiers())) {
+ node.setType(getClassForNode(node));
+ }
/**
* Using only default constructor. Everything else will be
* initialized on 2nd step. If we do here some partial
@@ -336,6 +340,8 @@
throw new YAMLException(e);
} catch (IllegalAccessException e) {
throw new YAMLException(e);
+ } catch (ClassNotFoundException e) {
+ throw new YAMLException(e);
}
}
diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/Shape.java b/src/test/java/org/yaml/snakeyaml/javabeans/Shape.java
new file mode 100644
index 0000000..30d3d54
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/Shape.java
@@ -0,0 +1,9 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.javabeans;
+
+public interface Shape {
+
+ public int process();
+}
diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/Triangle.java b/src/test/java/org/yaml/snakeyaml/javabeans/Triangle.java
new file mode 100644
index 0000000..d5abf8c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/Triangle.java
@@ -0,0 +1,20 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.javabeans;
+
+public class Triangle implements Shape {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int process() {
+ return 7;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBean.java b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBean.java
new file mode 100644
index 0000000..d51e0b8
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBean.java
@@ -0,0 +1,25 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.javabeans;
+
+public class TriangleBean {
+ private String name;
+ private Shape shape;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Shape getShape() {
+ return shape;
+ }
+
+ public void setShape(Shape shape) {
+ this.shape = shape;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java
new file mode 100644
index 0000000..bd1d7b1
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java
@@ -0,0 +1,60 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.javabeans;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.JavaBeanDumper;
+import org.yaml.snakeyaml.JavaBeanLoader;
+
+public class TriangleBeanTest extends TestCase {
+
+ public void testGetTriangle() {
+ Triangle triangle = new Triangle();
+ triangle.setName("Triangle25");
+ TriangleBean bean = new TriangleBean();
+ bean.setShape(triangle);
+ bean.setName("Bean25");
+ JavaBeanDumper beanDumper = new JavaBeanDumper();
+ String output = beanDumper.dump(bean);
+ System.out.println(output);
+ assertEquals(
+ "name: Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle\n name: Triangle25\n",
+ output);
+ JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(
+ TriangleBean.class);
+ TriangleBean loadedBean = beanLoader.load(output);
+ assertNotNull(loadedBean);
+ assertEquals("Bean25", loadedBean.getName());
+ assertEquals(7, loadedBean.getShape().process());
+ }
+
+ public void testClassNotFound() {
+ String output = "name: Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle777\n name: Triangle25\n";
+ JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(
+ TriangleBean.class);
+ try {
+ beanLoader.load(output);
+ fail("Class not found expected.");
+ } catch (Exception e) {
+ assertEquals(
+ "org.yaml.snakeyaml.error.YAMLException: java.lang.ClassNotFoundException: org.yaml.snakeyaml.javabeans.Triangle777",
+ e.getMessage());
+ }
+ }
+
+ /**
+ * Runtime class is more important then the tag (which is ignored if the
+ * class is known)
+ */
+ public void testClassAndTag() {
+ String output = "name: !!whatever Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle\n name: Triangle25\n";
+ JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(
+ TriangleBean.class);
+ TriangleBean loadedBean = beanLoader.load(output);
+ assertNotNull(loadedBean);
+ assertEquals("Bean25", loadedBean.getName());
+ assertEquals(7, loadedBean.getShape().process());
+ }
+}