From c1b859c8c3fbee698192b6ba839f309801e0d2b7 Mon Sep 17 00:00:00 2001 From: godotg Date: Sat, 2 Dec 2023 21:05:59 +0800 Subject: [PATCH] feat[protobuf]: generate pojo file from proto of protobuf --- .../serializer/protobuf/GeneratePbUtils.java | 70 + .../serializer/protobuf/PbBuildOption.java | 47 + .../protobuf/builder/JavaBuilder.java | 407 ++++++ .../protobuf/codegen/IfaceGenerator.java | 102 ++ .../protobuf/internal/CodeBuilder.java | 226 ++++ .../serializer/protobuf/wire/Comment.java | 80 ++ .../serializer/protobuf/wire/Extend.java | 67 + .../serializer/protobuf/wire/Extensions.java | 84 ++ .../serializer/protobuf/wire/Field.java | 365 ++++++ .../serializer/protobuf/wire/MapField.java | 67 + .../protobuf/wire/NameReserved.java | 36 + .../serializer/protobuf/wire/Oneof.java | 78 ++ .../serializer/protobuf/wire/Option.java | 54 + .../serializer/protobuf/wire/ProtoEnum.java | 196 +++ .../protobuf/wire/ProtoMessage.java | 336 +++++ .../serializer/protobuf/wire/Reserved.java | 220 ++++ .../serializer/protobuf/wire/Syntax.java | 44 + .../serializer/protobuf/wire/TagReserved.java | 108 ++ .../serializer/protobuf/wire/WireFormat.java | 153 +++ .../serializer/protobuf/wire/WireType.java | 81 ++ .../protobuf/wire/parser/Proto.java | 247 ++++ .../protobuf/wire/parser/ProtoParser.java | 1159 +++++++++++++++++ .../com/zfoo/protocol/util/FileUtils.java | 2 +- .../protocol/protobuf/AllTypeBuilderTest.java | 34 + .../src/test/resources/proto/all_type.proto | 31 + .../src/test/resources/proto/one_enum.proto | 21 + .../src/test/resources/proto/one_map.proto | 16 + .../test/resources/proto/one_message.proto | 18 + 28 files changed, 4348 insertions(+), 1 deletion(-) create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/GeneratePbUtils.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/PbBuildOption.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/builder/JavaBuilder.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/codegen/IfaceGenerator.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/internal/CodeBuilder.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/Comment.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/Extend.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/Extensions.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/Field.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/MapField.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/NameReserved.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/Oneof.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/Option.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/ProtoEnum.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/ProtoMessage.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/Reserved.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/Syntax.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/TagReserved.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/WireFormat.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/WireType.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/parser/Proto.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/wire/parser/ProtoParser.java create mode 100644 protocol/src/test/java/com/zfoo/protocol/protobuf/AllTypeBuilderTest.java create mode 100644 protocol/src/test/resources/proto/all_type.proto create mode 100644 protocol/src/test/resources/proto/one_enum.proto create mode 100644 protocol/src/test/resources/proto/one_map.proto create mode 100644 protocol/src/test/resources/proto/one_message.proto diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/GeneratePbUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/GeneratePbUtils.java new file mode 100644 index 00000000..a860e3d8 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/GeneratePbUtils.java @@ -0,0 +1,70 @@ +/* + * Copyright 2021 The edap Project + * + * 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.protobuf; + +import com.zfoo.protocol.collection.CollectionUtils; +import com.zfoo.protocol.serializer.protobuf.codegen.IfaceGenerator; +import com.zfoo.protocol.serializer.protobuf.wire.parser.Proto; +import com.zfoo.protocol.serializer.protobuf.wire.parser.ProtoParser; +import com.zfoo.protocol.util.FileUtils; +import com.zfoo.protocol.util.StringUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class GeneratePbUtils { + + public static void create(PbBuildOption buildOption) { + var protoPathFile = new File(buildOption.getProtoPath()); + if (!protoPathFile.exists()) { + throw new RuntimeException(StringUtils.format("proto path:[{}] not exist", buildOption.getProtoPath())); + } + + var protoFiles = FileUtils.getAllReadableFiles(protoPathFile) + .stream() + .filter(it -> it.getName().toLowerCase().endsWith(".proto")) + .toList(); + + if (CollectionUtils.isEmpty(protoFiles)) { + throw new RuntimeException(StringUtils.format("There are no proto files to build in proto path:[{}]", buildOption.getProtoPath())); + } + + var srcPath = new File(buildOption.getOutputPath()); + + var protos = parseProtoFile(protoFiles); + IfaceGenerator ifaceGenerator = new IfaceGenerator(srcPath, protos); + ifaceGenerator.generate(); + } + + public static List parseProtoFile(List protoFiles) { + var protos = new ArrayList(); + for (var protoFile : protoFiles) { + var strs = FileUtils.readFileToStringList(protoFile) + .stream() + .filter(StringUtils::isNotBlank) + .toArray(); + var protoString = StringUtils.joinWith(FileUtils.LS, strs); + if (StringUtils.isBlank(protoString)) { + continue; + } + ProtoParser parser = new ProtoParser(protoString); + Proto proto = parser.parse(); + proto.setFile(protoFile); + protos.add(proto); + } + return protos; + } + +} diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/PbBuildOption.java b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/PbBuildOption.java new file mode 100644 index 00000000..c96e9657 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/PbBuildOption.java @@ -0,0 +1,47 @@ +/* + * Copyright 2021 The edap Project + * + * 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.protobuf; + +public class PbBuildOption { + + private String protoPath; + private String outputPath; + private boolean isNested; + + public String getProtoPath() { + return protoPath; + } + + public void setProtoPath(String protoPath) { + this.protoPath = protoPath; + } + + public String getOutputPath() { + return outputPath; + } + + public void setOutputPath(String outputPath) { + this.outputPath = outputPath; + } + + public boolean isIsNested() { + return isNested; + } + + public PbBuildOption setIsNested(boolean isNested) { + this.isNested = isNested; + return this; + } + +} 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 new file mode 100644 index 00000000..886a6885 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/builder/JavaBuilder.java @@ -0,0 +1,407 @@ +/* + * Copyright 2021 The edap Project + * + * 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.protobuf.builder; + +import com.zfoo.protocol.collection.CollectionUtils; +import com.zfoo.protocol.serializer.protobuf.PbBuildOption; +import com.zfoo.protocol.serializer.protobuf.internal.CodeBuilder; +import com.zfoo.protocol.serializer.protobuf.wire.*; +import com.zfoo.protocol.serializer.protobuf.wire.Field.Type; +import com.zfoo.protocol.serializer.protobuf.wire.ProtoEnum.EnumEntry; +import com.zfoo.protocol.serializer.protobuf.wire.WireFormat.JavaType; +import com.zfoo.protocol.serializer.protobuf.wire.parser.Proto; +import com.zfoo.protocol.util.StringUtils; + +import java.util.*; + +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)); + } + + + private String getOptionJavaType(List