diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/game/DefaultGameEngineProvider.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/game/DefaultGameEngineProvider.kt index 2793daec..85675c82 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/game/DefaultGameEngineProvider.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/game/DefaultGameEngineProvider.kt @@ -6,9 +6,9 @@ import java.io.File @Component class DefaultGameEngineProvider : GameEngineProvider { - override fun provideBaseGameEngine(target: File) { + override fun provideBaseGameEngine(targetJar: File) { javaClass.getResourceAsStream("/engine/game.jar").use { ris -> - target.outputStream().use { fos -> + targetJar.outputStream().use { fos -> ris.copyTo(fos) } } 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 index d199716c..7db61640 100644 --- 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 @@ -4,4 +4,5 @@ import java.io.File interface JarPackager { fun pack(sourceDirectory: File, targetJar: File, root: String = ".") + fun copy(file: 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 index 4ffc59fe..b991f768 100644 --- 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 @@ -20,11 +20,22 @@ class ZipBasedJarPackager : JarPackager { 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) + .forEach { file -> + val path = jar.getPath(Paths.get(root, source.relativize(file).toString()).normalize().toString()) + path.parent?.let { Files.createDirectories(it) } + Files.copy(file, path, StandardCopyOption.REPLACE_EXISTING) } } } + + override fun copy(file: File, targetJar: File, root: String) { + val env = mapOf("create" to "true") + val zip = targetJar.toPath() + val uri = URI.create("jar:" + zip.toUri()) + + FileSystems.newFileSystem(uri, env).use { jar -> + val path = jar.getPath(Paths.get(root, file.name).normalize().toString()) + file.inputStream().use { fis -> Files.copy(fis, path) } + } + } } \ 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 index 4ea4e583..5d2b4def 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 @@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.editor.code.build.pipeline import com.bartlomiejpluta.base.editor.code.build.compiler.ScriptCompiler import com.bartlomiejpluta.base.editor.code.build.game.GameEngineProvider import com.bartlomiejpluta.base.editor.code.build.packager.JarPackager +import com.bartlomiejpluta.base.editor.code.build.project.ProjectAssembler import com.bartlomiejpluta.base.editor.project.context.ProjectContext import com.bartlomiejpluta.base.editor.project.model.Project import org.springframework.beans.factory.annotation.Autowired @@ -21,6 +22,9 @@ class DefaultBuildPipelineService : BuildPipelineService { @Autowired private lateinit var engineProvider: GameEngineProvider + @Autowired + private lateinit var projectAssembler: ProjectAssembler + @Autowired private lateinit var projectContext: ProjectContext @@ -33,6 +37,7 @@ class DefaultBuildPipelineService : BuildPipelineService { compiler.compile(it.codeFSNode, it.buildClassesDirectory) engineProvider.provideBaseGameEngine(outputFile) packager.pack(it.buildClassesDirectory, outputFile, "BOOT-INF/classes") + projectAssembler.assembly(it, outputFile) } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/DefaultProjectAssembler.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/DefaultProjectAssembler.kt new file mode 100644 index 00000000..1f722c07 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/DefaultProjectAssembler.kt @@ -0,0 +1,21 @@ +package com.bartlomiejpluta.base.editor.code.build.project + +import com.bartlomiejpluta.base.editor.code.build.packager.JarPackager +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 DefaultProjectAssembler : ProjectAssembler { + + @Autowired + private lateinit var packager: JarPackager + + override fun assembly(project: Project, targetJar: File) { + packager.pack(project.mapsDirectory, targetJar, "BOOT-INF/classes/project/maps") + packager.pack(project.tileSetsDirectory, targetJar, "BOOT-INF/classes/project/tilesets") + packager.pack(project.imagesDirectory, targetJar, "BOOT-INF/classes/project/images") + packager.copy(project.projectFile, targetJar, "BOOT-INF/classes/project") + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/ProjectAssembler.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/ProjectAssembler.kt new file mode 100644 index 00000000..83e535b9 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/project/ProjectAssembler.kt @@ -0,0 +1,8 @@ +package com.bartlomiejpluta.base.editor.code.build.project + +import com.bartlomiejpluta.base.editor.project.model.Project +import java.io.File + +interface ProjectAssembler { + fun assembly(project: Project, targetJar: File) +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt index 59815a17..5d086770 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt @@ -59,7 +59,7 @@ class DefaultProjectContext : ProjectContext { project?.let { it.sourceDirectory.mkdirs() - FileOutputStream(File(it.sourceDirectory, "project.bep")).use { fos -> + FileOutputStream(it.projectFile).use { fos -> projectSerializer.serialize(it, fos) } } 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 4f8d9d74..41417b21 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 @@ -4,7 +4,7 @@ import com.bartlomiejpluta.base.editor.code.model.FileSystemNode import com.bartlomiejpluta.base.editor.image.asset.ImageAsset import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset import com.bartlomiejpluta.base.editor.tileset.asset.TileSetAsset -import javafx.beans.binding.Bindings +import javafx.beans.binding.Bindings.createObjectBinding import javafx.beans.property.SimpleObjectProperty import javafx.beans.property.SimpleStringProperty import tornadofx.getValue @@ -19,6 +19,9 @@ class Project { val sourceDirectoryProperty = SimpleObjectProperty() val sourceDirectory by sourceDirectoryProperty + val projectFileProperty = createObjectBinding({ File(sourceDirectory, PROJECT_FILE) }, sourceDirectoryProperty) + val projectFile by projectFileProperty + val maps = observableListOf() val tileSets = observableListOf() val images = observableListOf() @@ -40,7 +43,7 @@ class Project { val codeDirectoryProperty = SimpleObjectProperty() var codeDirectory by codeDirectoryProperty private set - val codeFSNodeProperty = Bindings.createObjectBinding({ FileSystemNode(codeDirectory) }, codeDirectoryProperty) + val codeFSNodeProperty = createObjectBinding({ FileSystemNode(codeDirectory) }, codeDirectoryProperty) val codeFSNode by codeFSNodeProperty // Build directories @@ -79,6 +82,7 @@ class Project { } companion object { + const val PROJECT_FILE = "project.bep" const val MAPS_DIR = "maps" const val TILESETS_DIR = "tilesets" const val IMAGES_DIR = "images"