From d5c4badff69c22e56d45201862e0e721a5509776 Mon Sep 17 00:00:00 2001 From: godotg Date: Sun, 3 Dec 2023 15:59:29 +0800 Subject: [PATCH] perf[protobuf]: map box type of protobuf --- .../protobuf/builder/JavaBuilder.java | 58 ++++++++----------- .../protobuf/parser/TypeProtobuf.java | 15 +++++ .../serializer/protobuf/wire/MapField.java | 12 ---- .../serializer/protobuf/wire/PbField.java | 3 - .../test/resources/proto/one_message.proto | 7 +++ 5 files changed, 46 insertions(+), 49 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/builder/JavaBuilder.java b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/builder/JavaBuilder.java index 4df8aabe..8e763bb9 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/builder/JavaBuilder.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/builder/JavaBuilder.java @@ -29,30 +29,39 @@ import static com.zfoo.protocol.util.FileUtils.LS; import static com.zfoo.protocol.util.StringUtils.TAB; public class JavaBuilder { - private static final List BASE_TYPES; - - static { - BASE_TYPES = new ArrayList<>(); - String[] types = ("double,float,int32,int64,uint32,uint64,sint32,sint64," - + "fixed32,fixed64,sfixed32,sfixed64,bool,string,bytes").split(","); - BASE_TYPES.addAll(Arrays.asList(types)); - } - public String getJavaType(PbField field) { - String type = field.getTypeString(); + String type = field.getType(); if (field instanceof MapField) { - MapField mf = (MapField) field; - type = "Map<" + getJavaType(mf.getKey().value()) + ", " + getJavaType(mf.getValue()) + ">"; + var mapField = (MapField) field; + type = StringUtils.format("Map<{}, {}>", getBoxJavaType(mapField.getKey().value()), getBoxJavaType(mapField.getValue())); return type; } - if (!BASE_TYPES.contains(type.toLowerCase(Locale.ENGLISH))) { + return getJavaType(type); + } + + public String getJavaType(String type) { + var typeProtobuf = TypeProtobuf.typeOfProtobuf(type); + if (typeProtobuf == null) { return type; } - TypeJava javaType = TypeProtobuf.valueOf(type.toUpperCase(Locale.ENGLISH)).javaType(); + var javaType = typeProtobuf.javaType(); return javaType.getTypeString(); } + private String getBoxJavaType(PbField field) { + return getBoxJavaType(field.getType()); + } + + private String getBoxJavaType(String type) { + var typeProtobuf = TypeProtobuf.typeOfProtobuf(type); + if (typeProtobuf == null) { + return type; + } + var javaType = typeProtobuf.javaType(); + return javaType.getBoxedType(); + } + private void addImport(List imps, String imp) { if (imps == null) { return; @@ -62,13 +71,6 @@ public class JavaBuilder { } } - public String getJavaType(String type) { - if (BASE_TYPES.contains(type.toLowerCase(Locale.ENGLISH))) { - return TypeProtobuf.valueOf(type.toUpperCase(Locale.ENGLISH)).javaType().getTypeString(); - } else { - return type; - } - } private void buildMsgImps(ProtoMessage msg, List tmp, List imps) { var fields = msg.getFields(); @@ -144,7 +146,7 @@ public class JavaBuilder { String type = getJavaType(f); String name = f.getName(); if (f.getCardinality() == PbField.Cardinality.REPEATED) { - String boxedTypeName = getBoxedTypeName(f); + String boxedTypeName = getBoxJavaType(f); type = "List<" + boxedTypeName + ">"; } @@ -172,16 +174,4 @@ public class JavaBuilder { return builder.toString(); } - private String getBoxedTypeName(PbField f) { - String type = getJavaType(f); - if (BASE_TYPES.contains(f.getTypeString())) { - TypeJava javaType = null; - javaType = TypeProtobuf.valueOf(f.getTypeString().toUpperCase(Locale.ENGLISH)).javaType(); - if (javaType != null && javaType.getTypeString() != null) { - type = javaType.getBoxedType(); - } - } - return type; - } - } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/parser/TypeProtobuf.java b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/parser/TypeProtobuf.java index f88cb3c5..9c474afa 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/parser/TypeProtobuf.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/parser/TypeProtobuf.java @@ -12,6 +12,9 @@ package com.zfoo.protocol.serializer.protobuf.parser; +import java.util.HashMap; +import java.util.Map; + /** * @author godotg */ @@ -40,6 +43,14 @@ public enum TypeProtobuf { private final String value; private final TypeJava javaType; + private static final Map map = new HashMap<>(); + + static { + for (var ele : TypeProtobuf.values()) { + map.put(ele.value, ele); + } + } + TypeProtobuf(String value, TypeJava javaType) { this.value = value; this.javaType = javaType; @@ -53,4 +64,8 @@ public enum TypeProtobuf { public String value() { return this.value; } + + public static TypeProtobuf typeOfProtobuf(String str) { + return map.get(str); + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/MapField.java b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/MapField.java index 006603b9..0841dec2 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/MapField.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/MapField.java @@ -23,18 +23,6 @@ public class MapField extends PbField { private TypeProtobuf key; private String value; - @Override - public String getTypeString() { - StringBuilder sb = new StringBuilder(); - String keyStr = ""; - if (getKey() != null) { - keyStr = getKey().value(); - } - sb.append("map<").append(keyStr).append(", "); - sb.append(getValue()).append(">"); - return sb.toString(); - } - /** * @return the key */ diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/PbField.java b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/PbField.java index 5a6c624c..67efd1d1 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/PbField.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/PbField.java @@ -88,9 +88,6 @@ public class PbField { */ private List comments = new ArrayList<>(); - public String getTypeString() { - return this.getType(); - } /** * 消息属性的规则 diff --git a/protocol/src/test/resources/proto/one_message.proto b/protocol/src/test/resources/proto/one_message.proto index ae90127f..264ac50b 100644 --- a/protocol/src/test/resources/proto/one_message.proto +++ b/protocol/src/test/resources/proto/one_message.proto @@ -9,6 +9,10 @@ message OneMessage { Proj value = 1; } +message SimpleObject { + int64 aa = 1; +} + // 测试pb协议1 message Proj { int64 id = 1; @@ -16,4 +20,7 @@ message Proj { string repoPath = 3; //zzzzzzz repeated int32 a = 4;//rrrrrrrrrrrrrrrrrrrrrrr + map b = 5; + map c = 6; + map d = 7; } \ No newline at end of file