[Editor] Convert binary protobuf project files to JSON format
This commit is contained in:
@@ -37,6 +37,9 @@ dependencies {
|
||||
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib"
|
||||
|
||||
// JSON Proto
|
||||
implementation "com.google.protobuf:protobuf-java-util:${protobufVersion}"
|
||||
|
||||
// GUI
|
||||
implementation "no.tornado:tornadofx:${tornadoFxVersion}"
|
||||
implementation platform("org.kordamp.ikonli:ikonli-bom:${ikonliVersion}")
|
||||
|
||||
@@ -1,18 +1,23 @@
|
||||
package com.bartlomiejpluta.base.editor.asset.model
|
||||
|
||||
import javafx.beans.binding.Bindings.createObjectBinding
|
||||
import javafx.beans.property.ObjectProperty
|
||||
import javafx.beans.property.SimpleStringProperty
|
||||
import javafx.beans.value.ObservableValue
|
||||
import tornadofx.getValue
|
||||
import tornadofx.setValue
|
||||
import java.io.File
|
||||
|
||||
abstract class Asset(directory: ObjectProperty<File>, val uid: String, val source: String, name: String) {
|
||||
abstract class Asset(sourceDirectory: ObservableValue<File>, compiledDirectory: ObservableValue<File>, val uid: String, val source: String, val binarySource: String, name: String) {
|
||||
constructor(directory: ObservableValue<File>, uid: String, source: String, name: String) : this(directory, directory, uid, source, source, name)
|
||||
|
||||
val nameProperty = SimpleStringProperty(name)
|
||||
var name by nameProperty
|
||||
|
||||
val fileProperty = createObjectBinding({ File(directory.value, source) }, directory)
|
||||
val fileProperty = createObjectBinding({ File(sourceDirectory.value, source) }, sourceDirectory)
|
||||
val file by fileProperty
|
||||
|
||||
val binaryFileProperty = createObjectBinding({ File(compiledDirectory.value, binarySource) })
|
||||
val binaryFile by binaryFileProperty
|
||||
|
||||
override fun toString() = "${this.javaClass.simpleName}[name=$name, uid=$uid]"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.bartlomiejpluta.base.editor.code.build.asset
|
||||
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
|
||||
interface AssetSerializer {
|
||||
fun serializeAssets(project: Project)
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.bartlomiejpluta.base.editor.code.build.asset
|
||||
|
||||
import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset
|
||||
import com.bartlomiejpluta.base.editor.map.serial.BinaryMapSerializer
|
||||
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import com.bartlomiejpluta.base.editor.project.serial.BinaryProjectSerializer
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
@Component
|
||||
class DefaultAssetSerializer : AssetSerializer {
|
||||
|
||||
@Autowired
|
||||
private lateinit var projectContext: ProjectContext
|
||||
|
||||
@Autowired
|
||||
private lateinit var projectSerializer: BinaryProjectSerializer
|
||||
|
||||
@Autowired
|
||||
private lateinit var mapSerializer: BinaryMapSerializer
|
||||
|
||||
override fun serializeAssets(project: Project) {
|
||||
project.buildAssetsDir.mkdirs()
|
||||
serializeProject(project)
|
||||
|
||||
project.buildAssetsMapsDir.mkdirs()
|
||||
serializeMaps(project)
|
||||
}
|
||||
|
||||
private fun serializeProject(project: Project) {
|
||||
project.binaryProjectFile.outputStream().use {
|
||||
projectSerializer.serialize(project, it)
|
||||
}
|
||||
}
|
||||
|
||||
private fun serializeMaps(project: Project) = project.maps.forEach {
|
||||
serializeMap(it)
|
||||
}
|
||||
|
||||
private fun serializeMap(asset: GameMapAsset) {
|
||||
val map = projectContext.loadMap(asset.uid)
|
||||
asset.binaryFile.outputStream().use {
|
||||
mapSerializer.serialize(map, it)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package com.bartlomiejpluta.base.editor.code.build.generator
|
||||
import com.bartlomiejpluta.base.editor.asset.model.Asset
|
||||
import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset
|
||||
import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer
|
||||
import com.bartlomiejpluta.base.editor.map.serial.MapDeserializer
|
||||
import com.bartlomiejpluta.base.editor.map.serial.TextMapDeserializer
|
||||
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import com.squareup.javapoet.*
|
||||
@@ -22,7 +22,7 @@ class AssetMapCodeGenerator : CodeGenerator {
|
||||
private lateinit var projectContext: ProjectContext
|
||||
|
||||
@Autowired
|
||||
private lateinit var mapDeserializer: MapDeserializer
|
||||
private lateinit var mapDeserializer: TextMapDeserializer
|
||||
|
||||
override fun generate() {
|
||||
projectContext.project?.let(::generateAssetClasses)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.bartlomiejpluta.base.editor.code.build.pipeline
|
||||
|
||||
import com.bartlomiejpluta.base.editor.code.build.asset.AssetSerializer
|
||||
import com.bartlomiejpluta.base.editor.code.build.compiler.Compiler
|
||||
import com.bartlomiejpluta.base.editor.code.build.database.DatabaseAssembler
|
||||
import com.bartlomiejpluta.base.editor.code.build.exception.BuildException
|
||||
@@ -38,6 +39,9 @@ class DefaultBuildPipelineService : BuildPipelineService {
|
||||
@Autowired
|
||||
private lateinit var engineProvider: GameEngineProvider
|
||||
|
||||
@Autowired
|
||||
private lateinit var assetSerializer: AssetSerializer
|
||||
|
||||
@Autowired
|
||||
private lateinit var projectAssembler: ProjectAssembler
|
||||
|
||||
@@ -126,6 +130,9 @@ class DefaultBuildPipelineService : BuildPipelineService {
|
||||
out.println("Linking compilation units...")
|
||||
packager.pack(project.buildClassesDirectory, outputFile, "BOOT-INF/classes")
|
||||
|
||||
out.println("Serializing project assets...")
|
||||
assetSerializer.serializeAssets(project)
|
||||
|
||||
out.println("Assembling project assets...")
|
||||
projectAssembler.assembly(project, outputFile, out, err)
|
||||
|
||||
|
||||
@@ -24,7 +24,9 @@ class DefaultProjectAssembler : ProjectAssembler {
|
||||
}
|
||||
|
||||
private fun tryToAssembly(project: Project, targetJar: File) {
|
||||
packager.pack(project.mapsDirectory, targetJar, "BOOT-INF/classes/project/maps")
|
||||
packager.copy(project.binaryProjectFile, targetJar, "BOOT-INF/classes/project")
|
||||
packager.pack(project.buildAssetsMapsDir, targetJar, "BOOT-INF/classes/project/maps")
|
||||
|
||||
packager.pack(project.tileSetsDirectory, targetJar, "BOOT-INF/classes/project/tilesets")
|
||||
packager.pack(project.autoTilesDirectory, targetJar, "BOOT-INF/classes/project/autotiles")
|
||||
packager.pack(project.imagesDirectory, targetJar, "BOOT-INF/classes/project/images")
|
||||
@@ -34,7 +36,6 @@ class DefaultProjectAssembler : ProjectAssembler {
|
||||
packager.pack(project.fontsDirectory, targetJar, "BOOT-INF/classes/project/fonts")
|
||||
packager.pack(project.widgetsDirectory, targetJar, "BOOT-INF/classes/project/widgets")
|
||||
packager.pack(project.audioDirectory, targetJar, "BOOT-INF/classes/project/audio")
|
||||
packager.copy(project.projectFile, targetJar, "BOOT-INF/classes/project")
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -155,7 +155,7 @@ class MainController : Controller() {
|
||||
fun openProject() {
|
||||
chooseFile(
|
||||
title = "Load Project",
|
||||
filters = arrayOf(FileChooser.ExtensionFilter("BASE Editor Project (*.bep)", "*.bep")),
|
||||
filters = arrayOf(FileChooser.ExtensionFilter("BASE Editor Project (*.json)", "*.json")),
|
||||
).getOrNull(0)?.let {
|
||||
clearResources()
|
||||
projectContext.open(it)
|
||||
|
||||
@@ -4,4 +4,4 @@ import com.bartlomiejpluta.base.editor.asset.model.Asset
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
|
||||
class GameMapAsset(project: Project, uid: String, name: String) :
|
||||
Asset(project.mapsDirectoryProperty, uid, "$uid.dat", name)
|
||||
Asset(project.mapsDirectoryProperty, project.buildAssetsMapsDirProperty, uid, "$uid.json", "$uid.dat", name)
|
||||
@@ -2,10 +2,8 @@ package com.bartlomiejpluta.base.editor.map.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Deserializer
|
||||
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
|
||||
import com.bartlomiejpluta.base.editor.tileset.asset.TileSetAsset
|
||||
import com.bartlomiejpluta.base.editor.tileset.model.TileSet
|
||||
import java.io.InputStream
|
||||
|
||||
interface MapDeserializer : Deserializer<GameMap> {
|
||||
interface BinaryMapDeserializer : Deserializer<GameMap> {
|
||||
fun deserialize(input: InputStream, replaceTileSet: (String, String) -> String, replaceAutoTile: (String, String) -> String): GameMap
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.bartlomiejpluta.base.editor.map.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Serializer
|
||||
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
|
||||
|
||||
interface BinaryMapSerializer : Serializer<GameMap>
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.bartlomiejpluta.base.editor.map.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
|
||||
import com.bartlomiejpluta.base.proto.GameMapProto
|
||||
import com.google.protobuf.util.JsonFormat
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.stereotype.Component
|
||||
import java.io.InputStream
|
||||
|
||||
@Component
|
||||
class JsonProtobufMapDeserializer : TextMapDeserializer {
|
||||
|
||||
@Autowired
|
||||
private lateinit var deserializer: ProtobufMapDeserializer
|
||||
|
||||
override fun deserialize(input: InputStream) = deserialize(input, { _, uid -> uid }, { _, uid -> uid })
|
||||
|
||||
override fun deserialize(input: InputStream, replaceTileSet: (String, String) -> String, replaceAutoTile: (String, String) -> String): GameMap =
|
||||
input.bufferedReader().use { reader ->
|
||||
val builder = GameMapProto.GameMap.newBuilder()
|
||||
JsonFormat.parser().merge(reader, builder)
|
||||
deserializer.buildObject(builder.build(), replaceTileSet, replaceAutoTile)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.bartlomiejpluta.base.editor.map.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
|
||||
import com.google.protobuf.util.JsonFormat
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.stereotype.Component
|
||||
import java.io.OutputStream
|
||||
import java.io.PrintWriter
|
||||
|
||||
@Component
|
||||
class JsonProtobufMapSerializer : TextMapSerializer {
|
||||
|
||||
@Autowired
|
||||
private lateinit var serializer: ProtobufMapSerializer
|
||||
override fun serialize(item: GameMap, output: OutputStream) {
|
||||
output.bufferedWriter().let(::PrintWriter).use { out ->
|
||||
JsonFormat.printer().print(serializer.buildProto(item)).lines().forEach { line ->
|
||||
out.println(line)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ import org.springframework.stereotype.Component
|
||||
import java.io.InputStream
|
||||
|
||||
@Component
|
||||
class ProtobufMapDeserializer : MapDeserializer {
|
||||
open class ProtobufMapDeserializer : BinaryMapDeserializer {
|
||||
|
||||
@Autowired
|
||||
private lateinit var appContext: ApplicationContext
|
||||
@@ -30,8 +30,13 @@ class ProtobufMapDeserializer : MapDeserializer {
|
||||
input: InputStream,
|
||||
replaceTileSet: (String, String) -> String,
|
||||
replaceAutoTile: (String, String) -> String
|
||||
): GameMap = buildObject(GameMapProto.GameMap.parseFrom(input), replaceTileSet, replaceAutoTile)
|
||||
|
||||
fun buildObject(
|
||||
proto: GameMapProto.GameMap,
|
||||
replaceTileSet: (String, String) -> String,
|
||||
replaceAutoTile: (String, String) -> String
|
||||
): GameMap {
|
||||
val proto = GameMapProto.GameMap.parseFrom(input)
|
||||
val map = GameMap(proto.tileWidth.toDouble(), proto.tileHeight.toDouble())
|
||||
map.uid = proto.uid
|
||||
map.rows = proto.rows
|
||||
|
||||
@@ -9,9 +9,11 @@ import org.springframework.stereotype.Component
|
||||
import java.io.OutputStream
|
||||
|
||||
@Component
|
||||
class ProtobufMapSerializer : MapSerializer {
|
||||
open class ProtobufMapSerializer : BinaryMapSerializer {
|
||||
|
||||
override fun serialize(item: GameMap, output: OutputStream) {
|
||||
override fun serialize(item: GameMap, output: OutputStream) = buildProto(item).writeTo(output)
|
||||
|
||||
fun buildProto(item: GameMap): GameMapProto.GameMap {
|
||||
val protoMap = GameMapProto.GameMap.newBuilder()
|
||||
protoMap.uid = item.uid
|
||||
protoMap.rows = item.rows
|
||||
@@ -23,7 +25,7 @@ class ProtobufMapSerializer : MapSerializer {
|
||||
|
||||
item.layers.forEach { layer -> protoMap.addLayers(serializeLayer(layer)) }
|
||||
|
||||
protoMap.build().writeTo(output)
|
||||
return protoMap.build()
|
||||
}
|
||||
|
||||
private fun serializeLayer(layer: Layer): GameMapProto.Layer {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.bartlomiejpluta.base.editor.map.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Deserializer
|
||||
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
|
||||
import java.io.InputStream
|
||||
|
||||
interface TextMapDeserializer : Deserializer<GameMap> {
|
||||
fun deserialize(input: InputStream, replaceTileSet: (String, String) -> String, replaceAutoTile: (String, String) -> String): GameMap
|
||||
}
|
||||
@@ -3,4 +3,4 @@ package com.bartlomiejpluta.base.editor.map.serial
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Serializer
|
||||
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
|
||||
|
||||
interface MapSerializer : Serializer<GameMap>
|
||||
interface TextMapSerializer : Serializer<GameMap>
|
||||
@@ -45,7 +45,7 @@ class MapImportFragment : Fragment("Basic Data") {
|
||||
action {
|
||||
mapBuilderVM.fileProperty.value = chooseFile(
|
||||
title = "Map file location",
|
||||
filters = arrayOf(FileChooser.ExtensionFilter("Map files (*.dat)", "*.dat"))
|
||||
filters = arrayOf(FileChooser.ExtensionFilter("Map files (*.json)", "*.json"))
|
||||
).getOrNull(0)?.absolutePath
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,11 +25,11 @@ import com.bartlomiejpluta.base.editor.image.asset.ImageAsset
|
||||
import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData
|
||||
import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset
|
||||
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
|
||||
import com.bartlomiejpluta.base.editor.map.serial.MapDeserializer
|
||||
import com.bartlomiejpluta.base.editor.map.serial.MapSerializer
|
||||
import com.bartlomiejpluta.base.editor.map.serial.TextMapDeserializer
|
||||
import com.bartlomiejpluta.base.editor.map.serial.TextMapSerializer
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import com.bartlomiejpluta.base.editor.project.serial.ProjectDeserializer
|
||||
import com.bartlomiejpluta.base.editor.project.serial.ProjectSerializer
|
||||
import com.bartlomiejpluta.base.editor.project.serial.TextProjectDeserializer
|
||||
import com.bartlomiejpluta.base.editor.project.serial.TextProjectSerializer
|
||||
import com.bartlomiejpluta.base.editor.tileset.asset.TileSetAsset
|
||||
import com.bartlomiejpluta.base.editor.tileset.asset.TileSetAssetData
|
||||
import com.bartlomiejpluta.base.editor.tileset.model.TileSet
|
||||
@@ -53,16 +53,16 @@ class DefaultProjectContext : ProjectContext {
|
||||
private val autoTileCache = mutableMapOf<String, AutoTile>()
|
||||
|
||||
@Autowired
|
||||
private lateinit var projectSerializer: ProjectSerializer
|
||||
private lateinit var projectSerializer: TextProjectSerializer
|
||||
|
||||
@Autowired
|
||||
private lateinit var projectDeserializer: ProjectDeserializer
|
||||
private lateinit var projectDeserializer: TextProjectDeserializer
|
||||
|
||||
@Autowired
|
||||
private lateinit var mapSerializer: MapSerializer
|
||||
private lateinit var mapSerializer: TextMapSerializer
|
||||
|
||||
@Autowired
|
||||
private lateinit var mapDeserializer: MapDeserializer
|
||||
private lateinit var mapDeserializer: TextMapDeserializer
|
||||
|
||||
@Autowired
|
||||
private lateinit var javaClassService: JavaClassService
|
||||
|
||||
@@ -128,6 +128,16 @@ class Project {
|
||||
createObjectBinding({ File(buildOutDirectory, PROJECT_OUTPUT_JAR_FILE) }, buildOutDirectoryProperty)
|
||||
val buildOutputJarFile by buildOutputJarFileProperty
|
||||
|
||||
val buildAssetsDirProperty = SimpleObjectProperty<File>()
|
||||
var buildAssetsDir by buildAssetsDirProperty
|
||||
private set
|
||||
|
||||
val binaryProjectFileProperty = createObjectBinding({ File(buildAssetsDir, BINARY_PROJECT_FILE) }, buildAssetsDirProperty)
|
||||
val binaryProjectFile by binaryProjectFileProperty
|
||||
|
||||
val buildAssetsMapsDirProperty = createObjectBinding({ File(buildAssetsDir, MAPS_DIR) }, buildAssetsDirProperty)
|
||||
val buildAssetsMapsDir by buildAssetsMapsDirProperty
|
||||
|
||||
lateinit var database: H2DBDataSource
|
||||
|
||||
init {
|
||||
@@ -148,6 +158,7 @@ class Project {
|
||||
buildClassesDirectory = File(it, BUILD_CLASSES_DIR)
|
||||
buildDependenciesDirectory = File(it, BUILD_DEPENDENCIES_DIR)
|
||||
buildGeneratedCodeDirectory = File(it, BUILD_GENERATED_DIR)
|
||||
buildAssetsDir = File(it, BUILD_ASSETS_DIR)
|
||||
buildDatabaseDumpDirectory = File(it, BUILD_DATABASE_DUMP_DIR)
|
||||
buildOutDirectory = File(it, BUILD_OUT_DIR)
|
||||
}
|
||||
@@ -179,7 +190,8 @@ class Project {
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val PROJECT_FILE = "project.bep"
|
||||
const val PROJECT_FILE = "project.json"
|
||||
const val BINARY_PROJECT_FILE = "project.bep"
|
||||
const val DATABASE_FILE = "data.sql"
|
||||
const val DATABASE_DUMP_FILE = "data.sql"
|
||||
const val PROJECT_OUTPUT_JAR_FILE = "game.jar"
|
||||
@@ -200,6 +212,7 @@ class Project {
|
||||
const val BUILD_OUT_DIR = "$BUILD_DIR/out"
|
||||
const val BUILD_DEPENDENCIES_DIR = "$BUILD_DIR/dependencies"
|
||||
const val BUILD_GENERATED_DIR = "$BUILD_DIR/generated"
|
||||
const val BUILD_ASSETS_DIR = "$BUILD_DIR/assets"
|
||||
const val BUILD_DATABASE_DUMP_DIR = "$BUILD_DIR/db"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.bartlomiejpluta.base.editor.project.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Deserializer
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
|
||||
interface BinaryProjectDeserializer : Deserializer<Project>
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.bartlomiejpluta.base.editor.project.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Serializer
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
|
||||
interface BinaryProjectSerializer : Serializer<Project>
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.bartlomiejpluta.base.editor.project.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import com.bartlomiejpluta.base.proto.ProjectProto
|
||||
import com.google.protobuf.util.JsonFormat
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.stereotype.Component
|
||||
import java.io.InputStream
|
||||
|
||||
@Component
|
||||
class JsonProtobufProjectDeserializer : TextProjectDeserializer {
|
||||
|
||||
@Autowired
|
||||
private lateinit var deserializer: ProtobufProjectDeserializer
|
||||
override fun deserialize(input: InputStream): Project = input.bufferedReader().use { reader ->
|
||||
val builder = ProjectProto.Project.newBuilder()
|
||||
JsonFormat.parser().merge(reader, builder)
|
||||
deserializer.buildObject(builder.build())
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.bartlomiejpluta.base.editor.project.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import com.google.protobuf.util.JsonFormat
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.stereotype.Component
|
||||
import java.io.OutputStream
|
||||
import java.io.PrintWriter
|
||||
|
||||
@Component
|
||||
class JsonProtobufProjectSerializer : TextProjectSerializer {
|
||||
|
||||
@Autowired
|
||||
private lateinit var serializer: ProtobufProjectSerializer
|
||||
override fun serialize(item: Project, output: OutputStream) {
|
||||
output.bufferedWriter().let(::PrintWriter).use { out ->
|
||||
JsonFormat.printer().print(serializer.buildProto(item)).lines().forEach { line ->
|
||||
out.println(line)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,25 +17,23 @@ import org.springframework.stereotype.Component
|
||||
import java.io.InputStream
|
||||
|
||||
@Component
|
||||
class ProtobufProjectDeserializer : ProjectDeserializer {
|
||||
open class ProtobufProjectDeserializer : BinaryProjectDeserializer {
|
||||
|
||||
override fun deserialize(input: InputStream): Project {
|
||||
val proto = ProjectProto.Project.parseFrom(input)
|
||||
override fun deserialize(input: InputStream): Project = buildObject(ProjectProto.Project.parseFrom(input))
|
||||
|
||||
return Project().apply {
|
||||
name = proto.name
|
||||
runner = proto.runner
|
||||
maps.addAll(proto.mapsList.map { deserializeMap(this, it) })
|
||||
tileSets.addAll(proto.tileSetsList.map { deserializeTileSet(this, it) })
|
||||
autoTiles.addAll(proto.autoTilesList.map { deserializeAutoTile(this, it) })
|
||||
images.addAll(proto.imagesList.map { deserializeImage(this, it) })
|
||||
characterSets.addAll(proto.characterSetsList.map { deserializeCharacterSet(this, it) })
|
||||
animations.addAll(proto.animationsList.map { deserializeAnimation(this, it) })
|
||||
iconSets.addAll(proto.iconSetsList.map { deserializeIconSet(this, it) })
|
||||
fonts.addAll(proto.fontsList.map { deserializeFont(this, it) })
|
||||
widgets.addAll(proto.widgetsList.map { deserializeWidget(this, it) })
|
||||
sounds.addAll(proto.soundsList.map { deserializeSound(this, it) })
|
||||
}
|
||||
fun buildObject(proto: ProjectProto.Project): Project = Project().apply {
|
||||
name = proto.name
|
||||
runner = proto.runner
|
||||
maps.addAll(proto.mapsList.map { deserializeMap(this, it) })
|
||||
tileSets.addAll(proto.tileSetsList.map { deserializeTileSet(this, it) })
|
||||
autoTiles.addAll(proto.autoTilesList.map { deserializeAutoTile(this, it) })
|
||||
images.addAll(proto.imagesList.map { deserializeImage(this, it) })
|
||||
characterSets.addAll(proto.characterSetsList.map { deserializeCharacterSet(this, it) })
|
||||
animations.addAll(proto.animationsList.map { deserializeAnimation(this, it) })
|
||||
iconSets.addAll(proto.iconSetsList.map { deserializeIconSet(this, it) })
|
||||
fonts.addAll(proto.fontsList.map { deserializeFont(this, it) })
|
||||
widgets.addAll(proto.widgetsList.map { deserializeWidget(this, it) })
|
||||
sounds.addAll(proto.soundsList.map { deserializeSound(this, it) })
|
||||
}
|
||||
|
||||
private fun deserializeMap(project: Project, map: ProjectProto.GameMapAsset) = GameMapAsset(
|
||||
|
||||
@@ -16,9 +16,11 @@ import org.springframework.stereotype.Component
|
||||
import java.io.OutputStream
|
||||
|
||||
@Component
|
||||
class ProtobufProjectSerializer : ProjectSerializer {
|
||||
class ProtobufProjectSerializer : BinaryProjectSerializer {
|
||||
|
||||
override fun serialize(item: Project, output: OutputStream) {
|
||||
override fun serialize(item: Project, output: OutputStream) = buildProto(item).writeTo(output)
|
||||
|
||||
fun buildProto(item: Project): ProjectProto.Project {
|
||||
val proto = ProjectProto.Project.newBuilder()
|
||||
proto.name = item.name
|
||||
proto.runner = item.runner
|
||||
@@ -32,18 +34,18 @@ class ProtobufProjectSerializer : ProjectSerializer {
|
||||
proto.addAllFonts(item.fonts.map(this::serializeFont))
|
||||
proto.addAllWidgets(item.widgets.map(this::serializeWidget))
|
||||
proto.addAllSounds(item.sounds.map(this::serializeSound))
|
||||
proto.build().writeTo(output)
|
||||
return proto.build()
|
||||
}
|
||||
|
||||
private fun serializeMap(map: GameMapAsset) = ProjectProto.GameMapAsset.newBuilder()
|
||||
.setUid(map.uid)
|
||||
.setSource(map.source)
|
||||
.setSource(map.binarySource)
|
||||
.setName(map.name)
|
||||
.build()
|
||||
|
||||
private fun serializeTileSet(tileSet: TileSetAsset) = ProjectProto.TileSetAsset.newBuilder()
|
||||
.setUid(tileSet.uid)
|
||||
.setSource(tileSet.source)
|
||||
.setSource(tileSet.binarySource)
|
||||
.setName(tileSet.name)
|
||||
.setRows(tileSet.rows)
|
||||
.setColumns(tileSet.columns)
|
||||
@@ -51,7 +53,7 @@ class ProtobufProjectSerializer : ProjectSerializer {
|
||||
|
||||
private fun serializeAutoTile(autoTile: AutoTileAsset) = ProjectProto.AutoTileSetAsset.newBuilder()
|
||||
.setUid(autoTile.uid)
|
||||
.setSource(autoTile.source)
|
||||
.setSource(autoTile.binarySource)
|
||||
.setName(autoTile.name)
|
||||
.setRows(autoTile.rows)
|
||||
.setColumns(autoTile.columns)
|
||||
@@ -60,13 +62,13 @@ class ProtobufProjectSerializer : ProjectSerializer {
|
||||
|
||||
private fun serializeImage(image: ImageAsset) = ProjectProto.ImageAsset.newBuilder()
|
||||
.setUid(image.uid)
|
||||
.setSource(image.source)
|
||||
.setSource(image.binarySource)
|
||||
.setName(image.name)
|
||||
.build()
|
||||
|
||||
private fun serializeCharacterSet(characterSet: CharacterSetAsset) = ProjectProto.CharacterSetAsset.newBuilder()
|
||||
.setUid(characterSet.uid)
|
||||
.setSource(characterSet.source)
|
||||
.setSource(characterSet.binarySource)
|
||||
.setName(characterSet.name)
|
||||
.setRows(characterSet.rows)
|
||||
.setColumns(characterSet.columns)
|
||||
@@ -74,7 +76,7 @@ class ProtobufProjectSerializer : ProjectSerializer {
|
||||
|
||||
private fun serializeAnimation(animation: AnimationAsset) = ProjectProto.AnimationAsset.newBuilder()
|
||||
.setUid(animation.uid)
|
||||
.setSource(animation.source)
|
||||
.setSource(animation.binarySource)
|
||||
.setName(animation.name)
|
||||
.setRows(animation.rows)
|
||||
.setColumns(animation.columns)
|
||||
@@ -82,7 +84,7 @@ class ProtobufProjectSerializer : ProjectSerializer {
|
||||
|
||||
private fun serializeIconSet(iconSet: IconSetAsset) = ProjectProto.IconSetAsset.newBuilder()
|
||||
.setUid(iconSet.uid)
|
||||
.setSource(iconSet.source)
|
||||
.setSource(iconSet.binarySource)
|
||||
.setName(iconSet.name)
|
||||
.setRows(iconSet.rows)
|
||||
.setColumns(iconSet.columns)
|
||||
@@ -90,19 +92,19 @@ class ProtobufProjectSerializer : ProjectSerializer {
|
||||
|
||||
private fun serializeFont(font: FontAsset) = ProjectProto.FontAsset.newBuilder()
|
||||
.setUid(font.uid)
|
||||
.setSource(font.source)
|
||||
.setSource(font.binarySource)
|
||||
.setName(font.name)
|
||||
.build()
|
||||
|
||||
private fun serializeWidget(widget: WidgetAsset) = ProjectProto.WidgetAsset.newBuilder()
|
||||
.setUid(widget.uid)
|
||||
.setSource(widget.source)
|
||||
.setSource(widget.binarySource)
|
||||
.setName(widget.name)
|
||||
.build()
|
||||
|
||||
private fun serializeSound(sound: SoundAsset) = ProjectProto.SoundAsset.newBuilder()
|
||||
.setUid(sound.uid)
|
||||
.setSource(sound.source)
|
||||
.setSource(sound.binarySource)
|
||||
.setName(sound.name)
|
||||
.build()
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@ package com.bartlomiejpluta.base.editor.project.serial
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Deserializer
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
|
||||
interface ProjectDeserializer : Deserializer<Project>
|
||||
interface TextProjectDeserializer : Deserializer<Project>
|
||||
@@ -3,4 +3,4 @@ package com.bartlomiejpluta.base.editor.project.serial
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Serializer
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
|
||||
interface ProjectSerializer : Serializer<Project>
|
||||
interface TextProjectSerializer : Serializer<Project>
|
||||
Reference in New Issue
Block a user