From 03fa22001bf37f8826d9a732da52c7a47e2fe055 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Mon, 12 Dec 2011 18:34:26 +0000 Subject: Configuration methods .getX (int/double/etc) now try to cast existing values where possible. This fixes BUKKIT-290 --- .../org/bukkit/configuration/MemorySection.java | 13 +-- .../java/org/bukkit/util/NumberConversions.java | 92 ++++++++++++++++++++++ .../configuration/ConfigurationSectionTest.java | 16 +++- 3 files changed, 113 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/bukkit/util/NumberConversions.java (limited to 'src') diff --git a/src/main/java/org/bukkit/configuration/MemorySection.java b/src/main/java/org/bukkit/configuration/MemorySection.java index 7f4ea7cf..a2eb99df 100644 --- a/src/main/java/org/bukkit/configuration/MemorySection.java +++ b/src/main/java/org/bukkit/configuration/MemorySection.java @@ -12,6 +12,7 @@ import java.util.regex.Pattern; import org.bukkit.OfflinePlayer; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; +import static org.bukkit.util.NumberConversions.*; /** * A type of {@link ConfigurationSection} that is stored in memory. @@ -315,7 +316,7 @@ public class MemorySection implements ConfigurationSection { } Object def = getDefault(path); - return getInt(path, (def instanceof Integer) ? (Integer)def : 0); + return getInt(path, (def instanceof Number) ? toInt(def) : 0); } public int getInt(String path, int def) { @@ -324,7 +325,7 @@ public class MemorySection implements ConfigurationSection { } Object val = get(path, def); - return (val instanceof Integer) ? (Integer)val : def; + return (val instanceof Number) ? toInt(val) : def; } public boolean isInt(String path) { @@ -369,7 +370,7 @@ public class MemorySection implements ConfigurationSection { } Object def = getDefault(path); - return getDouble(path, (def instanceof Double) ? (Double)def : 0); + return getDouble(path, (def instanceof Number) ? toDouble(def) : 0); } public double getDouble(String path, double def) { @@ -378,7 +379,7 @@ public class MemorySection implements ConfigurationSection { } Object val = get(path, def); - return (val instanceof Double) ? (Double)val : def; + return (val instanceof Number) ? toDouble(val) : def; } public boolean isDouble(String path) { @@ -396,7 +397,7 @@ public class MemorySection implements ConfigurationSection { } Object def = getDefault(path); - return getLong(path, (def instanceof Long) ? (Long)def : 0); + return getLong(path, (def instanceof Number) ? toLong(def) : 0); } public long getLong(String path, long def) { @@ -405,7 +406,7 @@ public class MemorySection implements ConfigurationSection { } Object val = get(path, def); - return (val instanceof Long) ? (Long)val : def; + return (val instanceof Number) ? toLong(val) : def; } public boolean isLong(String path) { diff --git a/src/main/java/org/bukkit/util/NumberConversions.java b/src/main/java/org/bukkit/util/NumberConversions.java new file mode 100644 index 00000000..39bad86b --- /dev/null +++ b/src/main/java/org/bukkit/util/NumberConversions.java @@ -0,0 +1,92 @@ +package org.bukkit.util; + +/** + * Utils for casting number types to other number types + */ +public final class NumberConversions { + private NumberConversions() {} + + public static int toInt(Object object) { + if (object instanceof Number) { + return ((Number)object).intValue(); + } else { + int result = 0; + + try { + result = Integer.valueOf((String)object); + } catch (Throwable ex) {} + + return result; + } + } + + public static float toFloat(Object object) { + if (object instanceof Number) { + return ((Number)object).floatValue(); + } else { + float result = 0; + + try { + result = Float.valueOf((String)object); + } catch (Throwable ex) {} + + return result; + } + } + + public static double toDouble(Object object) { + if (object instanceof Number) { + return ((Number)object).doubleValue(); + } else { + double result = 0; + + try { + result = Double.valueOf((String)object); + } catch (Throwable ex) {} + + return result; + } + } + + public static long toLong(Object object) { + if (object instanceof Number) { + return ((Number)object).longValue(); + } else { + long result = 0; + + try { + result = Long.valueOf((String)object); + } catch (Throwable ex) {} + + return result; + } + } + + public static short toShort(Object object) { + if (object instanceof Number) { + return ((Number)object).shortValue(); + } else { + short result = 0; + + try { + result = Short.valueOf((String)object); + } catch (Throwable ex) {} + + return result; + } + } + + public static byte toByte(Object object) { + if (object instanceof Number) { + return ((Number)object).byteValue(); + } else { + byte result = 0; + + try { + result = Byte.valueOf((String)object); + } catch (Throwable ex) {} + + return result; + } + } +} diff --git a/src/test/java/org/bukkit/configuration/ConfigurationSectionTest.java b/src/test/java/org/bukkit/configuration/ConfigurationSectionTest.java index 6810f817..d45a4c31 100644 --- a/src/test/java/org/bukkit/configuration/ConfigurationSectionTest.java +++ b/src/test/java/org/bukkit/configuration/ConfigurationSectionTest.java @@ -315,9 +315,21 @@ public abstract class ConfigurationSectionTest { ConfigurationSection section = getConfigurationSection(); String key = "exists"; double value = Double.MAX_VALUE; - + section.set(key, value); - + + assertEquals(value, section.getDouble(key), 1); + assertNull(section.getString("doesntExist")); + } + + @Test + public void testGetDoubleFromInt() { + ConfigurationSection section = getConfigurationSection(); + String key = "exists"; + double value = 123; + + section.set(key, (int)value); + assertEquals(value, section.getDouble(key), 1); assertNull(section.getString("doesntExist")); } -- cgit v1.2.3