diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/CodeGenerateKotlin.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/CodeGenerateKotlin.java index 13030fea..3af398a8 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/CodeGenerateKotlin.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/CodeGenerateKotlin.java @@ -52,12 +52,12 @@ public class CodeGenerateKotlin implements ICodeGenerate { // custom configuration public static String protocolOutputRootPath = "zfookt"; private static String protocolOutputPath = StringUtils.EMPTY; - public static String protocolPackage = "com.zfoo.java"; + public static String protocolPackage = "com.zfoo.kotlin"; - private static final Map kotlinSerializerMap = new HashMap<>(); + private static final Map ktSerializerMap = new HashMap<>(); - public static IKtSerializer kotlinSerializer(ISerializer serializer) { - return kotlinSerializerMap.get(serializer); + public static IKtSerializer ktSerializer(ISerializer serializer) { + return ktSerializerMap.get(serializer); } @Override @@ -65,40 +65,42 @@ public class CodeGenerateKotlin implements ICodeGenerate { protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); FileUtils.deleteFile(new File(protocolOutputPath)); - kotlinSerializerMap.put(BooleanSerializer.INSTANCE, new KtBooleanSerializer()); - kotlinSerializerMap.put(ByteSerializer.INSTANCE, new KtByteSerializer()); - kotlinSerializerMap.put(ShortSerializer.INSTANCE, new KtShortSerializer()); - kotlinSerializerMap.put(IntSerializer.INSTANCE, new KtIntSerializer()); - kotlinSerializerMap.put(LongSerializer.INSTANCE, new KtLongSerializer()); - kotlinSerializerMap.put(FloatSerializer.INSTANCE, new KtFloatSerializer()); - kotlinSerializerMap.put(DoubleSerializer.INSTANCE, new KtDoubleSerializer()); - kotlinSerializerMap.put(StringSerializer.INSTANCE, new KtStringSerializer()); - kotlinSerializerMap.put(ArraySerializer.INSTANCE, new KtArraySerializer()); - kotlinSerializerMap.put(ListSerializer.INSTANCE, new KtListSerializer()); - kotlinSerializerMap.put(SetSerializer.INSTANCE, new KtSetSerializer()); - kotlinSerializerMap.put(MapSerializer.INSTANCE, new KtMapSerializer()); - kotlinSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new KtObjectProtocolSerializer()); + ktSerializerMap.put(BooleanSerializer.INSTANCE, new KtBooleanSerializer()); + ktSerializerMap.put(ByteSerializer.INSTANCE, new KtByteSerializer()); + ktSerializerMap.put(ShortSerializer.INSTANCE, new KtShortSerializer()); + ktSerializerMap.put(IntSerializer.INSTANCE, new KtIntSerializer()); + ktSerializerMap.put(LongSerializer.INSTANCE, new KtLongSerializer()); + ktSerializerMap.put(FloatSerializer.INSTANCE, new KtFloatSerializer()); + ktSerializerMap.put(DoubleSerializer.INSTANCE, new KtDoubleSerializer()); + ktSerializerMap.put(StringSerializer.INSTANCE, new KtStringSerializer()); + ktSerializerMap.put(ArraySerializer.INSTANCE, new KtArraySerializer()); + ktSerializerMap.put(ListSerializer.INSTANCE, new KtListSerializer()); + ktSerializerMap.put(SetSerializer.INSTANCE, new KtSetSerializer()); + ktSerializerMap.put(MapSerializer.INSTANCE, new KtMapSerializer()); + ktSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new KtObjectProtocolSerializer()); } @Override public void mergerProtocol(List registrations) throws IOException { createTemplateFile(); - var protocol_root_path = StringUtils.format("package {};", protocolPackage); + var protocol_root_path = StringUtils.format("package {}", protocolPackage); - var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("java/ProtocolManagerTemplate.java"); + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("kotlin/ProtocolManagerTemplate.kt"); var protocol_manager_registrations = new StringBuilder(); + var protocol_imports = new StringBuilder(); + protocol_imports.append(StringUtils.format("import {}.*", protocolPackage)).append(LS); for (var registration : registrations) { var protocol_id = registration.protocolId(); var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_manager_registrations.append(StringUtils.format("protocols[{}] = Protocols.registration{};", protocol_id, protocol_name)).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocolIdMap.put(Protocols.{}.class, (short){});", protocol_name, protocol_id)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols[{}] = registration{}", protocol_id, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocolIdMap.put({}::class.java, {})", protocol_name, protocol_id)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_root_path, protocol_root_path - , CodeTemplatePlaceholder.protocol_imports, StringUtils.EMPTY + , 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("{}/{}", protocolOutputRootPath, "ProtocolManager.java")); + var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.kt")); FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); logger.info("Generated Kotlin protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath()); @@ -109,16 +111,16 @@ public class CodeGenerateKotlin implements ICodeGenerate { // protocol protocol_class.append(protocol_class(registration)).append(LS); // registration - protocol_registration.append(protocol_registration(registration)).append(LS); + protocol_registration.append(protocol_registration_merger(registration)).append(LS); } - var protocolTemplate = ClassUtils.getFileFromClassPathToString("java/ProtocolsTemplate.java"); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("kotlin/ProtocolsTemplate.kt"); var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( CodeTemplatePlaceholder.protocol_root_path, protocol_root_path , CodeTemplatePlaceholder.protocol_imports, StringUtils.EMPTY - , CodeTemplatePlaceholder.protocol_class, protocol_class.toString().replace("public class", "public static class") + , CodeTemplatePlaceholder.protocol_class, protocol_class.toString() , CodeTemplatePlaceholder.protocol_registration, protocol_registration.toString() )); - var outputPath = StringUtils.format("{}/Protocols.java", protocolOutputPath); + var outputPath = StringUtils.format("{}/Protocols.kt", protocolOutputPath); var file = new File(outputPath); FileUtils.writeStringToFile(file, formatProtocolTemplate, true); logger.info("Generated Kotlin protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); @@ -128,30 +130,30 @@ public class CodeGenerateKotlin implements ICodeGenerate { public void foldProtocol(List registrations) throws IOException { createTemplateFile(); - var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("java/ProtocolManagerTemplate.java"); + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("kotlin/ProtocolManagerTemplate.kt"); var protocol_manager_registrations = new StringBuilder(); var protocol_imports = new StringBuilder(); for (var registration : registrations) { var protocol_id = registration.protocolId(); var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_imports.append(StringUtils.format("import {}.{}.{};", protocolPackage, GenerateProtocolPath.protocolPathPeriod(protocol_id), protocol_name)).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols[{}] = {}.registration{};", protocol_id, protocol_name, protocol_name)).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocolIdMap.put({}.class, (short){});", protocol_name, protocol_id)).append(LS); + protocol_imports.append(StringUtils.format("import {}.{}.{}", protocolPackage, GenerateProtocolPath.protocolPathPeriod(protocol_id), protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols[{}] = {}.registration{}", protocol_id, protocol_name, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocolIdMap[{}::class.java] = {}.toShort()", protocol_name, protocol_id)).append(LS); } - var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_root_path, StringUtils.format("package {};", protocolPackage) + var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_root_path, StringUtils.format("package {}", protocolPackage) , 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("{}/{}", protocolOutputRootPath, "ProtocolManager.java")); + var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.kt")); FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); logger.info("Generated Kotlin 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 protocolTemplate = ClassUtils.getFileFromClassPathToString("java/ProtocolTemplate.java"); - var protocol_root_path = StringUtils.format("package {}.{};", protocolPackage, GenerateProtocolPath.protocolPathPeriod(protocol_id)); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("kotlin/ProtocolTemplate.kt"); + var protocol_root_path = StringUtils.format("package {}.{}", protocolPackage, GenerateProtocolPath.protocolPathPeriod(protocol_id)); var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( CodeTemplatePlaceholder.protocol_root_path, protocol_root_path , CodeTemplatePlaceholder.protocol_imports, protocol_imports_fold(registration) @@ -160,7 +162,7 @@ public class CodeGenerateKotlin implements ICodeGenerate { , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) , CodeTemplatePlaceholder.protocol_registration, protocol_registration(registration) )); - var outputPath = StringUtils.format("{}/{}/{}.java", protocolOutputPath, GenerateProtocolPath.protocolPathSlash(protocol_id), protocol_name); + var outputPath = StringUtils.format("{}/{}/{}.kt", protocolOutputPath, GenerateProtocolPath.protocolPathSlash(protocol_id), protocol_name); var file = new File(outputPath); FileUtils.writeStringToFile(file, formatProtocolTemplate, true); logger.info("Generated Kotlin protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); @@ -251,6 +253,19 @@ public class CodeGenerateKotlin implements ICodeGenerate { return formatProtocolTemplate; } + private String protocol_registration_merger(ProtocolRegistration registration) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("kotlin/ProtocolRegistrationMergerTemplate.kt"); + var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( + CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) + , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) + , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) + )); + return formatProtocolTemplate; + } + private String protocol_imports_fold(ProtocolRegistration registration) { var protocolId = registration.getId(); @@ -281,8 +296,8 @@ public class CodeGenerateKotlin implements ICodeGenerate { for (var fieldNote : fieldNotes) { ktBuilder.append(fieldNote).append(LS); } - var pair = kotlinSerializer(fieldRegistration.serializer()).field(field, fieldRegistration); - ktBuilder.append(StringUtils.format("{}: {} = {}", fieldName, pair.getKey(), pair.getValue())).append(LS); + var pair = ktSerializer(fieldRegistration.serializer()).field(field, fieldRegistration); + ktBuilder.append(StringUtils.format("var {}: {} = {}", fieldName, pair.getKey(), pair.getValue())).append(LS); } return ktBuilder.toString(); } @@ -302,7 +317,7 @@ public class CodeGenerateKotlin implements ICodeGenerate { for (var i = 0; i < fields.length; i++) { var field = fields[i]; var fieldRegistration = fieldRegistrations[i]; - kotlinSerializer(fieldRegistration.serializer()).writeObject(ktBuilder, "message." + field.getName(), 0, field, fieldRegistration); + ktSerializer(fieldRegistration.serializer()).writeObject(ktBuilder, "message." + field.getName(), 0, field, fieldRegistration); } if (registration.isCompatible()) { ktBuilder.append(StringUtils.format("buffer.adjustPadding({}, beforeWriteIndex)", registration.getPredictionLength())).append(LS); @@ -322,12 +337,12 @@ public class CodeGenerateKotlin implements ICodeGenerate { if (field.isAnnotationPresent(Compatible.class)) { ktBuilder.append("if (buffer.compatibleRead(beforeReadIndex, length)) {").append(LS); - var compatibleReadObject = kotlinSerializer(fieldRegistration.serializer()).readObject(ktBuilder, 1, field, fieldRegistration); + var compatibleReadObject = ktSerializer(fieldRegistration.serializer()).readObject(ktBuilder, 1, field, fieldRegistration); ktBuilder.append(TAB).append(StringUtils.format("packet.{} = {}", field.getName(), compatibleReadObject)).append(LS); ktBuilder.append("}").append(LS); continue; } - var readObject = kotlinSerializer(fieldRegistration.serializer()).readObject(ktBuilder, 0, field, fieldRegistration); + var readObject = ktSerializer(fieldRegistration.serializer()).readObject(ktBuilder, 0, field, fieldRegistration); ktBuilder.append(StringUtils.format("packet.{} = {}", field.getName(), readObject)).append(LS); } return ktBuilder.toString(); @@ -421,7 +436,7 @@ public class CodeGenerateKotlin implements ICodeGenerate { typeName = typeName.replace("Map<", "Map<"); typeName = typeName.replace("Set<", "Set<"); - typeName = typeName.replace("List<", "Array<"); + typeName = typeName.replace("List<", "List<"); return typeName; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtArraySerializer.java index addeb6b3..26ebc521 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtArraySerializer.java @@ -45,30 +45,21 @@ public class KtArraySerializer implements IKtSerializer { ArrayField arrayField = (ArrayField) fieldRegistration; - builder.append(StringUtils.format("if (({} == null) || ({}.length == 0)) {", objectStr, objectStr)).append(LS); - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append("buffer.writeInt(0);").append(LS); + builder.append(StringUtils.format("buffer.writeInt({}.size)", objectStr)).append(LS); GenerateProtocolFile.addTab(builder, deep); - - builder.append("} else {").append(LS); - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("buffer.writeInt({}.length);", objectStr)).append(LS); - GenerateProtocolFile.addTab(builder, deep + 1); String length = "length" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("int {} = {}.length;", length, objectStr)).append(LS); + builder.append(StringUtils.format("val {} = {}.size", length, objectStr)).append(LS); String i = "i" + GenerateProtocolFile.localVariableId++; + GenerateProtocolFile.addTab(builder, deep); + builder.append(StringUtils.format("for ({} in 0 until {}) {", i, length)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("for (int {} = 0; {} < {}; {}++) {", i, i, length, i)).append(LS); - GenerateProtocolFile.addTab(builder, deep + 2); String element = "element" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("{} {} = {}[{}];", CodeGenerateKotlin.toKotlinClassName(arrayField.getType().getSimpleName()), element, objectStr, i)).append(LS); + builder.append(StringUtils.format("val {} = {}[{}]", element, objectStr, i)).append(LS); - CodeGenerateKotlin.kotlinSerializer(arrayField.getArrayElementRegistration().serializer()) - .writeObject(builder, element, deep + 2, field, arrayField.getArrayElementRegistration()); + CodeGenerateKotlin.ktSerializer(arrayField.getArrayElementRegistration().serializer()) + .writeObject(builder, element, deep + 1, field, arrayField.getArrayElementRegistration()); - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append("}").append(LS); GenerateProtocolFile.addTab(builder, deep); builder.append("}").append(LS); } @@ -88,21 +79,27 @@ public class KtArraySerializer implements IKtSerializer { var typeName = CodeGenerateKotlin.toKotlinClassName(arrayField.getType().getSimpleName()); var i = "index" + GenerateProtocolFile.localVariableId++; + var init = "init" + GenerateProtocolFile.localVariableId++; var size = "size" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("int {} = buffer.readInt();", size)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readInt()", size)).append(LS); GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("{}[] {} = new {}[{}];", typeName, result, typeName, size)).append(LS); + var pair = CodeGenerateKotlin.ktSerializer(arrayField.getArrayElementRegistration().serializer()).field(field, arrayField.getArrayElementRegistration()); + var defaultValue = pair.getValue(); + if (defaultValue.equals("null")) { + defaultValue = StringUtils.format("{}()", typeName); + } + builder.append(StringUtils.format("val {} = Array<{}>({}) { init -> {}}", result, typeName, size, defaultValue)).append(LS); GenerateProtocolFile.addTab(builder, deep); builder.append(StringUtils.format("if ({} > 0) {", size)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("for (int {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - var readObject = CodeGenerateKotlin.kotlinSerializer(arrayField.getArrayElementRegistration().serializer()) + builder.append(StringUtils.format("for ({} in 0 until {}) {", i, size)).append(LS); + var readObject = CodeGenerateKotlin.ktSerializer(arrayField.getArrayElementRegistration().serializer()) .readObject(builder, deep + 2, field, arrayField.getArrayElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); - builder.append(StringUtils.format("{}[{}] = {};", result, i, readObject)); + builder.append(StringUtils.format("{}[{}] = {}", result, i, readObject)); builder.append(LS); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("}").append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtBooleanSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtBooleanSerializer.java index 3f07d55a..be1c0d7b 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtBooleanSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtBooleanSerializer.java @@ -35,7 +35,7 @@ public class KtBooleanSerializer implements IKtSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeBool({});", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeBool({})", objectStr)).append(LS); } @Override @@ -43,7 +43,7 @@ public class KtBooleanSerializer implements IKtSerializer { String result = "result" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("boolean {} = buffer.readBool();", result)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readBool()", result)).append(LS); return result; } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtByteSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtByteSerializer.java index ab2a3201..5d615e05 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtByteSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtByteSerializer.java @@ -35,7 +35,7 @@ public class KtByteSerializer implements IKtSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeByte({});", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeByte({})", objectStr)).append(LS); } @Override @@ -43,7 +43,7 @@ public class KtByteSerializer implements IKtSerializer { String result = "result" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("byte {} = buffer.readByte();", result)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readByte()", result)).append(LS); return result; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtDoubleSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtDoubleSerializer.java index 89dc760f..d54497fd 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtDoubleSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtDoubleSerializer.java @@ -29,13 +29,13 @@ public class KtDoubleSerializer implements IKtSerializer { @Override public Pair field(Field field, IFieldRegistration fieldRegistration) { - return new Pair<>("Float", "0f"); + return new Pair<>("Double", "0.0"); } @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeDouble({});", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeDouble({})", objectStr)).append(LS); } @Override @@ -43,7 +43,7 @@ public class KtDoubleSerializer implements IKtSerializer { String result = "result" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("double {} = buffer.readDouble();", result)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readDouble()", result)).append(LS); return result; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtFloatSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtFloatSerializer.java index f4938634..7215915b 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtFloatSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtFloatSerializer.java @@ -29,13 +29,13 @@ public class KtFloatSerializer implements IKtSerializer { @Override public Pair field(Field field, IFieldRegistration fieldRegistration) { - return new Pair<>("Double", "0.0"); + return new Pair<>("Float", "0f"); } @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeFloat({});", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeFloat({})", objectStr)).append(LS); } @Override @@ -43,7 +43,7 @@ public class KtFloatSerializer implements IKtSerializer { String result = "result" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("float {} = buffer.readFloat();", result)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readFloat()", result)).append(LS); return result; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtIntSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtIntSerializer.java index 748d2796..d04f4438 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtIntSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtIntSerializer.java @@ -35,7 +35,7 @@ public class KtIntSerializer implements IKtSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeInt({});", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeInt({})", objectStr)).append(LS); } @Override @@ -43,7 +43,7 @@ public class KtIntSerializer implements IKtSerializer { String result = "result" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("int {} = buffer.readInt();", result)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readInt()", result)).append(LS); return result; } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtListSerializer.java index 442151b3..5ae9b026 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtListSerializer.java @@ -44,31 +44,16 @@ public class KtListSerializer implements IKtSerializer { } ListField listField = (ListField) fieldRegistration; - builder.append(StringUtils.format("if ({} == null) {", objectStr)).append(LS); - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append("buffer.writeInt(0);").append(LS); + + builder.append(StringUtils.format("buffer.writeInt({}.size)", objectStr)).append(LS); GenerateProtocolFile.addTab(builder, deep); - builder.append("}").append(LS); - GenerateProtocolFile.addTab(builder, deep); - builder.append("else {").append(LS); - - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("buffer.writeInt({}.size());", objectStr)).append(LS); - - GenerateProtocolFile.addTab(builder, deep + 1); - String length = "length" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("int {} = {}.size();", length, objectStr)).append(LS); - - GenerateProtocolFile.addTab(builder, deep + 1); String element = "element" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("for (var {} : {}) {", element, objectStr)).append(LS); + builder.append(StringUtils.format("for ({} in {}) {", element, objectStr)).append(LS); - CodeGenerateKotlin.kotlinSerializer(listField.getListElementRegistration().serializer()) - .writeObject(builder, element, deep + 2, field, listField.getListElementRegistration()); + CodeGenerateKotlin.ktSerializer(listField.getListElementRegistration().serializer()) + .writeObject(builder, element, deep + 1, field, listField.getListElementRegistration()); - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append("}").append(LS); GenerateProtocolFile.addTab(builder, deep); builder.append("}").append(LS); } @@ -89,19 +74,19 @@ public class KtListSerializer implements IKtSerializer { var i = "index" + GenerateProtocolFile.localVariableId++; var size = "size" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("int {} = buffer.readInt();", size)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readInt()", size)).append(LS); GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("var {} = new Array{}({});", result, typeName, size)).append(LS); + builder.append(StringUtils.format("val {} = Array{}({})", result, typeName, size)).append(LS); GenerateProtocolFile.addTab(builder, deep); builder.append(StringUtils.format("if ({} > 0) {", size)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("for (int {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - var readObject = CodeGenerateKotlin.kotlinSerializer(listField.getListElementRegistration().serializer()) + builder.append(StringUtils.format("for ({} in 0 until {}) {", i, size)).append(LS); + var readObject = CodeGenerateKotlin.ktSerializer(listField.getListElementRegistration().serializer()) .readObject(builder, deep + 2, field, listField.getListElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); - builder.append(StringUtils.format("{}.add({});", result, readObject)).append(LS); + builder.append(StringUtils.format("{}.add({})", result, readObject)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("}").append(LS); GenerateProtocolFile.addTab(builder, deep); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtLongSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtLongSerializer.java index 7201850b..0a21c696 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtLongSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtLongSerializer.java @@ -35,7 +35,7 @@ public class KtLongSerializer implements IKtSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeLong({});", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeLong({})", objectStr)).append(LS); } @Override @@ -43,7 +43,7 @@ public class KtLongSerializer implements IKtSerializer { String result = "result" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("long {} = buffer.readLong();", result)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readLong()", result)).append(LS); return result; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtMapSerializer.java index 89078f3a..e47c7923 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtMapSerializer.java @@ -45,37 +45,18 @@ public class KtMapSerializer implements IKtSerializer { MapField mapField = (MapField) fieldRegistration; - builder.append(StringUtils.format("if ({} == null) {", objectStr, objectStr)).append(LS); - - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append("buffer.writeInt(0);").append(LS); + builder.append(StringUtils.format("buffer.writeInt({}.size)", objectStr)).append(LS); GenerateProtocolFile.addTab(builder, deep); - builder.append("} else {").append(LS); - - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("buffer.writeInt({}.size());", objectStr)).append(LS); - - - String i = "i" + GenerateProtocolFile.localVariableId++; - - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("for (var {} : {}.entrySet()) {", i, objectStr)).append(LS); - - GenerateProtocolFile.addTab(builder, deep + 2); String key = "keyElement" + GenerateProtocolFile.localVariableId++; String value = "valueElement" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("var {} = {}.getKey();", key, i)).append(LS); + builder.append(StringUtils.format("for (({}, {}) in {}) {", key,value, objectStr)).append(LS); - GenerateProtocolFile.addTab(builder, deep + 2); - builder.append(StringUtils.format("var {} = {}.getValue();", value, i)).append(LS); + CodeGenerateKotlin.ktSerializer(mapField.getMapKeyRegistration().serializer()) + .writeObject(builder, key, deep + 1, field, mapField.getMapKeyRegistration()); + CodeGenerateKotlin.ktSerializer(mapField.getMapValueRegistration().serializer()) + .writeObject(builder, value, deep + 1, field, mapField.getMapValueRegistration()); - CodeGenerateKotlin.kotlinSerializer(mapField.getMapKeyRegistration().serializer()) - .writeObject(builder, key, deep + 2, field, mapField.getMapKeyRegistration()); - CodeGenerateKotlin.kotlinSerializer(mapField.getMapValueRegistration().serializer()) - .writeObject(builder, value, deep + 2, field, mapField.getMapValueRegistration()); - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append("}").append(LS); GenerateProtocolFile.addTab(builder, deep); builder.append("}").append(LS); } @@ -95,10 +76,10 @@ public class KtMapSerializer implements IKtSerializer { var typeName = CodeGenerateKotlin.toKotlinClassName(mapField.getType().toString()); String size = "size" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("int {} = buffer.readInt();", size)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readInt()", size)).append(LS); GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("var {} = new Hash{}({});", result, typeName, size)).append(LS); + builder.append(StringUtils.format("val {} = Hash{}({})", result, typeName, size)).append(LS); GenerateProtocolFile.addTab(builder, deep); @@ -106,17 +87,17 @@ public class KtMapSerializer implements IKtSerializer { String i = "index" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("for (var {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); + builder.append(StringUtils.format("for ({} in 0 until {}) {", i, size)).append(LS); - String keyObject = CodeGenerateKotlin.kotlinSerializer(mapField.getMapKeyRegistration().serializer()) + String keyObject = CodeGenerateKotlin.ktSerializer(mapField.getMapKeyRegistration().serializer()) .readObject(builder, deep + 2, field, mapField.getMapKeyRegistration()); - String valueObject = CodeGenerateKotlin.kotlinSerializer(mapField.getMapValueRegistration().serializer()) + String valueObject = CodeGenerateKotlin.ktSerializer(mapField.getMapValueRegistration().serializer()) .readObject(builder, deep + 2, field, mapField.getMapValueRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); - builder.append(StringUtils.format("{}.put({}, {});", result, keyObject, valueObject)).append(LS); + builder.append(StringUtils.format("{}.put({}, {})", result, keyObject, valueObject)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("}").append(LS); GenerateProtocolFile.addTab(builder, deep); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtObjectProtocolSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtObjectProtocolSerializer.java index 34fb9ddd..9a5f9a3a 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtObjectProtocolSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtObjectProtocolSerializer.java @@ -42,7 +42,7 @@ public class KtObjectProtocolSerializer implements IKtSerializer { public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { ObjectProtocolField objectProtocolField = (ObjectProtocolField) fieldRegistration; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writePacket({}, (short){});", objectStr, objectProtocolField.getProtocolId())) + builder.append(StringUtils.format("buffer.writePacket({}, {})", objectStr, objectProtocolField.getProtocolId())) .append(LS); } @@ -54,7 +54,7 @@ public class KtObjectProtocolSerializer implements IKtSerializer { var protocolSimpleName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(objectProtocolField.getProtocolId()); GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("{} {} = ({}) buffer.readPacket((short) {});", protocolSimpleName, result, protocolSimpleName, objectProtocolField.getProtocolId())) + builder.append(StringUtils.format("val {} = buffer.readPacket({}) as {}", result, objectProtocolField.getProtocolId(), protocolSimpleName)) .append(LS); return result; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtSetSerializer.java index f561164b..5df4653c 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtSetSerializer.java @@ -45,25 +45,15 @@ public class KtSetSerializer implements IKtSerializer { SetField setField = (SetField) fieldRegistration; - builder.append(StringUtils.format("if ({} == null) {", objectStr)).append(LS); - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append("buffer.writeInt(0);").append(LS); - - GenerateProtocolFile.addTab(builder, deep); - builder.append("} else {").append(LS); - - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("buffer.writeInt({}.size());", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeInt({}.size)", objectStr)).append(LS); String element = "i" + GenerateProtocolFile.localVariableId++; - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("for (var {} : {}) {", element, objectStr)).append(LS); + GenerateProtocolFile.addTab(builder, deep ); + builder.append(StringUtils.format("for ({} in {}) {", element, objectStr)).append(LS); - CodeGenerateKotlin.kotlinSerializer(setField.getSetElementRegistration().serializer()) - .writeObject(builder, element, deep + 2, field, setField.getSetElementRegistration()); + CodeGenerateKotlin.ktSerializer(setField.getSetElementRegistration().serializer()) + .writeObject(builder, element, deep + 1, field, setField.getSetElementRegistration()); - GenerateProtocolFile.addTab(builder, deep + 1); - builder.append("}").append(LS); GenerateProtocolFile.addTab(builder, deep); builder.append("}").append(LS); } @@ -83,22 +73,20 @@ public class KtSetSerializer implements IKtSerializer { var i = "index" + GenerateProtocolFile.localVariableId++; var size = "size" + GenerateProtocolFile.localVariableId++; - builder.append(StringUtils.format("int {} = buffer.readInt();", size)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readInt()", size)).append(LS); GenerateProtocolFile.addTab(builder, deep); - // unity里不支持HashSet的初始化大小 -// builder.append("var " + result + " = new " + typeName + "(" + size + ");" + LS); - builder.append(StringUtils.format("var {} = new Hash{}();", result, typeName)).append(LS); + builder.append(StringUtils.format("val {} = Hash{}()", result, typeName)).append(LS); GenerateProtocolFile.addTab(builder, deep); builder.append(StringUtils.format("if ({} > 0) {", size)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); - builder.append(StringUtils.format("for (int {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); + builder.append(StringUtils.format("for ({} in 0 until {}) {", i, size)).append(LS); - var readObject = CodeGenerateKotlin.kotlinSerializer(setField.getSetElementRegistration().serializer()) + var readObject = CodeGenerateKotlin.ktSerializer(setField.getSetElementRegistration().serializer()) .readObject(builder, deep + 2, field, setField.getSetElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); - builder.append(StringUtils.format("{}.add({});", result, readObject)).append(LS); + builder.append(StringUtils.format("{}.add({})", result, readObject)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("}").append(LS); GenerateProtocolFile.addTab(builder, deep); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtShortSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtShortSerializer.java index d3afddc6..0b7f1667 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtShortSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtShortSerializer.java @@ -35,7 +35,7 @@ public class KtShortSerializer implements IKtSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeShort({});", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeShort({})", objectStr)).append(LS); } @Override @@ -43,7 +43,7 @@ public class KtShortSerializer implements IKtSerializer { String result = "result" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("short {} = buffer.readShort();", result)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readShort()", result)).append(LS); return result; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtStringSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtStringSerializer.java index b5511226..aba530b1 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtStringSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/kotlin/KtStringSerializer.java @@ -35,7 +35,7 @@ public class KtStringSerializer implements IKtSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeString({});", objectStr)).append(LS); + builder.append(StringUtils.format("buffer.writeString({})", objectStr)).append(LS); } @Override @@ -43,7 +43,7 @@ public class KtStringSerializer implements IKtSerializer { String result = "result" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("String {} = buffer.readString();", result)).append(LS); + builder.append(StringUtils.format("val {} = buffer.readString()", result)).append(LS); return result; } diff --git a/protocol/src/main/resources/kotlin/IProtocolRegistration.kt b/protocol/src/main/resources/kotlin/IProtocolRegistration.kt index 71459b9b..746062a0 100644 --- a/protocol/src/main/resources/kotlin/IProtocolRegistration.kt +++ b/protocol/src/main/resources/kotlin/IProtocolRegistration.kt @@ -3,5 +3,5 @@ ${protocol_root_path} interface IProtocolRegistration { fun protocolId(): Short fun write(buffer: ByteBuffer, packet: Any?) - fun read(buffer: ByteBuffer): Any? + fun read(buffer: ByteBuffer): Any } \ No newline at end of file diff --git a/protocol/src/main/resources/kotlin/ProtocolManagerTemplate.kt b/protocol/src/main/resources/kotlin/ProtocolManagerTemplate.kt index 88401f30..92d6e573 100644 --- a/protocol/src/main/resources/kotlin/ProtocolManagerTemplate.kt +++ b/protocol/src/main/resources/kotlin/ProtocolManagerTemplate.kt @@ -1,32 +1,39 @@ ${protocol_root_path} ${protocol_imports} class ProtocolManager { - val protocols = arrayOfNulls(Short.MAX_VALUE.toInt()) - var protocolIdMap: MutableMap, Short> = HashMap() - fun initProtocol() { - // initProtocol - ${protocol_manager_registrations} - } + companion object { + val protocols = arrayOfNulls(Short.MAX_VALUE.toInt()) + var protocolIdMap: MutableMap, Short> = HashMap() + @JvmStatic + fun initProtocol() { + // initProtocol + ${protocol_manager_registrations} + } - fun getProtocolId(clazz: Class<*>): Short { - return protocolIdMap[clazz]!! - } + @JvmStatic + fun getProtocolId(clazz: Class<*>): Short { + return protocolIdMap[clazz]!! + } - fun getProtocol(protocolId: Short): IProtocolRegistration { - return protocols[protocolId.toInt()] - ?: throw RuntimeException("[protocolId:$protocolId] not exist") - } + @JvmStatic + fun getProtocol(protocolId: Short): IProtocolRegistration { + return protocols[protocolId.toInt()] + ?: throw RuntimeException("[protocolId:$protocolId] not exist") + } - fun write(buffer: ByteBuffer, packet: Any) { - val protocolId = getProtocolId(packet.javaClass) - // write protocol id to buffer - buffer.writeShort(protocolId) - // write packet - getProtocol(protocolId).write(buffer, packet) - } + @JvmStatic + fun write(buffer: ByteBuffer, packet: Any) { + val protocolId = getProtocolId(packet.javaClass) + // write protocol id to buffer + buffer.writeShort(protocolId) + // write packet + getProtocol(protocolId).write(buffer, packet) + } - fun read(buffer: ByteBuffer): Any? { - val protocolId = buffer.readShort() - return getProtocol(protocolId).read(buffer) + @JvmStatic + fun read(buffer: ByteBuffer): Any? { + val protocolId = buffer.readShort() + return getProtocol(protocolId).read(buffer) + } } } \ No newline at end of file diff --git a/protocol/src/main/resources/kotlin/ProtocolRegistrationMergerTemplate.kt b/protocol/src/main/resources/kotlin/ProtocolRegistrationMergerTemplate.kt new file mode 100644 index 00000000..94b81d49 --- /dev/null +++ b/protocol/src/main/resources/kotlin/ProtocolRegistrationMergerTemplate.kt @@ -0,0 +1,29 @@ +@JvmField +val registration${protocol_name}: IProtocolRegistration = object : IProtocolRegistration { + override fun protocolId(): Short { + return ${protocol_id} + } + + override fun write(buffer: ByteBuffer, packet: Any?) { + if (packet == null) { + buffer.writeInt(0) + return + } + val message = packet as ${protocol_name} + ${protocol_write_serialization} + } + + override fun read(buffer: ByteBuffer): Any { + val length = buffer.readInt() + val packet = ${protocol_name}() + if (length == 0) { + return packet + } + val beforeReadIndex = buffer.readOffset() + ${protocol_read_deserialization} + if (length > 0) { + buffer.setReadOffset(beforeReadIndex + length) + } + return packet + } +} \ No newline at end of file diff --git a/protocol/src/main/resources/kotlin/ProtocolRegistrationTemplate.kt b/protocol/src/main/resources/kotlin/ProtocolRegistrationTemplate.kt index 0a86c234..76854182 100644 --- a/protocol/src/main/resources/kotlin/ProtocolRegistrationTemplate.kt +++ b/protocol/src/main/resources/kotlin/ProtocolRegistrationTemplate.kt @@ -14,13 +14,13 @@ companion object { ${protocol_write_serialization} } - override fun read(buffer: ByteBuffer): Any? { + override fun read(buffer: ByteBuffer): Any { val length = buffer.readInt() + val packet = ${protocol_name}() if (length == 0) { - return null + return packet } val beforeReadIndex = buffer.readOffset() - val packet = ${protocol_name}() ${protocol_read_deserialization} if (length > 0) { buffer.setReadOffset(beforeReadIndex + length) diff --git a/protocol/src/main/resources/kotlin/ProtocolsTemplate.kt b/protocol/src/main/resources/kotlin/ProtocolsTemplate.kt index 4a803366..fe80e5f2 100644 --- a/protocol/src/main/resources/kotlin/ProtocolsTemplate.kt +++ b/protocol/src/main/resources/kotlin/ProtocolsTemplate.kt @@ -1,10 +1,8 @@ ${protocol_root_path} ${protocol_imports} -import java.util.*; -public class Protocols { - ${protocol_class} - // ----------------------------------------------------------------------------------------------------------------- +${protocol_class} - ${protocol_registration} -} +// ----------------------------------------------------------------------------------------------------------------- + +${protocol_registration} 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 296c1c17..2a4a0f6b 100644 --- a/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java +++ b/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java @@ -15,9 +15,12 @@ package com.zfoo.protocol.generate; import com.zfoo.protocol.ProtocolManager; import com.zfoo.protocol.packet.*; import com.zfoo.protocol.serializer.CodeLanguage; +import com.zfoo.protocol.util.FileUtils; import org.junit.Ignore; import org.junit.Test; +import java.io.File; +import java.io.IOException; import java.util.List; /** @@ -27,7 +30,7 @@ import java.util.List; public class GenerateTesting { @Test - public void generateAllProtocols() { + public void generateAllProtocols() throws IOException { var op = GenerateOperation.NO_OPERATION; op.setFoldProtocol(true); @@ -35,6 +38,8 @@ public class GenerateTesting { // generate the jsProtocol folder and its corresponding js protocol file in the current protocol directory generateLanguages.add(CodeLanguage.Cpp); + generateLanguages.add(CodeLanguage.Java); + generateLanguages.add(CodeLanguage.Kotlin); generateLanguages.add(CodeLanguage.Golang); generateLanguages.add(CodeLanguage.JavaScript); generateLanguages.add(CodeLanguage.EcmaScript); @@ -46,6 +51,14 @@ public class GenerateTesting { // Initialize and then generate the protocol ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), op); + copyFiles(); + } + + @Test + public void copyFiles() throws IOException { + var sourceDirectory = "C:\\github\\zfoo\\protocol\\zfookt"; + var targetDirectory = "C:\\github\\zfoo-kotlin-support\\src\\main\\kotlin\\com\\zfoo\\kotlin"; + FileUtils.copyDirectory(new File(sourceDirectory), new File(targetDirectory)); } }