diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/JaninoCompiler.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/compiler/JaninoCompiler.kt similarity index 90% rename from editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/JaninoCompiler.kt rename to editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/compiler/JaninoCompiler.kt index dd44418b..9c228a74 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/JaninoCompiler.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/compiler/JaninoCompiler.kt @@ -1,4 +1,4 @@ -package com.bartlomiejpluta.base.editor.code.compiler +package com.bartlomiejpluta.base.editor.code.build.compiler import com.bartlomiejpluta.base.editor.code.model.FileSystemNode import com.bartlomiejpluta.base.editor.event.UpdateCompilationLogEvent @@ -38,12 +38,6 @@ class JaninoCompiler : ScriptCompiler { } private fun moveClassFilesToTargetDirectory(sourceDirectory: File, targetDirectory: File) { - if (targetDirectory.exists() && !targetDirectory.isDirectory) { - throw IllegalStateException("Target directory is actually a file") - } - - targetDirectory.mkdirs() - val files = Files.walk(sourceDirectory.toPath()) .filter(Files::isRegularFile) .map(Path::toFile) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/ScriptCompiler.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/compiler/ScriptCompiler.kt similarity index 75% rename from editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/ScriptCompiler.kt rename to editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/compiler/ScriptCompiler.kt index ca84e8a8..06716dcc 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/ScriptCompiler.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/compiler/ScriptCompiler.kt @@ -1,4 +1,4 @@ -package com.bartlomiejpluta.base.editor.code.compiler +package com.bartlomiejpluta.base.editor.code.build.compiler import com.bartlomiejpluta.base.editor.code.model.FileSystemNode import java.io.File diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/packager/JarPackager.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/packager/JarPackager.kt new file mode 100644 index 00000000..d199716c --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/packager/JarPackager.kt @@ -0,0 +1,7 @@ +package com.bartlomiejpluta.base.editor.code.build.packager + +import java.io.File + +interface JarPackager { + fun pack(sourceDirectory: File, targetJar: File, root: String = ".") +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/packager/ZipBasedJarPackager.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/packager/ZipBasedJarPackager.kt new file mode 100644 index 00000000..4ffc59fe --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/packager/ZipBasedJarPackager.kt @@ -0,0 +1,30 @@ +package com.bartlomiejpluta.base.editor.code.build.packager + +import org.springframework.stereotype.Component +import java.io.File +import java.net.URI +import java.nio.file.FileSystems +import java.nio.file.Files +import java.nio.file.Paths +import java.nio.file.StandardCopyOption + +@Component +class ZipBasedJarPackager : JarPackager { + + override fun pack(sourceDirectory: File, targetJar: File, root: String) { + val env = mapOf("create" to "true") + val zip = targetJar.toPath() + val uri = URI.create("jar:" + zip.toUri()) + val source = sourceDirectory.toPath() + + FileSystems.newFileSystem(uri, env).use { jar -> + Files.walk(source) + .filter(Files::isRegularFile) + .forEach { + val path = jar.getPath(Paths.get(root, source.relativize(it).toString()).normalize().toString()) + Files.createDirectories(path.parent) + Files.copy(it, path, StandardCopyOption.REPLACE_EXISTING) + } + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/BuildPipelineService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/BuildPipelineService.kt new file mode 100644 index 00000000..8d9fe214 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/BuildPipelineService.kt @@ -0,0 +1,5 @@ +package com.bartlomiejpluta.base.editor.code.build.pipeline + +interface BuildPipelineService { + fun build() +} \ No newline at end of file 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 new file mode 100644 index 00000000..c23276c0 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/pipeline/DefaultBuildPipelineService.kt @@ -0,0 +1,42 @@ +package com.bartlomiejpluta.base.editor.code.build.pipeline + +import com.bartlomiejpluta.base.editor.code.build.compiler.ScriptCompiler +import com.bartlomiejpluta.base.editor.code.build.packager.JarPackager +import com.bartlomiejpluta.base.editor.project.context.ProjectContext +import com.bartlomiejpluta.base.editor.project.model.Project +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component +import java.io.File + +@Component +class DefaultBuildPipelineService : BuildPipelineService { + + @Autowired + private lateinit var compiler: ScriptCompiler + + @Autowired + private lateinit var packager: JarPackager + + @Autowired + private lateinit var projectContext: ProjectContext + + override fun build() { + projectContext.project?.let { + prepareBuildDirectory(it) + + compiler.compile(it.codeFSNode, it.buildClassesDirectory) + packager.pack(it.buildClassesDirectory, File(it.buildOutDirectory, OUTPUT_JAR_NAME)) + } + } + + private fun prepareBuildDirectory(project: Project) { + project.buildDirectory.delete() + + project.buildClassesDirectory.mkdirs() + project.buildOutDirectory.mkdirs() + } + + companion object { + private const val OUTPUT_JAR_NAME = "game.jar" + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/CompilingService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/CompilingService.kt deleted file mode 100644 index 9508a1d7..00000000 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/CompilingService.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.bartlomiejpluta.base.editor.code.compiler - -interface CompilingService { - fun compile() -} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/DefaultCompilingService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/DefaultCompilingService.kt deleted file mode 100644 index c317dcc6..00000000 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/compiler/DefaultCompilingService.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.bartlomiejpluta.base.editor.code.compiler - -import com.bartlomiejpluta.base.editor.project.context.ProjectContext -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.stereotype.Component - -@Component -class DefaultCompilingService : CompilingService { - - @Autowired - private lateinit var compiler: ScriptCompiler - - @Autowired - private lateinit var projectContext: ProjectContext - - override fun compile() { - projectContext.project?.let { - compiler.compile(it.codeFSNode, it.buildClassesDirectory) - } - } -} \ 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 d1c13b04..a08ecbc9 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 @@ -1,6 +1,6 @@ package com.bartlomiejpluta.base.editor.main.view -import com.bartlomiejpluta.base.editor.code.compiler.CompilingService +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 tornadofx.* @@ -8,7 +8,7 @@ import tornadofx.* class MainMenuView : View() { private val mainController: MainController by di() private val projectContext: ProjectContext by di() - private val compilingService: CompilingService by di() + private val buildPipelineService: BuildPipelineService by di() override val root = menubar { menu("File") { @@ -57,7 +57,7 @@ class MainMenuView : View() { item("Compile") { action { - compilingService.compile() + buildPipelineService.build() } } } 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 8bdfbeaf..4f8d9d74 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 @@ -43,10 +43,19 @@ class Project { val codeFSNodeProperty = Bindings.createObjectBinding({ FileSystemNode(codeDirectory) }, codeDirectoryProperty) val codeFSNode by codeFSNodeProperty + // Build directories + val buildDirectoryProperty = SimpleObjectProperty() + var buildDirectory by buildDirectoryProperty + private set + val buildClassesDirectoryProperty = SimpleObjectProperty() var buildClassesDirectory by buildClassesDirectoryProperty private set + val buildOutDirectoryProperty = SimpleObjectProperty() + var buildOutDirectory by buildOutDirectoryProperty + private set + init { sourceDirectoryProperty.addListener { _, _, dir -> dir?.let { @@ -54,7 +63,9 @@ class Project { tileSetsDirectory = File(it, TILESETS_DIR) imagesDirectory = File(it, IMAGES_DIR) codeDirectory = File(it, CODE_DIR) + buildDirectory = File(it, BUILD_DIR) buildClassesDirectory = File(it, BUILD_CLASSES_DIR) + buildOutDirectory = File(it, BUILD_OUT_DIR) } } } @@ -72,6 +83,8 @@ class Project { const val TILESETS_DIR = "tilesets" const val IMAGES_DIR = "images" const val CODE_DIR = "code" - const val BUILD_CLASSES_DIR = "build/classes" + const val BUILD_DIR = "build" + const val BUILD_CLASSES_DIR = "$BUILD_DIR/classes" + const val BUILD_OUT_DIR = "$BUILD_DIR/out" } }