From 47af6fbb9f3bc8f8fb3e917cc8792259b781b240 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 21 Jul 2024 23:54:36 +0200 Subject: [PATCH] Refactor ConfigHandler to use EntryHandler --- .../openrocket/importt/ConfigHandler.java | 42 +-------------- .../file/openrocket/importt/EntryHandler.java | 22 ++++++++ .../file/openrocket/importt/EntryHelper.java | 51 +++++++++++++++++++ 3 files changed, 75 insertions(+), 40 deletions(-) create mode 100644 core/src/main/java/info/openrocket/core/file/openrocket/importt/EntryHandler.java create mode 100644 core/src/main/java/info/openrocket/core/file/openrocket/importt/EntryHelper.java diff --git a/core/src/main/java/info/openrocket/core/file/openrocket/importt/ConfigHandler.java b/core/src/main/java/info/openrocket/core/file/openrocket/importt/ConfigHandler.java index f8283317c..e355ad486 100644 --- a/core/src/main/java/info/openrocket/core/file/openrocket/importt/ConfigHandler.java +++ b/core/src/main/java/info/openrocket/core/file/openrocket/importt/ConfigHandler.java @@ -1,12 +1,9 @@ package info.openrocket.core.file.openrocket.importt; -import java.math.BigDecimal; -import java.math.BigInteger; import java.util.HashMap; import java.util.List; import info.openrocket.core.logging.WarningSet; -import info.openrocket.core.file.simplesax.AbstractElementHandler; import info.openrocket.core.file.simplesax.ElementHandler; import info.openrocket.core.file.simplesax.PlainTextHandler; import info.openrocket.core.util.ArrayList; @@ -14,7 +11,7 @@ import info.openrocket.core.util.Config; import org.xml.sax.SAXException; -public class ConfigHandler extends AbstractElementHandler { +public class ConfigHandler extends EntryHandler { private ConfigHandler listHandler; private final Config config = new Config(); @@ -36,17 +33,7 @@ public class ConfigHandler extends AbstractElementHandler { throws SAXException { if (element.equals("entry")) { String key = attributes.get("key"); - String type = attributes.get("type"); - Object value = null; - if ("boolean".equals(type)) { - value = Boolean.valueOf(content); - } else if ("string".equals(type)) { - value = content; - } else if ("number".equals(type)) { - value = parseNumber(content); - } else if ("list".equals(type)) { - value = listHandler.list; - } + Object value = EntryHelper.getValueFromEntry(ConfigHandler.this, attributes, content); if (value != null) { if (key != null) { config.put(key, value); @@ -59,31 +46,6 @@ public class ConfigHandler extends AbstractElementHandler { } } - private Number parseNumber(String str) { - try { - str = str.trim(); - if (str.matches("^[+-]?[0-9]+$")) { - BigInteger value = new BigInteger(str, 10); - if (value.equals(BigInteger.valueOf(value.intValue()))) { - return value.intValue(); - } else if (value.equals(BigInteger.valueOf(value.longValue()))) { - return value.longValue(); - } else { - return value; - } - } else { - BigDecimal value = new BigDecimal(str); - if (value.equals(BigDecimal.valueOf(value.doubleValue()))) { - return value.doubleValue(); - } else { - return value; - } - } - } catch (NumberFormatException e) { - return null; - } - } - public Config getConfig() { return config; } diff --git a/core/src/main/java/info/openrocket/core/file/openrocket/importt/EntryHandler.java b/core/src/main/java/info/openrocket/core/file/openrocket/importt/EntryHandler.java new file mode 100644 index 000000000..b635b262f --- /dev/null +++ b/core/src/main/java/info/openrocket/core/file/openrocket/importt/EntryHandler.java @@ -0,0 +1,22 @@ +package info.openrocket.core.file.openrocket.importt; + +import info.openrocket.core.file.simplesax.AbstractElementHandler; +import info.openrocket.core.util.ArrayList; + +import java.util.List; + +/** + * Handler for entries that have a key and type attribute, and a value. + * For example bar + */ +public abstract class EntryHandler extends AbstractElementHandler { + protected EntryHandler listHandler; + protected final List list = new ArrayList<>(); + + public List getNestedList() { + if (listHandler != null) { + return listHandler.list; + } + return null; + } +} \ No newline at end of file diff --git a/core/src/main/java/info/openrocket/core/file/openrocket/importt/EntryHelper.java b/core/src/main/java/info/openrocket/core/file/openrocket/importt/EntryHelper.java new file mode 100644 index 000000000..fa34c0a76 --- /dev/null +++ b/core/src/main/java/info/openrocket/core/file/openrocket/importt/EntryHelper.java @@ -0,0 +1,51 @@ +package info.openrocket.core.file.openrocket.importt; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.HashMap; + +/** + * Helper class for parsing entry elements that have a key and type attribute, and a value. + * For example: value + */ +public abstract class EntryHelper { + public static Object getValueFromEntry(EntryHandler handler, HashMap attributes, String content) { + String type = attributes.get("type"); + Object value = null; + if ("boolean".equals(type)) { + value = Boolean.valueOf(content); + } else if ("string".equals(type)) { + value = content; + } else if ("number".equals(type)) { + value = parseNumber(content); + } else if ("list".equals(type)) { + value = handler.getNestedList(); + } + return value; + } + + private static Number parseNumber(String str) { + try { + str = str.trim(); + if (str.matches("^[+-]?[0-9]+$")) { + BigInteger value = new BigInteger(str, 10); + if (value.equals(BigInteger.valueOf(value.intValue()))) { + return value.intValue(); + } else if (value.equals(BigInteger.valueOf(value.longValue()))) { + return value.longValue(); + } else { + return value; + } + } else { + BigDecimal value = new BigDecimal(str); + if (value.equals(BigDecimal.valueOf(value.doubleValue()))) { + return value.doubleValue(); + } else { + return value; + } + } + } catch (NumberFormatException e) { + return null; + } + } +}