From 1c8afd14e625e9eb9370c71b80dfd6476dcf42f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 26 Feb 2021 17:59:32 +0100 Subject: [PATCH] [Editor] Create Application Runner which allows to run game from the UI --- .../pipeline/DefaultBuildPipelineService.kt | 1 - .../base/editor/main/view/MainMenuView.kt | 10 ++- .../process/runner/app/ApplicationRunner.kt | 8 +++ .../runner/app/DefaultApplicationRunner.kt | 63 +++++++++++++++++++ .../process/runner/jar/DefaultJarRunner.kt | 19 ++++++ .../editor/process/runner/jar/JarRunner.kt | 7 +++ .../base/editor/project/model/Project.kt | 6 ++ 7 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/app/ApplicationRunner.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/app/DefaultApplicationRunner.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/jar/DefaultJarRunner.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/jar/JarRunner.kt diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt index 36b4a358..5c5f4339 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt @@ -98,7 +98,6 @@ class DefaultBuildPipelineService : BuildPipelineService { } companion object { - private const val OUTPUT_JAR_NAME = "game.jar" private const val TAG = "Build" } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainMenuView.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainMenuView.kt index b7c1f5ac..5bd0df1a 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainMenuView.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainMenuView.kt @@ -3,12 +3,14 @@ package com.bartlomiejpluta.base.editor.main.view import com.bartlomiejpluta.base.editor.code.build.pipeline.BuildPipelineService import com.bartlomiejpluta.base.editor.main.controller.MainController import com.bartlomiejpluta.base.editor.project.context.ProjectContext +import com.bartlomiejpluta.base.editor.process.runner.app.ApplicationRunner import tornadofx.* class MainMenuView : View() { private val mainController: MainController by di() private val projectContext: ProjectContext by di() private val buildPipelineService: BuildPipelineService by di() + private val applicationRunner: ApplicationRunner by di() override val root = menubar { menu("File") { @@ -18,7 +20,6 @@ class MainMenuView : View() { } } - item("Open project...") { action { mainController.openProject() @@ -61,6 +62,13 @@ class MainMenuView : View() { buildPipelineService.build() } } + + item("Run") { + enableWhen(applicationRunner.isRunningProperty.not()) + action { + applicationRunner.run() + } + } } } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/app/ApplicationRunner.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/app/ApplicationRunner.kt new file mode 100644 index 00000000..2672dbd5 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/app/ApplicationRunner.kt @@ -0,0 +1,8 @@ +package com.bartlomiejpluta.base.editor.process.runner.app + +import javafx.beans.binding.BooleanExpression + +interface ApplicationRunner { + val isRunningProperty: BooleanExpression + fun run() +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/app/DefaultApplicationRunner.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/app/DefaultApplicationRunner.kt new file mode 100644 index 00000000..a846c8f8 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/app/DefaultApplicationRunner.kt @@ -0,0 +1,63 @@ +package com.bartlomiejpluta.base.editor.process.runner.app + +import com.bartlomiejpluta.base.editor.code.build.pipeline.BuildPipelineService +import com.bartlomiejpluta.base.editor.process.runner.jar.JarRunner +import com.bartlomiejpluta.base.editor.project.context.ProjectContext +import com.bartlomiejpluta.base.editor.project.model.Project +import javafx.event.EventHandler +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component +import tornadofx.getValue +import tornadofx.runAsync +import tornadofx.setValue +import tornadofx.toProperty + +@Component +class DefaultApplicationRunner : ApplicationRunner { + + @Autowired + private lateinit var projectContext: ProjectContext + + @Autowired + private lateinit var pipelineService: BuildPipelineService + + @Autowired + private lateinit var jarRunner: JarRunner + + override val isRunningProperty = false.toProperty() + private var isRunning by isRunningProperty + + override fun run() { + projectContext.project?.let { project -> + if (isRunning) { + return@let + } + + isRunning = true + pipelineService.build().onSucceeded = EventHandler { runApplication(project) } + } + } + + private fun runApplication(project: Project) { + val builder = jarRunner.run(project.buildOutputJarFile) + val process = builder.start() + + runAsync { + process.inputStream.bufferedReader().forEachLine { + println("OUTPUT -> $it") + } + } + + runAsync { + process.errorStream.bufferedReader().forEachLine { + println("ERROR -> $it") + } + } + + process.onExit().thenApply { + println("EXIT WITH ${it.exitValue()}") + isRunning = false + } + } + +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/jar/DefaultJarRunner.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/jar/DefaultJarRunner.kt new file mode 100644 index 00000000..16a0a19c --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/jar/DefaultJarRunner.kt @@ -0,0 +1,19 @@ +package com.bartlomiejpluta.base.editor.process.runner.jar + +import org.springframework.stereotype.Component +import java.io.File + +@Component +class DefaultJarRunner : JarRunner { + private val javaHome = System.getProperty("java.home") + private val classpath = System.getProperty("java.class.path") + private val javaBin = "$javaHome${FS}bin${FS}java" // == $JAVA_HOME/bin/java + + override fun run(jarFile: File, jvmArgs: Array, args: Array) = listOf( + javaBin, *jvmArgs, "-cp", classpath, "-jar", jarFile.absolutePath, *args + ).let { ProcessBuilder(it) } + + companion object { + private val FS = File.separator + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/jar/JarRunner.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/jar/JarRunner.kt new file mode 100644 index 00000000..31483096 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/process/runner/jar/JarRunner.kt @@ -0,0 +1,7 @@ +package com.bartlomiejpluta.base.editor.process.runner.jar + +import java.io.File + +interface JarRunner { + fun run(jarFile: File, jvmArgs: Array = emptyArray(), args: Array = emptyArray()): ProcessBuilder +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt index 41417b21..23d172a3 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt @@ -59,6 +59,10 @@ class Project { var buildOutDirectory by buildOutDirectoryProperty private set + val buildOutputJarFileProperty = + createObjectBinding({ File(buildOutDirectory, PROJECT_OUTPUT_JAR_FILE) }, buildOutDirectoryProperty) + val buildOutputJarFile by buildOutputJarFileProperty + init { sourceDirectoryProperty.addListener { _, _, dir -> dir?.let { @@ -83,6 +87,8 @@ class Project { companion object { const val PROJECT_FILE = "project.bep" + const val PROJECT_OUTPUT_JAR_FILE = "game.jar" + const val MAPS_DIR = "maps" const val TILESETS_DIR = "tilesets" const val IMAGES_DIR = "images"