Issue 25: generic Set does not emit redundant global tags
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 11b754a..a446fb3 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -8,6 +8,9 @@
 	<body>

 		<release version="1.5" date="in Mercurial" description="development: improve performance">

 		    <action dev="py4fun" type="fix">

+                Issue 25: generic Set does not emit redundant global tags (2009-10-22)

+            </action>

+            <action dev="py4fun" type="fix">

                 Issue 25: generic List does not emit redundant global tags (2009-10-22)

             </action>

             <action dev="py4fun" type="fix">

diff --git a/src/main/java/org/yaml/snakeyaml/nodes/Node.java b/src/main/java/org/yaml/snakeyaml/nodes/Node.java
index 944396e..b6f0aca 100644
--- a/src/main/java/org/yaml/snakeyaml/nodes/Node.java
+++ b/src/main/java/org/yaml/snakeyaml/nodes/Node.java
@@ -109,7 +109,6 @@
         return useClassConstructor.booleanValue();
     }
 
-    // TODO do we need it ?
     public void setUseClassConstructor(Boolean useClassConstructor) {
         this.useClassConstructor = useClassConstructor;
     }
diff --git a/src/main/java/org/yaml/snakeyaml/representer/Representer.java b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
index 98addcb..b3f1aa7 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/Representer.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
@@ -115,40 +115,47 @@
                 }
             } else if (memberValue != null && Enum.class.isAssignableFrom(memberValue.getClass())) {
                 nodeValue.setTag(Tags.STR);
-            } else {
-                // generic collections
-                if (nodeValue.getNodeId() != NodeId.scalar) {
-                    Type[] arguments = property.getActualTypeArguments();
-                    if (arguments != null) {
-                        if (nodeValue.getNodeId() == NodeId.sequence
-                                && List.class.isAssignableFrom(memberValue.getClass())) {
-                            Class<? extends Object> t = (Class<? extends Object>) arguments[0];
-                            SequenceNode snode = (SequenceNode) nodeValue;
-                            List<Object> memberList = (List<Object>) memberValue;
-                            Iterator<Object> iter = memberList.iterator();
-                            for (Node childNode : snode.getValue()) {
-                                Object member = iter.next();
-                                if (t.equals(member.getClass())
-                                        && childNode.getNodeId() == NodeId.mapping) {
-                                    childNode.setTag(Tags.MAP);
-                                }
+            }
+            // generic collections
+            if (nodeValue.getNodeId() != NodeId.scalar && !hasAlias) {
+                Type[] arguments = property.getActualTypeArguments();
+                if (arguments != null) {
+                    if (nodeValue.getNodeId() == NodeId.sequence
+                            && List.class.isAssignableFrom(memberValue.getClass())) {
+                        // apply map tag where class is the same
+                        Class<? extends Object> t = (Class<? extends Object>) arguments[0];
+                        SequenceNode snode = (SequenceNode) nodeValue;
+                        List<Object> memberList = (List<Object>) memberValue;
+                        Iterator<Object> iter = memberList.iterator();
+                        for (Node childNode : snode.getValue()) {
+                            Object member = iter.next();
+                            if (t.equals(member.getClass())
+                                    && childNode.getNodeId() == NodeId.mapping) {
+                                childNode.setTag(Tags.MAP);
                             }
-
                         }
-                        // else if (Tags.SET.equals(valueNode.getTag())) {
-                        // Class t = (Class) arguments[0];
-                        // MappingNode mnode = (MappingNode) valueNode;
-                        // mnode.setKeyType(t);
-                        // mnode.setUseClassConstructor(true);
-                        // } else if (valueNode.getNodeId() == NodeId.mapping) {
-                        // Class ketType = (Class) arguments[0];
-                        // Class valueType = (Class) arguments[1];
-                        // MappingNode mnode = (MappingNode) valueNode;
-                        // mnode.setKeyType(ketType);
-                        // mnode.setValueType(valueType);
-                        // mnode.setUseClassConstructor(true);
-                        // }
+
+                    } else if (memberValue instanceof Set) {
+                        Class t = (Class) arguments[0];
+                        MappingNode mnode = (MappingNode) nodeValue;
+                        Iterator<NodeTuple> iter = mnode.getValue().iterator();
+                        Set set = (Set) memberValue;
+                        for (Object member : set) {
+                            NodeTuple tuple = iter.next();
+                            if (t.equals(member.getClass())
+                                    && tuple.getKeyNode().getNodeId() == NodeId.mapping) {
+                                tuple.getKeyNode().setTag(Tags.MAP);
+                            }
+                        }
                     }
+                    // else if (nodeValue.getNodeId() == NodeId.mapping) {
+                    // Class ketType = (Class) arguments[0];
+                    // Class valueType = (Class) arguments[1];
+                    // MappingNode mnode = (MappingNode) nodeValue;
+                    // mnode.setKeyType(ketType);
+                    // mnode.setValueType(valueType);
+                    // mnode.setUseClassConstructor(true);
+                    // }
                 }
             }
             if (nodeKey.getStyle() != null) {
diff --git a/src/test/java/examples/collections/TypeSafeSetImplementationsTest.java b/src/test/java/examples/collections/TypeSafeSetImplementationsTest.java
index 1425c90..dd87185 100644
--- a/src/test/java/examples/collections/TypeSafeSetImplementationsTest.java
+++ b/src/test/java/examples/collections/TypeSafeSetImplementationsTest.java
@@ -47,8 +47,26 @@
         String output = dumper.dump(bean);

         // System.out.println(output);

         String etalon = Util.getLocalResource("examples/set-bean-1.yaml");

-        // TODO dump type safe collections

-        // assertEquals(etalon, output);

+        assertEquals(etalon, output);

+    }

+

+    public void testDumpSet2() {

+        SetBean bean = new SetBean();

+        SortedSet<String> sortedSet = new TreeSet<String>();

+        sortedSet.add("two");

+        sortedSet.add("one");

+        sortedSet.add("three");

+        bean.setSorted(sortedSet);

+        SortedSet<Developer> developers = new TreeSet<Developer>();

+        developers.add(new Developer("John", "founder"));

+        developers.add(new Developer("Karl", "user"));

+        developers.add(new SuperDeveloper("Bill", "super"));

+        bean.setDevelopers(developers);

+        JavaBeanDumper dumper = new JavaBeanDumper(false);

+        String output = dumper.dump(bean);

+        // System.out.println(output);

+        String etalon = Util.getLocalResource("examples/set-bean-6.yaml");

+        assertEquals(etalon, output);

     }

 

     public void testLoadSet() {

@@ -159,6 +177,18 @@
         }

     }

 

+    public static class SuperDeveloper extends Developer {

+

+        public SuperDeveloper() {

+            super();

+        }

+

+        public SuperDeveloper(String string, String string2) {

+            super(string, string2);

+        }

+

+    }

+

     @SuppressWarnings("unchecked")

     public void testNoJavaBeanSetRecursive() {

         Set<Object> set = new HashSet<Object>(3);

diff --git a/src/test/resources/examples/set-bean-1.yaml b/src/test/resources/examples/set-bean-1.yaml
index f030492..b3ae3ae 100644
--- a/src/test/resources/examples/set-bean-1.yaml
+++ b/src/test/resources/examples/set-bean-1.yaml
@@ -8,5 +8,5 @@
 name: Bean123

 sorted: !!set

   one: null

-  two: null

-  three: null
\ No newline at end of file
+  three: null

+  two: null
\ No newline at end of file
diff --git a/src/test/resources/examples/set-bean-6.yaml b/src/test/resources/examples/set-bean-6.yaml
new file mode 100644
index 0000000..c416520
--- /dev/null
+++ b/src/test/resources/examples/set-bean-6.yaml
@@ -0,0 +1,16 @@
+developers: !!set

+  ? !!examples.collections.TypeSafeSetImplementationsTest$SuperDeveloper

+    name: Bill

+    role: super

+  : null

+  ? name: John

+    role: founder

+  : null

+  ? name: Karl

+    role: user

+  : null

+name: Bean123

+sorted: !!set

+  one: null

+  three: null

+  two: null
\ No newline at end of file
diff --git a/src/test/resources/recursive/with-children.yaml b/src/test/resources/recursive/with-children.yaml
index 55a74dc..117bd28 100644
--- a/src/test/resources/recursive/with-children.yaml
+++ b/src/test/resources/recursive/with-children.yaml
@@ -5,8 +5,7 @@
   birthday: 1970-01-12T13:46:40Z
   children: &id003 !!set
     *id002: null
-    ? !!org.yaml.snakeyaml.recursive.Human
-      bankAccountOwner: *id001
+    ? bankAccountOwner: *id001
       birthPlace: New York
       birthday: 1983-04-24T02:40:00Z
       children: !!set {}