Skip to content

Commit

Permalink
#649 fixed multi-threaded handling of javascript templates
Browse files Browse the repository at this point in the history
  • Loading branch information
jamesdbloom committed Jul 15, 2019
1 parent 2f489ce commit 45ff70a
Show file tree
Hide file tree
Showing 2 changed files with 228 additions and 131 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package org.mockserver.templates.engine.javascript;

import org.mockserver.serialization.model.DTO;
import org.mockserver.logging.MockServerLogger;
import org.mockserver.model.HttpRequest;
import org.mockserver.serialization.model.DTO;
import org.mockserver.templates.engine.TemplateEngine;
import org.mockserver.templates.engine.model.HttpRequestTemplateObject;
import org.mockserver.templates.engine.serializer.HttpTemplateOutputDeserializer;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.*;

import static org.mockserver.formatting.StringFormatter.formatLogMessage;
import static org.mockserver.formatting.StringFormatter.indentAndToString;
Expand All @@ -20,7 +18,7 @@
*/
public class JavaScriptTemplateEngine implements TemplateEngine {

private static ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
private static ScriptEngine engine;
private final MockServerLogger logFormatter;
private HttpTemplateOutputDeserializer httpTemplateOutputDeserializer;

Expand All @@ -38,7 +36,10 @@ public <T> T executeTemplate(String template, HttpRequest request, Class<? exten
String script = "function handle(request) {" + indentAndToString(template)[0] + "}";
try {
if (engine != null) {
engine.eval(script + " function serialise(request) { return JSON.stringify(handle(JSON.parse(request)), null, 2); }");
SimpleScriptContext context = new SimpleScriptContext();
context.setBindings(engine.getBindings(ScriptContext.GLOBAL_SCOPE), ScriptContext.GLOBAL_SCOPE);
context.setBindings(engine.getBindings(ScriptContext.ENGINE_SCOPE), ScriptContext.ENGINE_SCOPE);
engine.eval(script + " function serialise(request) { return JSON.stringify(handle(JSON.parse(request)), null, 2); }", context);
// HttpResponse handle(HttpRequest httpRequest) - ES5
Object stringifiedResponse = ((Invocable) engine).invokeFunction("serialise", new HttpRequestTemplateObject(request));
logFormatter.info(TEMPLATE_GENERATED, request, "generated output:{}from template:{}for request:{}", stringifiedResponse, script, request);
Expand Down
Loading

0 comments on commit 45ff70a

Please sign in to comment.