diff --git a/core/src/main/java/org/elasticsearch/script/ScriptSettings.java b/core/src/main/java/org/elasticsearch/script/ScriptSettings.java index 3301e2e08aa..9c98b8d1e8c 100644 --- a/core/src/main/java/org/elasticsearch/script/ScriptSettings.java +++ b/core/src/main/java/org/elasticsearch/script/ScriptSettings.java @@ -97,9 +97,25 @@ public class ScriptSettings { } final boolean defaultIfNothingSet = defaultLangAndType; + Function defaultLangAndTypeFn = settings -> { + final Setting globalTypeSetting = scriptTypeSettingMap.get(scriptType); + final Setting langAndTypeSetting = Setting.boolSetting(ScriptModes.getGlobalKey(language, scriptType), + defaultIfNothingSet, Property.NodeScope); + + if (langAndTypeSetting.exists(settings)) { + // fine-grained e.g. script.engine.groovy.inline + return langAndTypeSetting.get(settings).toString(); + } else if (globalTypeSetting.exists(settings)) { + // global type - script.inline + return globalTypeSetting.get(settings).toString(); + } else { + return Boolean.toString(defaultIfNothingSet); + } + }; + // Setting for something like "script.engine.groovy.inline" final Setting langAndTypeSetting = Setting.boolSetting(ScriptModes.getGlobalKey(language, scriptType), - defaultLangAndType, Property.NodeScope); + defaultLangAndTypeFn, Property.NodeScope); scriptModeSettings.add(langAndTypeSetting); for (ScriptContext scriptContext : scriptContextRegistry.scriptContexts()) { diff --git a/core/src/test/java/org/elasticsearch/script/ScriptSettingsTests.java b/core/src/test/java/org/elasticsearch/script/ScriptSettingsTests.java index 8c1654fb902..120fd38b9a0 100644 --- a/core/src/test/java/org/elasticsearch/script/ScriptSettingsTests.java +++ b/core/src/test/java/org/elasticsearch/script/ScriptSettingsTests.java @@ -20,11 +20,13 @@ package org.elasticsearch.script; import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.search.lookup.SearchLookup; import org.elasticsearch.test.ESTestCase; import java.util.Collections; +import java.util.Iterator; import java.util.Map; import static org.hamcrest.Matchers.containsString; @@ -64,6 +66,22 @@ public class ScriptSettingsTests extends ESTestCase { } } + public void testSettingsAreProperlyPropogated() { + ScriptEngineRegistry scriptEngineRegistry = + new ScriptEngineRegistry(Collections.singletonList(new CustomScriptEngineService())); + ScriptContextRegistry scriptContextRegistry = new ScriptContextRegistry(Collections.emptyList()); + ScriptSettings scriptSettings = new ScriptSettings(scriptEngineRegistry, scriptContextRegistry); + boolean enabled = randomBoolean(); + Settings s = Settings.builder().put("script.inline", enabled).build(); + for (Iterator> iter = scriptSettings.getScriptLanguageSettings().iterator(); iter.hasNext();) { + Setting setting = iter.next(); + if (setting.getKey().endsWith(".inline")) { + assertThat("inline settings should have propagated", setting.get(s), equalTo(enabled)); + assertThat(setting.getDefaultRaw(s), equalTo(Boolean.toString(enabled))); + } + } + } + private static class CustomScriptEngineService implements ScriptEngineService { public static final String NAME = "custom";