diff --git a/net/src/main/java/com/zfoo/net/config/model/NetConfig.java b/net/src/main/java/com/zfoo/net/config/model/NetConfig.java index 327a29cf..092cbbe0 100644 --- a/net/src/main/java/com/zfoo/net/config/model/NetConfig.java +++ b/net/src/main/java/com/zfoo/net/config/model/NetConfig.java @@ -32,6 +32,7 @@ public class NetConfig { * 协议生成属性变量对应于{@link GenerateOperation} */ private boolean foldProtocol; + private String protocolPath; private String protocolParam; private boolean generateJsProtocol; private boolean generateCsProtocol; @@ -73,6 +74,14 @@ public class NetConfig { this.foldProtocol = foldProtocol; } + public String getProtocolPath() { + return protocolPath; + } + + public void setProtocolPath(String protocolPath) { + this.protocolPath = protocolPath; + } + public String getProtocolParam() { return protocolParam; } diff --git a/net/src/main/java/com/zfoo/net/packet/service/PacketService.java b/net/src/main/java/com/zfoo/net/packet/service/PacketService.java index 3edb6483..d7750e7b 100644 --- a/net/src/main/java/com/zfoo/net/packet/service/PacketService.java +++ b/net/src/main/java/com/zfoo/net/packet/service/PacketService.java @@ -83,6 +83,7 @@ public class PacketService implements IPacketService { var protocolLocation = NetContext.getConfigManager().getLocalConfig().getProtocolLocation(); var foldProtocol = NetContext.getConfigManager().getLocalConfig().isFoldProtocol(); + var protocolPath = NetContext.getConfigManager().getLocalConfig().getProtocolPath(); var protocolParam = NetContext.getConfigManager().getLocalConfig().getProtocolParam(); var generateJsProtocol = NetContext.getConfigManager().getLocalConfig().isGenerateJsProtocol(); var generateCsharpProtocol = NetContext.getConfigManager().getLocalConfig().isGenerateCsProtocol(); @@ -90,6 +91,7 @@ public class PacketService implements IPacketService { var generateGdProtocol = NetContext.getConfigManager().getLocalConfig().isGenerateGdProtocol(); var generateOperation = new GenerateOperation(); generateOperation.setFoldProtocol(foldProtocol); + generateOperation.setProtocolPath(protocolPath); generateOperation.setProtocolParam(protocolParam); if (generateJsProtocol) { generateOperation.getGenerateLanguages().add(CodeLanguage.JavaScript); diff --git a/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java b/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java index 93ecaf83..b98e6074 100644 --- a/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java +++ b/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java @@ -94,6 +94,7 @@ public class NetDefinitionParser implements BeanDefinitionParser { resolvePlaceholder("generate-lua-protocol", "generateLuaProtocol", builder, element, parserContext); resolvePlaceholder("generate-gd-protocol", "generateGdProtocol", builder, element, parserContext); resolvePlaceholder("fold-protocol", "foldProtocol", builder, element, parserContext); + resolvePlaceholder("protocol-path", "protocolPath", builder, element, parserContext); resolvePlaceholder("protocol-param", "protocolParam", builder, element, parserContext); var registryElement = DomUtils.getFirstChildElementByTagName(element, "registry"); diff --git a/net/src/main/resources/net-1.0.xsd b/net/src/main/resources/net-1.0.xsd index deebf7b7..5c6f5633 100644 --- a/net/src/main/resources/net-1.0.xsd +++ b/net/src/main/resources/net-1.0.xsd @@ -71,7 +71,8 @@ - + + 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 200ea300..906ff945 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateOperation.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateOperation.java @@ -32,12 +32,17 @@ public class GenerateOperation { public static final GenerateOperation NO_OPERATION = new GenerateOperation(); /** - * 折叠协议,生成协议文件会和Java源文件保持相同的目录结构 + * 折叠协议,生成协议文件会和Java源文件保持相同的目录结构,默认不折叠 */ private boolean foldProtocol; /** - * 生成协议文件的后缀名称,如果不指定,用语言约定的默认名称 + * 生成协议的路径,默认为当前运行项目的路径 + */ + private String protocolPath; + + /** + * 保留参数 */ private String protocolParam; @@ -46,6 +51,14 @@ public class GenerateOperation { */ private final Set generateLanguages = EnumSet.noneOf(CodeLanguage.class); + public String getProtocolPath() { + return protocolPath; + } + + public void setProtocolPath(String protocolPath) { + this.protocolPath = protocolPath; + } + public boolean isFoldProtocol() { return foldProtocol; } 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 4c76da7b..00f60477 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java @@ -98,28 +98,28 @@ public abstract class GenerateProtocolFile { // 生成C#协议 var generateLanguages = generateOperation.getGenerateLanguages(); if (generateLanguages.contains(CodeLanguage.CSharp)) { - GenerateCsUtils.init(); + GenerateCsUtils.init(generateOperation); GenerateCsUtils.createProtocolManager(); allSortedGenerateProtocols.forEach(it -> GenerateCsUtils.createCsProtocolFile((ProtocolRegistration) it)); } // 生成Javascript协议 if (generateLanguages.contains(CodeLanguage.JavaScript)) { - GenerateJsUtils.init(); + GenerateJsUtils.init(generateOperation); allSortedGenerateProtocols.forEach(it -> GenerateJsUtils.createJsProtocolFile((ProtocolRegistration) it)); GenerateJsUtils.createProtocolManager(allSortedGenerateProtocols); } // 生成Lua协议 if (generateLanguages.contains(CodeLanguage.Lua)) { - GenerateLuaUtils.init(); + GenerateLuaUtils.init(generateOperation); GenerateLuaUtils.createProtocolManager(allSortedGenerateProtocols); allSortedGenerateProtocols.forEach(it -> GenerateLuaUtils.createLuaProtocolFile((ProtocolRegistration) it)); } // 生成GdScript协议 if (generateLanguages.contains(CodeLanguage.GdScript)) { - GenerateGdUtils.init(); + GenerateGdUtils.init(generateOperation); GenerateGdUtils.createProtocolManager(allSortedGenerateProtocols); allSortedGenerateProtocols.forEach(it -> GenerateGdUtils.createGdProtocolFile((ProtocolRegistration) it)); } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/cs/GenerateCsUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/cs/GenerateCsUtils.java index bfa43f00..978e28b8 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/cs/GenerateCsUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/cs/GenerateCsUtils.java @@ -13,6 +13,7 @@ package com.zfoo.protocol.serializer.cs; +import com.zfoo.protocol.generate.GenerateOperation; import com.zfoo.protocol.generate.GenerateProtocolDocument; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.generate.GenerateProtocolPath; @@ -39,7 +40,7 @@ import static com.zfoo.protocol.util.StringUtils.TAB; */ public abstract class GenerateCsUtils { - private static final String PROTOCOL_OUTPUT_ROOT_PATH = "CsProtocol/"; + private static String protocolOutputRootPath = "CsProtocol/"; private static Map csSerializerMap; @@ -47,9 +48,11 @@ public abstract class GenerateCsUtils { return csSerializerMap.get(serializer); } - public static void init() { - FileUtils.deleteFile(new File(PROTOCOL_OUTPUT_ROOT_PATH)); - FileUtils.createDirectory(PROTOCOL_OUTPUT_ROOT_PATH); + public static void init(GenerateOperation generateOperation) { + protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); + + FileUtils.deleteFile(new File(protocolOutputRootPath)); + FileUtils.createDirectory(protocolOutputRootPath); csSerializerMap = new HashMap<>(); csSerializerMap.put(BooleanSerializer.INSTANCE, new CsBooleanSerializer()); @@ -70,6 +73,7 @@ public abstract class GenerateCsUtils { public static void clear() { csSerializerMap = null; + protocolOutputRootPath = null; } /** @@ -85,7 +89,7 @@ public abstract class GenerateCsUtils { for (var fileName : list) { var fileInputStream = ClassUtils.getFileFromClassPath(fileName); - var createFile = new File(StringUtils.format("{}{}", PROTOCOL_OUTPUT_ROOT_PATH, StringUtils.substringAfterFirst(fileName, "cs/"))); + var createFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, StringUtils.substringAfterFirst(fileName, "cs/"))); FileUtils.writeInputStreamToFile(createFile, fileInputStream); } } @@ -128,8 +132,8 @@ public abstract class GenerateCsUtils { csBuilder.append(TAB).append("}").append(LS); csBuilder.append("}").append(LS); - var protocolOutputPath = StringUtils.format("{}{}/{}.cs" - , PROTOCOL_OUTPUT_ROOT_PATH + var protocolOutputPath = StringUtils.format("{}/{}/{}.cs" + , protocolOutputRootPath , GenerateProtocolPath.getCapitalizeProtocolPath(protocolId) , protocolClazzName); FileUtils.writeStringToFile(new File(protocolOutputPath), csBuilder.toString()); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/gd/GenerateGdUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/gd/GenerateGdUtils.java index cddade87..92423ad2 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/gd/GenerateGdUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/gd/GenerateGdUtils.java @@ -13,6 +13,7 @@ package com.zfoo.protocol.serializer.gd; +import com.zfoo.protocol.generate.GenerateOperation; import com.zfoo.protocol.generate.GenerateProtocolDocument; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.generate.GenerateProtocolPath; @@ -39,7 +40,7 @@ import static com.zfoo.protocol.util.StringUtils.TAB; */ public abstract class GenerateGdUtils { - private static final String PROTOCOL_OUTPUT_ROOT_PATH = "gdProtocol/"; + private static String protocolOutputRootPath = "gdProtocol/"; private static Map gdSerializerMap; @@ -47,9 +48,11 @@ public abstract class GenerateGdUtils { return gdSerializerMap.get(serializer); } - public static void init() { - FileUtils.deleteFile(new File(PROTOCOL_OUTPUT_ROOT_PATH)); - FileUtils.createDirectory(PROTOCOL_OUTPUT_ROOT_PATH); + public static void init(GenerateOperation generateOperation) { + protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); + + FileUtils.deleteFile(new File(protocolOutputRootPath)); + FileUtils.createDirectory(protocolOutputRootPath); gdSerializerMap = new HashMap<>(); gdSerializerMap.put(BooleanSerializer.INSTANCE, new GdBooleanSerializer()); @@ -70,6 +73,7 @@ public abstract class GenerateGdUtils { public static void clear() { gdSerializerMap = null; + protocolOutputRootPath = null; } public static void createProtocolManager(List protocolList) throws IOException { @@ -77,7 +81,7 @@ public abstract class GenerateGdUtils { for (var fileName : list) { var fileInputStream = ClassUtils.getFileFromClassPath(fileName); - var createFile = new File(StringUtils.format("{}{}", PROTOCOL_OUTPUT_ROOT_PATH, StringUtils.substringAfterFirst(fileName, "gd/"))); + var createFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, StringUtils.substringAfterFirst(fileName, "gd/"))); FileUtils.writeInputStreamToFile(createFile, fileInputStream); } @@ -104,7 +108,7 @@ public abstract class GenerateGdUtils { .filter(it -> Objects.nonNull(it)) .forEach(it -> gdBuilder.append(TAB).append(StringUtils.format("protocols[{}] = {}", it.protocolId(), it.protocolConstructor().getDeclaringClass().getSimpleName())).append(LS)); - FileUtils.writeStringToFile(new File(StringUtils.format("{}{}", PROTOCOL_OUTPUT_ROOT_PATH, "ProtocolManager.gd")), gdBuilder.toString()); + FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.gd")), gdBuilder.toString()); } public static void createGdProtocolFile(ProtocolRegistration registration) { @@ -130,8 +134,8 @@ public abstract class GenerateGdUtils { // readObject method gdBuilder.append(readObject(registration)); - var protocolOutputPath = StringUtils.format("{}{}/{}.gd" - , PROTOCOL_OUTPUT_ROOT_PATH + var protocolOutputPath = StringUtils.format("{}/{}/{}.gd" + , protocolOutputRootPath , GenerateProtocolPath.getProtocolPath(protocolId) , protocolClazzName); FileUtils.writeStringToFile(new File(protocolOutputPath), gdBuilder.toString()); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/js/GenerateJsUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/js/GenerateJsUtils.java index 900d1bdc..f57e7fd3 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/js/GenerateJsUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/js/GenerateJsUtils.java @@ -13,6 +13,7 @@ package com.zfoo.protocol.serializer.js; +import com.zfoo.protocol.generate.GenerateOperation; import com.zfoo.protocol.generate.GenerateProtocolDocument; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.generate.GenerateProtocolPath; @@ -40,7 +41,7 @@ import static com.zfoo.protocol.util.StringUtils.TAB; */ public abstract class GenerateJsUtils { - private static final String PROTOCOL_OUTPUT_ROOT_PATH = "jsProtocol/"; + private static String protocolOutputRootPath = "jsProtocol/"; private static Map jsSerializerMap; @@ -48,9 +49,11 @@ public abstract class GenerateJsUtils { return jsSerializerMap.get(serializer); } - public static void init() { - FileUtils.deleteFile(new File(PROTOCOL_OUTPUT_ROOT_PATH)); - FileUtils.createDirectory(PROTOCOL_OUTPUT_ROOT_PATH); + public static void init(GenerateOperation generateOperation) { + protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); + + FileUtils.deleteFile(new File(protocolOutputRootPath)); + FileUtils.createDirectory(protocolOutputRootPath); jsSerializerMap = new HashMap<>(); jsSerializerMap.put(BooleanSerializer.INSTANCE, new JsBooleanSerializer()); @@ -71,6 +74,7 @@ public abstract class GenerateJsUtils { public static void clear() { jsSerializerMap = null; + protocolOutputRootPath = null; } public static void createProtocolManager(List protocolList) throws IOException { @@ -80,7 +84,7 @@ public abstract class GenerateJsUtils { for (var fileName : list) { var fileInputStream = ClassUtils.getFileFromClassPath(fileName); - var createFile = new File(StringUtils.format("{}{}", PROTOCOL_OUTPUT_ROOT_PATH, StringUtils.substringAfterFirst(fileName, "js/"))); + var createFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, StringUtils.substringAfterFirst(fileName, "js/"))); FileUtils.writeInputStreamToFile(createFile, fileInputStream); } @@ -112,7 +116,7 @@ public abstract class GenerateJsUtils { jsBuilder.append("export default ProtocolManager;").append(LS); - FileUtils.writeStringToFile(new File(StringUtils.format("{}{}", PROTOCOL_OUTPUT_ROOT_PATH, "ProtocolManager.js")), jsBuilder.toString()); + FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.js")), jsBuilder.toString()); } public static void createJsProtocolFile(ProtocolRegistration registration) { @@ -142,8 +146,8 @@ public abstract class GenerateJsUtils { jsBuilder.append(LS).append(StringUtils.format("export default {};", protocolClazzName)).append(LS); - var protocolOutputPath = StringUtils.format("{}{}/{}.js" - , PROTOCOL_OUTPUT_ROOT_PATH + var protocolOutputPath = StringUtils.format("{}/{}/{}.js" + , protocolOutputRootPath , GenerateProtocolPath.getProtocolPath(protocolId) , protocolClazzName); FileUtils.writeStringToFile(new File(protocolOutputPath), jsBuilder.toString()); 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 a4629d8f..e641b881 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 @@ -13,6 +13,7 @@ package com.zfoo.protocol.serializer.lua; +import com.zfoo.protocol.generate.GenerateOperation; import com.zfoo.protocol.generate.GenerateProtocolDocument; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.generate.GenerateProtocolPath; @@ -40,7 +41,7 @@ import static com.zfoo.protocol.util.StringUtils.TAB; */ public abstract class GenerateLuaUtils { - private static final String PROTOCOL_OUTPUT_ROOT_PATH = "LuaProtocol/"; + private static String protocolOutputRootPath = "LuaProtocol/"; private static Map luaSerializerMap; @@ -48,9 +49,11 @@ public abstract class GenerateLuaUtils { return luaSerializerMap.get(serializer); } - public static void init() { - FileUtils.deleteFile(new File(PROTOCOL_OUTPUT_ROOT_PATH)); - FileUtils.createDirectory(PROTOCOL_OUTPUT_ROOT_PATH); + public static void init(GenerateOperation generateOperation) { + protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); + + FileUtils.deleteFile(new File(protocolOutputRootPath)); + FileUtils.createDirectory(protocolOutputRootPath); luaSerializerMap = new HashMap<>(); luaSerializerMap.put(BooleanSerializer.INSTANCE, new LuaBooleanSerializer()); @@ -71,6 +74,7 @@ public abstract class GenerateLuaUtils { public static void clear() { luaSerializerMap = null; + protocolOutputRootPath = null; } public static void createProtocolManager(List protocolList) throws IOException { @@ -78,7 +82,7 @@ public abstract class GenerateLuaUtils { for (var fileName : list) { var fileInputStream = ClassUtils.getFileFromClassPath(fileName); - var createFile = new File(StringUtils.format("{}{}", PROTOCOL_OUTPUT_ROOT_PATH, StringUtils.substringAfterFirst(fileName, "lua/"))); + var createFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, StringUtils.substringAfterFirst(fileName, "lua/"))); FileUtils.writeInputStreamToFile(createFile, fileInputStream); } @@ -110,7 +114,7 @@ public abstract class GenerateLuaUtils { luaBuilder.append("ProtocolManager.initProtocol = initProtocol").append(LS); luaBuilder.append("return ProtocolManager").append(LS); - FileUtils.writeStringToFile(new File(StringUtils.format("{}{}", PROTOCOL_OUTPUT_ROOT_PATH, "ProtocolManager.lua")), luaBuilder.toString()); + FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.lua")), luaBuilder.toString()); } public static void createLuaProtocolFile(ProtocolRegistration registration) { @@ -144,8 +148,8 @@ public abstract class GenerateLuaUtils { luaBuilder.append(StringUtils.format("return {}", protocolClazzName)).append(LS); - var protocolOutputPath = StringUtils.format("{}{}/{}.lua" - , PROTOCOL_OUTPUT_ROOT_PATH + var protocolOutputPath = StringUtils.format("{}/{}/{}.lua" + , protocolOutputRootPath , GenerateProtocolPath.getCapitalizeProtocolPath(protocolId) , protocolClazzName); FileUtils.writeStringToFile(new File(protocolOutputPath), luaBuilder.toString()); diff --git a/protocol/src/main/java/com/zfoo/protocol/util/FileUtils.java b/protocol/src/main/java/com/zfoo/protocol/util/FileUtils.java index 9df77d2d..92e3d3d5 100644 --- a/protocol/src/main/java/com/zfoo/protocol/util/FileUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/util/FileUtils.java @@ -64,6 +64,23 @@ public abstract class FileUtils { return System.getProperty("user.dir"); } + /** + * 连接父路径和子路径 + * + * @return 绝对路径 + */ + public static String joinPath(String parentPath, String childPath) { + if (StringUtils.isEmpty(parentPath)) { + return new File(childPath).getAbsolutePath(); + } + + if (StringUtils.isEmpty(childPath)) { + return new File(parentPath).getAbsolutePath(); + } + + return new File(parentPath, childPath).getAbsolutePath(); + } + //---------------------------------搜索文件-------------------------------------- /**