From 216bdee29d57c4084deba3361f1aed3447da2a5e Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 25 Aug 2021 11:52:08 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=89=B9=E6=80=A7=E3=80=91=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20cfg=20java=5Fjson=20=E6=94=AF=E6=8C=81=20=E3=80=90?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E3=80=91Render=E4=B8=8D=E5=86=8D=E4=BB=8EThr?= =?UTF-8?q?eadStatic=E9=87=8C=E8=8E=B7=E5=BE=97Template,=E6=94=B9=E4=BB=8E?= =?UTF-8?q?CocurrentDictionary=E4=B8=AD=E8=8E=B7=E5=8F=96=20=E3=80=90?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E3=80=91=E4=BC=98=E5=8C=96=20cfg=20java=5Fbi?= =?UTF-8?q?n=20=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=B8=8D=E5=86=8D=E4=BB=8EAbstr?= =?UTF-8?q?aceBean=E7=BB=A7=E6=89=BF=EF=BC=8C=E5=B9=B6=E4=B8=94=E7=BE=8E?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Luban.Job.Cfg/Source/Defs/DefTable.cs | 2 + .../Source/Defs/TTypeTemplateExtends.cs | 12 ++ .../Source/Generate/CppCodeBinRender.cs | 16 +-- ...{EditorCppRender.cs => CppEditorRender.cs} | 2 +- .../{UE4BpCppRender.cs => CppUE4BpRender.cs} | 2 +- ...itorCppRender.cs => CppUE4EditorRender.cs} | 2 +- .../Source/Generate/CsCodeBinRender.cs | 13 +- .../Source/Generate/CsCodeJsonRender.cs | 13 +- .../Source/Generate/CsCodeUnityJsonRender.cs | 12 +- .../{EditorCsRender.cs => CsEditorRender.cs} | 14 +- .../Source/Generate/GoCodeBinRender.cs | 12 +- .../Source/Generate/GoCodeJsonRender.cs | 12 +- .../Source/Generate/GoCodeRenderBase.cs | 10 +- .../Source/Generate/JavaCodeBinRender.cs | 13 +- .../Source/Generate/JavaCodeJsonRender.cs | 41 ++++++ .../Source/Generate/LuaCodeBinRender.cs | 6 +- .../Source/Generate/Python3CodeJsonRender.cs | 8 +- .../Source/Generate/PythonCodeRenderBase.cs | 4 +- .../Generate/TypescriptCodeBinRender.cs | 12 +- .../Generate/TypescriptCodeJsonRender.cs | 12 +- src/Luban.Job.Cfg/Source/JobController.cs | 25 ++-- .../TypeVisitors/JavaJsonDeserialize.cs | 133 ++++++++++++++++++ .../JavaUnderingDeserializeVisitor.cs | 9 +- .../Source/Utils/RenderUtil.cs | 40 ++---- .../Source/Utils/StringTemplateUtil.cs | 16 ++- .../Source/Generate/AsyncCsRender.cs | 12 +- .../Source/Generate/SyncCsRender.cs | 12 +- .../Source/Generate/TypescriptRender.cs | 13 +- .../Source/Generate/CsRender.cs | 16 +-- .../Source/Generate/LuaRender.cs | 5 +- .../Source/Generate/TypescriptRender.cs | 16 +-- src/Luban.Server/Luban.Server.csproj | 9 ++ .../Templates/common/java/const.tpl | 3 +- .../Templates/common/java/enum.tpl | 3 +- .../Templates/config/java_bin/bean.tpl | 52 +++---- .../Templates/config/java_bin/table.tpl | 22 +-- .../Templates/config/java_bin/tables.tpl | 9 +- .../Templates/config/java_json/bean.tpl | 108 ++++++++++++++ .../Templates/config/java_json/table.tpl | 76 ++++++++++ .../Templates/config/java_json/tables.tpl | 32 +++++ 40 files changed, 552 insertions(+), 277 deletions(-) rename src/Luban.Job.Cfg/Source/Generate/{EditorCppRender.cs => CppEditorRender.cs} (94%) rename src/Luban.Job.Cfg/Source/Generate/{UE4BpCppRender.cs => CppUE4BpRender.cs} (98%) rename src/Luban.Job.Cfg/Source/Generate/{UE4EditorCppRender.cs => CppUE4EditorRender.cs} (99%) rename src/Luban.Job.Cfg/Source/Generate/{EditorCsRender.cs => CsEditorRender.cs} (56%) create mode 100644 src/Luban.Job.Cfg/Source/Generate/JavaCodeJsonRender.cs create mode 100644 src/Luban.Job.Cfg/Source/TypeVisitors/JavaJsonDeserialize.cs create mode 100644 src/Luban.Server/Templates/config/java_json/bean.tpl create mode 100644 src/Luban.Server/Templates/config/java_json/table.tpl create mode 100644 src/Luban.Server/Templates/config/java_json/tables.tpl diff --git a/src/Luban.Job.Cfg/Source/Defs/DefTable.cs b/src/Luban.Job.Cfg/Source/Defs/DefTable.cs index 932b09c..84d0fa6 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefTable.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefTable.cs @@ -52,6 +52,8 @@ namespace Luban.Job.Cfg.Defs public string OutputDataFile => FullName; + public string InnerName => "_" + this.Name; + public string OutputDataFileEscapeDot => FullName.Replace('.', '_'); public List GetBranchInputFiles(string branchName) diff --git a/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs b/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs index 3d66697..6cb50c1 100644 --- a/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs +++ b/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs @@ -58,6 +58,18 @@ namespace Luban.Job.Cfg.Defs return type.Apply(JavaDeserializeVisitor.Ins, bufName, fieldName); } + public static string JavaJsonDeserialize(string jsonName, string fieldName, string jsonFieldName, TType type) + { + if (type.IsNullable) + { + return $"{{ if ({jsonName}.has(\"{jsonFieldName}\") && !{jsonName}.get(\"{jsonFieldName}\").isJsonNull()) {{ {type.Apply(TypeVisitors.JavaJsonDeserialize.Ins, $"{jsonName}.get(\"{jsonFieldName}\")", fieldName)} }} else {{ {fieldName} = null; }} }}"; + } + else + { + return type.Apply(TypeVisitors.JavaJsonDeserialize.Ins, $"{jsonName}.get(\"{jsonFieldName}\")", fieldName); + } + } + public static string JavaRecursiveResolve(DefField field, string tables) { return field.CType.Apply(JavaRecursiveResolveVisitor.Ins, field.JavaStyleName, tables); diff --git a/src/Luban.Job.Cfg/Source/Generate/CppCodeBinRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppCodeBinRender.cs index 179ecfe..d07b71c 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CppCodeBinRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppCodeBinRender.cs @@ -24,29 +24,23 @@ namespace Luban.Job.Cfg.Generate return $"{b.CppNamespaceBegin} class {b.Name}; {b.CppNamespaceEnd} "; } - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cpp_bin/bean")); + var template = StringTemplateUtil.GetTemplate("config/cpp_bin/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cpp_bin/table")); + var template = StringTemplateUtil.GetTemplate("config/cpp_bin/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cpp_bin/tables")); + var template = StringTemplateUtil.GetTemplate("config/cpp_bin/tables"); var result = template.Render(new { Name = name, @@ -55,11 +49,9 @@ namespace Luban.Job.Cfg.Generate return result; } - [ThreadStatic] - private static Template t_stubRender; public string RenderStub(string topModule, List types) { - var template = t_stubRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cpp_bin/stub")); + var template = StringTemplateUtil.GetTemplate("config/cpp_bin/stub"); return template.RenderCode(new { TopModule = topModule, diff --git a/src/Luban.Job.Cfg/Source/Generate/EditorCppRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppEditorRender.cs similarity index 94% rename from src/Luban.Job.Cfg/Source/Generate/EditorCppRender.cs rename to src/Luban.Job.Cfg/Source/Generate/CppEditorRender.cs index 556321e..21f907c 100644 --- a/src/Luban.Job.Cfg/Source/Generate/EditorCppRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppEditorRender.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; namespace Luban.Job.Cfg.Generate { - class EditorCppRender : CodeRenderBase + class CppEditorRender : CodeRenderBase { public override string Render(DefConst c) { diff --git a/src/Luban.Job.Cfg/Source/Generate/UE4BpCppRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppUE4BpRender.cs similarity index 98% rename from src/Luban.Job.Cfg/Source/Generate/UE4BpCppRender.cs rename to src/Luban.Job.Cfg/Source/Generate/CppUE4BpRender.cs index 2923274..34f1b2b 100644 --- a/src/Luban.Job.Cfg/Source/Generate/UE4BpCppRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppUE4BpRender.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; namespace Luban.Job.Cfg.Generate { - class UE4BpCppRender : CodeRenderBase + class CppUE4BpRender : CodeRenderBase { [ThreadStatic] private static Template t_enumRender; diff --git a/src/Luban.Job.Cfg/Source/Generate/UE4EditorCppRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppUE4EditorRender.cs similarity index 99% rename from src/Luban.Job.Cfg/Source/Generate/UE4EditorCppRender.cs rename to src/Luban.Job.Cfg/Source/Generate/CppUE4EditorRender.cs index fe91d65..8cffa45 100644 --- a/src/Luban.Job.Cfg/Source/Generate/UE4EditorCppRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppUE4EditorRender.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; namespace Luban.Job.Cfg.Generate { - class UE4EditorCppRender : CodeRenderBase + class CppUE4EditorRender : CodeRenderBase { [ThreadStatic] private static Template t_enumRender; diff --git a/src/Luban.Job.Cfg/Source/Generate/CsCodeBinRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsCodeBinRender.cs index 5046697..707f194 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CsCodeBinRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsCodeBinRender.cs @@ -8,30 +8,23 @@ namespace Luban.Job.Cfg.Generate { class CsCodeBinRender : CsCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; - public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_bin/bean")); + var template = StringTemplateUtil.GetTemplate("config/cs_bin/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_bin/table")); + var template = StringTemplateUtil.GetTemplate("config/cs_bin/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_bin/tables")); + var template = StringTemplateUtil.GetTemplate("config/cs_bin/tables"); var result = template.RenderCode(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/CsCodeJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsCodeJsonRender.cs index 46d03ab..01e519f 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CsCodeJsonRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsCodeJsonRender.cs @@ -8,32 +8,25 @@ namespace Luban.Job.Cfg.Generate { class CsCodeJsonRender : CsCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_json/bean")); + var template = StringTemplateUtil.GetTemplate("config/cs_json/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_json/table")); + var template = StringTemplateUtil.GetTemplate("config/cs_json/table"); var result = template.RenderCode(p); return result; } - - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_json/tables")); + var template = StringTemplateUtil.GetTemplate("config/cs_json/tables"); var result = template.RenderCode(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/CsCodeUnityJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsCodeUnityJsonRender.cs index e4529dd..7a6b8ed 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CsCodeUnityJsonRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsCodeUnityJsonRender.cs @@ -8,31 +8,25 @@ namespace Luban.Job.Cfg.Generate { class CsCodeUnityJsonRender : CsCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_unity_json/bean")); + var template = StringTemplateUtil.GetTemplate("config/cs_unity_json/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_unity_json/table")); + var template = StringTemplateUtil.GetTemplate("config/cs_unity_json/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_unity_json/tables")); + var template = StringTemplateUtil.GetTemplate("config/cs_unity_json/tables"); var result = template.RenderCode(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/EditorCsRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsEditorRender.cs similarity index 56% rename from src/Luban.Job.Cfg/Source/Generate/EditorCsRender.cs rename to src/Luban.Job.Cfg/Source/Generate/CsEditorRender.cs index a577a60..1cc1872 100644 --- a/src/Luban.Job.Cfg/Source/Generate/EditorCsRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsEditorRender.cs @@ -8,33 +8,27 @@ using System.Linq; namespace Luban.Job.Cfg.Generate { - class EditorCsRender : CsCodeRenderBase + class CsEditorRender : CsCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_editor_json/bean")); + var template = StringTemplateUtil.GetTemplate("config/cs_editor_json/bean"); var result = template.Render(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_editor_json/table")); + var template = StringTemplateUtil.GetTemplate("config/cs_editor_json/table"); var result = template.Render(p); return result; } - [ThreadStatic] - private static Template t_stubRender; public override string RenderService(string name, string module, List tables) { - var template = t_stubRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/cs_editor_json/tables")); + var template = StringTemplateUtil.GetTemplate("config/cs_editor_json/tables"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/GoCodeBinRender.cs b/src/Luban.Job.Cfg/Source/Generate/GoCodeBinRender.cs index 9f840d9..5ca672f 100644 --- a/src/Luban.Job.Cfg/Source/Generate/GoCodeBinRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/GoCodeBinRender.cs @@ -9,35 +9,29 @@ namespace Luban.Job.Cfg.Generate { class GoCodeBinRender : GoCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { string package = "cfg"; - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/go_bin/bean")); + var template = StringTemplateUtil.GetTemplate("config/go_bin/bean"); var result = template.RenderCode(b, new Dictionary() { ["package"] = package }); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { // TODO 目前只有普通表支持多态. 单例表和双key表都不支持 string package = "cfg"; - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/go_bin/table")); + var template = StringTemplateUtil.GetTemplate("config/go_bin/table"); var result = template.RenderCode(p, new Dictionary() { ["package"] = package }); return result; } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { string package = "cfg"; - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/go_bin/tables")); + var template = StringTemplateUtil.GetTemplate("config/go_bin/tables"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/GoCodeJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/GoCodeJsonRender.cs index 02acb67..4e7eb5c 100644 --- a/src/Luban.Job.Cfg/Source/Generate/GoCodeJsonRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/GoCodeJsonRender.cs @@ -9,37 +9,31 @@ namespace Luban.Job.Cfg.Generate { class GoCodeJsonRender : GoCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { string package = "cfg"; - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/go_json/bean")); + var template = StringTemplateUtil.GetTemplate("config/go_json/bean"); var result = template.RenderCode(b, new Dictionary() { ["package"] = package }); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { // TODO 目前只有普通表支持多态. 单例表和双key表都不支持 string package = "cfg"; - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/go_json/table")); + var template = StringTemplateUtil.GetTemplate("config/go_json/table"); var result = template.RenderCode(p, new Dictionary() { ["package"] = package }); return result; } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { string package = "cfg"; - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/go_json/tables")); + var template = StringTemplateUtil.GetTemplate("config/go_json/tables"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/GoCodeRenderBase.cs b/src/Luban.Job.Cfg/Source/Generate/GoCodeRenderBase.cs index dba7dea..5a28e76 100644 --- a/src/Luban.Job.Cfg/Source/Generate/GoCodeRenderBase.cs +++ b/src/Luban.Job.Cfg/Source/Generate/GoCodeRenderBase.cs @@ -12,24 +12,18 @@ namespace Luban.Job.Cfg.Generate { abstract class GoCodeRenderBase : CodeRenderBase { - [ThreadStatic] - private static Template t_constRender; - public override string Render(DefConst c) { string package = "cfg"; - var template = t_constRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/go/const")); + var template = StringTemplateUtil.GetTemplate("common/go/const"); var result = template.RenderCode(c, new Dictionary() { ["package"] = package }); return result; } - [ThreadStatic] - private static Template t_enumRender; - public override string Render(DefEnum e) { string package = "cfg"; - var template = t_enumRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/go/enum")); + var template = StringTemplateUtil.GetTemplate("common/go/enum"); var result = template.RenderCode(e, new Dictionary() { ["package"] = package }); return result; } diff --git a/src/Luban.Job.Cfg/Source/Generate/JavaCodeBinRender.cs b/src/Luban.Job.Cfg/Source/Generate/JavaCodeBinRender.cs index 4d8954d..e38159d 100644 --- a/src/Luban.Job.Cfg/Source/Generate/JavaCodeBinRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/JavaCodeBinRender.cs @@ -9,32 +9,25 @@ namespace Luban.Job.Cfg.Generate { class JavaCodeBinRender : JavaCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; - public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/java_bin/bean")); + var template = StringTemplateUtil.GetTemplate("config/java_bin/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/java_bin/table")); + var template = StringTemplateUtil.GetTemplate("config/java_bin/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/java_bin/tables")); + var template = StringTemplateUtil.GetTemplate("config/java_bin/tables"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/JavaCodeJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/JavaCodeJsonRender.cs new file mode 100644 index 0000000..d9bf60d --- /dev/null +++ b/src/Luban.Job.Cfg/Source/Generate/JavaCodeJsonRender.cs @@ -0,0 +1,41 @@ +using Luban.Job.Cfg.Defs; +using Luban.Job.Common.Defs; +using Luban.Job.Common.Utils; +using Scriban; +using System; +using System.Collections.Generic; + +namespace Luban.Job.Cfg.Generate +{ + class JavaCodeJsonRender : JavaCodeRenderBase + { + public override string Render(DefBean b) + { + var template = StringTemplateUtil.GetTemplate("config/java_json/bean"); + var result = template.RenderCode(b); + + return result; + } + + public override string Render(DefTable p) + { + var template = StringTemplateUtil.GetTemplate("config/java_json/table"); + var result = template.RenderCode(p); + + return result; + } + + public override string RenderService(string name, string module, List tables) + { + var template = StringTemplateUtil.GetTemplate("config/java_json/tables"); + var result = template.Render(new + { + Name = name, + Package = module, + Tables = tables, + }); + + return result; + } + } +} diff --git a/src/Luban.Job.Cfg/Source/Generate/LuaCodeBinRender.cs b/src/Luban.Job.Cfg/Source/Generate/LuaCodeBinRender.cs index 2fce8d9..65d4af8 100644 --- a/src/Luban.Job.Cfg/Source/Generate/LuaCodeBinRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/LuaCodeBinRender.cs @@ -10,15 +10,15 @@ namespace Luban.Job.Cfg.Generate { class LuaCodeBinRender : LuaCodeRenderBase { - [ThreadStatic] - private static Template t_allRender; public override string RenderAll(List types) { var consts = types.Where(t => t is DefConst).ToList(); var enums = types.Where(t => t is DefEnum).ToList(); var beans = types.Where(t => t is DefBean).ToList(); var tables = types.Where(t => t is DefTable).ToList(); - var template = t_allRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/lua/base") + StringTemplateUtil.GetTemplateString("config/lua_bin/all")); + var template = StringTemplateUtil.GetOrAddTemplate("common/lua/base_all", fn => + Template.Parse(StringTemplateUtil.GetTemplateString("common/lua/base") + + StringTemplateUtil.GetTemplateString("config/lua_bin/all"))); return template.RenderCode(new { Consts = consts, Enums = enums, Beans = beans, Tables = tables }); } } diff --git a/src/Luban.Job.Cfg/Source/Generate/Python3CodeJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/Python3CodeJsonRender.cs index edca74d..d4ca6bb 100644 --- a/src/Luban.Job.Cfg/Source/Generate/Python3CodeJsonRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/Python3CodeJsonRender.cs @@ -7,21 +7,17 @@ namespace Luban.Job.Cfg.Generate { class Python3CodeJsonRender : PythonCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/python_json/bean")); + var template = StringTemplateUtil.GetTemplate("config/python_json/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/python_json/table")); + var template = StringTemplateUtil.GetTemplate("config/python_json/table"); var result = template.RenderCode(p); return result; diff --git a/src/Luban.Job.Cfg/Source/Generate/PythonCodeRenderBase.cs b/src/Luban.Job.Cfg/Source/Generate/PythonCodeRenderBase.cs index 3eb958a..32f2e87 100644 --- a/src/Luban.Job.Cfg/Source/Generate/PythonCodeRenderBase.cs +++ b/src/Luban.Job.Cfg/Source/Generate/PythonCodeRenderBase.cs @@ -19,11 +19,9 @@ namespace Luban.Job.Cfg.Generate return RenderUtil.RenderPythonEnumClass(e); } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/python_json/tables")); + var template = StringTemplateUtil.GetTemplate("config/python_json/tables"); var result = template.RenderCode(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/TypescriptCodeBinRender.cs b/src/Luban.Job.Cfg/Source/Generate/TypescriptCodeBinRender.cs index e0ff750..0f044fe 100644 --- a/src/Luban.Job.Cfg/Source/Generate/TypescriptCodeBinRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/TypescriptCodeBinRender.cs @@ -9,31 +9,25 @@ namespace Luban.Job.Cfg.Generate { class TypescriptCodeBinRender : TypescriptCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/typescript_bin/bean")); + var template = StringTemplateUtil.GetTemplate("config/typescript_bin/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/typescript_bin/table")); + var template = StringTemplateUtil.GetTemplate("config/typescript_bin/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/typescript_bin/tables")); + var template = StringTemplateUtil.GetTemplate("config/typescript_bin/tables"); var result = template.RenderCode(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/Generate/TypescriptCodeJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/TypescriptCodeJsonRender.cs index 15375e0..1b552ef 100644 --- a/src/Luban.Job.Cfg/Source/Generate/TypescriptCodeJsonRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/TypescriptCodeJsonRender.cs @@ -9,31 +9,25 @@ namespace Luban.Job.Cfg.Generate { class TypescriptCodeJsonRender : TypescriptCodeRenderBase { - [ThreadStatic] - private static Template t_beanRender; public override string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/typescript_json/bean")); + var template = StringTemplateUtil.GetTemplate("config/typescript_json/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public override string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/typescript_json/table")); + var template = StringTemplateUtil.GetTemplate("config/typescript_json/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_serviceRender; public override string RenderService(string name, string module, List tables) { - var template = t_serviceRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("config/typescript_json/tables")); + var template = StringTemplateUtil.GetTemplate("config/typescript_json/tables"); var result = template.RenderCode(new { Name = name, diff --git a/src/Luban.Job.Cfg/Source/JobController.cs b/src/Luban.Job.Cfg/Source/JobController.cs index 3c5be7e..f53d227 100644 --- a/src/Luban.Job.Cfg/Source/JobController.cs +++ b/src/Luban.Job.Cfg/Source/JobController.cs @@ -46,7 +46,7 @@ namespace Luban.Job.Cfg [Option("output_data_json_monolithic_file", Required = false, HelpText = "output monolithic json file")] public string OutputDataJsonMonolithicFile { get; set; } - [Option("gen_types", Required = true, HelpText = "code_cs_bin,code_cs_json,code_cs_unity_json,code_lua_bin,code_java_bin,code_go_bin,code_go_json,code_cpp_bin,code_python3_json,code_typescript_bin,code_typescript_json,data_bin,data_lua,data_json,data_json2,data_json_monolithic,data_resources . can be multi")] + [Option("gen_types", Required = true, HelpText = "code_cs_bin,code_cs_json,code_cs_unity_json,code_lua_bin,code_java_bin,code_java_json,code_go_bin,code_go_json,code_cpp_bin,code_python3_json,code_typescript_bin,code_typescript_json,data_bin,data_lua,data_json,data_json2,data_json_monolithic,data_resources . can be multi")] public string GenType { get; set; } [Option('s', "service", Required = true, HelpText = "service")] @@ -82,6 +82,7 @@ namespace Luban.Job.Cfg case "code_cs_json": return new CsCodeJsonRender(); case "code_cs_unity_json": return new CsCodeUnityJsonRender(); case "code_java_bin": return new JavaCodeBinRender(); + case "code_java_json": return new JavaCodeJsonRender(); case "code_go_bin": return new GoCodeBinRender(); case "code_go_json": return new GoCodeJsonRender(); case "code_cpp_bin": return new CppCodeBinRender(); @@ -90,9 +91,9 @@ namespace Luban.Job.Cfg case "code_python3_json": return new Python3CodeJsonRender(); case "code_typescript_bin": return new TypescriptCodeBinRender(); case "code_typescript_json": return new TypescriptCodeJsonRender(); - case "code_cpp_ue_editor": return new UE4EditorCppRender(); - case "code_cpp_ue_bp": return new UE4BpCppRender(); - case "code_cs_unity_editor": return new EditorCsRender(); + case "code_cpp_ue_editor": return new CppUE4EditorRender(); + case "code_cpp_ue_bp": return new CppUE4BpRender(); + case "code_cs_unity_editor": return new CsEditorRender(); default: throw new ArgumentException($"not support gen type:{genType}"); } } @@ -103,9 +104,9 @@ namespace Luban.Job.Cfg { case "code_cs_bin": case "code_cs_json": - case "code_cs_unity_json": - return ELanguage.CS; - case "code_java_bin": return ELanguage.JAVA; + case "code_cs_unity_json": return ELanguage.CS; + case "code_java_bin": + case "code_java_json": return ELanguage.JAVA; case "code_go_bin": case "code_go_json": return ELanguage.GO; case "code_cpp_bin": return ELanguage.CPP; @@ -339,6 +340,7 @@ namespace Luban.Job.Cfg case "code_cs_json": case "code_cs_unity_json": case "code_java_bin": + case "code_java_json": case "code_go_bin": case "code_go_json": { @@ -406,8 +408,7 @@ namespace Luban.Job.Cfg default: { - s_logger.Error("unknown gentype:{gentype}", genType); - break; + throw new Exception($"unknown gentype:{genType}"); } } } @@ -693,7 +694,7 @@ namespace {ctx.TopModule} private void GenCppUeEditor(GenContext ctx) { - var render = new UE4EditorCppRender(); + var render = new CppUE4EditorRender(); var renderTypes = ctx.Assembly.Types.Values.Where(c => c is DefEnum || c is DefBean).ToList(); @@ -728,7 +729,7 @@ namespace {ctx.TopModule} private void GenCsUnityEditor(GenContext ctx) { - var render = new EditorCsRender(); + var render = new CsEditorRender(); foreach (var c in ctx.Assembly.Types.Values) { ctx.Tasks.Add(Task.Run(() => @@ -743,7 +744,7 @@ namespace {ctx.TopModule} private void GenCppUeBp(GenContext ctx) { - var render = new UE4BpCppRender(); + var render = new CppUE4BpRender(); foreach (var c in ctx.ExportTypes) { if (!(c is DefEnum || c is DefBean)) diff --git a/src/Luban.Job.Cfg/Source/TypeVisitors/JavaJsonDeserialize.cs b/src/Luban.Job.Cfg/Source/TypeVisitors/JavaJsonDeserialize.cs new file mode 100644 index 0000000..c3016ab --- /dev/null +++ b/src/Luban.Job.Cfg/Source/TypeVisitors/JavaJsonDeserialize.cs @@ -0,0 +1,133 @@ +using Luban.Job.Common.Types; +using Luban.Job.Common.TypeVisitors; +using System; + +namespace Luban.Job.Cfg.TypeVisitors +{ + class JavaJsonDeserialize : ITypeFuncVisitor + { + public static JavaJsonDeserialize Ins { get; } = new(); + + public string Accept(TBool type, string json, string x) + { + return $"{x} = {json}.getAsBoolean();"; + } + + public string Accept(TByte type, string json, string x) + { + return $"{x} = {json}.getAsByte();"; + } + + public string Accept(TShort type, string json, string x) + { + return $"{x} = {json}.getAsShort();"; + } + + public string Accept(TFshort type, string json, string x) + { + return $"{x} = {json}.getAsShort();"; + } + + public string Accept(TInt type, string json, string x) + { + return $"{x} = {json}.getAsInt();"; + } + + public string Accept(TFint type, string json, string x) + { + return $"{x} = {json}.getAsInt();"; + } + + public string Accept(TLong type, string json, string x) + { + return $"{x} = {json}.getAsLong();"; + } + + public string Accept(TFlong type, string json, string x) + { + return $"{x} = {json}.getAsLong();"; + } + + public string Accept(TFloat type, string json, string x) + { + return $"{x} = {json}.getAsFloat();"; + } + + public string Accept(TDouble type, string json, string x) + { + return $"{x} = {json}.getAsDouble();"; + } + + public string Accept(TEnum type, string json, string x) + { + return $"{x} = {type.DefineEnum.FullNameWithTopModule}.valueOf({json}.getAsInt());"; + } + + public string Accept(TString type, string json, string x) + { + return $"{x} = {json}.getAsString();"; + } + + public string Accept(TBytes type, string json, string x) + { + throw new NotSupportedException(); + } + + public string Accept(TText type, string json, string x) + { + return $"{x} = {json}.getAsString();"; + } + + public string Accept(TBean type, string json, string x) + { + if (type.IsDynamic) + { + return $"{x} = {type.Bean.FullNameWithTopModule}.deserialize{type.Bean.Name}({json}.getAsJsonObject());"; + } + else + { + return $"{x} = new {type.Bean.FullNameWithTopModule}({json}.getAsJsonObject());"; + } + } + + public string Accept(TArray type, string json, string x) + { + return $"{{ var _json0_ = {json}.getAsJsonArray(); int _n = _json0_.size(); {x} = new {type.ElementType.Apply(JavaDefineTypeName.Ins)}[_n]; int _index=0; for(JsonElement __e : _json0_) {{ {type.ElementType.Apply(JavaDefineTypeName.Ins)} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}[_index++] = __v; }} }}"; + } + + public string Accept(TList type, string json, string x) + { + return $"{{ var _json0_ = {json}.getAsJsonArray(); {x} = new {type.Apply(JavaDefineTypeName.Ins)}(_json0_.size()); for(JsonElement __e : _json0_) {{ {type.ElementType.Apply(JavaDefineTypeName.Ins)} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}.add(__v); }} }}"; + } + + public string Accept(TSet type, string json, string x) + { + return $"{{ var _json0_ = {json}.getAsJsonArray(); {x} = new {type.Apply(JavaDefineTypeName.Ins)}(_json0_.size()); for(JsonElement __e : _json0_) {{ {type.ElementType.Apply(JavaDefineTypeName.Ins)} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}.add(__v); }} }}"; + } + + public string Accept(TMap type, string json, string x) + { + return @$"{{ var _json0_ = {json}.getAsJsonArray(); {x} = new {type.Apply(JavaDefineTypeName.Ins)}(_json0_.size()); for(JsonElement __e : _json0_) {{ {type.KeyType.Apply(JavaDefineTypeName.Ins)} __k; {type.KeyType.Apply(this, "__e.getAsJsonArray().get(0)", "__k")} {type.ValueType.Apply(JavaDefineTypeName.Ins)} __v; {type.ValueType.Apply(this, "__e.getAsJsonArray().get(1)", "__v")} {x}.put(__k, __v); }} }}"; + } + + public string Accept(TVector2 type, string json, string x) + { + return $"{{ var _json0_ = {json}.getAsJsonObject(); float __x; {TFloat.Ins.Apply(this, "_json0_.get(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json0_.get(\"y\")", "__y") } {x} = new {type.Apply(JavaDefineTypeName.Ins)}(__x, __y); }}"; + } + + public string Accept(TVector3 type, string json, string x) + { + return $"{{ var _json0_ = {json}.getAsJsonObject(); float __x; {TFloat.Ins.Apply(this, "_json0_.get(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json0_.get(\"y\")", "__y") } float __z; {TFloat.Ins.Apply(this, "_json0_.get(\"z\")", "__z") } {x} = new {type.Apply(JavaDefineTypeName.Ins)}(__x, __y,__z); }}"; + } + + public string Accept(TVector4 type, string json, string x) + { + return $"{{ var _json0_ = {json}.getAsJsonObject(); float __x; {TFloat.Ins.Apply(this, "_json0_.get(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json0_.get(\"y\")", "__y") } float __z; {TFloat.Ins.Apply(this, "_json0_.get(\"z\")", "__z") } float __w; {TFloat.Ins.Apply(this, "_json0_.get(\"w\")", "__w") } {x} = new {type.Apply(JavaDefineTypeName.Ins)}(__x, __y, __z, __w); }}"; + } + + public string Accept(TDateTime type, string json, string x) + { + return $"{x} = {json}.getAsInt();"; + } + } +} diff --git a/src/Luban.Job.Cfg/Source/TypeVisitors/JavaUnderingDeserializeVisitor.cs b/src/Luban.Job.Cfg/Source/TypeVisitors/JavaUnderingDeserializeVisitor.cs index cc8ddd4..aa78855 100644 --- a/src/Luban.Job.Cfg/Source/TypeVisitors/JavaUnderingDeserializeVisitor.cs +++ b/src/Luban.Job.Cfg/Source/TypeVisitors/JavaUnderingDeserializeVisitor.cs @@ -79,7 +79,14 @@ namespace Luban.Job.Cfg.TypeVisitors public string Accept(TBean type, string bufName, string fieldName) { - return $"{fieldName} = {type.Bean.FullNameWithTopModule}.deserialize{type.Bean.Name}({bufName});"; + if (type.IsDynamic) + { + return $"{fieldName} = {type.Bean.FullNameWithTopModule}.deserialize{type.Bean.Name}({bufName});"; + } + else + { + return $"{fieldName} = new {type.Bean.FullNameWithTopModule}({bufName});"; + } } public string Accept(TArray type, string bufName, string fieldName) diff --git a/src/Luban.Job.Common/Source/Utils/RenderUtil.cs b/src/Luban.Job.Common/Source/Utils/RenderUtil.cs index 58b5dcf..cd07a3b 100644 --- a/src/Luban.Job.Common/Source/Utils/RenderUtil.cs +++ b/src/Luban.Job.Common/Source/Utils/RenderUtil.cs @@ -6,8 +6,6 @@ namespace Luban.Job.Common.Utils { public static class RenderUtil { - [ThreadStatic] - private static Template t_constRender; public static string RenderCsConstClass(DefConst c) { var ctx = new TemplateContext(); @@ -17,24 +15,20 @@ namespace Luban.Job.Common.Utils }; ctx.PushGlobal(env); - var template = t_constRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/cs/const")); + var template = StringTemplateUtil.GetTemplate("common/cs/const"); var result = template.Render(ctx); return result; } - [ThreadStatic] - private static Template t_enumRender; public static string RenderCsEnumClass(DefEnum e) { - var template = t_enumRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/cs/enum")); + var template = StringTemplateUtil.GetTemplate("common/cs/enum"); var result = template.Render(e); return result; } - [ThreadStatic] - private static Template t_javaConstRender; public static string RenderJavaConstClass(DefConst c) { var ctx = new TemplateContext(); @@ -45,24 +39,20 @@ namespace Luban.Job.Common.Utils ctx.PushGlobal(env); - var template = t_javaConstRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/java/const")); + var template = StringTemplateUtil.GetTemplate("common/java/const"); var result = template.Render(ctx); return result; } - [ThreadStatic] - private static Template t_javaEnumRender; public static string RenderJavaEnumClass(DefEnum e) { - var template = t_javaEnumRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/java/enum")); + var template = StringTemplateUtil.GetTemplate("common/java/enum"); var result = template.Render(e); return result; } - [ThreadStatic] - private static Template t_cppConstRender; public static string RenderCppConstClass(DefConst c) { var ctx = new TemplateContext(); @@ -73,22 +63,18 @@ namespace Luban.Job.Common.Utils ctx.PushGlobal(env); - var template = t_cppConstRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/cpp/const")); + var template = StringTemplateUtil.GetTemplate("common/cpp/const"); var result = template.Render(ctx); return result; } - [ThreadStatic] - private static Template t_cppEnumRender; public static string RenderCppEnumClass(DefEnum e) { - var template = t_cppEnumRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/cpp/enum")); + var template = StringTemplateUtil.GetTemplate("common/cpp/enum"); var result = template.Render(e); return result; } - [ThreadStatic] - private static Template t_pythonConstRender; public static string RenderPythonConstClass(DefConst c) { var ctx = new TemplateContext(); @@ -99,24 +85,20 @@ namespace Luban.Job.Common.Utils ctx.PushGlobal(env); - var template = t_pythonConstRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/python/const")); + var template = StringTemplateUtil.GetTemplate("common/python/const"); var result = template.Render(ctx); return result; } - [ThreadStatic] - private static Template t_pythonEnumRender; public static string RenderPythonEnumClass(DefEnum e) { - var template = t_pythonEnumRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/python/enum")); + var template = StringTemplateUtil.GetTemplate("common/python/enum"); var result = template.Render(e); return result; } - [ThreadStatic] - private static Template t_tsConstRender; public static string RenderTypescriptConstClass(DefConst c) { var ctx = new TemplateContext(); @@ -127,17 +109,15 @@ namespace Luban.Job.Common.Utils ctx.PushGlobal(env); - var template = t_tsConstRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/typescript/const")); + var template = StringTemplateUtil.GetTemplate("common/typescript/const"); var result = template.Render(ctx); return result; } - [ThreadStatic] - private static Template t_tsEnumRender; public static string RenderTypescriptEnumClass(DefEnum e) { - var template = t_tsEnumRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("common/typescript/enum")); + var template = StringTemplateUtil.GetTemplate("common/typescript/enum"); var result = template.Render(e); return result; diff --git a/src/Luban.Job.Common/Source/Utils/StringTemplateUtil.cs b/src/Luban.Job.Common/Source/Utils/StringTemplateUtil.cs index 351e167..9d8f44c 100644 --- a/src/Luban.Job.Common/Source/Utils/StringTemplateUtil.cs +++ b/src/Luban.Job.Common/Source/Utils/StringTemplateUtil.cs @@ -1,4 +1,6 @@ -锘縰sing System; +锘縰sing Scriban; +using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -15,5 +17,17 @@ namespace Luban.Job.Common.Utils { return File.ReadAllText($"{TemplateDir}/{templateName}.tpl", Encoding.UTF8); } + + private static readonly ConcurrentDictionary s_templates = new(); + + public static Template GetTemplate(string templateName) + { + return s_templates.GetOrAdd(templateName, tn => Template.Parse(GetTemplateString(tn))); + } + + public static Template GetOrAddTemplate(string templateName, Func creator) + { + return s_templates.GetOrAdd(templateName, creator); + } } } diff --git a/src/Luban.Job.Db/Source/Generate/AsyncCsRender.cs b/src/Luban.Job.Db/Source/Generate/AsyncCsRender.cs index 2cdbfbd..42bed10 100644 --- a/src/Luban.Job.Db/Source/Generate/AsyncCsRender.cs +++ b/src/Luban.Job.Db/Source/Generate/AsyncCsRender.cs @@ -31,30 +31,24 @@ namespace Luban.Job.Db.Generate return RenderUtil.RenderCsEnumClass(e); } - [ThreadStatic] - private static Template t_beanRender; public string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/cs_async/bean")); + var template = StringTemplateUtil.GetTemplate("db/cs_async/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/cs_async/table")); + var template = StringTemplateUtil.GetTemplate("db/cs_async/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_stubRender; public string RenderTables(string name, string module, List tables) { - var template = t_stubRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/cs_async/tables")); + var template = StringTemplateUtil.GetTemplate("db/cs_async/tables"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Job.Db/Source/Generate/SyncCsRender.cs b/src/Luban.Job.Db/Source/Generate/SyncCsRender.cs index a462843..70eaf14 100644 --- a/src/Luban.Job.Db/Source/Generate/SyncCsRender.cs +++ b/src/Luban.Job.Db/Source/Generate/SyncCsRender.cs @@ -31,30 +31,24 @@ namespace Luban.Job.Db.Generate return RenderUtil.RenderCsEnumClass(e); } - [ThreadStatic] - private static Template t_beanRender; public string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/cs_sync/bean")); + var template = StringTemplateUtil.GetTemplate("db/cs_sync/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/cs_sync/table")); + var template = StringTemplateUtil.GetTemplate("db/cs_sync/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_stubRender; public string RenderTables(string name, string module, List tables) { - var template = t_stubRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/cs_sync/tables")); + var template = StringTemplateUtil.GetTemplate("db/cs_sync/tables"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Job.Db/Source/Generate/TypescriptRender.cs b/src/Luban.Job.Db/Source/Generate/TypescriptRender.cs index 83e80bb..3400f11 100644 --- a/src/Luban.Job.Db/Source/Generate/TypescriptRender.cs +++ b/src/Luban.Job.Db/Source/Generate/TypescriptRender.cs @@ -33,30 +33,25 @@ namespace Luban.Job.Db.Generate { return RenderUtil.RenderTypescriptEnumClass(e); } - [ThreadStatic] - private static Template t_beanRender; + public string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/typescript/bean")); + var template = StringTemplateUtil.GetTemplate("db/typescript/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_tableRender; public string Render(DefTable p) { - var template = t_tableRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/typescript/table")); + var template = StringTemplateUtil.GetTemplate("db/typescript/table"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_stubRender; public string RenderTables(string name, string module, List tables) { - var template = t_stubRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("db/typescript/tables")); + var template = StringTemplateUtil.GetTemplate("db/typescript/tables"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Job.Proto/Source/Generate/CsRender.cs b/src/Luban.Job.Proto/Source/Generate/CsRender.cs index 3fd3555..2056b22 100644 --- a/src/Luban.Job.Proto/Source/Generate/CsRender.cs +++ b/src/Luban.Job.Proto/Source/Generate/CsRender.cs @@ -33,41 +33,33 @@ namespace Luban.Job.Proto.Generate return RenderUtil.RenderCsEnumClass(e); } - [ThreadStatic] - private static Template t_beanRender; private string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/cs/bean")); + var template = StringTemplateUtil.GetTemplate("proto/cs/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_protoRender; private string Render(DefProto p) { - var template = t_protoRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/cs/proto")); + var template = StringTemplateUtil.GetTemplate("proto/cs/proto"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_rpcRender; private string Render(DefRpc r) { - var template = t_rpcRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/cs/rpc")); + var template = StringTemplateUtil.GetTemplate("proto/cs/rpc"); var result = template.RenderCode(r); return result; } - [ThreadStatic] - private static Template t_stubRender; public string RenderStubs(string name, string module, List protos, List rpcs) { - var template = t_stubRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/cs/stub")); + var template = StringTemplateUtil.GetTemplate("proto/cs/stub"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Job.Proto/Source/Generate/LuaRender.cs b/src/Luban.Job.Proto/Source/Generate/LuaRender.cs index c16ae66..26a045d 100644 --- a/src/Luban.Job.Proto/Source/Generate/LuaRender.cs +++ b/src/Luban.Job.Proto/Source/Generate/LuaRender.cs @@ -10,9 +10,6 @@ namespace Luban.Job.Proto.Generate { class LuaRender { - - [ThreadStatic] - private static Template t_allRender; public string RenderTypes(List types) { var consts = types.Where(t => t is DefConst).ToList(); @@ -20,7 +17,7 @@ namespace Luban.Job.Proto.Generate var beans = types.Where(t => t is DefBean).ToList(); var protos = types.Where(t => t is DefProto).ToList(); var rpcs = types.Where(t => t is DefRpc).ToList(); - var template = t_allRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/lua/all")); + var template = StringTemplateUtil.GetTemplate("proto/lua/all"); return template.RenderCode(new { Consts = consts, Enums = enums, Beans = beans, Protos = protos, Rpcs = rpcs }); } } diff --git a/src/Luban.Job.Proto/Source/Generate/TypescriptRender.cs b/src/Luban.Job.Proto/Source/Generate/TypescriptRender.cs index ad9fc8b..abfa074 100644 --- a/src/Luban.Job.Proto/Source/Generate/TypescriptRender.cs +++ b/src/Luban.Job.Proto/Source/Generate/TypescriptRender.cs @@ -36,41 +36,33 @@ namespace Luban.Job.Proto.Generate return RenderUtil.RenderTypescriptEnumClass(e); } - [ThreadStatic] - private static Template t_beanRender; private string Render(DefBean b) { - var template = t_beanRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/typescript/bean")); + var template = StringTemplateUtil.GetTemplate("proto/typescript/bean"); var result = template.RenderCode(b); return result; } - [ThreadStatic] - private static Template t_protoRender; private string Render(DefProto p) { - var template = t_protoRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/typescript/proto")); + var template = StringTemplateUtil.GetTemplate("proto/typescript/proto"); var result = template.RenderCode(p); return result; } - [ThreadStatic] - private static Template t_rpcRender; private string Render(DefRpc r) { - var template = t_rpcRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/typescript/rpc")); + var template = StringTemplateUtil.GetTemplate("proto/typescript/rpc"); var result = template.RenderCode(r); return result; } - [ThreadStatic] - private static Template t_stubRender; public string RenderStubs(string name, string module, List protos, List rpcs) { - var template = t_stubRender ??= Template.Parse(StringTemplateUtil.GetTemplateString("proto/typescript/stub")); + var template = StringTemplateUtil.GetTemplate("proto/typescript/stub"); var result = template.Render(new { Name = name, diff --git a/src/Luban.Server/Luban.Server.csproj b/src/Luban.Server/Luban.Server.csproj index 4a0c245..710d7c1 100644 --- a/src/Luban.Server/Luban.Server.csproj +++ b/src/Luban.Server/Luban.Server.csproj @@ -149,6 +149,15 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/src/Luban.Server/Templates/common/java/const.tpl b/src/Luban.Server/Templates/common/java/const.tpl index ab8e0f6..08f920c 100644 --- a/src/Luban.Server/Templates/common/java/const.tpl +++ b/src/Luban.Server/Templates/common/java/const.tpl @@ -6,8 +6,7 @@ package {{x.namespace_with_top_module}}; * {{x.comment}} */ {{~end~}} -public final class {{x.name}} -{ +public final class {{x.name}} { {{~ for item in x.items ~}} {{~if item.comment != '' ~}} /** diff --git a/src/Luban.Server/Templates/common/java/enum.tpl b/src/Luban.Server/Templates/common/java/enum.tpl index 648aa3b..6c9d014 100644 --- a/src/Luban.Server/Templates/common/java/enum.tpl +++ b/src/Luban.Server/Templates/common/java/enum.tpl @@ -4,8 +4,7 @@ package {{namespace_with_top_module}}; * {{comment}} */ {{~end~}} -public enum {{name}} -{ +public enum {{name}} { {{~ for item in items ~}} {{~if item.comment != '' ~}} /** diff --git a/src/Luban.Server/Templates/config/java_bin/bean.tpl b/src/Luban.Server/Templates/config/java_bin/bean.tpl index 4075d7d..65d77e8 100644 --- a/src/Luban.Server/Templates/config/java_bin/bean.tpl +++ b/src/Luban.Server/Templates/config/java_bin/bean.tpl @@ -14,54 +14,45 @@ import bright.serialization.*; * {{x.comment}} */ {{~end~}} -public {{x.java_class_modifier}} class {{name}} extends {{if parent_def_type}} {{x.parent_def_type.full_name_with_top_module}} {{else}} bright.serialization.AbstractBean {{end}} -{ - public {{name}}(ByteBuf _buf) - { +public {{x.java_class_modifier}} class {{name}}{{if parent_def_type}} extends {{x.parent_def_type.full_name_with_top_module}}{{end}} { + public {{name}}(ByteBuf _buf) { {{~if parent_def_type~}} super(_buf); {{~end~}} {{~ for field in export_fields ~}} {{java_deserialize '_buf' field.java_style_name field.ctype}} {{~if field.index_field~}} - for({{java_box_define_type field.ctype.element_type}} _v : {{field.java_style_name}}) - { + for({{java_box_define_type field.ctype.element_type}} _v : {{field.java_style_name}}) { {{field.java_style_name}}_Index.put(_v.{{field.index_field.java_style_name}}, _v); } {{~end~}} {{~end~}} } - public {{name}}({{- for field in hierarchy_export_fields }}{{java_define_type field.ctype}} {{field.name}}{{if !for.last}},{{end}} {{end}}) - { + public {{name}}({{- for field in hierarchy_export_fields }}{{java_define_type field.ctype}} {{field.name}}{{if !for.last}},{{end}} {{end}}) { {{~if parent_def_type~}} super({{ for field in parent_def_type.hierarchy_export_fields }}{{field.name}}{{if !for.last}}, {{end}}{{end}}); {{~end~}} {{~ for field in export_fields ~}} this.{{field.java_style_name}} = {{field.name}}; {{~if field.index_field~}} - for({{java_box_define_type field.ctype.element_type}} _v : {{field.java_style_name}}) - { + for({{java_box_define_type field.ctype.element_type}} _v : {{field.java_style_name}}) { {{field.java_style_name}}_Index.put(_v.{{field.index_field.java_style_name}}, _v); } {{~end~}} {{~end~}} } - public static {{name}} deserialize{{name}}(ByteBuf _buf) - { {{~if x.is_abstract_type~}} - switch (_buf.readInt()) - { + public static {{name}} deserialize{{name}}(ByteBuf _buf) { + switch (_buf.readInt()) { {{~for child in x.hierarchy_not_abstract_children~}} case {{child.full_name_with_top_module}}.ID: return new {{child.full_name_with_top_module}}(_buf); {{~end~}} default: throw new SerializationException(); } - {{~else~}} - return new {{name}}(_buf); - {{~end~}} } + {{~end~}} {{~ for field in export_fields ~}} {{~if field.comment != '' ~}} @@ -78,42 +69,33 @@ public {{x.java_class_modifier}} class {{name}} extends {{if parent_def_type}} { {{~end~}} {{~end~}} -{{~if !x.is_abstract_type~}} +{{~if !x.is_abstract_type && x.parent_def_type~}} public static final int ID = {{x.id}}; @Override public int getTypeId() { return ID; } +{{~else if x.is_abstract_type && !x.parent_def_type~}} + public abstract int getTypeId(); {{~end~}} + {{~if parent_def_type~}} @Override - public void serialize(ByteBuf os) - { - throw new UnsupportedOperationException(); - } - - @Override - public void deserialize(ByteBuf os) - { - throw new UnsupportedOperationException(); - } - - public void resolve(java.util.HashMap _tables) - { + {{~end~}} + public void resolve(java.util.HashMap _tables) { {{~if parent_def_type~}} super.resolve(_tables); {{~end~}} {{~ for field in export_fields ~}} {{~if field.gen_ref~}} - {{java_ref_validator_resolve field}} + {{java_ref_validator_resolve field}} {{~else if field.has_recursive_ref~}} - {{java_recursive_resolve field '_tables'}} + {{java_recursive_resolve field '_tables'}} {{~end~}} {{~end~}} } @Override - public String toString() - { + public String toString() { return "{{full_name}}{ " {{~for field in hierarchy_export_fields ~}} + "{{field.java_style_name}}:" + {{java_to_string field.java_style_name field.ctype}} + "," diff --git a/src/Luban.Server/Templates/config/java_bin/table.tpl b/src/Luban.Server/Templates/config/java_bin/table.tpl index 6dd2a8f..466e65e 100644 --- a/src/Luban.Server/Templates/config/java_bin/table.tpl +++ b/src/Luban.Server/Templates/config/java_bin/table.tpl @@ -15,19 +15,16 @@ import bright.serialization.*; * {{x.comment}} */ {{~end~}} -public final class {{name}} -{ +public final class {{name}} { {{~if x.is_map_table ~}} private final java.util.HashMap<{{java_box_define_type key_type}}, {{java_box_define_type value_type}}> _dataMap; private final java.util.ArrayList<{{java_box_define_type value_type}}> _dataList; - public {{name}}(ByteBuf _buf) - { + public {{name}}(ByteBuf _buf) { _dataMap = new java.util.HashMap<{{java_box_define_type key_type}}, {{java_box_define_type value_type}}>(); _dataList = new java.util.ArrayList<{{java_box_define_type value_type}}>(); - for(int n = _buf.readSize() ; n > 0 ; --n) - { + for(int n = _buf.readSize() ; n > 0 ; --n) { {{java_box_define_type value_type}} _v; {{java_deserialize '_buf' '_v' value_type}} _dataList.add(_v); @@ -44,10 +41,8 @@ public final class {{name}} {{~end~}} public {{java_box_define_type value_type}} get({{java_define_type key_type}} key) { return _dataMap.get(key); } - public void resolve(java.util.HashMap _tables) - { - for({{java_box_define_type value_type}} v : _dataList) - { + public void resolve(java.util.HashMap _tables) { + for({{java_box_define_type value_type}} v : _dataList) { v.resolve(_tables); } } @@ -57,8 +52,7 @@ public final class {{name}} public final {{java_define_type value_type}} data() { return _data; } - public {{name}}(ByteBuf _buf) - { + public {{name}}(ByteBuf _buf) { int n = _buf.readSize(); if (n != 1) throw new SerializationException("table mode=one, but size != 1"); {{java_deserialize '_buf' '_data' value_type}} @@ -74,10 +68,8 @@ public final class {{name}} public {{java_define_type field.ctype}} {{field.java_getter_name}}() { return _data.{{field.java_style_name}}; } {{~end~}} - public void resolve(java.util.HashMap _tables) - { + public void resolve(java.util.HashMap _tables) { _data.resolve(_tables); } - {{~end~}} } \ No newline at end of file diff --git a/src/Luban.Server/Templates/config/java_bin/tables.tpl b/src/Luban.Server/Templates/config/java_bin/tables.tpl index 1ed22e3..8aae727 100644 --- a/src/Luban.Server/Templates/config/java_bin/tables.tpl +++ b/src/Luban.Server/Templates/config/java_bin/tables.tpl @@ -14,18 +14,19 @@ public final class {{name}} * {{table.comment}} */ {{~end~}} - public final {{table.full_name_with_top_module}} {{table.name}}; + private final {{table.full_name_with_top_module}} {{table.inner_name}}; + public {{table.full_name_with_top_module}} get{{table.name}}() { return {{table.inner_name}}; } {{~end~}} public {{name}}(IByteBufLoader loader) throws java.io.IOException { var tables = new java.util.HashMap(); {{~for table in tables ~}} - {{table.name}} = new {{table.full_name_with_top_module}}(loader.load("{{table.output_data_file}}")); - tables.put("{{table.full_name}}", {{table.name}}); + {{table.inner_name}} = new {{table.full_name_with_top_module}}(loader.load("{{table.output_data_file}}")); + tables.put("{{table.full_name}}", {{table.inner_name}}); {{~end~}} {{~ for table in tables ~}} - {{table.name}}.resolve(tables); + {{table.inner_name}}.resolve(tables); {{~end~}} } } diff --git a/src/Luban.Server/Templates/config/java_json/bean.tpl b/src/Luban.Server/Templates/config/java_json/bean.tpl new file mode 100644 index 0000000..216e72b --- /dev/null +++ b/src/Luban.Server/Templates/config/java_json/bean.tpl @@ -0,0 +1,108 @@ +package {{x.namespace_with_top_module}}; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +{{ + name = x.name + parent_def_type = x.parent_def_type + export_fields = x.export_fields + hierarchy_export_fields = x.hierarchy_export_fields +}} + +{{~if x.comment != '' ~}} +/** + * {{x.comment}} + */ +{{~end~}} +public {{x.java_class_modifier}} class {{name}}{{if parent_def_type}} extends {{x.parent_def_type.full_name_with_top_module}}{{end}} { + public {{name}}(JsonObject __json__) { + {{~if parent_def_type~}} + super(__json__); + {{~end~}} + {{~ for field in export_fields ~}} + {{java_json_deserialize '__json__' field.java_style_name field.name field.ctype}} + {{~if field.index_field~}} + for({{java_box_define_type field.ctype.element_type}} _v : {{field.java_style_name}}) { + {{field.java_style_name}}_Index.put(_v.{{field.index_field.java_style_name}}, _v); + } + {{~end~}} + {{~end~}} + } + + public {{name}}({{- for field in hierarchy_export_fields }}{{java_define_type field.ctype}} {{field.name}}{{if !for.last}},{{end}} {{end}}) { + {{~if parent_def_type~}} + super({{ for field in parent_def_type.hierarchy_export_fields }}{{field.name}}{{if !for.last}}, {{end}}{{end}}); + {{~end~}} + {{~ for field in export_fields ~}} + this.{{field.java_style_name}} = {{field.name}}; + {{~if field.index_field~}} + for({{java_box_define_type field.ctype.element_type}} _v : {{field.java_style_name}}) { + {{field.java_style_name}}_Index.put(_v.{{field.index_field.java_style_name}}, _v); + } + {{~end~}} + {{~end~}} + } + + public static {{name}} deserialize{{name}}(JsonObject __json__) { + {{~if x.is_abstract_type~}} + switch (__json__.get("__type__").getAsString()) { + {{~for child in x.hierarchy_not_abstract_children~}} + case "{{child.name}}": return new {{child.full_name_with_top_module}}(__json__); + {{~end~}} + default: throw new bright.serialization.SerializationException(); + } + {{~else~}} + return new {{name}}(__json__); + {{~end~}} + } + + {{~ for field in export_fields ~}} +{{~if field.comment != '' ~}} + /** + * {{field.comment}} + */ +{{~end~}} + public final {{java_define_type field.ctype}} {{field.java_style_name}}; + {{~if field.index_field~}} + public final java.util.HashMap<{{java_box_define_type field.index_field.ctype}}, {{java_box_define_type field.ctype.element_type}}> {{field.java_style_name}}_Index = new java.util.HashMap<>(); + {{~end~}} + {{~if field.gen_ref~}} + public {{field.java_ref_validator_define}} + {{~end~}} + {{~end~}} + +{{~if !x.is_abstract_type && x.parent_def_type~}} + public static final int ID = {{x.id}}; + + @Override + public int getTypeId() { return ID; } +{{~else if x.is_abstract_type && !x.parent_def_type~}} + public abstract int getTypeId(); +{{~end~}} + + {{~if parent_def_type~}} + @Override + {{~end~}} + public void resolve(java.util.HashMap _tables) { + {{~if parent_def_type~}} + super.resolve(_tables); + {{~end~}} + {{~ for field in export_fields ~}} + {{~if field.gen_ref~}} + {{java_ref_validator_resolve field}} + {{~else if field.has_recursive_ref~}} + {{java_recursive_resolve field '_tables'}} + {{~end~}} + {{~end~}} + } + + @Override + public String toString() { + return "{{full_name}}{ " + {{~for field in hierarchy_export_fields ~}} + + "{{field.java_style_name}}:" + {{java_to_string field.java_style_name field.ctype}} + "," + {{~end~}} + + "}"; + } +} diff --git a/src/Luban.Server/Templates/config/java_json/table.tpl b/src/Luban.Server/Templates/config/java_json/table.tpl new file mode 100644 index 0000000..16fc260 --- /dev/null +++ b/src/Luban.Server/Templates/config/java_json/table.tpl @@ -0,0 +1,76 @@ +package {{x.namespace_with_top_module}}; + +import com.google.gson.JsonElement; + +{{~ + name = x.name + key_type = x.key_ttype + key_type1 = x.key_ttype1 + key_type2 = x.key_ttype2 + value_type = x.value_ttype +~}} + +{{~if x.comment != '' ~}} +/** + * {{x.comment}} + */ +{{~end~}} +public final class {{name}} { + {{~if x.is_map_table ~}} + private final java.util.HashMap<{{java_box_define_type key_type}}, {{java_box_define_type value_type}}> _dataMap; + private final java.util.ArrayList<{{java_box_define_type value_type}}> _dataList; + + public {{name}}(JsonElement __json__) { + _dataMap = new java.util.HashMap<{{java_box_define_type key_type}}, {{java_box_define_type value_type}}>(); + _dataList = new java.util.ArrayList<{{java_box_define_type value_type}}>(); + + for(var _e_ : __json__.getAsJsonArray()) { + {{java_box_define_type value_type}} _v; + {{java_deserialize '_e_.getAsJsonObject()' '_v' value_type}} + _dataList.add(_v); + _dataMap.put(_v.{{x.index_field.java_style_name}}, _v); + } + } + + public java.util.HashMap<{{java_box_define_type key_type}}, {{java_box_define_type value_type}}> getDataMap() { return _dataMap; } + public java.util.ArrayList<{{java_box_define_type value_type}}> getDataList() { return _dataList; } + +{{~if value_type.is_dynamic~}} + @SuppressWarnings("unchecked") + public T getAs({{java_define_type key_type}} key) { return (T)_dataMap.get(key); } +{{~end~}} + public {{java_box_define_type value_type}} get({{java_define_type key_type}} key) { return _dataMap.get(key); } + + public void resolve(java.util.HashMap _tables) { + for({{java_box_define_type value_type}} v : _dataList) { + v.resolve(_tables); + } + } + + {{~else~}} + private final {{java_define_type value_type}} _data; + + public final {{java_define_type value_type}} data() { return _data; } + + public {{name}}(JsonElement __json__) { + int n = __json__.getAsJsonArray().size(); + if (n != 1) throw new bright.serialization.SerializationException("table mode=one, but size != 1"); + {{java_deserialize '__json__.getAsJsonArray().get(0).getAsJsonObject()' '_data' value_type}} + } + + + {{~ for field in value_type.bean.hierarchy_export_fields ~}} +{{~if field.comment != '' ~}} + /** + * {{field.comment}} + */ +{{~end~}} + public {{java_define_type field.ctype}} {{field.java_getter_name}}() { return _data.{{field.java_style_name}}; } + {{~end~}} + + public void resolve(java.util.HashMap _tables) { + _data.resolve(_tables); + } + + {{~end~}} +} \ No newline at end of file diff --git a/src/Luban.Server/Templates/config/java_json/tables.tpl b/src/Luban.Server/Templates/config/java_json/tables.tpl new file mode 100644 index 0000000..6b79c47 --- /dev/null +++ b/src/Luban.Server/Templates/config/java_json/tables.tpl @@ -0,0 +1,32 @@ +package {{package}}; + +import com.google.gson.JsonElement; + +public final class {{name}} +{ + public interface IJsonLoader { + JsonElement load(String file) throws java.io.IOException; + } + + {{~for table in tables ~}} +{{~if table.comment != '' ~}} + /** + * {{table.comment}} + */ +{{~end~}} + private final {{table.full_name_with_top_module}} {{table.inner_name}}; + public {{table.full_name_with_top_module}} get{{table.name}}() { return {{table.inner_name}}; } + {{~end~}} + + public {{name}}(IJsonLoader loader) throws java.io.IOException { + var tables = new java.util.HashMap(); + {{~for table in tables ~}} + {{table.inner_name}} = new {{table.full_name_with_top_module}}(loader.load("{{table.output_data_file}}")); + tables.put("{{table.full_name}}", {{table.inner_name}}); + {{~end~}} + + {{~ for table in tables ~}} + {{table.inner_name}}.resolve(tables); + {{~end~}} + } +}