From 4f623d9dd541bb462b90d0e37da9baab5a61a93a Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Fri, 18 Nov 2011 16:38:28 -0500 Subject: [PATCH] throw exception if you getInt() and the int is out of range --- .../com/typesafe/config/impl/ConfigNumber.java | 13 +++++++++++++ .../com/typesafe/config/impl/SimpleConfig.java | 17 +++++++++++------ .../com/typesafe/config/impl/ConfigTest.scala | 14 ++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/typesafe/config/impl/ConfigNumber.java b/src/main/java/com/typesafe/config/impl/ConfigNumber.java index af45d1d3..3c01d9b9 100644 --- a/src/main/java/com/typesafe/config/impl/ConfigNumber.java +++ b/src/main/java/com/typesafe/config/impl/ConfigNumber.java @@ -3,6 +3,7 @@ */ package com.typesafe.config.impl; +import com.typesafe.config.ConfigException; import com.typesafe.config.ConfigOrigin; abstract class ConfigNumber extends AbstractConfigValue { @@ -17,11 +18,23 @@ abstract class ConfigNumber extends AbstractConfigValue { this.originalText = originalText; } + @Override + public abstract Number unwrapped(); + @Override String transformToString() { return originalText; } + int intValueRangeChecked(String path) { + long l = longValue(); + if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) { + throw new ConfigException.WrongType(origin(), path, "32-bit integer", + "out-of-range value " + l); + } + return (int) l; + } + protected abstract long longValue(); protected abstract double doubleValue(); diff --git a/src/main/java/com/typesafe/config/impl/SimpleConfig.java b/src/main/java/com/typesafe/config/impl/SimpleConfig.java index 0f166fab..d64ce462 100644 --- a/src/main/java/com/typesafe/config/impl/SimpleConfig.java +++ b/src/main/java/com/typesafe/config/impl/SimpleConfig.java @@ -139,15 +139,20 @@ class SimpleConfig implements Config { return (Boolean) v.unwrapped(); } + private ConfigNumber getConfigNumber(String path) { + ConfigValue v = find(path, ConfigValueType.NUMBER, path); + return (ConfigNumber) v; + } + @Override public Number getNumber(String path) { - ConfigValue v = find(path, ConfigValueType.NUMBER, path); - return (Number) v.unwrapped(); + return getConfigNumber(path).unwrapped(); } @Override public int getInt(String path) { - return getNumber(path).intValue(); + ConfigNumber n = getConfigNumber(path); + return n.intValueRangeChecked(path); } @Override @@ -255,9 +260,9 @@ class SimpleConfig implements Config { @Override public List getIntList(String path) { List l = new ArrayList(); - List numbers = getNumberList(path); - for (Number n : numbers) { - l.add(n.intValue()); + List numbers = getHomogeneousWrappedList(path, ConfigValueType.NUMBER); + for (AbstractConfigValue v : numbers) { + l.add(((ConfigNumber) v).intValueRangeChecked(path)); } return l; } diff --git a/src/test/scala/com/typesafe/config/impl/ConfigTest.scala b/src/test/scala/com/typesafe/config/impl/ConfigTest.scala index 71aaa810..5d28e1c2 100644 --- a/src/test/scala/com/typesafe/config/impl/ConfigTest.scala +++ b/src/test/scala/com/typesafe/config/impl/ConfigTest.scala @@ -504,6 +504,20 @@ class ConfigTest extends TestUtils { testIgnoredMergesDoNothing(root) } + @Test + def integerRangeChecks() { + val conf = parseConfig("{ tooNegative: " + (Integer.MIN_VALUE - 1L) + ", tooPositive: " + (Integer.MAX_VALUE + 1L) + "}") + val en = intercept[ConfigException.WrongType] { + conf.getInt("tooNegative") + } + assertTrue(en.getMessage.contains("range")) + + val ep = intercept[ConfigException.WrongType] { + conf.getInt("tooPositive") + } + assertTrue(ep.getMessage.contains("range")) + } + @Test def test01Getting() { val conf = ConfigFactory.load("test01")