From 1bb7acb8e70ecf51e1c373fe1a621961393a55c6 Mon Sep 17 00:00:00 2001
From: Jan-Niclas Struewer <j.n.struewer@gmail.com>
Date: Tue, 2 May 2023 09:25:36 +0200
Subject: [PATCH] added test endpoint. added external process task

---
 .../dataprovider/gitlab/GitlabController.kt   |  4 ++--
 .../dataprovider/taskManager/TaskManager.kt   | 11 +++++-----
 .../taskManager/tasks/ProcessTask.kt          | 20 ++++++++++++-------
 3 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt
index e9429a96..13d95ee4 100644
--- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt
@@ -2,7 +2,7 @@ package de.fraunhofer.iem.dataprovider.gitlab
 
 import de.fraunhofer.iem.dataprovider.logger.getLogger
 import de.fraunhofer.iem.dataprovider.taskManager.TaskManager
-import de.fraunhofer.iem.dataprovider.taskManager.tasks.ProcessTask
+import de.fraunhofer.iem.dataprovider.taskManager.tasks.JavaTask
 import de.fraunhofer.iem.dataprovider.taskManager.tasks.TaskType
 import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.PostMapping
@@ -51,6 +51,6 @@ class GitlabController(private val gitlabService: GitlabService, private val tas
 
     @GetMapping("/test")
     suspend fun test() {
-        taskManager.addTask(ProcessTask(TaskType.REPO_CHANGED))
+        taskManager.addTask(JavaTask(TaskType.REPO_CHANGED, "-version", responseChannel = taskManager::addTask ))
     }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/TaskManager.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/TaskManager.kt
index 160edb33..9ffefe4d 100644
--- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/TaskManager.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/TaskManager.kt
@@ -36,15 +36,16 @@ class TaskManager: IWorker {
 
     private fun CoroutineScope.taskActor() = actor<ITask> {
         for (task in channel) {
+            logger.info("[${Thread.currentThread().name}] add task called in Task Manager $task")
             // For test purposes we have the Done task, which prints a control
             // message printed in the task manager.
             if (task.type == TaskType.DONE) {
                 task.execute()
-            }
-            logger.info("[${Thread.currentThread().name}] add task called in Task Manager $task")
-            when(task) {
-                is GetGitlabProjectTask -> ioWorker.addTask(task)
-                else -> worker.addTask(task)
+            } else {
+                when (task) {
+                    is GetGitlabProjectTask -> ioWorker.addTask(task)
+                    else -> worker.addTask(task)
+                }
             }
             logger.info("[${Thread.currentThread().name}] add task finished in Task Manager $task")
         }
diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ProcessTask.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ProcessTask.kt
index 220f319c..780ccf2c 100644
--- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ProcessTask.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ProcessTask.kt
@@ -1,31 +1,37 @@
 package de.fraunhofer.iem.dataprovider.taskManager.tasks
 
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
 sealed class ProcessTask(protected open vararg val flags: String): Task() {
 
     protected abstract val execPath: String
-
+    private val mainScope = CoroutineScope(Dispatchers.Default)
     override suspend fun execute() {
 
         val p = ProcessBuilder(execPath, *flags)
             .start()
 
         p.onExit().thenApply { p1 ->
-            handleProcessReturn(p1)
+            mainScope.launch {
+                handleProcessReturn(p1)
+            }
         }
 
     }
 
-    abstract fun handleProcessReturn(p: Process)
+    abstract suspend fun handleProcessReturn(p: Process)
 }
 
 class JavaTask(
     override val type: TaskType,
-    override val execPath: String,
     override vararg val flags: String,
-    val addTask: (task: Task) -> Unit
+    private val responseChannel: suspend (task: ITask) -> Unit
 ): ProcessTask() {
 
-    override fun handleProcessReturn(p: Process) {
-        addTask(DoneTask("Done with external process. Exit value ${p.exitValue()}"))
+    override val execPath: String = "java"
+    override suspend fun handleProcessReturn(p: Process) {
+        responseChannel(DoneTask("Done with external process. Exit value ${p.exitValue()}"))
     }
 }
\ No newline at end of file
-- 
GitLab