diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/DataProviderApplication.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/DataProviderApplication.kt index ed3c240b11402e4a4f86e9958a7f9fead10fc794..dbc39208563f2fc34ba4f510e602e203c8842d72 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/DataProviderApplication.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/DataProviderApplication.kt @@ -8,5 +8,6 @@ import org.springframework.boot.runApplication class DataProviderApplication fun main(args: Array<String>) { + println("Started app [${Thread.currentThread().name}]") runApplication<DataProviderApplication>(*args) } diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/WebSecurityConfiguration.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/WebSecurityConfiguration.kt index 9d8cd00031ce48bffa90d37bc69abc1d33538320..202fbbb8faf95fcda0f349b480403a32a67eb61f 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/WebSecurityConfiguration.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/WebSecurityConfiguration.kt @@ -18,8 +18,9 @@ class SecurityConfiguration { authorizeExchange { authorize("/gitlab/repoChanged", permitAll) } - csrf { disable() } - + csrf { + disable() + } } } } \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/GitService.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/GitService.kt new file mode 100644 index 0000000000000000000000000000000000000000..4ba78604d6ef047ab0bf7071e9a09d81204d47bb --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/GitService.kt @@ -0,0 +1,20 @@ +package de.fraunhofer.iem.dataprovider.git + +import org.springframework.stereotype.Service +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* +@Service +class GitService(private val taskManager: TaskManager) { + + + suspend fun cloneGit() { + println("clone git called") + repeat(20) { + taskManager.addTask("Task no $it") + } + // val git: Git = Git.cloneRepository() +// .setURI("https://github.com/eclipse/jgit.git") +// .setDirectory("/path/to/repo") +// .call() + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/TaskManager.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/TaskManager.kt new file mode 100644 index 0000000000000000000000000000000000000000..5d335adae5860ecdf52b057c42440f336e28974b --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/TaskManager.kt @@ -0,0 +1,53 @@ +package de.fraunhofer.iem.dataprovider.git + +import jakarta.annotation.PostConstruct +import jakarta.annotation.PreDestroy +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.Channel +import org.springframework.stereotype.Component +import kotlin.coroutines.CoroutineContext + +@Component +class TaskManager : CoroutineScope { + + private val job = SupervisorJob() + override val coroutineContext: CoroutineContext + get() = Dispatchers.Default + job + + // TODO: this could be dangerous to give it unlimited memory + private val tasks = Channel<String>(Channel.UNLIMITED) + + @PostConstruct + fun startWorkers() { + // TODO: spawn threads equal to number of cores + repeat(10) { + println("[${Thread.currentThread().name}] launching coroutine") + launchWorker(it) + } + } + + private fun launchWorker(id: Int) = launch { + for (task in tasks) { + println("[${Thread.currentThread().name}] Processor #$id received $task") + executeTask(task) + println("[${Thread.currentThread().name}] Processor #$id finished $task") + } + } + + private suspend fun executeTask(task: String) { + // simulate a long running task + delay(5000) + } + + fun addTask(task: String) { + launch { + tasks.send(task) + } + } + + @PreDestroy + fun stop() { + job.cancel() + } + +} 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 3ba2c9b155a808962d4b3becd63c049124e3f91a..c062fcb3f27674b8a5de281bd78030b325c23da1 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt @@ -14,7 +14,7 @@ class GitlabController(private val gitlabService: GitlabService) { private val logger = getLogger(javaClass) @PostMapping("/repoChanged") - fun repoChanged(@RequestBody repositoryChangedDto: RepositoryChangedDto) { + suspend fun repoChanged(@RequestBody repositoryChangedDto: RepositoryChangedDto) { logger.info("Repo changed POST request for ID ${repositoryChangedDto.repoId} received.") gitlabService.queryRepo(repositoryChangedDto.repoId) } diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt index 12e5670f1f25107c1a4087d96d7ed1cc25eabbe5..1312899173ea182bf2cc42a67a396551b4b52bec 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt @@ -1,23 +1,21 @@ package de.fraunhofer.iem.dataprovider.gitlab +import de.fraunhofer.iem.dataprovider.git.GitService import de.fraunhofer.iem.dataprovider.logger.getLogger import org.eclipse.jgit.api.Git import org.gitlab4j.api.GitLabApi import org.springframework.stereotype.Service @Service -class GitlabService(gitlabConfiguration: GitlabConfiguration) { +class GitlabService(gitlabConfiguration: GitlabConfiguration, val gitService: GitService) { private val logger = getLogger(javaClass) private var gitlabApi = GitLabApi(gitlabConfiguration.host, gitlabConfiguration.accessToken) - fun queryRepo(repoId: Long) { - val project = gitlabApi.projectApi.getProject(repoId) - logger.info(project.toString()) - val projectUri = project.sshUrlToRepo -// val git: Git = Git.cloneRepository() -// .setURI("https://github.com/eclipse/jgit.git") -// .setDirectory("/path/to/repo") -// .call() + suspend fun queryRepo(repoId: Long) { +// val project = gitlabApi.projectApi.getProject(repoId) +// logger.info(project.toString()) +// val projectUri = project.sshUrlToRepo + gitService.cloneGit() } } \ No newline at end of file