From 80ce932527acd9f15ba968c7f9e50d4cef7dfb35 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Sat, 12 May 2018 18:19:52 +0200 Subject: Visualisation queue --- .../pi2graphviz/VisualisationQueque.xtend | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/VisualisationQueque.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/VisualisationQueque.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/VisualisationQueque.xtend new file mode 100644 index 00000000..79074bfc --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/VisualisationQueque.xtend @@ -0,0 +1,82 @@ +package hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz + +import guru.nidi.graphviz.engine.Format +import guru.nidi.graphviz.engine.Graphviz +import guru.nidi.graphviz.engine.GraphvizEngine +import guru.nidi.graphviz.engine.GraphvizV8Engine +import guru.nidi.graphviz.model.Graph +import java.io.File +import java.io.IOException +import java.util.concurrent.BlockingQueue +import java.util.concurrent.CompletableFuture +import java.util.concurrent.LinkedBlockingQueue +import org.eclipse.xtend.lib.annotations.Data + +class VisualisationQueque { + val BlockingQueue taskQueue = new LinkedBlockingQueue + var Thread runnerThread = null; + + def addTask(Graph document, File targetFile) { + val future = new CompletableFuture(); + taskQueue.add( + new VisualisationQueueEntry(document,targetFile,targetFile.speficyFormat,future) + ) + return future + } + + private def Format speficyFormat(File targetFile) { + val ^extension = targetFile.name.split('\\.').last + if(^extension === null) { + throw new IllegalArgumentException('''No file extension specified in path "«targetFile.path»"!''') + } else { + val extensionInUppercase = ^extension.toUpperCase + try { + return Format.valueOf(extensionInUppercase) + } catch(IllegalArgumentException e) { + throw new IllegalArgumentException('''Unsupported extension: ".«extensionInUppercase»"!''',e) + } + } + } + + def void start() { + if(runnerThread !== null) { + // do nothing + } else { + runnerThread = new Thread(new Runnable() { + val engine = new GraphvizV8Engine() + + override run() { + //println("Visualisation thread started") + while(true) { + val head = taskQueue.take + //println("Task scheduled: "+head.targetFile) + val message = engine.execute(head.document,head.targetFile,head.format) + //println("Task finished: "+head.targetFile) + head.future.complete(message) + } + } + }) + runnerThread.daemon = true + runnerThread.name = "GraphVizVisualiser" + runnerThread.start + } + } + + private def execute(GraphvizEngine engine, Graph document, File targetFile, Format format) { + Graphviz.useEngine(engine); + try { + Graphviz.fromGraph(document).render(format).toFile(targetFile) + return null + } catch(IOException e){ + return e.message + } + } + + @Data private static class VisualisationQueueEntry { + Graph document + File targetFile + Format format + CompletableFuture future + } +} + -- cgit v1.2.3-70-g09d2