Fix issue 72: Support java.util.Collection as a parent for List and Set
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b78c5af..6f6e251 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,9 @@
</properties>
<body>
<release version="1.7" date="in Mercurial" description="development">
+ <action dev="py4fun" type="add" issue="72" due-to="birnbuazn">
+ Support java.util.Collection as a parent for List and Set (2010-07-09)
+ </action>
<action dev="maslovalex" type="add" issue="55" due-to="birnbuazn">
Allow direct field access bypassing setters and getters. Empty constructor
is required to support 2-step construction (2010-07-02)
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index 39cc980..118eb56 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -22,6 +22,7 @@
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -36,7 +37,6 @@
import org.yaml.snakeyaml.TypeDescription;
import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.introspector.Property;
-import org.yaml.snakeyaml.introspector.PropertyUtils;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.NodeId;
@@ -165,7 +165,7 @@
constructSet2ndStep(mnode, set);
}
return set;
- } else if (Set.class.isAssignableFrom(node.getType())) {
+ } else if (Collection.class.isAssignableFrom(node.getType())) {
if (node.isTwoStepsConstruction()) {
return createDefaultSet();
} else {
@@ -489,7 +489,7 @@
@SuppressWarnings("unchecked")
public Object construct(Node node) {
SequenceNode snode = (SequenceNode) node;
- if (List.class.isAssignableFrom(node.getType())) {
+ if (Collection.class.isAssignableFrom(node.getType())) {
if (node.isTwoStepsConstruction()) {
return createDefaultList(snode.getValue().size());
} else {
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue72/CollectionTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue72/CollectionTest.java
new file mode 100644
index 0000000..45d219d
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue72/CollectionTest.java
@@ -0,0 +1,92 @@
+/**
+ * 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.issues.issue72;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.JavaBeanDumper;
+import org.yaml.snakeyaml.JavaBeanLoader;
+
+public class CollectionTest extends TestCase {
+
+ public void testCollectionList() {
+ CollectionList bean = new CollectionList();
+ JavaBeanDumper dumper = new JavaBeanDumper();
+ String doc = dumper.dump(bean);
+ // System.out.println(doc);
+ JavaBeanLoader<CollectionList> beanLoader = new JavaBeanLoader<CollectionList>(
+ CollectionList.class);
+ CollectionList parsed = beanLoader.load(doc);
+ assertTrue(parsed.getNames().contains("aaa"));
+ assertTrue(parsed.getNames().contains("bbb"));
+ assertEquals(2, parsed.getNames().size());
+ }
+
+ public static class CollectionList {
+ private Collection<String> names;
+
+ public CollectionList() {
+ names = new ArrayList<String>();
+ names.add("aaa");
+ names.add("bbb");
+ }
+
+ public Collection<String> getNames() {
+ return names;
+ }
+
+ public void setNames(Collection<String> names) {
+ this.names = names;
+ }
+ }
+
+ public void testCollectionSet() {
+ CollectionSet bean = new CollectionSet();
+ JavaBeanDumper dumper = new JavaBeanDumper();
+ String doc = dumper.dump(bean);
+ // System.out.println(doc);
+ JavaBeanLoader<CollectionSet> beanLoader = new JavaBeanLoader<CollectionSet>(
+ CollectionSet.class);
+ CollectionSet parsed = beanLoader.load(doc);
+ assertTrue(parsed.getRoles().contains(11));
+ assertTrue(parsed.getRoles().contains(13));
+ assertEquals(2, parsed.getRoles().size());
+ }
+
+ public static class CollectionSet {
+ private Collection<Integer> roles;
+
+ public CollectionSet() {
+ roles = new HashSet<Integer>();
+ roles.add(11);
+ roles.add(13);
+ }
+
+ public Collection<Integer> getRoles() {
+ return roles;
+ }
+
+ public void setRoles(Collection<Integer> roles) {
+ this.roles = roles;
+ }
+ }
+
+}