From 48cfe0b07bc2a3a8a2b43083485b4960a32e74a9 Mon Sep 17 00:00:00 2001 From: godotg Date: Mon, 27 May 2024 17:32:04 +0800 Subject: [PATCH] ref[EcmaScript]: refactor generate EcmaScript protocol --- .../generate/GenerateProtocolFile.java | 11 - .../generate/GenerateProtocolNote.java | 3 +- .../generate/GenerateProtocolPath.java | 3 +- .../protocol/serializer/CodeLanguage.java | 7 +- .../serializer/CutDownArraySerializer.java | 64 ++-- .../serializer/CutDownListSerializer.java | 36 +-- .../serializer/CutDownMapSerializer.java | 48 +-- .../serializer/CutDownSetSerializer.java | 36 +-- .../ecmascript/CodeGenerateEcmaScript.java | 293 ++++++++++++++++++ .../{es => ecmascript}/EsArraySerializer.java | 10 +- .../EsBooleanSerializer.java | 2 +- .../{es => ecmascript}/EsByteSerializer.java | 2 +- .../EsDoubleSerializer.java | 2 +- .../{es => ecmascript}/EsFloatSerializer.java | 2 +- .../{es => ecmascript}/EsIntSerializer.java | 2 +- .../{es => ecmascript}/EsListSerializer.java | 10 +- .../{es => ecmascript}/EsLongSerializer.java | 2 +- .../{es => ecmascript}/EsMapSerializer.java | 14 +- .../EsObjectProtocolSerializer.java | 2 +- .../{es => ecmascript}/EsSetSerializer.java | 10 +- .../{es => ecmascript}/EsShortSerializer.java | 2 +- .../EsStringSerializer.java | 2 +- .../{es => ecmascript}/IEsSerializer.java | 2 +- .../serializer/es/GenerateEsUtils.java | 197 ------------ ...cript.java => CodeGenerateJavaScript.java} | 4 +- .../javascript/JsArraySerializer.java | 4 +- .../javascript/JsListSerializer.java | 4 +- .../javascript/JsMapSerializer.java | 8 +- .../javascript/JsSetSerializer.java | 4 +- .../ProtocolClassTemplate.mjs} | 20 +- .../ProtocolManagerTemplate.mjs | 4 +- .../resources/ecmascript/ProtocolTemplate.mjs | 33 ++ .../ecmascript/ProtocolsTemplate.mjs | 8 + .../{es => ecmascript}/buffer/ByteBuffer.mjs | 2 +- .../{es => ecmascript}/buffer/long.mjs | 0 .../{es => ecmascript}/buffer/longbits.mjs | 0 .../protocol/generate/GenerateTesting.java | 3 +- 37 files changed, 489 insertions(+), 367 deletions(-) create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/CodeGenerateEcmaScript.java rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsArraySerializer.java (91%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsBooleanSerializer.java (97%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsByteSerializer.java (97%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsDoubleSerializer.java (97%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsFloatSerializer.java (97%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsIntSerializer.java (97%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsListSerializer.java (91%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsLongSerializer.java (97%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsMapSerializer.java (88%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsObjectProtocolSerializer.java (98%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsSetSerializer.java (91%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsShortSerializer.java (97%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/EsStringSerializer.java (97%) rename protocol/src/main/java/com/zfoo/protocol/serializer/{es => ecmascript}/IEsSerializer.java (96%) delete mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/es/GenerateEsUtils.java rename protocol/src/main/java/com/zfoo/protocol/serializer/javascript/{CodeGenerateJavascript.java => CodeGenerateJavaScript.java} (99%) rename protocol/src/main/resources/{es/ProtocolTemplate.mjs => ecmascript/ProtocolClassTemplate.mjs} (62%) rename protocol/src/main/resources/{es => ecmascript}/ProtocolManagerTemplate.mjs (93%) create mode 100644 protocol/src/main/resources/ecmascript/ProtocolTemplate.mjs create mode 100644 protocol/src/main/resources/ecmascript/ProtocolsTemplate.mjs rename protocol/src/main/resources/{es => ecmascript}/buffer/ByteBuffer.mjs (99%) rename protocol/src/main/resources/{es => ecmascript}/buffer/long.mjs (100%) rename protocol/src/main/resources/{es => ecmascript}/buffer/longbits.mjs (100%) 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 a57ad485..2318e067 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java @@ -19,7 +19,6 @@ import com.zfoo.protocol.registration.IProtocolRegistration; import com.zfoo.protocol.registration.ProtocolAnalysis; import com.zfoo.protocol.registration.ProtocolRegistration; import com.zfoo.protocol.serializer.CodeLanguage; -import com.zfoo.protocol.serializer.es.GenerateEsUtils; import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils; import com.zfoo.protocol.serializer.go.GenerateGoUtils; import com.zfoo.protocol.serializer.python.GeneratePyUtils; @@ -117,7 +116,6 @@ public abstract class GenerateProtocolFile { // 计算协议生成的路径 GenerateProtocolPath.initProtocolPath(generateProtocols); - // 生成C++协议 var generateLanguages = generateOperation.getGenerateLanguages(); // 生成Golang协议 @@ -129,15 +127,6 @@ public abstract class GenerateProtocolFile { } } - // 生成Javascript协议 - if (generateLanguages.contains(CodeLanguage.ES)) { - GenerateEsUtils.init(generateOperation); - for (var protocolRegistration : generateProtocols) { - GenerateEsUtils.createEsProtocolFile((ProtocolRegistration) protocolRegistration); - } - GenerateEsUtils.createProtocolManager(generateProtocols); - } - // 生成TypeScript协议 if (generateLanguages.contains(CodeLanguage.TypeScript)) { GenerateTsUtils.init(generateOperation); diff --git a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolNote.java b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolNote.java index d2050654..a33c23e6 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolNote.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolNote.java @@ -16,7 +16,6 @@ package com.zfoo.protocol.generate; import com.zfoo.protocol.anno.Note; import com.zfoo.protocol.exception.RunException; import com.zfoo.protocol.model.Pair; -import com.zfoo.protocol.registration.IProtocolRegistration; import com.zfoo.protocol.registration.ProtocolRegistration; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.util.AssertionUtils; @@ -100,7 +99,7 @@ public abstract class GenerateProtocolNote { case Cpp: case Go: case JavaScript: - case ES: + case EcmaScript: case TypeScript: case CSharp: case Protobuf: diff --git a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolPath.java b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolPath.java index d1b74a53..f2320b71 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolPath.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolPath.java @@ -15,7 +15,6 @@ package com.zfoo.protocol.generate; import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.collection.tree.GeneralTree; import com.zfoo.protocol.collection.tree.TreeNode; -import com.zfoo.protocol.registration.IProtocolRegistration; import com.zfoo.protocol.registration.ProtocolRegistration; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.enhance.EnhanceObjectProtocolSerializer; @@ -60,7 +59,7 @@ public abstract class GenerateProtocolPath { break; case JavaScript: break; - case ES: + case EcmaScript: break; case TypeScript: break; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java index c2cedfd3..de315066 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java @@ -14,7 +14,8 @@ package com.zfoo.protocol.serializer; import com.zfoo.protocol.serializer.cpp.CodeGenerateCpp; import com.zfoo.protocol.serializer.csharp.CodeGenerateCsharp; -import com.zfoo.protocol.serializer.javascript.CodeGenerateJavascript; +import com.zfoo.protocol.serializer.ecmascript.CodeGenerateEcmaScript; +import com.zfoo.protocol.serializer.javascript.CodeGenerateJavaScript; import com.zfoo.protocol.serializer.lua.CodeGenerateLua; /** @@ -31,9 +32,9 @@ public enum CodeLanguage { Go(1 << 2, null), - JavaScript(1 << 3, CodeGenerateJavascript.class), + JavaScript(1 << 3, CodeGenerateJavaScript.class), - ES(1 << 4, null), + EcmaScript(1 << 4, CodeGenerateEcmaScript.class), TypeScript(1 << 5, null), diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownArraySerializer.java index 162e28f8..a8e86a2e 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownArraySerializer.java @@ -65,7 +65,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeBooleanArray({});", objectStr)).append(LS); break; @@ -93,7 +93,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeBooleanArray({});", objectStr)).append(LS); break; @@ -121,7 +121,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeByteArray({});", objectStr)).append(LS); break; @@ -149,7 +149,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeByteArray({});", objectStr)).append(LS); break; @@ -177,7 +177,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeShortArray({});", objectStr)).append(LS); break; @@ -205,7 +205,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeShortArray({});", objectStr)).append(LS); break; @@ -233,7 +233,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeIntArray({});", objectStr)).append(LS); break; @@ -261,7 +261,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeIntArray({});", objectStr)).append(LS); break; @@ -289,7 +289,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeLongArray({});", objectStr)).append(LS); break; @@ -317,7 +317,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeLongArray({});", objectStr)).append(LS); break; @@ -345,7 +345,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeFloatArray({});", objectStr)).append(LS); break; @@ -373,7 +373,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeFloatArray({});", objectStr)).append(LS); break; @@ -401,7 +401,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeDoubleArray({});", objectStr)).append(LS); break; @@ -429,7 +429,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeDoubleArray({});", objectStr)).append(LS); break; @@ -457,7 +457,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeStringArray({});", objectStr)).append(LS); break; @@ -486,7 +486,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("buffer.writePacketArray<{}>({}, {});", EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), objectStr, protocolId)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writePacketArray({}, {});", objectStr, protocolId)).append(LS); break; @@ -536,7 +536,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readBooleanArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readBooleanArray();", array)).append(LS); break; @@ -568,7 +568,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readBooleanArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readBooleanArray();", array)).append(LS); break; @@ -600,7 +600,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readByteArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readByteArray();", array)).append(LS); break; @@ -632,7 +632,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readByteArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readByteArray();", array)).append(LS); break; @@ -664,7 +664,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readShortArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readShortArray();", array)).append(LS); break; @@ -696,7 +696,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readShortArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readShortArray();", array)).append(LS); break; @@ -728,7 +728,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readIntArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readIntArray();", array)).append(LS); break; @@ -760,7 +760,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readIntArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readIntArray();", array)).append(LS); break; @@ -792,7 +792,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readLongArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readLongArray();", array)).append(LS); break; @@ -824,7 +824,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readLongArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readLongArray();", array)).append(LS); break; @@ -856,7 +856,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readFloatArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readFloatArray();", array)).append(LS); break; @@ -888,7 +888,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readFloatArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readFloatArray();", array)).append(LS); break; @@ -920,7 +920,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readDoubleArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readDoubleArray();", array)).append(LS); break; @@ -952,7 +952,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readDoubleArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readDoubleArray();", array)).append(LS); break; @@ -984,7 +984,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readStringArray();", array)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readStringArray();", array)).append(LS); break; @@ -1013,7 +1013,7 @@ public class CutDownArraySerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readPacketArray<{}>({});", array, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readPacketArray({});", array, protocolId)).append(LS); break; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownListSerializer.java index 25ad6cde..0f0b9f96 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownListSerializer.java @@ -64,7 +64,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeBooleanList({});", objectStr)).append(LS); break; @@ -92,7 +92,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeByteList({});", objectStr)).append(LS); break; @@ -120,7 +120,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeShortList({});", objectStr)).append(LS); break; @@ -148,7 +148,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeIntList({});", objectStr)).append(LS); break; @@ -176,7 +176,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeLongList({});", objectStr)).append(LS); break; @@ -205,7 +205,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeFloatList({});", objectStr)).append(LS); break; @@ -234,7 +234,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeDoubleList({});", objectStr)).append(LS); break; @@ -263,7 +263,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeStringList({});", objectStr)).append(LS); break; @@ -291,7 +291,7 @@ public class CutDownListSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writePacketList({}, {});", objectStr, protocolId)).append(LS); break; @@ -340,7 +340,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readBooleanList();", list)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readBooleanList();", list)).append(LS); break; @@ -372,7 +372,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readByteList();", list)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readByteList();", list)).append(LS); break; @@ -404,7 +404,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readShortList();", list)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readShortList();", list)).append(LS); break; @@ -436,7 +436,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readIntList();", list)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readIntList();", list)).append(LS); break; @@ -468,7 +468,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readLongList();", list)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readLongList();", list)).append(LS); break; @@ -500,7 +500,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readFloatList();", list)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readFloatList();", list)).append(LS); break; @@ -532,7 +532,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readDoubleList();", list)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readDoubleList();", list)).append(LS); break; @@ -564,7 +564,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readStringList();", list)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readStringList();", list)).append(LS); break; @@ -595,7 +595,7 @@ public class CutDownListSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readPacketList<{}>({});", list, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readPacketList({});", list, protocolId)).append(LS); break; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownMapSerializer.java index b3fd4e36..46a4c8e9 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownMapSerializer.java @@ -71,7 +71,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeIntIntMap({});", objectStr)).append(LS); return true; @@ -96,7 +96,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeIntLongMap({});", objectStr)).append(LS); return true; @@ -121,7 +121,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeIntStringMap({});", objectStr)).append(LS); return true; @@ -143,7 +143,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeIntPacketMap({}, {});", objectStr, ((ObjectProtocolField) valueRegistration).getProtocolId())).append(LS); return true; @@ -173,7 +173,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeLongIntMap({});", objectStr)).append(LS); return true; @@ -198,7 +198,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeLongLongMap({});", objectStr)).append(LS); return true; @@ -223,7 +223,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeLongStringMap({});", objectStr)).append(LS); return true; @@ -245,7 +245,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeLongPacketMap({}, {});", objectStr, ((ObjectProtocolField) valueRegistration).getProtocolId())).append(LS); return true; @@ -275,7 +275,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeStringIntMap({});", objectStr)).append(LS); return true; @@ -300,7 +300,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeStringLongMap({});", objectStr)).append(LS); return true; @@ -325,7 +325,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeStringStringMap({});", objectStr)).append(LS); return true; @@ -347,7 +347,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { return true; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeStringPacketMap({}, {});", objectStr, ((ObjectProtocolField) valueRegistration).getProtocolId())).append(LS); return true; @@ -397,7 +397,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readIntIntMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readIntIntMap();", map)).append(LS); return map; @@ -426,7 +426,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readIntLongMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readIntLongMap();", map)).append(LS); return map; @@ -455,7 +455,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readIntStringMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readIntStringMap();", map)).append(LS); return map; @@ -482,7 +482,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readIntPacketMap<{}>({});", map, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readIntPacketMap({});", map, protocolId)).append(LS); return map; @@ -515,7 +515,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readLongIntMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readLongIntMap();", map)).append(LS); return map; @@ -544,7 +544,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readLongLongMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readLongLongMap();", map)).append(LS); return map; @@ -573,7 +573,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readLongStringMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readLongStringMap();", map)).append(LS); return map; @@ -600,7 +600,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readLongPacketMap<{}>({});", map, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readLongPacketMap({});", map, protocolId)).append(LS); return map; @@ -634,7 +634,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readStringIntMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readStringIntMap();", map)).append(LS); return map; @@ -663,7 +663,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readStringLongMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readStringLongMap();", map)).append(LS); return map; @@ -692,7 +692,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readStringStringMap();", map)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readStringStringMap();", map)).append(LS); return map; @@ -719,7 +719,7 @@ public class CutDownMapSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readStringPacketMap<{}>({});", map, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS); return map; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readStringPacketMap({});", map, protocolId)).append(LS); return map; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownSetSerializer.java index 74b9bd7f..50b2c6c2 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownSetSerializer.java @@ -67,7 +67,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeBooleanSet({});", objectStr)).append(LS); break; @@ -97,7 +97,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeByteSet({});", objectStr)).append(LS); break; @@ -127,7 +127,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeShortSet({});", objectStr)).append(LS); break; @@ -157,7 +157,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeIntSet({});", objectStr)).append(LS); break; @@ -187,7 +187,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeLongSet({});", objectStr)).append(LS); break; @@ -217,7 +217,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeFloatSet({});", objectStr)).append(LS); break; @@ -247,7 +247,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeDoubleSet({});", objectStr)).append(LS); break; @@ -277,7 +277,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writeStringSet({});", objectStr)).append(LS); break; @@ -307,7 +307,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { break; case Cpp: case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("buffer.writePacketSet({}, {});", objectStr, protocolId)).append(LS); break; @@ -356,7 +356,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("var {} = buffer.ReadBooleanArray()", set)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readBooleanSet();", set)).append(LS); break; @@ -388,7 +388,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readByteSet();", set)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readByteSet();", set)).append(LS); break; @@ -420,7 +420,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readShortSet();", set)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readShortSet();", set)).append(LS); break; @@ -452,7 +452,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readIntSet();", set)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readIntSet();", set)).append(LS); break; @@ -484,7 +484,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readLongSet();", set)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readLongSet();", set)).append(LS); break; @@ -516,7 +516,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readFloatSet();", set)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readFloatSet();", set)).append(LS); break; @@ -548,7 +548,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readDoubleSet();", set)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readDoubleSet();", set)).append(LS); break; @@ -580,7 +580,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readStringSet();", set)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readStringSet();", set)).append(LS); break; @@ -611,7 +611,7 @@ public class CutDownSetSerializer implements ICutDownSerializer { builder.append(StringUtils.format("auto {} = buffer.readPacketSet<{}>({});", set, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS); break; case JavaScript: - case ES: + case EcmaScript: case TypeScript: builder.append(StringUtils.format("const {} = buffer.readPacketSet({});", set, protocolId)).append(LS); break; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/CodeGenerateEcmaScript.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/CodeGenerateEcmaScript.java new file mode 100644 index 00000000..8b9918b8 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/CodeGenerateEcmaScript.java @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.protocol.serializer.ecmascript; + +import com.zfoo.protocol.anno.Compatible; +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.registration.ProtocolRegistration; +import com.zfoo.protocol.serializer.CodeLanguage; +import com.zfoo.protocol.serializer.CodeTemplatePlaceholder; +import com.zfoo.protocol.serializer.ICodeGenerate; +import com.zfoo.protocol.serializer.reflect.*; +import com.zfoo.protocol.util.ClassUtils; +import com.zfoo.protocol.util.FileUtils; +import com.zfoo.protocol.util.ReflectionUtils; +import com.zfoo.protocol.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.zfoo.protocol.util.FileUtils.LS; +import static com.zfoo.protocol.util.StringUtils.TAB; + +/** + * @author godotg + */ +public class CodeGenerateEcmaScript implements ICodeGenerate { + private static final Logger logger = LoggerFactory.getLogger(CodeGenerateEcmaScript.class); + // custom configuration + public static String protocolOutputRootPath = "zfooes"; + private static String protocolOutputPath = StringUtils.EMPTY; + + private static final Map esSerializerMap = new HashMap<>(); + + + public static IEsSerializer esSerializer(ISerializer serializer) { + return esSerializerMap.get(serializer); + } + + @Override + public void init(GenerateOperation generateOperation) { + protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); + FileUtils.deleteFile(new File(protocolOutputPath)); + + esSerializerMap.put(BooleanSerializer.INSTANCE, new EsBooleanSerializer()); + esSerializerMap.put(ByteSerializer.INSTANCE, new EsByteSerializer()); + esSerializerMap.put(ShortSerializer.INSTANCE, new EsShortSerializer()); + esSerializerMap.put(IntSerializer.INSTANCE, new EsIntSerializer()); + esSerializerMap.put(LongSerializer.INSTANCE, new EsLongSerializer()); + esSerializerMap.put(FloatSerializer.INSTANCE, new EsFloatSerializer()); + esSerializerMap.put(DoubleSerializer.INSTANCE, new EsDoubleSerializer()); + esSerializerMap.put(StringSerializer.INSTANCE, new EsStringSerializer()); + esSerializerMap.put(ArraySerializer.INSTANCE, new EsArraySerializer()); + esSerializerMap.put(ListSerializer.INSTANCE, new EsListSerializer()); + esSerializerMap.put(SetSerializer.INSTANCE, new EsSetSerializer()); + esSerializerMap.put(MapSerializer.INSTANCE, new EsMapSerializer()); + esSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new EsObjectProtocolSerializer()); + } + + @Override + public void mergerProtocol(List registrations) throws IOException { + createTemplateFile(); + + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("ecmascript/ProtocolManagerTemplate.mjs"); + var protocol_imports = new StringBuilder(); + var protocol_manager_registrations = new StringBuilder(); + protocol_imports.append("import Protocols from './Protocols.mjs';").append(LS); + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_class_name)).append(LS); + } + var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() + , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); + var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap); + var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.mjs")); + FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); + logger.info("Generated ES protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath()); + + var protocol_class = new StringBuilder(); + var protocol_registration = new StringBuilder(); + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + // protocol + protocol_class.append(formatProtocolClassTemplate(registration)).append(LS); + } + + protocol_registration.append(LS); + for (var registration : registrations) { + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_registration.append(StringUtils.format("Protocols.{} = {}", protocol_name, protocol_name)).append(LS); + } + + var protocolTemplate = ClassUtils.getFileFromClassPathToString("ecmascript/ProtocolsTemplate.mjs"); + var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( + CodeTemplatePlaceholder.protocol_class, protocol_class.toString() + , CodeTemplatePlaceholder.protocol_registration, protocol_registration.toString() + )); + var outputPath = StringUtils.format("{}/Protocols.mjs", protocolOutputPath); + var file = new File(outputPath); + FileUtils.writeStringToFile(file, formatProtocolTemplate, true); + logger.info("Generated ES protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); + } + + @Override + public void foldProtocol(List registrations) throws IOException { + createTemplateFile(); + + // 生成ProtocolManager.mjs文件 + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("ecmascript/ProtocolManagerTemplate.mjs"); + var protocol_imports = new StringBuilder(); + var protocol_manager_registrations = new StringBuilder(); + for (var protocol : registrations) { + var protocol_id = protocol.protocolId(); + var protocol_class_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("import {} from './{}.mjs';", protocol_class_name, GenerateProtocolPath.protocolAbsolutePath(protocol.protocolId(), CodeLanguage.EcmaScript))).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_class_name)).append(LS); + } + var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() + , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); + var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap); + var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.mjs")); + FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); + logger.info("Generated ES protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath()); + + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var formatProtocolTemplate = formatProtocolTemplate(registration); + var outputPath = StringUtils.format("{}/{}/{}.mjs", protocolOutputPath, GenerateProtocolPath.getProtocolPath(protocol_id), protocol_name); + var file = new File(outputPath); + FileUtils.writeStringToFile(file, formatProtocolTemplate, true); + logger.info("Generated ES protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); + } + } + + @Override + public void defaultProtocol(List registrations) throws IOException { + createTemplateFile(); + + // 生成ProtocolManager.mjs文件 + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("ecmascript/ProtocolManagerTemplate.mjs"); + var protocol_imports = new StringBuilder(); + var protocol_manager_registrations = new StringBuilder(); + for (var protocol : registrations) { + var protocol_id = protocol.protocolId(); + var protocol_class_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("import {} from './{}.mjs';", protocol_class_name, protocol_class_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_class_name)).append(LS); + } + var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() + , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); + var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap); + var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.mjs")); + FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); + logger.info("Generated ES protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath()); + + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var formatProtocolTemplate = formatProtocolTemplate(registration); + var outputPath = StringUtils.format("{}/{}.mjs", protocolOutputPath, protocol_name, protocol_name); + var file = new File(outputPath); + FileUtils.writeStringToFile(file, formatProtocolTemplate, true); + logger.info("Generated ES protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); + } + } + + private void createTemplateFile() throws IOException { + var list = List.of("ecmascript/buffer/ByteBuffer.mjs", "ecmascript/buffer/long.mjs", "ecmascript/buffer/longbits.mjs"); + for (var fileName : list) { + var fileInputStream = ClassUtils.getFileFromClassPath(fileName); + var outputPath = StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "ecmascript/")); + var createFile = new File(outputPath); + FileUtils.writeInputStreamToFile(createFile, fileInputStream); + } + } + + public String formatProtocolTemplate(ProtocolRegistration registration) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.getConstructor().getDeclaringClass().getSimpleName(); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("ecmascript/ProtocolTemplate.mjs"); + var placeholderMap = Map.of( + CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.EcmaScript) + , CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) + , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) + , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) + , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) + ); + return CodeTemplatePlaceholder.formatTemplate(protocolTemplate, placeholderMap); + } + + public String formatProtocolClassTemplate(ProtocolRegistration registration) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.getConstructor().getDeclaringClass().getSimpleName(); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("ecmascript/ProtocolClassTemplate.mjs"); + var placeholderMap = Map.of( + CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.EcmaScript) + , CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) + , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) + , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) + , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) + ); + return CodeTemplatePlaceholder.formatTemplate(protocolTemplate, placeholderMap); + } + + + private String protocol_field_definition(ProtocolRegistration registration) { + var protocolId = registration.getId(); + var fields = registration.getFields(); + var fieldRegistrations = registration.getFieldRegistrations(); + // when generate source code fields, use origin fields sort + var sequencedFields = ReflectionUtils.notStaticAndTransientFields(registration.getConstructor().getDeclaringClass()); + var fieldDefinitionBuilder = new StringBuilder(); + for (var field : sequencedFields) { + var fieldRegistration = fieldRegistrations[GenerateProtocolFile.indexOf(fields, field)]; + var fieldName = field.getName(); + // 生成注释 + var fieldNotes = GenerateProtocolNote.fieldNotes(protocolId, fieldName, CodeLanguage.EcmaScript); + for (var fieldNote : fieldNotes) { + fieldDefinitionBuilder.append(fieldNote).append(LS); + } + var triple = esSerializer(fieldRegistration.serializer()).field(field, fieldRegistration); + fieldDefinitionBuilder.append(StringUtils.format("{} = {}; // {}", fieldName, triple.getRight(), triple.getLeft())) + .append(LS); + + } + return fieldDefinitionBuilder.toString(); + } + + private String protocol_write_serialization(ProtocolRegistration registration) { + GenerateProtocolFile.localVariableId = 0; + var fields = registration.getFields(); + var fieldRegistrations = registration.getFieldRegistrations(); + var jsBuilder = new StringBuilder(); + if (registration.isCompatible()) { + jsBuilder.append("const beforeWriteIndex = buffer.getWriteOffset();").append(LS); + jsBuilder.append(StringUtils.format("buffer.writeInt({});", registration.getPredictionLength())).append(LS); + } else { + jsBuilder.append("buffer.writeInt(-1);").append(LS); + } + for (var i = 0; i < fields.length; i++) { + var field = fields[i]; + var fieldRegistration = fieldRegistrations[i]; + esSerializer(fieldRegistration.serializer()).writeObject(jsBuilder, "packet." + field.getName(), 0, field, fieldRegistration); + } + if (registration.isCompatible()) { + jsBuilder.append(StringUtils.format("buffer.adjustPadding({}, beforeWriteIndex);", registration.getPredictionLength())).append(LS); + } + return jsBuilder.toString(); + } + + private String protocol_read_deserialization(ProtocolRegistration registration) { + GenerateProtocolFile.localVariableId = 0; + var fields = registration.getFields(); + var fieldRegistrations = registration.getFieldRegistrations(); + var jsBuilder = new StringBuilder(); + for (var i = 0; i < fields.length; i++) { + var field = fields[i]; + var fieldRegistration = fieldRegistrations[i]; + if (field.isAnnotationPresent(Compatible.class)) { + jsBuilder.append("if (buffer.compatibleRead(beforeReadIndex, length)) {").append(LS); + var compatibleReadObject = esSerializer(fieldRegistration.serializer()).readObject(jsBuilder, 1, field, fieldRegistration); + jsBuilder.append(TAB).append(StringUtils.format("packet.{} = {};", field.getName(), compatibleReadObject)).append(LS); + jsBuilder.append("}").append(LS); + continue; + } + var readObject = esSerializer(fieldRegistration.serializer()).readObject(jsBuilder, 0, field, fieldRegistration); + jsBuilder.append(StringUtils.format("packet.{} = {};", field.getName(), readObject)).append(LS); + } + return jsBuilder.toString(); + } +} diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsArraySerializer.java similarity index 91% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsArraySerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsArraySerializer.java index c2f0dbc9..6399ed7b 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsArraySerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; @@ -39,7 +39,7 @@ public class EsArraySerializer implements IEsSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - if (CutDownArraySerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.ES)) { + if (CutDownArraySerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.EcmaScript)) { return; } @@ -57,7 +57,7 @@ public class EsArraySerializer implements IEsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - GenerateEsUtils.esSerializer(arrayField.getArrayElementRegistration().serializer()) + CodeGenerateEcmaScript.esSerializer(arrayField.getArrayElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, arrayField.getArrayElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -68,7 +68,7 @@ public class EsArraySerializer implements IEsSerializer { @Override public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - var cutDown = CutDownArraySerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.ES); + var cutDown = CutDownArraySerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.EcmaScript); if (cutDown != null) { return cutDown; } @@ -88,7 +88,7 @@ public class EsArraySerializer implements IEsSerializer { builder.append(StringUtils.format("if ({} > 0) {", size)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = GenerateEsUtils.esSerializer(arrayField.getArrayElementRegistration().serializer()) + String readObject = CodeGenerateEcmaScript.esSerializer(arrayField.getArrayElementRegistration().serializer()) .readObject(builder, deep + 2, field, arrayField.getArrayElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsBooleanSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsBooleanSerializer.java similarity index 97% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsBooleanSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsBooleanSerializer.java index 39974929..eb9d78bd 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsBooleanSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsBooleanSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsByteSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsByteSerializer.java similarity index 97% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsByteSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsByteSerializer.java index cbe32c91..b72524d2 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsByteSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsByteSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsDoubleSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsDoubleSerializer.java similarity index 97% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsDoubleSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsDoubleSerializer.java index 74b51f80..483b313f 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsDoubleSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsDoubleSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsFloatSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsFloatSerializer.java similarity index 97% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsFloatSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsFloatSerializer.java index d42259eb..a7ebdf34 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsFloatSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsFloatSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsIntSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsIntSerializer.java similarity index 97% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsIntSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsIntSerializer.java index 6a48297f..34975ae9 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsIntSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsIntSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsListSerializer.java similarity index 91% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsListSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsListSerializer.java index 073bd566..042cda8c 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsListSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; @@ -38,7 +38,7 @@ public class EsListSerializer implements IEsSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - if (CutDownListSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.ES)) { + if (CutDownListSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.EcmaScript)) { return; } @@ -56,7 +56,7 @@ public class EsListSerializer implements IEsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - GenerateEsUtils.esSerializer(listField.getListElementRegistration().serializer()) + CodeGenerateEcmaScript.esSerializer(listField.getListElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, listField.getListElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -67,7 +67,7 @@ public class EsListSerializer implements IEsSerializer { @Override public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - var cutDown = CutDownListSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.ES); + var cutDown = CutDownListSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.EcmaScript); if (cutDown != null) { return cutDown; } @@ -87,7 +87,7 @@ public class EsListSerializer implements IEsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); String i = "index" + GenerateProtocolFile.localVariableId++; builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = GenerateEsUtils.esSerializer(listField.getListElementRegistration().serializer()) + String readObject = CodeGenerateEcmaScript.esSerializer(listField.getListElementRegistration().serializer()) .readObject(builder, deep + 2, field, listField.getListElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsLongSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsLongSerializer.java similarity index 97% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsLongSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsLongSerializer.java index 60cd4a10..d6ef40ab 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsLongSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsLongSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsMapSerializer.java similarity index 88% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsMapSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsMapSerializer.java index 748b9182..fe8406cb 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsMapSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; @@ -38,7 +38,7 @@ public class EsMapSerializer implements IEsSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - if (CutDownMapSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.ES)) { + if (CutDownMapSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.EcmaScript)) { return; } @@ -58,9 +58,9 @@ public class EsMapSerializer implements IEsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach(({}, {}) => {", objectStr, value, key)).append(LS); - GenerateEsUtils.esSerializer(mapField.getMapKeyRegistration().serializer()) + CodeGenerateEcmaScript.esSerializer(mapField.getMapKeyRegistration().serializer()) .writeObject(builder, key, deep + 2, field, mapField.getMapKeyRegistration()); - GenerateEsUtils.esSerializer(mapField.getMapValueRegistration().serializer()) + CodeGenerateEcmaScript.esSerializer(mapField.getMapValueRegistration().serializer()) .writeObject(builder, value, deep + 2, field, mapField.getMapValueRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -71,7 +71,7 @@ public class EsMapSerializer implements IEsSerializer { @Override public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - var cutDown = CutDownMapSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.ES); + var cutDown = CutDownMapSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.EcmaScript); if (cutDown != null) { return cutDown; } @@ -92,11 +92,11 @@ public class EsMapSerializer implements IEsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String keyObject = GenerateEsUtils.esSerializer(mapField.getMapKeyRegistration().serializer()) + String keyObject = CodeGenerateEcmaScript.esSerializer(mapField.getMapKeyRegistration().serializer()) .readObject(builder, deep + 2, field, mapField.getMapKeyRegistration()); - String valueObject = GenerateEsUtils.esSerializer(mapField.getMapValueRegistration().serializer()) + String valueObject = CodeGenerateEcmaScript.esSerializer(mapField.getMapValueRegistration().serializer()) .readObject(builder, deep + 2, field, mapField.getMapValueRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsObjectProtocolSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsObjectProtocolSerializer.java similarity index 98% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsObjectProtocolSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsObjectProtocolSerializer.java index 42aa4356..52c3e98f 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsObjectProtocolSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsObjectProtocolSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsSetSerializer.java similarity index 91% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsSetSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsSetSerializer.java index bf680258..07dc3c95 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsSetSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; @@ -38,7 +38,7 @@ public class EsSetSerializer implements IEsSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - if (CutDownSetSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.ES)) { + if (CutDownSetSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.EcmaScript)) { return; } @@ -57,7 +57,7 @@ public class EsSetSerializer implements IEsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - GenerateEsUtils.esSerializer(setField.getSetElementRegistration().serializer()) + CodeGenerateEcmaScript.esSerializer(setField.getSetElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, setField.getSetElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -68,7 +68,7 @@ public class EsSetSerializer implements IEsSerializer { @Override public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - var cutDown = CutDownSetSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.ES); + var cutDown = CutDownSetSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.EcmaScript); if (cutDown != null) { return cutDown; } @@ -88,7 +88,7 @@ public class EsSetSerializer implements IEsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); String i = "index" + GenerateProtocolFile.localVariableId++; builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = GenerateEsUtils.esSerializer(setField.getSetElementRegistration().serializer()) + String readObject = CodeGenerateEcmaScript.esSerializer(setField.getSetElementRegistration().serializer()) .readObject(builder, deep + 2, field, setField.getSetElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.add({});", result, readObject)).append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsShortSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsShortSerializer.java similarity index 97% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsShortSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsShortSerializer.java index 021368a5..50b2976e 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsShortSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsShortSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsStringSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsStringSerializer.java similarity index 97% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/EsStringSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsStringSerializer.java index 5dfd03a7..2999c22c 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/EsStringSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsStringSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.model.Triple; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/IEsSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/IEsSerializer.java similarity index 96% rename from protocol/src/main/java/com/zfoo/protocol/serializer/es/IEsSerializer.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/IEsSerializer.java index 7fc69c08..be5709d7 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/IEsSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/IEsSerializer.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and limitations under the License. */ -package com.zfoo.protocol.serializer.es; +package com.zfoo.protocol.serializer.ecmascript; import com.zfoo.protocol.model.Triple; import com.zfoo.protocol.registration.field.IFieldRegistration; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/es/GenerateEsUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/es/GenerateEsUtils.java deleted file mode 100644 index 6391f975..00000000 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/es/GenerateEsUtils.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2020 The zfoo Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and limitations under the License. - */ - -package com.zfoo.protocol.serializer.es; - -import com.zfoo.protocol.anno.Compatible; -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.registration.ProtocolRegistration; -import com.zfoo.protocol.serializer.CodeLanguage; -import com.zfoo.protocol.serializer.reflect.*; -import com.zfoo.protocol.util.ClassUtils; -import com.zfoo.protocol.util.FileUtils; -import com.zfoo.protocol.util.ReflectionUtils; -import com.zfoo.protocol.util.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.zfoo.protocol.util.FileUtils.LS; -import static com.zfoo.protocol.util.StringUtils.TAB; - -/** - * @author godotg - */ -public abstract class GenerateEsUtils { - private static final Logger logger = LoggerFactory.getLogger(GenerateEsUtils.class); - // custom configuration - public static String protocolOutputRootPath = "zfooes"; - private static String protocolOutputPath = StringUtils.EMPTY; - - private static Map esSerializerMap; - - - public static IEsSerializer esSerializer(ISerializer serializer) { - return esSerializerMap.get(serializer); - } - - public static void init(GenerateOperation generateOperation) { - protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); - FileUtils.deleteFile(new File(protocolOutputPath)); - - esSerializerMap = new HashMap<>(); - esSerializerMap.put(BooleanSerializer.INSTANCE, new EsBooleanSerializer()); - esSerializerMap.put(ByteSerializer.INSTANCE, new EsByteSerializer()); - esSerializerMap.put(ShortSerializer.INSTANCE, new EsShortSerializer()); - esSerializerMap.put(IntSerializer.INSTANCE, new EsIntSerializer()); - esSerializerMap.put(LongSerializer.INSTANCE, new EsLongSerializer()); - esSerializerMap.put(FloatSerializer.INSTANCE, new EsFloatSerializer()); - esSerializerMap.put(DoubleSerializer.INSTANCE, new EsDoubleSerializer()); - esSerializerMap.put(StringSerializer.INSTANCE, new EsStringSerializer()); - esSerializerMap.put(ArraySerializer.INSTANCE, new EsArraySerializer()); - esSerializerMap.put(ListSerializer.INSTANCE, new EsListSerializer()); - esSerializerMap.put(SetSerializer.INSTANCE, new EsSetSerializer()); - esSerializerMap.put(MapSerializer.INSTANCE, new EsMapSerializer()); - esSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new EsObjectProtocolSerializer()); - } - - public static void clear() { - protocolOutputRootPath = null; - protocolOutputPath = null; - esSerializerMap = null; - } - - public static void createProtocolManager(List protocolList) throws IOException { - var list = List.of("es/buffer/ByteBuffer.mjs", "es/buffer/long.mjs", "es/buffer/longbits.mjs"); - for (var fileName : list) { - var fileInputStream = ClassUtils.getFileFromClassPath(fileName); - var outputPath = StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "es/")); - var createFile = new File(outputPath); - FileUtils.writeInputStreamToFile(createFile, fileInputStream); - } - - // 生成ProtocolManager.mjs文件 - var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("es/ProtocolManagerTemplate.mjs"); - - var importBuilder = new StringBuilder(); - var initProtocolBuilder = new StringBuilder(); - for (var protocol : protocolList) { - var protocolId = protocol.protocolId(); - var protocolName = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); - var path = GenerateProtocolPath.protocolAbsolutePath(protocol.protocolId(), CodeLanguage.ES); - importBuilder.append(StringUtils.format("import {} from './{}.mjs';", protocolName, path)).append(LS); - initProtocolBuilder.append(StringUtils.format("protocols.set({}, {});", protocolId, protocolName)).append(LS); - } - - protocolManagerTemplate = StringUtils.format(protocolManagerTemplate, importBuilder.toString().trim(), initProtocolBuilder.toString().trim()); - var file = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.mjs")); - FileUtils.writeStringToFile(file, protocolManagerTemplate, true); - logger.info("Generated ES protocol manager file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); - } - - public static void createEsProtocolFile(ProtocolRegistration registration) throws IOException { - var protocolId = registration.protocolId(); - var registrationConstructor = registration.getConstructor(); - var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName(); - - var protocolTemplate = ClassUtils.getFileFromClassPathToString("es/ProtocolTemplate.mjs"); - - var classNote = GenerateProtocolNote.classNote(protocolId, CodeLanguage.ES, TAB, 0); - var fieldDefinition = fieldDefinition(registration); - var writeObject = writeObject(registration); - var readObject = readObject(registration); - - protocolTemplate = StringUtils.format(protocolTemplate, classNote, protocolClazzName - , fieldDefinition.trim(), protocolId, protocolClazzName - , writeObject.trim(), protocolClazzName, readObject.trim(), protocolClazzName); - var outputPath = StringUtils.format("{}/{}/{}.mjs", protocolOutputPath, GenerateProtocolPath.getProtocolPath(protocolId), protocolClazzName); - var file = new File(outputPath); - FileUtils.writeStringToFile(file, protocolTemplate, true); - logger.info("Generated ES protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); - } - - private static String fieldDefinition(ProtocolRegistration registration) { - var protocolId = registration.getId(); - var fields = registration.getFields(); - var fieldRegistrations = registration.getFieldRegistrations(); - // when generate source code fields, use origin fields sort - var sequencedFields = ReflectionUtils.notStaticAndTransientFields(registration.getConstructor().getDeclaringClass()); - var fieldDefinitionBuilder = new StringBuilder(); - for (var field : sequencedFields) { - var fieldRegistration = fieldRegistrations[GenerateProtocolFile.indexOf(fields, field)]; - var fieldName = field.getName(); - // 生成注释 - var fieldNotes = GenerateProtocolNote.fieldNotes(protocolId, fieldName, CodeLanguage.ES); - for (var fieldNote : fieldNotes) { - fieldDefinitionBuilder.append(TAB).append(fieldNote).append(LS); - } - var triple = esSerializer(fieldRegistration.serializer()).field(field, fieldRegistration); - fieldDefinitionBuilder.append(TAB) - .append(StringUtils.format("{} = {}; // {}", fieldName, triple.getRight(), triple.getLeft())) - .append(LS); - - } - return fieldDefinitionBuilder.toString(); - } - - private static String writeObject(ProtocolRegistration registration) { - GenerateProtocolFile.localVariableId = 0; - var fields = registration.getFields(); - var fieldRegistrations = registration.getFieldRegistrations(); - var jsBuilder = new StringBuilder(); - if (registration.isCompatible()) { - jsBuilder.append("const beforeWriteIndex = buffer.getWriteOffset();").append(LS); - jsBuilder.append(TAB + TAB).append(StringUtils.format("buffer.writeInt({});", registration.getPredictionLength())).append(LS); - } else { - jsBuilder.append(TAB + TAB).append("buffer.writeInt(-1);").append(LS); - } - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - var fieldRegistration = fieldRegistrations[i]; - esSerializer(fieldRegistration.serializer()).writeObject(jsBuilder, "packet." + field.getName(), 2, field, fieldRegistration); - } - if (registration.isCompatible()) { - jsBuilder.append(TAB + TAB).append(StringUtils.format("buffer.adjustPadding({}, beforeWriteIndex);", registration.getPredictionLength())).append(LS); - } - return jsBuilder.toString(); - } - - private static String readObject(ProtocolRegistration registration) { - GenerateProtocolFile.localVariableId = 0; - var fields = registration.getFields(); - var fieldRegistrations = registration.getFieldRegistrations(); - var jsBuilder = new StringBuilder(); - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - var fieldRegistration = fieldRegistrations[i]; - if (field.isAnnotationPresent(Compatible.class)) { - jsBuilder.append(TAB + TAB).append("if (buffer.compatibleRead(beforeReadIndex, length)) {").append(LS); - var compatibleReadObject = esSerializer(fieldRegistration.serializer()).readObject(jsBuilder, 3, field, fieldRegistration); - jsBuilder.append(TAB + TAB + TAB).append(StringUtils.format("packet.{} = {};", field.getName(), compatibleReadObject)).append(LS); - jsBuilder.append(TAB + TAB).append("}").append(LS); - continue; - } - var readObject = esSerializer(fieldRegistration.serializer()).readObject(jsBuilder, 2, field, fieldRegistration); - jsBuilder.append(TAB + TAB).append(StringUtils.format("packet.{} = {};", field.getName(), readObject)).append(LS); - } - return jsBuilder.toString(); - } -} diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavascript.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavaScript.java similarity index 99% rename from protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavascript.java rename to protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavaScript.java index 60140533..989fa0ba 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavascript.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavaScript.java @@ -42,8 +42,8 @@ import static com.zfoo.protocol.util.StringUtils.TAB; /** * @author godotg */ -public class CodeGenerateJavascript implements ICodeGenerate { - private static final Logger logger = LoggerFactory.getLogger(CodeGenerateJavascript.class); +public class CodeGenerateJavaScript implements ICodeGenerate { + private static final Logger logger = LoggerFactory.getLogger(CodeGenerateJavaScript.class); // custom configuration public static String protocolOutputRootPath = "zfoojs"; private static String protocolOutputPath = StringUtils.EMPTY; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsArraySerializer.java index 4c0b104a..2d7b6d94 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsArraySerializer.java @@ -57,7 +57,7 @@ public class JsArraySerializer implements IJsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - CodeGenerateJavascript.jsSerializer(arrayField.getArrayElementRegistration().serializer()) + CodeGenerateJavaScript.jsSerializer(arrayField.getArrayElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, arrayField.getArrayElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -88,7 +88,7 @@ public class JsArraySerializer implements IJsSerializer { builder.append(StringUtils.format("if ({} > 0) {", size)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = CodeGenerateJavascript.jsSerializer(arrayField.getArrayElementRegistration().serializer()) + String readObject = CodeGenerateJavaScript.jsSerializer(arrayField.getArrayElementRegistration().serializer()) .readObject(builder, deep + 2, field, arrayField.getArrayElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsListSerializer.java index a6cb30af..7c67bfa6 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsListSerializer.java @@ -56,7 +56,7 @@ public class JsListSerializer implements IJsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - CodeGenerateJavascript.jsSerializer(listField.getListElementRegistration().serializer()) + CodeGenerateJavaScript.jsSerializer(listField.getListElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, listField.getListElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -87,7 +87,7 @@ public class JsListSerializer implements IJsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); String i = "index" + GenerateProtocolFile.localVariableId++; builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = CodeGenerateJavascript.jsSerializer(listField.getListElementRegistration().serializer()) + String readObject = CodeGenerateJavaScript.jsSerializer(listField.getListElementRegistration().serializer()) .readObject(builder, deep + 2, field, listField.getListElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsMapSerializer.java index ad390f22..10048ff8 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsMapSerializer.java @@ -58,9 +58,9 @@ public class JsMapSerializer implements IJsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach(({}, {}) => {", objectStr, value, key)).append(LS); - CodeGenerateJavascript.jsSerializer(mapField.getMapKeyRegistration().serializer()) + CodeGenerateJavaScript.jsSerializer(mapField.getMapKeyRegistration().serializer()) .writeObject(builder, key, deep + 2, field, mapField.getMapKeyRegistration()); - CodeGenerateJavascript.jsSerializer(mapField.getMapValueRegistration().serializer()) + CodeGenerateJavaScript.jsSerializer(mapField.getMapValueRegistration().serializer()) .writeObject(builder, value, deep + 2, field, mapField.getMapValueRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -92,11 +92,11 @@ public class JsMapSerializer implements IJsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String keyObject = CodeGenerateJavascript.jsSerializer(mapField.getMapKeyRegistration().serializer()) + String keyObject = CodeGenerateJavaScript.jsSerializer(mapField.getMapKeyRegistration().serializer()) .readObject(builder, deep + 2, field, mapField.getMapKeyRegistration()); - String valueObject = CodeGenerateJavascript.jsSerializer(mapField.getMapValueRegistration().serializer()) + String valueObject = CodeGenerateJavaScript.jsSerializer(mapField.getMapValueRegistration().serializer()) .readObject(builder, deep + 2, field, mapField.getMapValueRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsSetSerializer.java index 4ee35f1e..5603922a 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsSetSerializer.java @@ -57,7 +57,7 @@ public class JsSetSerializer implements IJsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - CodeGenerateJavascript.jsSerializer(setField.getSetElementRegistration().serializer()) + CodeGenerateJavaScript.jsSerializer(setField.getSetElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, setField.getSetElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -88,7 +88,7 @@ public class JsSetSerializer implements IJsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); String i = "index" + GenerateProtocolFile.localVariableId++; builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = CodeGenerateJavascript.jsSerializer(setField.getSetElementRegistration().serializer()) + String readObject = CodeGenerateJavaScript.jsSerializer(setField.getSetElementRegistration().serializer()) .readObject(builder, deep + 2, field, setField.getSetElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.add({});", result, readObject)).append(LS); diff --git a/protocol/src/main/resources/es/ProtocolTemplate.mjs b/protocol/src/main/resources/ecmascript/ProtocolClassTemplate.mjs similarity index 62% rename from protocol/src/main/resources/es/ProtocolTemplate.mjs rename to protocol/src/main/resources/ecmascript/ProtocolClassTemplate.mjs index 82d943c4..dc869073 100644 --- a/protocol/src/main/resources/es/ProtocolTemplate.mjs +++ b/protocol/src/main/resources/ecmascript/ProtocolClassTemplate.mjs @@ -1,11 +1,11 @@ -{} -class {} { - {} +${protocol_note} +class ${protocol_name} { + ${protocol_field_definition} - static PROTOCOL_ID = {}; + static PROTOCOL_ID = ${protocol_id}; protocolId() { - return {}.PROTOCOL_ID; + return ${protocol_name}.PROTOCOL_ID; } static write(buffer, packet) { @@ -13,7 +13,7 @@ class {} { buffer.writeInt(0); return; } - {} + ${protocol_write_serialization} } static read(buffer) { @@ -22,13 +22,11 @@ class {} { return null; } const beforeReadIndex = buffer.getReadOffset(); - const packet = new {}(); - {} + const packet = new ${protocol_name}(); + ${protocol_read_deserialization} if (length > 0) { buffer.setReadOffset(beforeReadIndex + length); } return packet; } - -} -export default {}; +} \ No newline at end of file diff --git a/protocol/src/main/resources/es/ProtocolManagerTemplate.mjs b/protocol/src/main/resources/ecmascript/ProtocolManagerTemplate.mjs similarity index 93% rename from protocol/src/main/resources/es/ProtocolManagerTemplate.mjs rename to protocol/src/main/resources/ecmascript/ProtocolManagerTemplate.mjs index e4aefb03..4b2f96f9 100644 --- a/protocol/src/main/resources/es/ProtocolManagerTemplate.mjs +++ b/protocol/src/main/resources/ecmascript/ProtocolManagerTemplate.mjs @@ -1,9 +1,9 @@ -{} +${protocol_imports} const protocols = new Map(); // initProtocol -{} +${protocol_manager_registrations} class ProtocolManager { static getProtocol(protocolId) { diff --git a/protocol/src/main/resources/ecmascript/ProtocolTemplate.mjs b/protocol/src/main/resources/ecmascript/ProtocolTemplate.mjs new file mode 100644 index 00000000..0f722ed4 --- /dev/null +++ b/protocol/src/main/resources/ecmascript/ProtocolTemplate.mjs @@ -0,0 +1,33 @@ +${protocol_note} +class ${protocol_name} { + ${protocol_field_definition} + + static PROTOCOL_ID = ${protocol_id}; + + protocolId() { + return ${protocol_name}.PROTOCOL_ID; + } + + static write(buffer, packet) { + if (packet === null) { + buffer.writeInt(0); + return; + } + ${protocol_write_serialization} + } + + static read(buffer) { + const length = buffer.readInt(); + if (length === 0) { + return null; + } + const beforeReadIndex = buffer.getReadOffset(); + const packet = new ${protocol_name}(); + ${protocol_read_deserialization} + if (length > 0) { + buffer.setReadOffset(beforeReadIndex + length); + } + return packet; + } +} +export default ${protocol_name}; \ No newline at end of file diff --git a/protocol/src/main/resources/ecmascript/ProtocolsTemplate.mjs b/protocol/src/main/resources/ecmascript/ProtocolsTemplate.mjs new file mode 100644 index 00000000..f94233da --- /dev/null +++ b/protocol/src/main/resources/ecmascript/ProtocolsTemplate.mjs @@ -0,0 +1,8 @@ +class Protocols { +} + +${protocol_class} + +${protocol_registration} + +export default Protocols; diff --git a/protocol/src/main/resources/es/buffer/ByteBuffer.mjs b/protocol/src/main/resources/ecmascript/buffer/ByteBuffer.mjs similarity index 99% rename from protocol/src/main/resources/es/buffer/ByteBuffer.mjs rename to protocol/src/main/resources/ecmascript/buffer/ByteBuffer.mjs index 2fe75cd4..127ac5bc 100644 --- a/protocol/src/main/resources/es/buffer/ByteBuffer.mjs +++ b/protocol/src/main/resources/ecmascript/buffer/ByteBuffer.mjs @@ -1,4 +1,4 @@ -import { readInt64, writeInt64 } from './longbits.mjs'; +import {readInt64, writeInt64} from './longbits.mjs'; import ProtocolManager from '../ProtocolManager.mjs'; const empty_str = ''; diff --git a/protocol/src/main/resources/es/buffer/long.mjs b/protocol/src/main/resources/ecmascript/buffer/long.mjs similarity index 100% rename from protocol/src/main/resources/es/buffer/long.mjs rename to protocol/src/main/resources/ecmascript/buffer/long.mjs diff --git a/protocol/src/main/resources/es/buffer/longbits.mjs b/protocol/src/main/resources/ecmascript/buffer/longbits.mjs similarity index 100% rename from protocol/src/main/resources/es/buffer/longbits.mjs rename to protocol/src/main/resources/ecmascript/buffer/longbits.mjs diff --git a/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java b/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java index 9987c335..646d7673 100644 --- a/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java +++ b/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java @@ -19,7 +19,6 @@ import org.junit.Ignore; import org.junit.Test; import java.util.List; -import java.util.Set; /** * @author godotg @@ -38,7 +37,7 @@ public class GenerateTesting { generateLanguages.add(CodeLanguage.Cpp); generateLanguages.add(CodeLanguage.Go); generateLanguages.add(CodeLanguage.JavaScript); - generateLanguages.add(CodeLanguage.ES); + generateLanguages.add(CodeLanguage.EcmaScript); generateLanguages.add(CodeLanguage.TypeScript); generateLanguages.add(CodeLanguage.Lua); generateLanguages.add(CodeLanguage.CSharp);