diff --git a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java index c79c42f9..8ffd585c 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java @@ -159,9 +159,14 @@ public abstract class GenerateProtocolFile { // 生成Lua协议 if (generateLanguages.contains(CodeLanguage.Lua)) { GenerateLuaUtils.init(generateOperation); - GenerateLuaUtils.createProtocolManager(allSortedGenerateProtocols); - for (var protocolRegistration : allSortedGenerateProtocols) { - GenerateLuaUtils.createLuaProtocolFile((ProtocolRegistration) protocolRegistration); + if (generateOperation.isOneProtocol()) { + GenerateLuaUtils.createProtocolManagerInOneFile(allSortedGenerateProtocols); + GenerateLuaUtils.createLuaProtocolsInOneFile(allSortedGenerateProtocols); + } else { + GenerateLuaUtils.createProtocolManager(allSortedGenerateProtocols); + for (var protocolRegistration : allSortedGenerateProtocols) { + GenerateLuaUtils.createLuaProtocolFile((ProtocolRegistration) protocolRegistration); + } } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/lua/GenerateLuaUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/lua/GenerateLuaUtils.java index a0e77b94..03732407 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/lua/GenerateLuaUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/lua/GenerateLuaUtils.java @@ -19,7 +19,6 @@ import com.zfoo.protocol.generate.GenerateOperation; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.generate.GenerateProtocolNote; import com.zfoo.protocol.generate.GenerateProtocolPath; -import com.zfoo.protocol.model.Pair; import com.zfoo.protocol.registration.IProtocolRegistration; import com.zfoo.protocol.registration.ProtocolRegistration; import com.zfoo.protocol.serializer.CodeLanguage; @@ -83,6 +82,72 @@ public abstract class GenerateLuaUtils { protocolOutputPath = null; } + // All protocol files are generated in a single protocol file. + public static void createProtocolManagerInOneFile(List protocolList) throws IOException { + var list = List.of("lua/ByteBuffer.lua", "lua/Long.lua"); + for (var fileName : list) { + var fileInputStream = ClassUtils.getFileFromClassPath(fileName); + var createFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, StringUtils.substringAfterFirst(fileName, "lua/"))); + FileUtils.writeInputStreamToFile(createFile, fileInputStream); + } + + // 生成Protocol.lua文件 + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("lua-one/ProtocolManagerTemplate.lua"); + var importProtocols = StringUtils.format("local Protocols = require(\"{}.Protocols\")", protocolOutputRootPath); + var importRegistrations = StringUtils.format("local Registrations = require(\"{}.Registrations\")", protocolOutputRootPath); + var protocolBuilder = new StringBuilder(); + for (var protocol : protocolList) { + var protocolId = protocol.protocolId(); + var protocolName = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); + protocolBuilder.append(TAB).append(StringUtils.format("protocols[{}] = Protocols.{}", protocolId, protocolName)).append(LS); + } + protocolManagerTemplate = StringUtils.format(protocolManagerTemplate, StringUtils.EMPTY_JSON, StringUtils.EMPTY_JSON, importProtocols, importRegistrations, protocolBuilder.toString().trim()); + FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.lua")), protocolManagerTemplate, true); + } + + public static void createLuaProtocolsInOneFile(List registrations) { + var protocolTemplate1 = ClassUtils.getFileFromClassPathToString("lua-one/ProtocolTemplate1.lua"); + var protocolTemplate2 = ClassUtils.getFileFromClassPathToString("lua-one/ProtocolTemplate2.lua"); + var builder1 = new StringBuilder(); + var builder2 = new StringBuilder(); + + builder2.append(StringUtils.format("local Protocols = require(\"{}.Protocols\")", protocolOutputRootPath)).append(LS + LS); + + for (var protocolRegistration : registrations) { + var registration = (ProtocolRegistration) protocolRegistration; + var protocolId = registration.protocolId(); + var registrationConstructor = registration.getConstructor(); + var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName(); + GenerateProtocolFile.index.set(0); + + var classNote = GenerateProtocolNote.classNote(protocolId, CodeLanguage.Lua); + var valueOfMethod = valueOfMethod(registration); + var toStringJsonTemplate = toStringJsonTemplate(registration); + var toStringParams = toStringParams(registration); + var writePacket = writePacket(registration); + var readPacket = readPacket(registration); + + var body1 = StringUtils.format(protocolTemplate1, classNote, protocolClazzName, StringUtils.EMPTY_JSON, protocolClazzName, valueOfMethod.trim()); + var body2 = StringUtils.format(protocolTemplate2, protocolClazzName, protocolId, protocolClazzName, protocolClazzName + , protocolClazzName, toStringJsonTemplate, toStringParams + , protocolClazzName, writePacket.trim(), protocolClazzName, protocolClazzName, readPacket.trim()); + builder1.append(body1).append(LS); + builder2.append(body2).append(LS); + } + + builder1.append(LS).append("local Protocols = {}").append(LS); + for (var protocolRegistration : registrations) { + var registration = (ProtocolRegistration) protocolRegistration; + var registrationConstructor = registration.getConstructor(); + var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName(); + builder1.append(StringUtils.format("Protocols.{} = {}", protocolClazzName, protocolClazzName)).append(LS); + } + builder1.append("return Protocols"); + + FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "Protocols.lua")), builder1.toString(), true); + FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "Registrations.lua")), builder2.toString(), true); + } + public static void createProtocolManager(List protocolList) throws IOException { var list = List.of("lua/ByteBuffer.lua", "lua/Long.lua"); for (var fileName : list) { @@ -103,7 +168,7 @@ public abstract class GenerateLuaUtils { fieldBuilder.append(TAB).append(StringUtils.format("local {} = require(\"{}.{}\")", protocolName, protocolOutputRootPath, protocolName)).append(LS); } else { fieldBuilder.append(TAB).append(StringUtils.format("local {} = require(\"{}.{}.{}\")" - , protocolName,protocolOutputRootPath, path.replaceAll(StringUtils.SLASH, StringUtils.PERIOD), protocolName)).append(LS); + , protocolName, protocolOutputRootPath, path.replaceAll(StringUtils.SLASH, StringUtils.PERIOD), protocolName)).append(LS); } protocolBuilder.append(TAB).append(StringUtils.format("protocols[{}] = {}", protocolId, protocolName)).append(LS); @@ -112,7 +177,7 @@ public abstract class GenerateLuaUtils { FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.lua")), protocolManagerTemplate, true); } - public static void createLuaProtocolFile(ProtocolRegistration registration) throws IOException { + public static void createLuaProtocolFile(ProtocolRegistration registration) { // 初始化index GenerateProtocolFile.index.set(0); diff --git a/protocol/src/main/resources/lua-one/ProtocolManagerTemplate.lua b/protocol/src/main/resources/lua-one/ProtocolManagerTemplate.lua new file mode 100644 index 00000000..30a3924a --- /dev/null +++ b/protocol/src/main/resources/lua-one/ProtocolManagerTemplate.lua @@ -0,0 +1,42 @@ +local protocols = {} + +local ProtocolManager = {} + +-- table扩展方法,map的大小 +function table.mapSize(map) + local size = 0 + for _,_ in pairs(map) do + size = size + 1 + end + return size +end + +function ProtocolManager.getProtocol(protocolId) + local protocol = protocols[protocolId] + if protocol == nil then + error("[protocolId:" + protocolId + "]协议不存在") + end + return protocol +end + +function ProtocolManager.write(buffer, packet) + local protocolId = packet:protocolId() + -- 写入协议号 + buffer:writeShort(protocolId) + -- 写入包体 + ProtocolManager.getProtocol(protocolId):write(buffer, packet) +end + +function ProtocolManager.read(buffer) + local protocolId = buffer:readShort() + return ProtocolManager.getProtocol(protocolId):read(buffer) +end + +function initProtocol() + {} + {} + {} +end + +ProtocolManager.initProtocol = initProtocol +return ProtocolManager diff --git a/protocol/src/main/resources/lua-one/ProtocolTemplate1.lua b/protocol/src/main/resources/lua-one/ProtocolTemplate1.lua new file mode 100644 index 00000000..941f9ad7 --- /dev/null +++ b/protocol/src/main/resources/lua-one/ProtocolTemplate1.lua @@ -0,0 +1,10 @@ +{} +local {} = {} +function {}:new() + local obj = { + {} + } + setmetatable(obj, self) + self.__index = self + return obj +end \ No newline at end of file diff --git a/protocol/src/main/resources/lua-one/ProtocolTemplate2.lua b/protocol/src/main/resources/lua-one/ProtocolTemplate2.lua new file mode 100644 index 00000000..8d3b2983 --- /dev/null +++ b/protocol/src/main/resources/lua-one/ProtocolTemplate2.lua @@ -0,0 +1,35 @@ +function Protocols.{}:protocolId() + return {} +end + +function Protocols.{}:protocolName() + return {} +end + +function Protocols.{}:__tostring() + local jsonTemplate = "{}" + local result = string.format(jsonTemplate, {}) + return result +end + +function Protocols.{}:write(buffer, packet) + if packet == nil then + buffer:writeInt(0) + return + end + {} +end + +function Protocols.{}:read(buffer) + local length = buffer:readInt() + if length == 0 then + return nil + end + local beforeReadIndex = buffer:getReadOffset() + local packet = {}:new() + {} + if length > 0 then + buffer:setReadOffset(beforeReadIndex + length) + end + return packet +end \ No newline at end of file diff --git a/protocol/src/main/resources/lua/ProtocolManagerTemplate.lua b/protocol/src/main/resources/lua/ProtocolManagerTemplate.lua index 4ee35a47..0c173653 100644 --- a/protocol/src/main/resources/lua/ProtocolManagerTemplate.lua +++ b/protocol/src/main/resources/lua/ProtocolManagerTemplate.lua @@ -1,6 +1,6 @@ -protocols = {} +local protocols = {} -ProtocolManager = {} +local ProtocolManager = {} -- table扩展方法,map的大小 function table.mapSize(map)