Title: [2132] trunk: LongConverter supports now positive hex and octal numbers over Long.MAX_VALUE within 64 bit.
Revision
2132
Author
joehni
Date
2013-09-26 12:43:09 -0500 (Thu, 26 Sep 2013)

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:

http://xircles.codehaus.org/manage_email

Reply via email to