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 {}