blob: b067ba7dd211ab58860fb87817245293853245c8 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
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
import java.util.function.Consumer
class VisualisationQueque {
val BlockingQueue<VisualisationQueueEntry> taskQueue = new LinkedBlockingQueue
var Thread runnerThread = null;
def addTask(Graph document, File targetFile) {
val future = new CompletableFuture<String>();
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() {
override run() {
val engine = new GraphvizV8Engine()
val nullConsumer = new Consumer<GraphvizEngine>() {
override accept(GraphvizEngine t) {}
}
engine.init(nullConsumer,nullConsumer)
//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<String> future
}
}
|