From 2d2fd63606457e9f94a8a7629ee595d56ed1ec7c Mon Sep 17 00:00:00 2001 From: kasun Date: Wed, 17 Jun 2026 13:21:08 +0200 Subject: [PATCH] refactored tariffloader, added exception checks --- .../petinsurance/tariffs/TariffLoader.java | 59 +++++++++++++------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/pfefferminzia/petinsurance/tariffs/TariffLoader.java b/src/main/java/com/pfefferminzia/petinsurance/tariffs/TariffLoader.java index b153e0b..be8cc0e 100644 --- a/src/main/java/com/pfefferminzia/petinsurance/tariffs/TariffLoader.java +++ b/src/main/java/com/pfefferminzia/petinsurance/tariffs/TariffLoader.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.time.LocalDate; +import java.time.format.DateTimeParseException; import java.util.HashMap; import java.util.Map; import java.util.NavigableMap; @@ -31,44 +32,49 @@ public final class TariffLoader { return new TariffConfiguration(animalBaseSums(props), tariffs(props), ageFactors(props), breedFactors(props)); - } private static Map animalBaseSums(Properties props) { - Map baseSums = new HashMap<>(); - for (String key : props.stringPropertyNames()) { if (key.startsWith("baseSum.")) { String animal = key.substring("baseSum.".length()).toUpperCase(); - BigDecimal baseSum = new BigDecimal(props.getProperty(key)); - baseSums.put(animal, baseSum); + baseSums.put(animal, parseDecimal(key, props.getProperty(key))); } } return baseSums; } private static Map tariffs(Properties props) { - return props.stringPropertyNames().stream().filter(key -> key.startsWith("tariffs.")) .map(key -> { String name = key.substring("tariffs.".length()).toUpperCase(); - String[] values = props.getProperty(key).split(","); - BigDecimal factor = new BigDecimal(values[0]); - LocalDate availableFrom = LocalDate.parse(values[1]); + String raw = props.getProperty(key); + String[] values = raw.split(","); + if (values.length < 2) { + throw new IllegalStateException("Ungültiges Format für Tarifoption '" + + key + "': erwartet 'Faktor,Datum', gefunden: '" + raw + "'"); + } + BigDecimal factor = parseDecimal(key, values[0]); + LocalDate availableFrom = parseDate(key, values[1]); return new TariffOption(name, factor, availableFrom); }).collect(Collectors.toMap(TariffOption::name, tariff -> tariff)); } private static NavigableMap ageFactors(Properties props) { - NavigableMap ageFactors = new TreeMap<>(); - for (String key : props.stringPropertyNames()) { if (key.startsWith("age.")) { - Integer age = Integer.parseInt(key.replace("age.", "")); - BigDecimal factor = new BigDecimal(props.getProperty(key)); - ageFactors.put(age, factor); + String agePart = key.substring("age.".length()); + int age; + try { + age = Integer.parseInt(agePart); + } catch (NumberFormatException e) { + throw new IllegalStateException( + "Ungültiger Alterswert in Schlüssel '" + key + "': '" + agePart + "'", + e); + } + ageFactors.put(age, parseDecimal(key, props.getProperty(key))); } } @@ -76,23 +82,38 @@ public final class TariffLoader { if (rawElderly == null) { throw new IllegalStateException("Pflichtkonfiguration 'elderlyFactor' fehlt."); } - ageFactors.put(Integer.MAX_VALUE, new BigDecimal(rawElderly)); + ageFactors.put(Integer.MAX_VALUE, parseDecimal("elderlyFactor", rawElderly)); return ageFactors; } private static Map breedFactors(Properties props) { - Map breedFactors = new HashMap<>(); - for (String key : props.stringPropertyNames()) { if (key.startsWith("breed.")) { String name = key.substring("breed.".length()).toUpperCase(); - BigDecimal factor = new BigDecimal(props.getProperty(key)); - breedFactors.put(name, factor); + breedFactors.put(name, parseDecimal(key, props.getProperty(key))); } } return breedFactors; } + private static BigDecimal parseDecimal(String key, String value) { + try { + return new BigDecimal(value.trim()); + } catch (NumberFormatException e) { + throw new IllegalStateException( + "Ungültiger Zahlenwert für '" + key + "': '" + value + "'", e); + } + } + + private static LocalDate parseDate(String key, String value) { + try { + return LocalDate.parse(value.trim()); + } catch (DateTimeParseException e) { + throw new IllegalStateException( + "Ungültiges Datum für '" + key + "': '" + value + "'", e); + } + } + private TariffLoader() {} }