From c3da20ebc54f104dcb64a5fc8df2051564fb4edc Mon Sep 17 00:00:00 2001 From: godotg Date: Mon, 8 Jul 2024 18:42:48 +0800 Subject: [PATCH] ref[python]: refactor python protocol --- .../serializer/python/CodeGeneratePython.java | 46 +++++++++++++++---- .../resources/python/ProtocolClassTemplate.py | 4 ++ .../python/ProtocolManagerTemplate.py | 3 +- .../python/ProtocolRegistrationTemplate.py | 24 ++++++++++ .../main/resources/python/ProtocolTemplate.py | 27 +---------- .../resources/python/ProtocolsTemplate.py | 4 +- 6 files changed, 71 insertions(+), 37 deletions(-) create mode 100644 protocol/src/main/resources/python/ProtocolClassTemplate.py create mode 100644 protocol/src/main/resources/python/ProtocolRegistrationTemplate.py diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/python/CodeGeneratePython.java b/protocol/src/main/java/com/zfoo/protocol/serializer/python/CodeGeneratePython.java index 3ac72ded..2484f4c2 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/python/CodeGeneratePython.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/python/CodeGeneratePython.java @@ -88,7 +88,8 @@ public class CodeGeneratePython implements ICodeGenerate { for (var registration : registrations) { var protocol_id = registration.protocolId(); var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_manager_registrations.append(StringUtils.format("protocols[{}] = Protocols.{}", protocol_id, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols[{}] = Protocols.{}Registration", protocol_id, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocolIdMap[Protocols.{}] = {}", protocol_name, protocol_id)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -99,14 +100,17 @@ public class CodeGeneratePython implements ICodeGenerate { var protocol_class = new StringBuilder(); + var protocol_registration = new StringBuilder(); for (var registration : registrations) { var protocol_id = registration.protocolId(); var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_class.append(formatProtocolTemplate(registration)).append(LS); + protocol_class.append(protocol_class(registration)).append(LS); + protocol_registration.append(protocol_registration(registration)).append(LS); } var protocolTemplate = ClassUtils.getFileFromClassPathToString("python/ProtocolsTemplate.py"); var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( CodeTemplatePlaceholder.protocol_class, protocol_class.toString() + , CodeTemplatePlaceholder.protocol_registration, protocol_registration.toString() )); var outputPath = StringUtils.format("{}/Protocols.py", protocolOutputPath); var file = new File(outputPath); @@ -127,7 +131,8 @@ public class CodeGeneratePython implements ICodeGenerate { var protocol_id = registration.protocolId(); var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); protocol_imports.append(StringUtils.format("from .{} import {}", GenerateProtocolPath.protocolPathPeriod(protocol_id), protocol_name)).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols[{}] = {}.{}", protocol_id, protocol_name, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols[{}] = {}.{}Registration", protocol_id, protocol_name, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocolIdMap[{}.{}] = {}", protocol_name, protocol_name, protocol_id)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -140,7 +145,12 @@ public class CodeGeneratePython implements ICodeGenerate { for (var registration : registrations) { var protocol_id = registration.protocolId(); var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - var formatProtocolTemplate = formatProtocolTemplate(registration); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("python/ProtocolTemplate.py"); + var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( + CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_class, protocol_class(registration) + , CodeTemplatePlaceholder.protocol_registration, protocol_registration(registration) + )); var outputPath = StringUtils.format("{}/{}/{}.py", protocolOutputPath, GenerateProtocolPath.protocolPathSlash(protocol_id), protocol_name); var file = new File(outputPath); FileUtils.writeStringToFile(file, formatProtocolTemplate, true); @@ -160,7 +170,8 @@ public class CodeGeneratePython implements ICodeGenerate { var protocol_id = registration.protocolId(); var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); protocol_imports.append(StringUtils.format("from . import {}", protocol_name)).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols[{}] = {}.{}", protocol_id, protocol_name, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols[{}] = {}.{}Registration", protocol_id, protocol_name, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocolIdMap[{}.{}] = {}", protocol_name, protocol_name, protocol_id)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -169,11 +180,15 @@ public class CodeGeneratePython implements ICodeGenerate { FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); logger.info("Generated Python protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath()); - for (var registration : registrations) { var protocol_id = registration.protocolId(); var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - var formatProtocolTemplate = formatProtocolTemplate(registration); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("python/ProtocolTemplate.py"); + var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( + CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_class, protocol_class(registration) + , CodeTemplatePlaceholder.protocol_registration, protocol_registration(registration) + )); var outputPath = StringUtils.format("{}/{}.py", protocolOutputPath, protocol_name); var file = new File(outputPath); FileUtils.writeStringToFile(file, formatProtocolTemplate, true); @@ -191,22 +206,33 @@ public class CodeGeneratePython implements ICodeGenerate { } } - public String formatProtocolTemplate(ProtocolRegistration registration) { + public String protocol_class(ProtocolRegistration registration) { var protocol_id = registration.protocolId(); var protocol_name = registration.getConstructor().getDeclaringClass().getSimpleName(); - var protocolTemplate = ClassUtils.getFileFromClassPathToString("python/ProtocolTemplate.py"); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("python/ProtocolClassTemplate.py"); var placeholderMap = Map.of( CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.Python) , CodeTemplatePlaceholder.protocol_name, protocol_name , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) + ); + return CodeTemplatePlaceholder.formatTemplate(protocolTemplate, placeholderMap); + } + + public String protocol_registration(ProtocolRegistration registration) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.getConstructor().getDeclaringClass().getSimpleName(); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("python/ProtocolRegistrationTemplate.py"); + var placeholderMap = Map.of( + CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.Python) + , CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) ); return CodeTemplatePlaceholder.formatTemplate(protocolTemplate, placeholderMap); } - private String protocol_field_definition(ProtocolRegistration registration) { var protocolId = registration.getId(); var fields = registration.getFields(); diff --git a/protocol/src/main/resources/python/ProtocolClassTemplate.py b/protocol/src/main/resources/python/ProtocolClassTemplate.py new file mode 100644 index 00000000..bb63b0d2 --- /dev/null +++ b/protocol/src/main/resources/python/ProtocolClassTemplate.py @@ -0,0 +1,4 @@ +${protocol_note} +class ${protocol_name}: + ${protocol_field_definition} + pass diff --git a/protocol/src/main/resources/python/ProtocolManagerTemplate.py b/protocol/src/main/resources/python/ProtocolManagerTemplate.py index 2258b278..c6b78177 100644 --- a/protocol/src/main/resources/python/ProtocolManagerTemplate.py +++ b/protocol/src/main/resources/python/ProtocolManagerTemplate.py @@ -1,6 +1,7 @@ ${protocol_imports} protocols = {} +protocolIdMap = {} ${protocol_manager_registrations} @@ -8,7 +9,7 @@ def getProtocol(protocolId): return protocols[protocolId] def write(buffer, packet): - protocolId = packet.protocolId() + protocolId = protocolIdMap[type(packet)] buffer.writeShort(protocolId) protocol = protocols[protocolId] protocol.write(buffer, packet) diff --git a/protocol/src/main/resources/python/ProtocolRegistrationTemplate.py b/protocol/src/main/resources/python/ProtocolRegistrationTemplate.py new file mode 100644 index 00000000..685495fc --- /dev/null +++ b/protocol/src/main/resources/python/ProtocolRegistrationTemplate.py @@ -0,0 +1,24 @@ +class ${protocol_name}Registration: + @classmethod + def protocolId(cls, self): + return ${protocol_id} + + @classmethod + def write(cls, buffer, packet): + if packet is None: + buffer.writeInt(0) + return + ${protocol_write_serialization} + pass + + @classmethod + def read(cls, buffer): + length = buffer.readInt() + if length == 0: + return None + beforeReadIndex = buffer.getReadOffset() + packet = ${protocol_name}() + ${protocol_read_deserialization} + if length > 0: + buffer.setReadOffset(beforeReadIndex + length) + return packet \ No newline at end of file diff --git a/protocol/src/main/resources/python/ProtocolTemplate.py b/protocol/src/main/resources/python/ProtocolTemplate.py index a5636d69..f1867def 100644 --- a/protocol/src/main/resources/python/ProtocolTemplate.py +++ b/protocol/src/main/resources/python/ProtocolTemplate.py @@ -1,26 +1,3 @@ -${protocol_note} -class ${protocol_name}: - ${protocol_field_definition} +${protocol_class} - def protocolId(self): - return ${protocol_id} - - @classmethod - def write(cls, buffer, packet): - if packet is None: - buffer.writeInt(0) - return - ${protocol_write_serialization} - pass - - @classmethod - def read(cls, buffer): - length = buffer.readInt() - if length == 0: - return None - beforeReadIndex = buffer.getReadOffset() - packet = ${protocol_name}() - ${protocol_read_deserialization} - if length > 0: - buffer.setReadOffset(beforeReadIndex + length) - return packet \ No newline at end of file +${protocol_registration} \ No newline at end of file diff --git a/protocol/src/main/resources/python/ProtocolsTemplate.py b/protocol/src/main/resources/python/ProtocolsTemplate.py index fe4db4f4..f1867def 100644 --- a/protocol/src/main/resources/python/ProtocolsTemplate.py +++ b/protocol/src/main/resources/python/ProtocolsTemplate.py @@ -1 +1,3 @@ -${protocol_class} \ No newline at end of file +${protocol_class} + +${protocol_registration} \ No newline at end of file