diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/GitService.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/GitService.kt deleted file mode 100644 index 1b40b291c232b9a83462daf8177722524f9aab5f..0000000000000000000000000000000000000000 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/git/GitService.kt +++ /dev/null @@ -1,21 +0,0 @@ -package de.fraunhofer.iem.dataprovider.git - -import de.fraunhofer.iem.dataprovider.taskManager.GitTask -import de.fraunhofer.iem.dataprovider.taskManager.Task -import de.fraunhofer.iem.dataprovider.taskManager.TaskManager -import de.fraunhofer.iem.dataprovider.taskManager.TaskType -import org.springframework.stereotype.Service - -@Service -class GitService(private val taskManager: TaskManager) { - - val list = listOf("https://github.com/eclipse/jgit.git", "https://github.com/secure-software-engineering/phasar", "https://github.com/secure-software-engineering/FlowDroid") - - suspend fun cloneGit() { - println("clone git called") - for (e in list) { - val t = GitTask(TaskType.REPO_CHANGED, e, taskManager::addTask) - taskManager.addTask(t) - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabConfiguration.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabConfiguration.kt deleted file mode 100644 index 1d9eda1740c3c6e0de353d87a6f9c63661fd65b5..0000000000000000000000000000000000000000 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabConfiguration.kt +++ /dev/null @@ -1,12 +0,0 @@ -package de.fraunhofer.iem.dataprovider.gitlab - -import org.springframework.beans.factory.annotation.Value -import org.springframework.stereotype.Component - -@Component -class GitlabConfiguration { - @Value("\${OPENCODE_GITLAB_URL}") - lateinit var host: String - @Value("\${OPENCODE_GITLAB_TOKEN}") - lateinit var accessToken: String -} \ No newline at end of file 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 c062fcb3f27674b8a5de281bd78030b325c23da1..829194f0ba84a55f6c5643d6b8c436d7b6e01f86 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabController.kt @@ -6,16 +6,28 @@ import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController -data class RepositoryChangedDto(val repoId: Long) +enum class Platform { + OPEN_CODE, + GITHUB, +} +data class RepositoryChangedDto(val repoId: Long, val platform: Platform) @RestController @RequestMapping("/gitlab") class GitlabController(private val gitlabService: GitlabService) { private val logger = getLogger(javaClass) + // TODO: if the parsing of the request body fails we send a stack + // trace back this should be changed to a custom error. @PostMapping("/repoChanged") suspend fun repoChanged(@RequestBody repositoryChangedDto: RepositoryChangedDto) { - logger.info("Repo changed POST request for ID ${repositoryChangedDto.repoId} received.") - gitlabService.queryRepo(repositoryChangedDto.repoId) + logger.info("Repo changed POST request for ID ${repositoryChangedDto.repoId} on platform ${repositoryChangedDto.platform} received.") + when (repositoryChangedDto.platform) { + Platform.OPEN_CODE -> gitlabService.queryOpenCodeProject(repositoryChangedDto.repoId) + else -> { + logger.info("Platform currently not supported.") + // TODO: send fitting http response + } + } } } \ No newline at end of file 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 1312899173ea182bf2cc42a67a396551b4b52bec..ec09be77bfc53ce64aeecdf929fd4faaf14e1185 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/GitlabService.kt @@ -1,21 +1,19 @@ 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 de.fraunhofer.iem.dataprovider.taskManager.TaskManager +import de.fraunhofer.iem.dataprovider.taskManager.tasks.GetGitlabProjectTask import org.springframework.stereotype.Service + + @Service -class GitlabService(gitlabConfiguration: GitlabConfiguration, val gitService: GitService) { +class GitlabService(private val openCodeGitlabConfiguration: OpenCodeGitlabConfiguration, private val taskManager: TaskManager) { private val logger = getLogger(javaClass) - private var gitlabApi = GitLabApi(gitlabConfiguration.host, gitlabConfiguration.accessToken) - suspend fun queryRepo(repoId: Long) { -// val project = gitlabApi.projectApi.getProject(repoId) -// logger.info(project.toString()) -// val projectUri = project.sshUrlToRepo - gitService.cloneGit() + + suspend fun queryOpenCodeProject(repoId: Long) { + taskManager.addTask(GetGitlabProjectTask(repoId = repoId, gitlabConfiguration = openCodeGitlabConfiguration, responseChannel = taskManager::addTask)) } } \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/OpenCodeGitlabConfiguration.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/OpenCodeGitlabConfiguration.kt new file mode 100644 index 0000000000000000000000000000000000000000..88fa1a70433f5038fddc0759a1b5246a25532e41 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/gitlab/OpenCodeGitlabConfiguration.kt @@ -0,0 +1,24 @@ +package de.fraunhofer.iem.dataprovider.gitlab + +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Component + +interface GitlabConfiguration { + var host: String + var accessToken: String +} +@Component +class OpenCodeGitlabConfiguration: GitlabConfiguration { + @Value("\${OPENCODE_GITLAB_URL}") + override lateinit var host: String + @Value("\${OPENCODE_GITLAB_TOKEN}") + override lateinit var accessToken: String +} + +@Component +class GitHubConfiguration: GitlabConfiguration { + @Value("\${GITHUB_URL}") + override lateinit var host: String + @Value("\${GITHUB_TOKEN}") + override lateinit var accessToken: String +} 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 d45f6b7492a7c34edcfe7105af79e79de78e6de3..160edb3317a485a8911c9eb50aa33ae205f72fd6 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/TaskManager.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/TaskManager.kt @@ -1,46 +1,14 @@ package de.fraunhofer.iem.dataprovider.taskManager import de.fraunhofer.iem.dataprovider.logger.getLogger +import de.fraunhofer.iem.dataprovider.taskManager.tasks.GetGitlabProjectTask +import de.fraunhofer.iem.dataprovider.taskManager.tasks.ITask +import de.fraunhofer.iem.dataprovider.taskManager.tasks.TaskType import jakarta.annotation.PreDestroy import kotlinx.coroutines.* import kotlinx.coroutines.channels.actor import org.springframework.stereotype.Component -enum class TaskType { - REPO_CHANGED, - DONE -} -interface Task { - val type: TaskType - suspend fun execute() -} - -class GitTask( - override val type: TaskType, - private val gitUrl: String, - private val responseChannel: suspend (task: Task) -> Unit -): Task { - override suspend fun execute() { - println("Cloning $gitUrl") - delay(5000) - responseChannel(DoneTask("Done 1 with gitUrl $gitUrl")) - delay(5000) - responseChannel(DoneTask("Done 2 with gitUrl $gitUrl")) - // val git: Git = Git.cloneRepository() -// .setURI("https://github.com/eclipse/jgit.git") -// .setDirectory("/path/to/repo") -// .call() - } -} - -class DoneTask(private val message: String? = null): Task { - override val type: TaskType = TaskType.DONE - override suspend fun execute() { - println("[${Thread.currentThread().name}] I'm done $message") - } -} - - /** * The Task Manager takes tasks and distributes them to * underlying workers. Internally it uses a channel @@ -55,18 +23,18 @@ class TaskManager: IWorker { private val worker = Worker("Worker") // Should be used for long-running tasks, which DON'T use CPU power and // are non-blocking - // private val ioWorker = Worker("IO-Worker", CoroutineScope(Dispatchers.IO)) + private val ioWorker = Worker("IO-Worker", CoroutineScope(Dispatchers.IO)) // Should be used for long-running CPU heavy tasks, which potentially block. // private val customWorker = getCustomThreadpoolWorker() private val logger = getLogger(javaClass) private val mainScope = CoroutineScope(Dispatchers.Default) private val actor = mainScope.taskActor() - override suspend fun addTask(task: Task) { + override suspend fun addTask(task: ITask) { actor.send(task) } - private fun CoroutineScope.taskActor() = actor<Task> { + private fun CoroutineScope.taskActor() = actor<ITask> { for (task in channel) { // For test purposes we have the Done task, which prints a control // message printed in the task manager. @@ -74,7 +42,10 @@ class TaskManager: IWorker { task.execute() } logger.info("[${Thread.currentThread().name}] add task called in Task Manager $task") - worker.addTask(task) + 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/Worker.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/Worker.kt index e8c8d0586d1a15ed8c22778f628ef62aa6df725f..7715df2978aa28f3e60fbc4c5c1763ced717cc48 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/Worker.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/Worker.kt @@ -1,6 +1,7 @@ package de.fraunhofer.iem.dataprovider.taskManager import de.fraunhofer.iem.dataprovider.logger.getLogger +import de.fraunhofer.iem.dataprovider.taskManager.tasks.ITask import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel @@ -9,7 +10,7 @@ interface IWorker { /** * Adds a new task to the worker's internal tasks channel. */ - suspend fun addTask(task: Task) + suspend fun addTask(task: ITask) // TODO: check if we can use autoclosable interface here. /** @@ -40,12 +41,12 @@ class Worker(private val name: String, ): IWorker { // TODO: this could be dangerous to give it unlimited memory - private val tasks = Channel<Task>(Channel.UNLIMITED) + private val tasks = Channel<ITask>(Channel.UNLIMITED) private val logger = getLogger(javaClass) - override suspend fun addTask(task: Task) { + override suspend fun addTask(task: ITask) { tasks.send(task) } diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitTask.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitTask.kt new file mode 100644 index 0000000000000000000000000000000000000000..09ff462425c9ee90e3fbe9c0df56140c3e73d6b3 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitTask.kt @@ -0,0 +1,24 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks + +import org.eclipse.jgit.api.Git +import java.io.File + + +data class GitProject(val name: String, val uri: String) +class GitTask( + override val type: TaskType, + private val gitProject: GitProject, + private val responseChannel: suspend (task: ITask) -> Unit +): Task() { + override suspend fun execute() { + logger.info("Cloning ${gitProject.name}") + + val git: Git = Git.cloneRepository() + .setURI(gitProject.uri) + .setDirectory( + File("/tmp/opencode/${gitProject.name}-${taskID}")) // TODO: add output path + .call() + git.close() + responseChannel(DoneTask("Successfully cloned ${gitProject.name}")) + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitlabTask.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitlabTask.kt new file mode 100644 index 0000000000000000000000000000000000000000..96ac3b9998174d959a7b6bb9c2f24a452d886e5b --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/GitlabTask.kt @@ -0,0 +1,22 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks + +import de.fraunhofer.iem.dataprovider.gitlab.GitlabConfiguration +import org.gitlab4j.api.GitLabApi + +class GetGitlabProjectTask( + override val type: TaskType = TaskType.REPO_CHANGED, + private val repoId: Long, + private val gitlabConfiguration: GitlabConfiguration, + private val responseChannel: suspend (task: ITask) -> Unit): Task() { + + private val gitlabApi: GitLabApi = GitLabApi(gitlabConfiguration.host, gitlabConfiguration.accessToken) + override suspend fun execute() { + logger.info("Gitlab config ${gitlabConfiguration.host} ${gitlabConfiguration.accessToken}") + val project = gitlabApi.projectApi.getProject(repoId) + logger.info(project.toString()) + val projectUri = project.sshUrlToRepo + val gitProject = GitProject(project.name, projectUri) + logger.info("Retrieved project ${project.path} and URI $projectUri") + responseChannel(GitTask(this.type, gitProject, responseChannel)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/Task.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/Task.kt new file mode 100644 index 0000000000000000000000000000000000000000..5168bacf66da4b688aa8b4621ba3f4798d0dd2f5 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/Task.kt @@ -0,0 +1,24 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks + +import de.fraunhofer.iem.dataprovider.logger.getLogger +import java.util.* + +enum class TaskType { + REPO_CHANGED, + DONE +} +interface ITask { + val type: TaskType + suspend fun execute() +} + +sealed class Task(protected val taskID: UUID = UUID.randomUUID()): ITask { + protected val logger = getLogger(javaClass) +} + +class DoneTask(private val message: String? = null): Task() { + override val type: TaskType = TaskType.DONE + override suspend fun execute() { + logger.info("[${Thread.currentThread().name}] I'm done $message") + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index db2873267210a0439e74f78b34e251630fce14c0..7ea02d250b2e5faad085be0f7d9a54e50ca99b4b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1,7 @@ spring.config.import=optional:classpath:.env[.properties] OPENCODE_GITLAB_URL=https://gitlab.opencode.de/ OPENCODE_GITLAB_TOKEN=${OPENCODE_TOKEN} +GITHUB_URL=https://gitlab.opencode.de/ +GITHUB_TOKEN=${GITHUB_TOKEN} spring.r2dbc.url=${R2DBC_URL} -logging.level.root=DEBUG \ No newline at end of file +#logging.level.root=DEBUG \ No newline at end of file