[Editor] Create Project Assembler

From now on, the project assets are assembled to the output *.jar file.
This commit is contained in:
2021-02-25 23:03:52 +01:00
parent b1f122ea20
commit ede2441ae4
8 changed files with 59 additions and 9 deletions

View File

@@ -6,9 +6,9 @@ import java.io.File
@Component @Component
class DefaultGameEngineProvider : GameEngineProvider { class DefaultGameEngineProvider : GameEngineProvider {
override fun provideBaseGameEngine(target: File) { override fun provideBaseGameEngine(targetJar: File) {
javaClass.getResourceAsStream("/engine/game.jar").use { ris -> javaClass.getResourceAsStream("/engine/game.jar").use { ris ->
target.outputStream().use { fos -> targetJar.outputStream().use { fos ->
ris.copyTo(fos) ris.copyTo(fos)
} }
} }

View File

@@ -4,4 +4,5 @@ import java.io.File
interface JarPackager { interface JarPackager {
fun pack(sourceDirectory: File, targetJar: File, root: String = ".") fun pack(sourceDirectory: File, targetJar: File, root: String = ".")
fun copy(file: File, targetJar: File, root: String = ".")
} }

View File

@@ -20,11 +20,22 @@ class ZipBasedJarPackager : JarPackager {
FileSystems.newFileSystem(uri, env).use { jar -> FileSystems.newFileSystem(uri, env).use { jar ->
Files.walk(source) Files.walk(source)
.filter(Files::isRegularFile) .filter(Files::isRegularFile)
.forEach { .forEach { file ->
val path = jar.getPath(Paths.get(root, source.relativize(it).toString()).normalize().toString()) val path = jar.getPath(Paths.get(root, source.relativize(file).toString()).normalize().toString())
Files.createDirectories(path.parent) path.parent?.let { Files.createDirectories(it) }
Files.copy(it, path, StandardCopyOption.REPLACE_EXISTING) 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) }
}
}
} }

View File

@@ -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.compiler.ScriptCompiler
import com.bartlomiejpluta.base.editor.code.build.game.GameEngineProvider 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.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.context.ProjectContext
import com.bartlomiejpluta.base.editor.project.model.Project import com.bartlomiejpluta.base.editor.project.model.Project
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
@@ -21,6 +22,9 @@ class DefaultBuildPipelineService : BuildPipelineService {
@Autowired @Autowired
private lateinit var engineProvider: GameEngineProvider private lateinit var engineProvider: GameEngineProvider
@Autowired
private lateinit var projectAssembler: ProjectAssembler
@Autowired @Autowired
private lateinit var projectContext: ProjectContext private lateinit var projectContext: ProjectContext
@@ -33,6 +37,7 @@ class DefaultBuildPipelineService : BuildPipelineService {
compiler.compile(it.codeFSNode, it.buildClassesDirectory) compiler.compile(it.codeFSNode, it.buildClassesDirectory)
engineProvider.provideBaseGameEngine(outputFile) engineProvider.provideBaseGameEngine(outputFile)
packager.pack(it.buildClassesDirectory, outputFile, "BOOT-INF/classes") packager.pack(it.buildClassesDirectory, outputFile, "BOOT-INF/classes")
projectAssembler.assembly(it, outputFile)
} }
} }

View File

@@ -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")
}
}

View File

@@ -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)
}

View File

@@ -59,7 +59,7 @@ class DefaultProjectContext : ProjectContext {
project?.let { project?.let {
it.sourceDirectory.mkdirs() it.sourceDirectory.mkdirs()
FileOutputStream(File(it.sourceDirectory, "project.bep")).use { fos -> FileOutputStream(it.projectFile).use { fos ->
projectSerializer.serialize(it, fos) projectSerializer.serialize(it, fos)
} }
} }

View File

@@ -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.image.asset.ImageAsset
import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset
import com.bartlomiejpluta.base.editor.tileset.asset.TileSetAsset 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.SimpleObjectProperty
import javafx.beans.property.SimpleStringProperty import javafx.beans.property.SimpleStringProperty
import tornadofx.getValue import tornadofx.getValue
@@ -19,6 +19,9 @@ class Project {
val sourceDirectoryProperty = SimpleObjectProperty<File>() val sourceDirectoryProperty = SimpleObjectProperty<File>()
val sourceDirectory by sourceDirectoryProperty val sourceDirectory by sourceDirectoryProperty
val projectFileProperty = createObjectBinding({ File(sourceDirectory, PROJECT_FILE) }, sourceDirectoryProperty)
val projectFile by projectFileProperty
val maps = observableListOf<GameMapAsset>() val maps = observableListOf<GameMapAsset>()
val tileSets = observableListOf<TileSetAsset>() val tileSets = observableListOf<TileSetAsset>()
val images = observableListOf<ImageAsset>() val images = observableListOf<ImageAsset>()
@@ -40,7 +43,7 @@ class Project {
val codeDirectoryProperty = SimpleObjectProperty<File>() val codeDirectoryProperty = SimpleObjectProperty<File>()
var codeDirectory by codeDirectoryProperty var codeDirectory by codeDirectoryProperty
private set private set
val codeFSNodeProperty = Bindings.createObjectBinding({ FileSystemNode(codeDirectory) }, codeDirectoryProperty) val codeFSNodeProperty = createObjectBinding({ FileSystemNode(codeDirectory) }, codeDirectoryProperty)
val codeFSNode by codeFSNodeProperty val codeFSNode by codeFSNodeProperty
// Build directories // Build directories
@@ -79,6 +82,7 @@ class Project {
} }
companion object { companion object {
const val PROJECT_FILE = "project.bep"
const val MAPS_DIR = "maps" const val MAPS_DIR = "maps"
const val TILESETS_DIR = "tilesets" const val TILESETS_DIR = "tilesets"
const val IMAGES_DIR = "images" const val IMAGES_DIR = "images"