diff options
author | Ryan Ernst <ryan@iernst.net> | 2017-06-02 13:41:26 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-02 13:41:26 -0700 |
commit | 0d8216d5afe66d1360ef06cab2c640180489d300 (patch) | |
tree | 13aa218f65b9b9657825f03149ad5a67666a5dc7 /modules/lang-mustache/src/main | |
parent | a926ace2e1e9c20dd93d94d129c616097e788e2f (diff) |
Scripting: Convert CompiledTemplate to a ScriptContext (#25032)
This commit creates TemplateScript and associated classes so that
templates no longer need a special ScriptService.compileTemplate method.
The execute() method is equivalent to the old run() method.
relates #20426
Diffstat (limited to 'modules/lang-mustache/src/main')
3 files changed, 22 insertions, 31 deletions
diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustacheScriptEngine.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustacheScriptEngine.java index 3363db47b4..65e23ef87a 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustacheScriptEngine.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustacheScriptEngine.java @@ -27,17 +27,16 @@ import org.apache.logging.log4j.util.Supplier; import org.elasticsearch.SpecialPermission; import org.elasticsearch.common.io.FastStringReader; import org.elasticsearch.common.logging.ESLoggerFactory; -import org.elasticsearch.script.ExecutableScript; import org.elasticsearch.script.GeneralScriptException; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.ScriptEngine; +import org.elasticsearch.script.TemplateScript; import java.io.Reader; import java.io.StringWriter; import java.security.AccessController; import java.security.PrivilegedAction; -import java.util.Collections; import java.util.Map; /** @@ -61,22 +60,22 @@ public final class MustacheScriptEngine implements ScriptEngine { * @return a compiled template object for later execution. * */ @Override - public <T> T compile(String templateName, String templateSource, ScriptContext<T> context, Map<String, String> params) { - if (context.instanceClazz.equals(ExecutableScript.class) == false) { + public <T> T compile(String templateName, String templateSource, ScriptContext<T> context, Map<String, String> options) { + if (context.instanceClazz.equals(TemplateScript.class) == false) { throw new IllegalArgumentException("mustache engine does not know how to handle context [" + context.name + "]"); } - final MustacheFactory factory = createMustacheFactory(params); + final MustacheFactory factory = createMustacheFactory(options); Reader reader = new FastStringReader(templateSource); Mustache template = factory.compile(reader, "query-template"); - ExecutableScript.Factory compiled = p -> new MustacheExecutableScript(template, p); + TemplateScript.Factory compiled = params -> new MustacheExecutableScript(template, params); return context.factoryClazz.cast(compiled); } - private CustomMustacheFactory createMustacheFactory(Map<String, String> params) { - if (params == null || params.isEmpty() || params.containsKey(Script.CONTENT_TYPE_OPTION) == false) { + private CustomMustacheFactory createMustacheFactory(Map<String, String> options) { + if (options == null || options.isEmpty() || options.containsKey(Script.CONTENT_TYPE_OPTION) == false) { return new CustomMustacheFactory(); } - return new CustomMustacheFactory(params.get(Script.CONTENT_TYPE_OPTION)); + return new CustomMustacheFactory(options.get(Script.CONTENT_TYPE_OPTION)); } @Override @@ -87,34 +86,28 @@ public final class MustacheScriptEngine implements ScriptEngine { /** * Used at query execution time by script service in order to execute a query template. * */ - private class MustacheExecutableScript implements ExecutableScript { + private class MustacheExecutableScript implements TemplateScript { /** Factory template. */ private Mustache template; - /** Parameters to fill above object with. */ - private Map<String, Object> vars; + + private Map<String, Object> params; /** * @param template the compiled template object wrapper - * @param vars the parameters to fill above object with **/ - MustacheExecutableScript(Mustache template, Map<String, Object> vars) { + MustacheExecutableScript(Mustache template, Map<String, Object> params) { this.template = template; - this.vars = vars == null ? Collections.emptyMap() : vars; - } - - @Override - public void setNextVar(String name, Object value) { - this.vars.put(name, value); + this.params = params; } @Override - public Object run() { + public String execute() { final StringWriter writer = new StringWriter(); try { // crazy reflection here SpecialPermission.check(); AccessController.doPrivileged((PrivilegedAction<Void>) () -> { - template.execute(writer, vars); + template.execute(writer, params); return null; }); } catch (Exception e) { diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestPutSearchTemplateAction.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestPutSearchTemplateAction.java index ecee7f67c8..751e58aeeb 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestPutSearchTemplateAction.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestPutSearchTemplateAction.java @@ -18,6 +18,8 @@ */ package org.elasticsearch.script.mustache; +import java.io.IOException; + import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptRequest; import org.elasticsearch.client.node.NodeClient; import org.elasticsearch.common.bytes.BytesReference; @@ -26,10 +28,8 @@ import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestController; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.action.AcknowledgedRestListener; -import org.elasticsearch.script.ExecutableScript; import org.elasticsearch.script.Script; - -import java.io.IOException; +import org.elasticsearch.script.TemplateScript; import static org.elasticsearch.rest.RestRequest.Method.POST; import static org.elasticsearch.rest.RestRequest.Method.PUT; @@ -53,7 +53,7 @@ public class RestPutSearchTemplateAction extends BaseRestHandler { String id = request.param("id"); BytesReference content = request.content(); - PutStoredScriptRequest put = new PutStoredScriptRequest(id, Script.DEFAULT_TEMPLATE_LANG, ExecutableScript.CONTEXT.name, + PutStoredScriptRequest put = new PutStoredScriptRequest(id, Script.DEFAULT_TEMPLATE_LANG, TemplateScript.CONTEXT.name, content, request.getXContentType()); return channel -> client.admin().cluster().putStoredScript(put, new AcknowledgedRestListener<>(channel)); } diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/TransportSearchTemplateAction.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/TransportSearchTemplateAction.java index faf543e2a0..d1e6377b69 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/TransportSearchTemplateAction.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/TransportSearchTemplateAction.java @@ -37,16 +37,14 @@ import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.script.ExecutableScript; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptService; +import org.elasticsearch.script.TemplateScript; import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.elasticsearch.template.CompiledTemplate; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; import java.io.IOException; import java.util.Collections; -import static org.elasticsearch.script.ExecutableScript.CONTEXT; - public class TransportSearchTemplateAction extends HandledTransportAction<SearchTemplateRequest, SearchTemplateResponse> { private static final String TEMPLATE_LANG = MustacheScriptEngine.NAME; @@ -101,8 +99,8 @@ public class TransportSearchTemplateAction extends HandledTransportAction<Search NamedXContentRegistry xContentRegistry) throws IOException { Script script = new Script(searchTemplateRequest.getScriptType(), TEMPLATE_LANG, searchTemplateRequest.getScript(), searchTemplateRequest.getScriptParams() == null ? Collections.emptyMap() : searchTemplateRequest.getScriptParams()); - CompiledTemplate compiledScript = scriptService.compileTemplate(script, ExecutableScript.CONTEXT); - String source = compiledScript.run(script.getParams()); + TemplateScript compiledScript = scriptService.compile(script, TemplateScript.CONTEXT).newInstance(script.getParams()); + String source = compiledScript.execute(); response.setSource(new BytesArray(source)); SearchRequest searchRequest = searchTemplateRequest.getRequest(); |