From 370c090d23072a166d92ccd8f05f177b957d14aa Mon Sep 17 00:00:00 2001 From: godotg Date: Fri, 28 Oct 2022 12:17:10 +0800 Subject: [PATCH] perf[storage]: perfect gdscript generate option --- .../protocol/generate/GenerateOperation.java | 3 ++- .../serializer/gdscript/GenerateGdUtils.java | 27 ++++++++++++------- .../gdscript/ProtocolManagerTemplate.gd | 12 ++++----- .../resources/gdscript/buffer/ByteBuffer.gd | 2 +- .../com/zfoo/storage/util/ExportUtils.java | 14 ++++++---- .../zfoo/storage/export/ExportBinaryTest.java | 1 + .../zfoo/storage/export/ExportCsvTest.java | 5 ++++ 7 files changed, 41 insertions(+), 23 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateOperation.java b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateOperation.java index 6bfc6707..eecc704f 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateOperation.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateOperation.java @@ -14,6 +14,7 @@ package com.zfoo.protocol.generate; import com.zfoo.protocol.serializer.CodeLanguage; +import com.zfoo.protocol.util.StringUtils; import java.util.EnumSet; import java.util.Set; @@ -39,7 +40,7 @@ public class GenerateOperation { /** * 生成协议的路径,默认为当前运行项目的路径 */ - private String protocolPath; + private String protocolPath = StringUtils.EMPTY; /** * 保留参数 diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java index bddfa6b0..33d9b29b 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java @@ -48,7 +48,7 @@ import static com.zfoo.protocol.util.StringUtils.TAB_ASCII; */ public abstract class GenerateGdUtils { - private static String protocolOutputRootPath = "gdProtocol/"; + private static String protocolOutputRootPath = "gdProtocol"; private static String protocolOutputPath = StringUtils.EMPTY; private static Map gdSerializerMap; @@ -58,10 +58,16 @@ public abstract class GenerateGdUtils { } public static void init(GenerateOperation generateOperation) { - protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); + // 如果没有配置路径,则使用默认路径 + if (StringUtils.isEmpty(generateOperation.getProtocolPath())) { + protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); + } else { + protocolOutputPath = generateOperation.getProtocolPath(); + } FileUtils.deleteFile(new File(protocolOutputPath)); - FileUtils.createDirectory(protocolOutputPath); + var protocolOutputPathFile = FileUtils.createDirectory(protocolOutputPath); + protocolOutputRootPath = protocolOutputPathFile.getName(); gdSerializerMap = new HashMap<>(); gdSerializerMap.put(BooleanSerializer.INSTANCE, new GdBooleanSerializer()); @@ -87,12 +93,9 @@ public abstract class GenerateGdUtils { } public static void createProtocolManager(List protocolList) throws IOException { - var list = List.of("gdscript/buffer/ByteBuffer.gd"); - for (var fileName : list) { - var fileInputStream = ClassUtils.getFileFromClassPath(fileName); - var createFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "gdscript/"))); - FileUtils.writeInputStreamToFile(createFile, fileInputStream); - } + var byteBufferFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ByteBuffer.gd")); + var byteBufferTemplate = StringUtils.bytesToString(IOUtils.toByteArray(ClassUtils.getFileFromClassPath("gdscript/buffer/ByteBuffer.gd"))); + FileUtils.writeStringToFile(byteBufferFile, StringUtils.format(byteBufferTemplate, protocolOutputRootPath), false); var protocolManagerTemplate = StringUtils.bytesToString(IOUtils.toByteArray(ClassUtils.getFileFromClassPath("gdscript/ProtocolManagerTemplate.gd"))); // 生成ProtocolManager.gd文件 @@ -102,7 +105,11 @@ public abstract class GenerateGdUtils { var protocolId = protocol.protocolId(); var name = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); var path = GenerateProtocolPath.getProtocolPath(protocolId); - importBuilder.append(StringUtils.format("const {} = preload(\"res://gdProtocol/{}/{}.gd\")", name, path, name)).append(LS); + if (StringUtils.isBlank(path)) { + importBuilder.append(StringUtils.format("const {} = preload(\"res://{}/{}.gd\")", name, protocolOutputRootPath, name)).append(LS); + } else { + importBuilder.append(StringUtils.format("const {} = preload(\"res://{}/{}/{}.gd\")", name, protocolOutputRootPath, path, name)).append(LS); + } initList.add(StringUtils.format("{}{}: {}", TAB_ASCII, protocolId, name)); } var initProtocols = StringUtils.joinWith(StringUtils.COMMA + LS, initList.toArray()); diff --git a/protocol/src/main/resources/gdscript/ProtocolManagerTemplate.gd b/protocol/src/main/resources/gdscript/ProtocolManagerTemplate.gd index 87caab73..3779a818 100644 --- a/protocol/src/main/resources/gdscript/ProtocolManagerTemplate.gd +++ b/protocol/src/main/resources/gdscript/ProtocolManagerTemplate.gd @@ -8,8 +8,8 @@ static func getProtocol(protocolId: int): return protocols[protocolId] static func newInstance(protocolId: int): - var protocol = protocols[protocolId] - return protocol.new() + var protocol = protocols[protocolId] + return protocol.new() static func write(buffer, packet): var protocolId: int = packet.PROTOCOL_ID @@ -18,7 +18,7 @@ static func write(buffer, packet): protocol.write(buffer, packet) static func read(buffer): - var protocolId = buffer.readShort(); - var protocol = protocols[protocolId] - var packet = protocol.read(buffer); - return packet; + var protocolId = buffer.readShort(); + var protocol = protocols[protocolId] + var packet = protocol.read(buffer); + return packet; diff --git a/protocol/src/main/resources/gdscript/buffer/ByteBuffer.gd b/protocol/src/main/resources/gdscript/buffer/ByteBuffer.gd index 847c1f6d..6a94eeed 100644 --- a/protocol/src/main/resources/gdscript/buffer/ByteBuffer.gd +++ b/protocol/src/main/resources/gdscript/buffer/ByteBuffer.gd @@ -1,4 +1,4 @@ -const ProtocolManager = preload("res://gdProtocol/ProtocolManager.gd") +const ProtocolManager = preload("res://{}/ProtocolManager.gd") const EMPTY: String = "" diff --git a/storage/src/main/java/com/zfoo/storage/util/ExportUtils.java b/storage/src/main/java/com/zfoo/storage/util/ExportUtils.java index 2385a6ef..4843adb7 100644 --- a/storage/src/main/java/com/zfoo/storage/util/ExportUtils.java +++ b/storage/src/main/java/com/zfoo/storage/util/ExportUtils.java @@ -68,10 +68,7 @@ public abstract class ExportUtils { } public static void csv2json(String inputDir, String outputDir) throws IOException { - var csvFiles = FileUtils.getAllReadableFiles(new File(inputDir)) - .stream() - .filter(it -> ResourceEnum.getResourceEnumByType(FileUtils.fileExtName(it.getName())) == ResourceEnum.CSV) - .collect(Collectors.toList()); + var csvFiles = scanCsvFiles(inputDir); for (var csv : csvFiles) { var excelSimpleName = FileUtils.fileSimpleName(csv.getName()); var resourceData = CsvReader.readResourceDataFromCSV(FileUtils.openInputStream(csv), csv.getName()); @@ -82,13 +79,20 @@ public abstract class ExportUtils { } } - private static List scanExcelFiles(String inputDir) { + public static List scanExcelFiles(String inputDir) { return FileUtils.getAllReadableFiles(new File(inputDir)) .stream() .filter(it -> ResourceEnum.isExcel(FileUtils.fileExtName(it.getName()))) .collect(Collectors.toList()); } + public static List scanCsvFiles(String inputDir) { + return FileUtils.getAllReadableFiles(new File(inputDir)) + .stream() + .filter(it -> ResourceEnum.getResourceEnumByType(FileUtils.fileExtName(it.getName())) == ResourceEnum.CSV) + .collect(Collectors.toList()); + } + // 将class里的map自动赋值storage public static T autoWrapData(Class clazz, Map, Storage> storageMap) { var instance = ReflectionUtils.newInstance(clazz); diff --git a/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTest.java b/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTest.java index 6d8d1282..3a322e95 100644 --- a/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTest.java +++ b/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTest.java @@ -92,6 +92,7 @@ public class ExportBinaryTest { protocols.add(ResourceData.class); protocols.addAll(storageManager.storageMap().keySet()); var operation = new GenerateOperation(); + operation.setProtocolPath("D:\\github\\godot-bird\\test\\storage\\protocol"); operation.getGenerateLanguages().add(CodeLanguage.GdScript); ProtocolManager.initProtocolAuto(protocols, operation); diff --git a/storage/src/test/java/com/zfoo/storage/export/ExportCsvTest.java b/storage/src/test/java/com/zfoo/storage/export/ExportCsvTest.java index acb5fa35..0d3649ba 100644 --- a/storage/src/test/java/com/zfoo/storage/export/ExportCsvTest.java +++ b/storage/src/test/java/com/zfoo/storage/export/ExportCsvTest.java @@ -13,6 +13,7 @@ package com.zfoo.storage.export; import com.zfoo.protocol.util.FileUtils; +import com.zfoo.protocol.util.StringUtils; import com.zfoo.storage.interpreter.CsvReader; import com.zfoo.storage.util.ExportUtils; import org.junit.Ignore; @@ -34,6 +35,10 @@ public class ExportCsvTest { var outputDir = "E:\\workspace\\zfoo\\storage\\src\\test\\resources\\excel"; ExportUtils.excel2csv(inputDir, outputDir); + // godot4.x导入csv,莫名奇妙生成了一些translation文件,批量修改一下文件的名称 + var csvFiles = ExportUtils.scanCsvFiles(outputDir); + csvFiles.stream().forEach(it -> it.renameTo(new File(StringUtils.format("{}.txt", it.getAbsolutePath())))); + csvFiles.stream().forEach(it -> FileUtils.deleteFile(it)); } @Test