From 98cddfa31e981c29e7e1d12eea66a506e99d6e13 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Thu, 25 May 2017 16:39:31 -0700 Subject: [PATCH] Scripting: Make contexts available to ScriptEngine construction This commit adds collection of all contexts to the parameters of getScriptEngine. This will allow script engines like painless to precache extra information about the contexts. --- .../main/java/org/elasticsearch/plugins/ScriptPlugin.java | 8 ++++++-- .../main/java/org/elasticsearch/script/ScriptModule.java | 4 +++- .../search/functionscore/ExplainableScriptIT.java | 2 +- .../org/elasticsearch/search/suggest/SuggestSearchIT.java | 2 +- .../elasticsearch/script/expression/ExpressionPlugin.java | 5 ++++- .../org/elasticsearch/script/mustache/MustachePlugin.java | 4 +++- .../java/org/elasticsearch/painless/PainlessPlugin.java | 4 +++- .../example/expertscript/ExpertScriptPlugin.java | 3 ++- .../java/org/elasticsearch/script/MockScriptPlugin.java | 3 ++- .../src/main/java/org/elasticsearch/test/ESTestCase.java | 3 ++- 10 files changed, 27 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/plugins/ScriptPlugin.java b/core/src/main/java/org/elasticsearch/plugins/ScriptPlugin.java index c74344578d606..88af291983af8 100644 --- a/core/src/main/java/org/elasticsearch/plugins/ScriptPlugin.java +++ b/core/src/main/java/org/elasticsearch/plugins/ScriptPlugin.java @@ -18,8 +18,10 @@ */ package org.elasticsearch.plugins; +import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.script.ScriptContext; @@ -31,9 +33,11 @@ public interface ScriptPlugin { /** - * Returns a {@link ScriptEngine} instance or null if this plugin doesn't add a new script engine + * Returns a {@link ScriptEngine} instance or null if this plugin doesn't add a new script engine. + * @param settings Node settings + * @param contexts The contexts that {@link ScriptEngine#compile(String, String, ScriptContext, Map)} may be called with */ - default ScriptEngine getScriptEngine(Settings settings) { + default ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { return null; } diff --git a/core/src/main/java/org/elasticsearch/script/ScriptModule.java b/core/src/main/java/org/elasticsearch/script/ScriptModule.java index ecf3dc5ded935..cc098c14359a5 100644 --- a/core/src/main/java/org/elasticsearch/script/ScriptModule.java +++ b/core/src/main/java/org/elasticsearch/script/ScriptModule.java @@ -61,7 +61,9 @@ public ScriptModule(Settings settings, List scriptPlugins) { throw new IllegalArgumentException("Context name [" + context.name + "] defined twice"); } } - ScriptEngine engine = plugin.getScriptEngine(settings); + } + for (ScriptPlugin plugin : scriptPlugins) { + ScriptEngine engine = plugin.getScriptEngine(settings, contexts.values()); if (engine != null) { ScriptEngine existing = engines.put(engine.getType(), engine); if (existing != null) { diff --git a/core/src/test/java/org/elasticsearch/search/functionscore/ExplainableScriptIT.java b/core/src/test/java/org/elasticsearch/search/functionscore/ExplainableScriptIT.java index a5a7e587c7418..5dde216eabb71 100644 --- a/core/src/test/java/org/elasticsearch/search/functionscore/ExplainableScriptIT.java +++ b/core/src/test/java/org/elasticsearch/search/functionscore/ExplainableScriptIT.java @@ -70,7 +70,7 @@ public class ExplainableScriptIT extends ESIntegTestCase { public static class ExplainableScriptPlugin extends Plugin implements ScriptPlugin { @Override - public ScriptEngine getScriptEngine(Settings settings) { + public ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { return new ScriptEngine() { @Override public String getType() { diff --git a/core/src/test/java/org/elasticsearch/search/suggest/SuggestSearchIT.java b/core/src/test/java/org/elasticsearch/search/suggest/SuggestSearchIT.java index 3747fef68255e..51a652e4ce0b6 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/SuggestSearchIT.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/SuggestSearchIT.java @@ -1009,7 +1009,7 @@ protected Collection> nodePlugins() { public static class DummyTemplatePlugin extends Plugin implements ScriptPlugin { @Override - public ScriptEngine getScriptEngine(Settings settings) { + public ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { return new DummyTemplateScriptEngine(); } } diff --git a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ExpressionPlugin.java b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ExpressionPlugin.java index 071e5cf666d0c..fd80c56cdbe8a 100644 --- a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ExpressionPlugin.java +++ b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ExpressionPlugin.java @@ -19,15 +19,18 @@ package org.elasticsearch.script.expression; +import java.util.Collection; + import org.elasticsearch.common.settings.Settings; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.ScriptPlugin; +import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.ScriptEngine; public class ExpressionPlugin extends Plugin implements ScriptPlugin { @Override - public ScriptEngine getScriptEngine(Settings settings) { + public ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { return new ExpressionScriptEngine(settings); } } diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustachePlugin.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustachePlugin.java index 105fa3f6f803b..c05a88e9351db 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustachePlugin.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustachePlugin.java @@ -33,16 +33,18 @@ import org.elasticsearch.plugins.SearchPlugin; import org.elasticsearch.rest.RestController; import org.elasticsearch.rest.RestHandler; +import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.ScriptEngine; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.function.Supplier; public class MustachePlugin extends Plugin implements ScriptPlugin, ActionPlugin, SearchPlugin { @Override - public ScriptEngine getScriptEngine(Settings settings) { + public ScriptEngine getScriptEngine(Settings settings, Collection>contexts) { return new MustacheScriptEngine(); } diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java index 62ea89acb06e2..0007b92314202 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java @@ -24,9 +24,11 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.ScriptPlugin; +import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.ScriptEngine; import java.util.Arrays; +import java.util.Collection; import java.util.List; /** @@ -40,7 +42,7 @@ public final class PainlessPlugin extends Plugin implements ScriptPlugin { } @Override - public ScriptEngine getScriptEngine(Settings settings) { + public ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { return new PainlessScriptEngine(settings); } diff --git a/plugins/examples/script-expert-scoring/src/main/java/org/elasticsearch/example/expertscript/ExpertScriptPlugin.java b/plugins/examples/script-expert-scoring/src/main/java/org/elasticsearch/example/expertscript/ExpertScriptPlugin.java index 756dba6b688c4..ccb8d37dd5ad1 100644 --- a/plugins/examples/script-expert-scoring/src/main/java/org/elasticsearch/example/expertscript/ExpertScriptPlugin.java +++ b/plugins/examples/script-expert-scoring/src/main/java/org/elasticsearch/example/expertscript/ExpertScriptPlugin.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.UncheckedIOException; +import java.util.Collection; import java.util.Map; import java.util.function.Function; @@ -45,7 +46,7 @@ public class ExpertScriptPlugin extends Plugin implements ScriptPlugin { @Override - public ScriptEngine getScriptEngine(Settings settings) { + public ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { return new MyExpertScriptEngine(); } diff --git a/test/framework/src/main/java/org/elasticsearch/script/MockScriptPlugin.java b/test/framework/src/main/java/org/elasticsearch/script/MockScriptPlugin.java index ff022e1d73173..cd951a3b53f5c 100644 --- a/test/framework/src/main/java/org/elasticsearch/script/MockScriptPlugin.java +++ b/test/framework/src/main/java/org/elasticsearch/script/MockScriptPlugin.java @@ -23,6 +23,7 @@ import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.ScriptPlugin; +import java.util.Collection; import java.util.Map; import java.util.function.Function; @@ -34,7 +35,7 @@ public abstract class MockScriptPlugin extends Plugin implements ScriptPlugin { public static final String NAME = MockScriptEngine.NAME; @Override - public ScriptEngine getScriptEngine(Settings settings) { + public ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { return new MockScriptEngine(pluginScriptLang(), pluginScripts()); } diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java index f7f641c6a292c..256227779aa0e 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -94,6 +94,7 @@ import org.elasticsearch.plugins.ScriptPlugin; import org.elasticsearch.script.MockScriptEngine; import org.elasticsearch.script.Script; +import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.ScriptEngine; import org.elasticsearch.script.ScriptModule; import org.elasticsearch.script.ScriptService; @@ -1195,7 +1196,7 @@ public static TestAnalysis createTestAnalysis(IndexSettings indexSettings, Setti public static ScriptModule newTestScriptModule() { return new ScriptModule(Settings.EMPTY, singletonList(new ScriptPlugin() { @Override - public ScriptEngine getScriptEngine(Settings settings) { + public ScriptEngine getScriptEngine(Settings settings, Collection> contexts) { return new MockScriptEngine(MockScriptEngine.NAME, Collections.singletonMap("1", script -> "1")); } }));