Skip to content

Commit

Permalink
See #344
Browse files Browse the repository at this point in the history
  • Loading branch information
simonbrowndotje committed Sep 27, 2024
1 parent d5e0d20 commit ff37cc2
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.structurizr.dsl;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;

class ExternalScriptDslContext extends ScriptDslContext {

Expand All @@ -23,10 +20,7 @@ void end() {
throw new RuntimeException("Script file " + scriptFile.getCanonicalPath() + " does not exist");
}

String fileExtension = filename.substring(filename.lastIndexOf('.') + 1);
List<String> lines = Files.readAllLines(scriptFile.toPath(), StandardCharsets.UTF_8);

run(this, fileExtension, lines);
run(this, scriptFile);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error running script at " + filename + ", caused by " + e.getClass().getName() + ": " + e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import com.structurizr.model.Element;
import com.structurizr.model.Relationship;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.*;
import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -48,32 +47,54 @@ void run(DslContext context, String extension, List<String> lines) throws Except

if (engine != null) {
Bindings bindings = engine.createBindings();
bindings.put(WORKSPACE_VARIABLE_NAME, context.getWorkspace());

if (parentContext instanceof ViewDslContext) {
bindings.put(VIEW_VARIABLE_NAME, ((ViewDslContext)parentContext).getView());
} else if (parentContext instanceof ModelItemDslContext) {
ModelItemDslContext modelItemDslContext = (ModelItemDslContext)parentContext;
if (modelItemDslContext.getModelItem() instanceof Element) {
bindings.put(ELEMENT_VARIABLE_NAME, modelItemDslContext.getModelItem());
} else if (modelItemDslContext.getModelItem() instanceof Relationship) {
bindings.put(RELATIONSHIP_VARIABLE_NAME, modelItemDslContext.getModelItem());
}
}
populateBindings(bindings, context);

// bind a context object
StructurizrDslScriptContext scriptContext = new StructurizrDslScriptContext(dslParser, dslFile, getWorkspace(), parameters);
bindings.put(CONTEXT_VARIABLE_NAME, scriptContext);
engine.eval(script.toString(), bindings);
} else {
throw new RuntimeException("Could not load a scripting engine for extension \"" + extension + "\"");
}
}

// and any custom parameters
for (String name : parameters.keySet()) {
bindings.put(name, parameters.get(name));
}
void run(DslContext context, File scriptFile) throws Exception {
String extension = scriptFile.getName().substring(scriptFile.getName().lastIndexOf('.') + 1);
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByExtension(extension);

engine.eval(script.toString(), bindings);
if (engine != null) {
Bindings bindings = engine.createBindings();
populateBindings(bindings, context);

ScriptContext scriptContext = new SimpleScriptContext();
scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
scriptContext.setAttribute(ScriptEngine.FILENAME, scriptFile.getAbsolutePath(), ScriptContext.ENGINE_SCOPE);
engine.eval(new FileReader(scriptFile), scriptContext);
} else {
throw new RuntimeException("Could not load a scripting engine for extension \"" + extension + "\"");
}
}

private void populateBindings(Bindings bindings, DslContext context) {
bindings.put(WORKSPACE_VARIABLE_NAME, context.getWorkspace());

if (parentContext instanceof ViewDslContext) {
bindings.put(VIEW_VARIABLE_NAME, ((ViewDslContext)parentContext).getView());
} else if (parentContext instanceof ModelItemDslContext) {
ModelItemDslContext modelItemDslContext = (ModelItemDslContext)parentContext;
if (modelItemDslContext.getModelItem() instanceof Element) {
bindings.put(ELEMENT_VARIABLE_NAME, modelItemDslContext.getModelItem());
} else if (modelItemDslContext.getModelItem() instanceof Relationship) {
bindings.put(RELATIONSHIP_VARIABLE_NAME, modelItemDslContext.getModelItem());
}
}

// bind a context object
StructurizrDslScriptContext scriptContext = new StructurizrDslScriptContext(dslParser, dslFile, getWorkspace(), parameters);
bindings.put(CONTEXT_VARIABLE_NAME, scriptContext);

// and any custom parameters
for (String name : parameters.keySet()) {
bindings.put(name, parameters.get(name));
}
}

}

0 comments on commit ff37cc2

Please sign in to comment.