package org.jboss.windup.reporting.renderer.graphviz;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.jboss.windup.reporting.renderer.dot.DotWriter;
import java.util.logging.Logger;
import org.jboss.windup.util.Logging;
import com.tinkerpop.blueprints.Graph;
public class GraphvizWriter extends DotWriter
{
private static final Logger LOG = Logging.get(GraphvizWriter.class);
private final CompiledScript vizJsCompiled;
public GraphvizWriter(Graph graph) throws ScriptException, IOException
{
super(graph);
if (true)
{
throw new RuntimeException(
"Not yet implemented; this is unstable. The javascript requires Int32Array, which isn't currently provided by Rhino.");
}
// precompile the javascript.
StringBuilder builder = new StringBuilder();
builder.append(IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("vizjs/viz.js")));
builder = new StringBuilder();
builder.append("function Viz() { console.log('Hello World'); }");
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
String script = builder.toString();
Compilable compilingEngine = (Compilable) engine;
vizJsCompiled = compilingEngine.compile(builder.toString());
}
@Override
public void writeGraph(OutputStream os) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
super.writeGraph(baos);
try
{
StringBuilder builder = new StringBuilder();
builder.append(IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("vizjs/viz.js")));
builder.append("var result = new Viz(dotGraph);");
String script = builder.toString();
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Compilable compilingEngine = (Compilable) engine;
CompiledScript cscript = compilingEngine.compile(script);
// Bindings bindings = cscript.getEngine().createBindings();
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
for (Map.Entry me : bindings.entrySet())
{
System.out.printf("%s: %s\n", me.getKey(), String.valueOf(me.getValue()));
}
bindings.put("dotGraph", baos.toString());
// cscript.eval();
Object result = cscript.eval(bindings);
LOG.info("Result:" + ReflectionToStringBuilder.toString(result));
}
catch (Exception e)
{
throw new IOException("Exception generating graph.", e);
}
}
}