diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java b/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java index 0f98dde73..d0e5f7186 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java @@ -47,6 +47,7 @@ import java.util.stream.Collectors; public class Scenario implements Callable { private static final Logger logger = (Logger) LoggerFactory.getLogger(Scenario.class); + private static final ScriptEngineManager engineManager = new ScriptEngineManager(); private final List scripts = new ArrayList<>(); private ScriptEngine scriptEngine; diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/script/ScriptParams.java b/engine-core/src/main/java/io/nosqlbench/engine/core/script/ScriptParams.java index 3523687d5..2830626a5 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/script/ScriptParams.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/script/ScriptParams.java @@ -17,23 +17,72 @@ package io.nosqlbench.engine.core.script; +import ch.qos.logback.classic.Logger; +import io.nosqlbench.nb.api.errors.BasicError; +import org.slf4j.LoggerFactory; + import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; -public class ScriptParams extends HashMap { +public class ScriptParams extends HashMap { - public Map withOverrides(Map overrides) { - HashMap result = new HashMap<>(); + private static final Logger logger = (Logger) LoggerFactory.getLogger(ScriptParams.class); + + public Map withOverrides(Map overrides) { + if (overrides == null) { + logger.warn("A null map was provided to withOverrides. This could be a bug in your script."); + overrides=Map.of(); + } + checkForNulls("params", "calling withOverrides", this); + checkForNulls("overrides", "calling withOverrides", overrides); + HashMap result = new HashMap<>(); result.putAll(this); result.putAll(overrides); return result; } - public Map withDefaults(Map defaults) { - HashMap result = new HashMap<>(); + public Map withDefaults(Map defaults) { + if (defaults == null) { + logger.warn("A null map was provided to withDefaults. This could be a bug in your script."); + defaults=Map.of(); + } + HashMap result = new HashMap<>(); + checkForNulls("params", "calling withDefaults", this); + checkForNulls("defaults", "calling withDefaults", defaults); result.putAll(defaults); result.putAll(this); return result; } + private static void checkForNulls(String name, String action, Map map) { + for (String s : map.keySet()) { + if (s == null) { + printMapToLog(name,map); + throw new BasicError("Found a null key in " + name + " while " + action + ". Please ensure that you " + + "only provide non-null keys and values in parameter maps."); + } else if (map.get(s) == null) { + printMapToLog(name,map); + throw new BasicError("Found a null value for key '" + s + "' in " + name + " while " + action + ". " + + "Please ensure you provide non-null keys and values in parameter maps."); + } + } + } + + private static void printMapToLog(String name, Map map) { + logger.info("contents of map '" + name + "':"); + String mapdetail = map.entrySet() + .stream() + .map(e -> valueOf(e.getKey()) + ":" + valueOf(e.getValue())) + .collect(Collectors.joining(",")); + logger.info(mapdetail); + } + + private static String valueOf(Object o) { + if (o == null) { + return "NULL"; + } + return String.valueOf(o); + } + } diff --git a/engine-core/src/test/java/io/nosqlbench/engine/core/script/ScriptParamsTest.java b/engine-core/src/test/java/io/nosqlbench/engine/core/script/ScriptParamsTest.java new file mode 100644 index 000000000..64a43b3f6 --- /dev/null +++ b/engine-core/src/test/java/io/nosqlbench/engine/core/script/ScriptParamsTest.java @@ -0,0 +1,23 @@ +package io.nosqlbench.engine.core.script; + +import io.nosqlbench.nb.api.errors.BasicError; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ScriptParamsTest { + + @Test(expected = BasicError.class) + public void testThatNullOverridesKeyThrowsBasicError() { + ScriptParams p = new ScriptParams(); + p.putAll(Map.of("a","b")); + p.withDefaults(Map.of("c","d")); + HashMap overrides = new HashMap<>(); + overrides.put(null,"test"); + p.withOverrides(overrides); + } + +}