Skip to content

Commit f114937

Browse files
committed
improve js engine error handling (logging)
Signed-off-by: Stefan Niederhauser <[email protected]>
1 parent b5451a8 commit f114937

File tree

6 files changed

+56
-24
lines changed

6 files changed

+56
-24
lines changed

graphviz-java/src/main/java/guru/nidi/graphviz/engine/AbstractJsGraphvizEngine.java

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static java.util.stream.Collectors.joining;
2727

2828
public abstract class AbstractJsGraphvizEngine extends AbstractGraphvizEngine {
29+
private static final String RENDER_JS = loadAsString("guru/nidi/graphviz/engine/render.js");
2930
private static final String VIZ_BASE = "META-INF/resources/webjars/viz.js-graphviz-java/2.1.3/";
3031
static final boolean AVAILABLE = isOnClasspath(VIZ_BASE + "viz.js");
3132
private static final Pattern FONT_NAME_PATTERN = Pattern.compile("\"?fontname\"?\\s*=\\s*\"?(.*?)[\",;\\]]");
@@ -47,7 +48,7 @@ protected void doInit() {
4748
if (state == null || !state.ininted) {
4849
final JavascriptEngine engine = engine(true);
4950
engine.executeJavascript(vizJsCode());
50-
engine.executeJavascript(renderJsCode());
51+
engine.executeJavascript(RENDER_JS);
5152
execute("graph g { a -- b }", Options.create(), Rasterizer.NONE);
5253
}
5354
}
@@ -136,27 +137,6 @@ protected String promiseJsCode() {
136137
return loadAsString("net/arnx/nashorn/lib/promise.js");
137138
}
138139

139-
private String renderJsCode() {
140-
return "var viz; var totalMemory = 16777216;"
141-
+ "function initViz(force){"
142-
+ " if (force || !viz || viz.totalMemory !== totalMemory){"
143-
+ " viz = new Viz({"
144-
+ " Module: function(){ return Viz.Module({TOTAL_MEMORY: totalMemory}); },"
145-
+ " render: Viz.render"
146-
+ " });"
147-
+ " viz.totalMemory = totalMemory;"
148-
+ " }"
149-
+ " return viz;"
150-
+ "}"
151-
+ "function render(src, options){"
152-
+ " try {"
153-
+ " initViz().renderString(src, options)"
154-
+ " .then(function(res) { result(res); })"
155-
+ " .catch(function(err) { initViz(true); error(err.toString()); });"
156-
+ " } catch(e) { error(e.toString()); }"
157-
+ "}";
158-
}
159-
160140
private static class EngineState {
161141
final JavascriptEngine engine;
162142
boolean ininted;

graphviz-java/src/main/java/guru/nidi/graphviz/engine/GraalJavascriptEngine.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ class GraalJavascriptEngine extends AbstractJavascriptEngine {
2525
GraalJavascriptEngine() {
2626
context.getPolyglotBindings().putMember("handler", resultHandler);
2727
eval("function result(r){ Polyglot.import('handler').setResult(r); }"
28-
+ "function error(r){ Polyglot.import('handler').setError(r); }");
28+
+ "function error(r){ Polyglot.import('handler').setError(r); }"
29+
+ "function log(r){ Polyglot.import('handler').log(r); }");
2930
}
3031

3132
@Override

graphviz-java/src/main/java/guru/nidi/graphviz/engine/NashornJavascriptEngine.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ class NashornJavascriptEngine extends AbstractJavascriptEngine {
4141
+ "Use javascript of Graal instead by adding this dependency: org.graalvm.js:js");
4242
}
4343
context.getBindings(ScriptContext.ENGINE_SCOPE).put("handler", resultHandler);
44-
eval("function result(r){ handler.setResult(r); }" + "function error(r){ handler.setError(r); }");
44+
eval("function result(r){ handler.setResult(r); }"
45+
+ "function error(r){ handler.setError(r); }"
46+
+ "function log(r){ handler.log(r); }");
4547
}
4648

4749
@Override

graphviz-java/src/main/java/guru/nidi/graphviz/engine/ResultHandler.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,22 @@
1515
*/
1616
package guru.nidi.graphviz.engine;
1717

18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
20+
1821
import java.util.concurrent.ArrayBlockingQueue;
1922
import java.util.concurrent.BlockingQueue;
2023

2124
//public because of nashorn
2225
public class ResultHandler {
26+
private static final Logger LOG = LoggerFactory.getLogger(ResultHandler.class);
2327
private final BlockingQueue<String> value = new ArrayBlockingQueue<>(1);
2428
private boolean ok;
2529

30+
public void log(String msg) {
31+
LOG.warn(msg);
32+
}
33+
2634
public void setResult(String result) {
2735
ok = true;
2836
value.add(result);

graphviz-java/src/main/java/guru/nidi/graphviz/engine/V8JavascriptEngine.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ public V8JavascriptEngine(@Nullable String extractionPath) {
4646
: rawMsg;
4747
resultHandler.setError(msg);
4848
}, "error");
49+
v8.registerJavaMethod((receiver, parameters) -> {
50+
resultHandler.log(parameters.getString(0));
51+
}, "log");
4952
LOG.info("Initialized javascript.");
5053
}
5154

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
var viz;
2+
var totalMemory = 16777216;
3+
4+
function initViz(force) {
5+
if (force || !viz || viz.totalMemory !== totalMemory) {
6+
viz = new Viz({
7+
Module: function () {
8+
return Viz.Module({
9+
print: function (e) {
10+
log(e);
11+
},
12+
printErr: function (e) {
13+
log(e);
14+
},
15+
TOTAL_MEMORY: totalMemory
16+
});
17+
},
18+
render: Viz.render
19+
});
20+
viz.totalMemory = totalMemory;
21+
}
22+
return viz;
23+
}
24+
25+
function render(src, options) {
26+
try {
27+
initViz().renderString(src, options)
28+
.then(function (res) {
29+
result(res);
30+
})
31+
.catch(function (err) {
32+
initViz(true);
33+
error(err.toString());
34+
});
35+
} catch (e) {
36+
error(e.toString());
37+
}
38+
}

0 commit comments

Comments
 (0)