Fix issue 183: Support Number class
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f45f804..c9f671d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,9 @@
</properties>
<body>
<release version="1.14-SNAPSHOT" date="in Mercurial" description="Maintenance">
+ <action dev="py4fun" type="fix" issue="183">
+ Support Number class (2013-11-07)
+ </action>
<action dev="py4fun" type="fix" issue="182">
Double.POSITIVE_INFINITY applied to float fields (2013-11-07)
</action>
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index 847aa7e..c135504 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -492,6 +492,9 @@
ConstructYamlTimestamp contr = new ConstructYamlTimestamp();
contr.construct(node);
result = contr.getCalendar();
+ } else if (Number.class.isAssignableFrom(type)) {
+ ConstructYamlNumber contr = new ConstructYamlNumber();
+ result = contr.construct(node);
} else {
throw new YAMLException("Unsupported class: " + type);
}
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java
index e8f4214..1ce65c1 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java
@@ -16,6 +16,8 @@
package org.yaml.snakeyaml.constructor;
import java.math.BigInteger;
+import java.text.NumberFormat;
+import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
@@ -271,6 +273,20 @@
}
}
+ public static class ConstructYamlNumber extends AbstractConstruct {
+ private final NumberFormat nf = NumberFormat.getInstance();
+
+ public Object construct(Node node) {
+ ScalarNode scalar = (ScalarNode) node;
+ try {
+ return nf.parse(scalar.getValue());
+ } catch (ParseException e) {
+ throw new IllegalArgumentException("Unable to parse as Number: "
+ + scalar.getValue());
+ }
+ }
+ }
+
private final static Pattern TIMESTAMP_REGEXP = Pattern
.compile("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[ \t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \t]*(?:Z|([-+][0-9][0-9]?)(?::([0-9][0-9])?)?))?)?$");
private final static Pattern YMD_REGEXP = Pattern
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/BigDecimalBeanConstructorTest.java b/src/test/java/org/yaml/snakeyaml/constructor/BigDecimalBeanConstructorTest.java
index 9303b96..0c51e2d 100644
--- a/src/test/java/org/yaml/snakeyaml/constructor/BigDecimalBeanConstructorTest.java
+++ b/src/test/java/org/yaml/snakeyaml/constructor/BigDecimalBeanConstructorTest.java
@@ -52,8 +52,7 @@
yaml.load(className);
fail("AtomicLong is not supported.");
} catch (Exception e) {
- assertEquals("Unsupported class: class java.util.concurrent.atomic.AtomicLong", e
- .getCause().getMessage());
+ assertEquals("argument type mismatch", e.getCause().getMessage());
}
}
}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBean.java b/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBean.java
new file mode 100644
index 0000000..6ac984f
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBean.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2008-2013, http://www.snakeyaml.org
+ *
+ * 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.issue183;
+
+public class NumberBean {
+ public Number number;
+}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBeanTest.java
new file mode 100644
index 0000000..8842a3c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue183/NumberBeanTest.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2008-2013, http://www.snakeyaml.org
+ *
+ * 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.issue183;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+
+public class NumberBeanTest extends TestCase {
+
+ public void testInfinityFloatBean() throws Exception {
+
+ NumberBean number = new NumberBean();
+ number.number = 1;
+
+ Yaml yaml = new Yaml();
+ String dump = yaml.dump(number);
+ NumberBean loaded = yaml.loadAs(dump, NumberBean.class);
+ assertEquals(new Long(1), loaded.number);
+ }
+}