]> source.dussan.org Git - vaadin-framework.git/commitdiff
Ensure StringToIntegerConverter rejects values outside range of int (#12230)
authorJohannes Dahlström <johannesd@vaadin.com>
Thu, 1 Aug 2013 08:53:34 +0000 (11:53 +0300)
committerVaadin Code Review <review@vaadin.com>
Thu, 1 Aug 2013 10:33:37 +0000 (10:33 +0000)
Change-Id: I150bee64144045355bfa75ac10ede663d3feb5ce

server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java
server/tests/src/com/vaadin/tests/data/converter/TestStringToIntegerConverter.java

index bc436112fe4871686f02ef1676b0999f8adb3d5c..f6f668ad4d93fb0e5c28e6f3ce4de3c435b4d206 100644 (file)
@@ -62,7 +62,22 @@ public class StringToIntegerConverter extends
             Class<? extends Integer> targetType, Locale locale)
             throws ConversionException {
         Number n = convertToNumber(value, targetType, locale);
-        return n == null ? null : n.intValue();
+
+        if (n == null) {
+            return null;
+        }
+
+        int intValue = n.intValue();
+        if (intValue == n.longValue()) {
+            // If the value of n is outside the range of long, the return value
+            // of longValue() is either Long.MIN_VALUE or Long.MAX_VALUE. The
+            // above comparison promotes int to long and thus does not need to
+            // consider wrap-around.
+            return intValue;
+        }
+
+        throw new ConversionException("Could not convert '" + value + "' to "
+                + Integer.class.getName() + ": value out of range");
 
     }
 
index c73853578eba9699d8d75cc01b97219a75be4f4e..e810106631470bd31bdfcb0fb7f00015d8c41b3f 100644 (file)
@@ -2,6 +2,7 @@ package com.vaadin.tests.data.converter;
 
 import junit.framework.TestCase;
 
+import com.vaadin.data.util.converter.Converter.ConversionException;
 import com.vaadin.data.util.converter.StringToIntegerConverter;
 
 public class TestStringToIntegerConverter extends TestCase {
@@ -16,6 +17,23 @@ public class TestStringToIntegerConverter extends TestCase {
         assertEquals(null, converter.convertToModel("", Integer.class, null));
     }
 
+    public void testValueOutOfRange() {
+        Double[] values = new Double[] { Integer.MAX_VALUE * 2.0,
+                Integer.MIN_VALUE * 2.0, Long.MAX_VALUE * 2.0,
+                Long.MIN_VALUE * 2.0 };
+
+        boolean accepted = false;
+        for (Number value : values) {
+            try {
+                converter.convertToModel(String.format("%.0f", value),
+                        Integer.class, null);
+                accepted = true;
+            } catch (ConversionException expected) {
+            }
+        }
+        assertFalse("Accepted value outside range of int", accepted);
+    }
+
     public void testValueConversion() {
         assertEquals(Integer.valueOf(10),
                 converter.convertToModel("10", Integer.class, null));