aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/VisualisationQueque.xtend
blob: 79074bfc5af25c50713df73ad9f4c41eeabbde89 (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
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<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() {
				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<String> future
	}
}