fix both parser and emitter for issue 61
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index 691333d..601f8ed 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.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
@@ -273,7 +274,8 @@
if (!typeDetected && valueNode.getNodeId() != NodeId.scalar) {
// only if there is no explicit TypeDescription
Type[] arguments = property.getActualTypeArguments();
- if (arguments != null) {
+ if (arguments != null && !(arguments[0] instanceof TypeVariable)) {
+ // TODO check non Java HotSpot(TM) Server VM
// type safe (generic) collection may contain the
// proper class
if (valueNode.getNodeId() == NodeId.sequence) {
diff --git a/src/main/java/org/yaml/snakeyaml/representer/Representer.java b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
index af6d0b1..5fb4bb9 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/Representer.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
@@ -179,13 +179,9 @@
@SuppressWarnings("unchecked")
protected void checkGlobalTag(Property property, Node node, Object object) {
Type[] arguments = property.getActualTypeArguments();
- if (arguments != null) {
+ if (arguments != null && !(arguments[0] instanceof TypeVariable)) {
if (node.getNodeId() == NodeId.sequence) {
// apply map tag where class is the same
- if (arguments[0] instanceof TypeVariable) {
- // generic collections need the tag
- return;
- }
Class<? extends Object> t = (Class<? extends Object>) arguments[0];
SequenceNode snode = (SequenceNode) node;
List<Object> memberList = (List<Object>) object;
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
similarity index 65%
rename from src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java
rename to src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
index 727254f..06d91f9 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
@@ -22,9 +22,11 @@
import junit.framework.TestCase;
import org.yaml.snakeyaml.JavaBeanDumper;
+import org.yaml.snakeyaml.JavaBeanLoader;
import org.yaml.snakeyaml.Util;
-public class GenericBeanTest extends TestCase {
+public class GenericListBeanTest extends TestCase {
+ @SuppressWarnings("unchecked")
public void testGenericList() throws Exception {
JavaBeanDumper beanDumper = new JavaBeanDumper();
ListProvider<String> listProvider = new ListProvider<String>();
@@ -34,13 +36,14 @@
// System.out.println(s);
assertEquals("list:\n- foo\n- bar\n", s);
// parse
- // JavaBeanLoader<ListProvider> loader = new
- // JavaBeanLoader<ListProvider>(ListProvider.class);
- // ListProvider listProvider2 = loader.load(s);
- // assertEquals("foo", listProvider2.getList().get(0));
- // assertEquals("bar", listProvider2.getList().get(1));
+ JavaBeanLoader<ListProvider> loader = new JavaBeanLoader<ListProvider>(ListProvider.class);
+ ListProvider<String> listProvider2 = loader.load(s);
+ assertEquals("foo", listProvider2.getList().get(0));
+ assertEquals("bar", listProvider2.getList().get(1));
+ assertEquals(listProvider, listProvider2);
}
+ @SuppressWarnings("unchecked")
public void testGenericBean() throws Exception {
JavaBeanDumper beanDumper = new JavaBeanDumper();
ListProvider<Bean> listProvider = new ListProvider<Bean>();
@@ -55,6 +58,15 @@
// System.out.println(s);
String etalon = Util.getLocalResource("issues/issue61-1.yaml");
assertEquals(etalon, s);
+ // parse
+ JavaBeanLoader<ListProvider> loader = new JavaBeanLoader<ListProvider>(ListProvider.class);
+ ListProvider listProvider2 = loader.load(s);
+ Bean foo2 = (Bean) listProvider2.getList().get(0);
+ assertEquals("foo", foo2.getName());
+ assertEquals(0, foo2.getNumber());
+ Bean bar2 = (Bean) listProvider2.getList().get(1);
+ assertEquals("bar", bar2.getName());
+ assertEquals(3, bar2.getNumber());
}
public static class ListProvider<T> {
@@ -67,6 +79,21 @@
public void setList(List<T> list) {
this.list = list;
}
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ListProvider) {
+ return list.equals(((ListProvider) obj).getList());
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return list.hashCode();
+ }
}
public static class Bean {
@@ -89,5 +116,4 @@
this.number = number;
}
}
-
}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java
new file mode 100644
index 0000000..859fa67
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2008-2010 Andrey Somov
+ *
+ * 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.issue61;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.JavaBeanDumper;
+import org.yaml.snakeyaml.JavaBeanLoader;
+import org.yaml.snakeyaml.Util;
+
+public class GenericMapBeanTest extends TestCase {
+ @SuppressWarnings("unchecked")
+ public void testGenericMap() throws Exception {
+ JavaBeanDumper beanDumper = new JavaBeanDumper();
+ MapProvider<String, Integer> listProvider = new MapProvider<String, Integer>();
+ listProvider.getMap().put("foo", 17);
+ listProvider.getMap().put("bar", 19);
+ String s = beanDumper.dump(listProvider);
+ // System.out.println(s);
+ assertEquals("map:\n foo: 17\n bar: 19\n", s);
+ // parse
+ JavaBeanLoader<MapProvider> loader = new JavaBeanLoader<MapProvider>(MapProvider.class);
+ MapProvider<String, Integer> listProvider2 = loader.load(s);
+ assertEquals(new Integer(17), listProvider2.getMap().get("foo"));
+ assertEquals(new Integer(19), listProvider2.getMap().get("bar"));
+ assertEquals(listProvider, listProvider2);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testGenericBean() throws Exception {
+ JavaBeanDumper beanDumper = new JavaBeanDumper();
+ MapProvider<String, Bean> listProvider = new MapProvider<String, Bean>();
+ Bean foo = new Bean();
+ foo.setName("foo");
+ listProvider.getMap().put("foo", foo);
+ Bean bar = new Bean();
+ bar.setName("bar");
+ bar.setNumber(3);
+ listProvider.getMap().put("bar", bar);
+ String s = beanDumper.dump(listProvider);
+ // System.out.println(s);
+ String etalon = Util.getLocalResource("issues/issue61-2.yaml");
+ assertEquals(etalon, s);
+ // parse
+ JavaBeanLoader<MapProvider> loader = new JavaBeanLoader<MapProvider>(MapProvider.class);
+ MapProvider listProvider2 = loader.load(s);
+ Bean foo2 = (Bean) listProvider2.getMap().get("foo");
+ assertEquals("foo", foo2.getName());
+ assertEquals(0, foo2.getNumber());
+ Bean bar2 = (Bean) listProvider2.getMap().get("bar");
+ assertEquals("bar", bar2.getName());
+ assertEquals(3, bar2.getNumber());
+ }
+
+ public static class MapProvider<K, V> {
+ private Map<K, V> map = new HashMap<K, V>();
+
+ public Map<K, V> getMap() {
+ return map;
+ }
+
+ public void setMap(Map<K, V> map) {
+ this.map = map;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MapProvider) {
+ return map.equals(((MapProvider) obj).getMap());
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return map.hashCode();
+ }
+ }
+
+ public static class Bean {
+ private String name;
+ private int number;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+ }
+}
diff --git a/src/test/resources/issues/issue61-1.yaml b/src/test/resources/issues/issue61-1.yaml
index 52e1f43..80361f2 100644
--- a/src/test/resources/issues/issue61-1.yaml
+++ b/src/test/resources/issues/issue61-1.yaml
@@ -1,7 +1,7 @@
list:
-- !!org.yaml.snakeyaml.issues.issue61.GenericBeanTest$Bean
+- !!org.yaml.snakeyaml.issues.issue61.GenericListBeanTest$Bean
name: foo
number: 0
-- !!org.yaml.snakeyaml.issues.issue61.GenericBeanTest$Bean
+- !!org.yaml.snakeyaml.issues.issue61.GenericListBeanTest$Bean
name: bar
number: 3
diff --git a/src/test/resources/issues/issue61-2.yaml b/src/test/resources/issues/issue61-2.yaml
new file mode 100644
index 0000000..2aea65c
--- /dev/null
+++ b/src/test/resources/issues/issue61-2.yaml
@@ -0,0 +1,7 @@
+map:
+ foo: !!org.yaml.snakeyaml.issues.issue61.GenericMapBeanTest$Bean
+ name: foo
+ number: 0
+ bar: !!org.yaml.snakeyaml.issues.issue61.GenericMapBeanTest$Bean
+ name: bar
+ number: 3