Log Message
LongConverter supports now positive hex and octal numbers over Long.MAX_VALUE within 64 bit.
Modified Paths
Diff
Modified: trunk/xstream/src/java/com/thoughtworks/xstream/converters/basic/LongConverter.java (2131 => 2132)
--- trunk/xstream/src/java/com/thoughtworks/xstream/converters/basic/LongConverter.java 2013-09-25 22:35:07 UTC (rev 2131)
+++ trunk/xstream/src/java/com/thoughtworks/xstream/converters/basic/LongConverter.java 2013-09-26 17:43:09 UTC (rev 2132)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2003, 2004 Joe Walnes.
- * Copyright (C) 2006, 2007 XStream Committers.
+ * Copyright (C) 2006, 2007, 2013 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
@@ -12,9 +12,8 @@
package com.thoughtworks.xstream.converters.basic;
/**
- * Converts a long primitive or java.lang.Long wrapper to
- * a String.
- *
+ * Converts a long primitive or java.lang.Long wrapper to a String.
+ *
* @author Joe Walnes
*/
public class LongConverter extends AbstractSingleValueConverter {
@@ -24,7 +23,34 @@
}
public Object fromString(String str) {
- return Long.decode(str);
+ int len = str.length();
+ if (len == 0) {
+ throw new NumberFormatException("For input string: \"\"");
+ }
+ if (len < 17) {
+ return Long.decode(str);
+ }
+ char c0 = str.charAt(0);
+ if (c0 != '0' && c0 != '#') {
+ return Long.decode(str);
+ }
+ char c1 = str.charAt(1);
+ final long high;
+ final long low;
+ if (c0 == '#' && len == 17) {
+ high = Long.parseLong(str.substring(1, 9), 16) << 32;
+ low = Long.parseLong(str.substring(9, 17), 16);
+ } else if ((c1 == 'x' || c1 == 'X') && len == 18) {
+ high = Long.parseLong(str.substring(2, 10), 16) << 32;
+ low = Long.parseLong(str.substring(10, 18), 16);
+ } else if (len == 23 && c1 == '1') {
+ high = Long.parseLong(str.substring(1, 12), 8) << 33;
+ low = Long.parseLong(str.substring(12, 23), 8);
+ } else {
+ return Long.decode(str);
+ }
+ final long num = high | low;
+ return num;
}
}
Modified: trunk/xstream/src/test/com/thoughtworks/acceptance/BasicTypesTest.java (2131 => 2132)
--- trunk/xstream/src/test/com/thoughtworks/acceptance/BasicTypesTest.java 2013-09-25 22:35:07 UTC (rev 2131)
+++ trunk/xstream/src/test/com/thoughtworks/acceptance/BasicTypesTest.java 2013-09-26 17:43:09 UTC (rev 2132)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2003, 2004, 2005 Joe Walnes.
- * Copyright (C) 2006, 2007, 2009 XStream Committers.
+ * Copyright (C) 2006, 2007, 2009, 2013 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
@@ -14,6 +14,7 @@
import java.math.BigDecimal;
import java.math.BigInteger;
+
public class BasicTypesTest extends AbstractAcceptanceTest {
public void testPrimitiveNumbers() {
@@ -23,33 +24,36 @@
assertBothWays(new Float(-123.45f), "<float>-123.45</float>");
assertBothWays(new Double(-1234567890.12345), "<double>-1.23456789012345E9</double>");
assertBothWays(new Long(123456789123456L), "<long>123456789123456</long>");
- assertBothWays(new Short((short) 123), "<short>123</short>");
+ assertBothWays(new Short((short)123), "<short>123</short>");
}
public void testDifferentBaseIntegers() {
assertEquals(new Integer(255), xstream.fromXML("<int>0xFF</int>"));
+ assertEquals(new Integer(255), xstream.fromXML("<int>#FF</int>"));
assertEquals(new Integer(8), xstream.fromXML("<int>010</int>"));
+ assertEquals(
+ 01777777773427777777773L, xstream.fromXML("<long>01777777773427777777773</long>"));
}
public void testNegativeIntegersInHex() {
assertEquals(new Byte((byte)-1), xstream.fromXML("<byte>0xFF</byte>"));
assertEquals(new Short((short)-1), xstream.fromXML("<short>0xFFFF</short>"));
assertEquals(new Integer(-1), xstream.fromXML("<int>0xFFFFFFFF</int>"));
- assertEquals(new Long(Long.MAX_VALUE), xstream.fromXML("<long>0x7FFFFFFFFFFFFFFF</long>"));
+ assertEquals(new Long(-1), xstream.fromXML("<long>0xFFFFFFFFFFFFFFFF</long>"));
}
public void testNegativeIntegersInOctal() {
assertEquals(new Byte((byte)-1), xstream.fromXML("<byte>0377</byte>"));
assertEquals(new Short((short)-1), xstream.fromXML("<short>0177777</short>"));
assertEquals(new Integer(-1), xstream.fromXML("<int>037777777777</int>"));
- assertEquals(new Long(Long.MAX_VALUE), xstream.fromXML("<long>0777777777777777777777</long>"));
+ assertEquals(new Long(-1), xstream.fromXML("<long>01777777777777777777777</long>"));
}
public void testOtherPrimitives() {
assertBothWays(new Character('z'), "<char>z</char>");
assertBothWays(Boolean.TRUE, "<boolean>true</boolean>");
assertBothWays(Boolean.FALSE, "<boolean>false</boolean>");
- assertBothWays(new Byte((byte) 44), "<byte>44</byte>");
+ assertBothWays(new Byte((byte)44), "<byte>44</byte>");
}
public void testNullCharacter() {
@@ -76,7 +80,7 @@
buffer.append("woo");
String xml = xstream.toXML(buffer);
assertEquals(xml, "<string-buffer>woo</string-buffer>");
- StringBuffer out = (StringBuffer) xstream.fromXML(xml);
+ StringBuffer out = (StringBuffer)xstream.fromXML(xml);
assertEquals("woo", out.toString());
}
@@ -89,7 +93,7 @@
BigDecimal bigDecimal = new BigDecimal("1234567890123456.987654321");
assertBothWays(bigDecimal, "<big-decimal>1234567890123456.987654321</big-decimal>");
}
-
+
public void testNull() {
assertBothWays(null, "<null/>");
}
Modified: trunk/xstream-distribution/src/content/changes.html (2131 => 2132)
--- trunk/xstream-distribution/src/content/changes.html 2013-09-25 22:35:07 UTC (rev 2131)
+++ trunk/xstream-distribution/src/content/changes.html 2013-09-26 17:43:09 UTC (rev 2132)
@@ -74,6 +74,7 @@
<li>New constructors for CollectionConverter and MapConverter to allow registration for an individual type.</li>
<li>JIRA:XSTR-724: Cache class name lookup failures.</li>
<li>Current IBM JDK for Java 1.4.2 no longer has a reverse field ordering.</li>
+ <li>LongConverter supports now positive hex and octal numbers over Long.MAX_VALUE within 64 bit.</li>
<li>JIRA:XSTR-457: Do not write 'defined-in' attribute it not needed.</li>
<li>JettisonMappedXmlDriver provides better support to overwrite its create methods.</li>
<li>JIRA:XSTR-685: StAX based drivers (StaxDriver and JettisonMappedXmlDriver) are not closing internal input
To unsubscribe from this list please visit:
