You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by cr...@apache.org on 2022/03/02 07:43:12 UTC

[dubbo] branch 3.0 updated: [3.0-compiler] proto3 support optional (#9688)

This is an automated email from the ASF dual-hosted git repository.

crazyhzm pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 8f9d0ee  [3.0-compiler] proto3 support optional (#9688)
8f9d0ee is described below

commit 8f9d0eebd77bd730ee34e1dbbf7c6f00ac8bb6c9
Author: earthchen <ea...@gmail.com>
AuthorDate: Wed Mar 2 15:42:50 2022 +0800

    [3.0-compiler] proto3 support optional (#9688)
    
    * proto3 support optional
    
    * fix grpc compiler error
    
    * update grpc version
    
    * Compatible with grpc
---
 compiler/pom.xml                                   | 26 ++++++++-
 .../org/apache/dubbo/gen/AbstractGenerator.java    | 61 +++++++++++++---------
 .../apache/dubbo/gen/dubbo/Dubbo3Generator.java    |  5 ++
 3 files changed, 65 insertions(+), 27 deletions(-)

diff --git a/compiler/pom.xml b/compiler/pom.xml
index fe3c2ba..0885db0 100644
--- a/compiler/pom.xml
+++ b/compiler/pom.xml
@@ -26,11 +26,13 @@
 
     <groupId>org.apache.dubbo</groupId>
     <artifactId>dubbo-compiler</artifactId>
-    <version>0.0.3</version>
+    <version>0.0.4-SNAPSHOT</version>
 
     <packaging>jar</packaging>
 
     <properties>
+        <grpc.verison>1.44.0</grpc.verison>
+        <jprotoc.version>1.2.1</jprotoc.version>
         <maven_compiler_version>3.6.0</maven_compiler_version>
         <maven_jar_version>3.0.2</maven_jar_version>
         <maven_source_version>3.0.1</maven_source_version>
@@ -42,6 +44,26 @@
 
     <dependencies>
         <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-core</artifactId>
+            <version>${grpc.verison}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-stub</artifactId>
+            <version>${grpc.verison}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-protobuf</artifactId>
+            <version>${grpc.verison}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-context</artifactId>
+            <version>${grpc.verison}</version>
+        </dependency>
+        <dependency>
             <groupId>com.salesforce.servicelibs</groupId>
             <artifactId>grpc-contrib</artifactId>
             <version>0.8.1</version>
@@ -49,7 +71,7 @@
         <dependency>
             <groupId>com.salesforce.servicelibs</groupId>
             <artifactId>jprotoc</artifactId>
-            <version>0.9.1</version>
+            <version>${jprotoc.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/compiler/src/main/java/org/apache/dubbo/gen/AbstractGenerator.java b/compiler/src/main/java/org/apache/dubbo/gen/AbstractGenerator.java
index 68e2c74..934c6f0 100644
--- a/compiler/src/main/java/org/apache/dubbo/gen/AbstractGenerator.java
+++ b/compiler/src/main/java/org/apache/dubbo/gen/AbstractGenerator.java
@@ -23,6 +23,7 @@ import com.google.protobuf.DescriptorProtos.FileOptions;
 import com.google.protobuf.DescriptorProtos.MethodDescriptorProto;
 import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto;
 import com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location;
+import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse.Feature;
 import com.google.protobuf.compiler.PluginProtos;
 import com.salesforce.jprotoc.Generator;
 import com.salesforce.jprotoc.GeneratorException;
@@ -30,6 +31,7 @@ import com.salesforce.jprotoc.ProtoTypeMap;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -44,18 +46,23 @@ public abstract class AbstractGenerator extends Generator {
 
     protected abstract String getClassSuffix();
 
-    protected String getSingleTemplateFileName () {
+    protected String getSingleTemplateFileName() {
         return getTemplateFileName();
     }
 
-    protected String getTemplateFileName () {
+    protected String getTemplateFileName() {
         return getClassPrefix() + getClassSuffix() + "Stub.mustache";
     }
 
-    protected String getInterfaceTemplateFileName () {
+    protected String getInterfaceTemplateFileName() {
         return getClassPrefix() + getClassSuffix() + "InterfaceStub.mustache";
     }
 
+    @Override
+    protected List<Feature> supportedFeatures() {
+        return Collections.singletonList(Feature.FEATURE_PROTO3_OPTIONAL);
+    }
+
     private String getServiceJavaDocPrefix() {
         return "    ";
     }
@@ -119,23 +126,23 @@ public abstract class AbstractGenerator extends Generator {
         serviceContext.fileName = getClassPrefix() + serviceProto.getName() + getClassSuffix() + ".java";
         serviceContext.className = getClassPrefix() + serviceProto.getName() + getClassSuffix();
 
-        serviceContext.interfaceFileName = serviceProto.getName()+ ".java";
+        serviceContext.interfaceFileName = serviceProto.getName() + ".java";
         serviceContext.interfaceClassName = serviceProto.getName();
         serviceContext.serviceName = serviceProto.getName();
         serviceContext.deprecated = serviceProto.getOptions() != null && serviceProto.getOptions().getDeprecated();
 
         List<Location> allLocationsForService = locations.stream()
-                .filter(location ->
-                    location.getPathCount() >= 2 &&
-                       location.getPath(0) == FileDescriptorProto.SERVICE_FIELD_NUMBER &&
-                       location.getPath(1) == serviceNumber
-                )
-                .collect(Collectors.toList());
+            .filter(location ->
+                location.getPathCount() >= 2 &&
+                    location.getPath(0) == FileDescriptorProto.SERVICE_FIELD_NUMBER &&
+                    location.getPath(1) == serviceNumber
+            )
+            .collect(Collectors.toList());
 
         Location serviceLocation = allLocationsForService.stream()
-                .filter(location -> location.getPathCount() == SERVICE_NUMBER_OF_PATHS)
-                .findFirst()
-                .orElseGet(Location::getDefaultInstance);
+            .filter(location -> location.getPathCount() == SERVICE_NUMBER_OF_PATHS)
+            .findFirst()
+            .orElseGet(Location::getDefaultInstance);
         serviceContext.javaDoc = getJavaDoc(getComments(serviceLocation), getServiceJavaDocPrefix());
 
         for (int methodNumber = 0; methodNumber < serviceProto.getMethodCount(); methodNumber++) {
@@ -164,12 +171,12 @@ public abstract class AbstractGenerator extends Generator {
         methodContext.methodNumber = methodNumber;
 
         Location methodLocation = locations.stream()
-                .filter(location ->
-                    location.getPathCount() == METHOD_NUMBER_OF_PATHS &&
-                        location.getPath(METHOD_NUMBER_OF_PATHS - 1) == methodNumber
-                )
-                .findFirst()
-                .orElseGet(Location::getDefaultInstance);
+            .filter(location ->
+                location.getPathCount() == METHOD_NUMBER_OF_PATHS &&
+                    location.getPath(METHOD_NUMBER_OF_PATHS - 1) == methodNumber
+            )
+            .findFirst()
+            .orElseGet(Location::getDefaultInstance);
         methodContext.javaDoc = getJavaDoc(getComments(methodLocation), getMethodJavaDocPrefix());
 
         if (!methodProto.getClientStreaming() && !methodProto.getServerStreaming()) {
@@ -204,10 +211,14 @@ public abstract class AbstractGenerator extends Generator {
         return allServiceFiles;
     }
 
+    protected boolean enableMultipleTemplateFiles(){
+        return false;
+    }
+
     private List<PluginProtos.CodeGeneratorResponse.File> buildFile(ServiceContext context) {
         List<PluginProtos.CodeGeneratorResponse.File> files = new ArrayList<>();
 
-        if (context.multipleFiles) {
+        if (context.multipleFiles && enableMultipleTemplateFiles()) {
             String content = applyTemplate(getTemplateFileName(), context);
             String dir = absoluteDir(context);
 
@@ -260,13 +271,13 @@ public abstract class AbstractGenerator extends Generator {
     private String getJavaDoc(String comments, String prefix) {
         if (!comments.isEmpty()) {
             StringBuilder builder = new StringBuilder("/**\n")
-                    .append(prefix).append(" * <pre>\n");
+                .append(prefix).append(" * <pre>\n");
             Arrays.stream(HtmlEscapers.htmlEscaper().escape(comments).split("\n"))
-                    .map(line -> line.replace("*/", "&#42;&#47;").replace("*", "&#42;"))
-                    .forEach(line -> builder.append(prefix).append(" * ").append(line).append("\n"));
+                .map(line -> line.replace("*/", "&#42;&#47;").replace("*", "&#42;"))
+                .forEach(line -> builder.append(prefix).append(" * ").append(line).append("\n"));
             builder
-                    .append(prefix).append(" * </pre>\n")
-                    .append(prefix).append(" */");
+                .append(prefix).append(" * </pre>\n")
+                .append(prefix).append(" */");
             return builder.toString();
         }
         return null;
diff --git a/compiler/src/main/java/org/apache/dubbo/gen/dubbo/Dubbo3Generator.java b/compiler/src/main/java/org/apache/dubbo/gen/dubbo/Dubbo3Generator.java
index ff5e3c8..929ce57 100644
--- a/compiler/src/main/java/org/apache/dubbo/gen/dubbo/Dubbo3Generator.java
+++ b/compiler/src/main/java/org/apache/dubbo/gen/dubbo/Dubbo3Generator.java
@@ -55,4 +55,9 @@ public class Dubbo3Generator extends AbstractGenerator {
     protected String getSingleTemplateFileName() {
         return "DubboStub.mustache";// compatible with 2.7 or before
     }
+
+    @Override
+    protected boolean enableMultipleTemplateFiles() {
+        return true;
+    }
 }