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;

+        }

+    }

+

+}