From 8f9d0eebd77bd730ee34e1dbbf7c6f00ac8bb6c9 Mon Sep 17 00:00:00 2001 From: earthchen Date: Wed, 2 Mar 2022 15:42:50 +0800 Subject: [PATCH] [3.0-compiler] proto3 support optional (#9688) * proto3 support optional * fix grpc compiler error * update grpc version * Compatible with grpc --- compiler/pom.xml | 26 +++++++- .../apache/dubbo/gen/AbstractGenerator.java | 61 +++++++++++-------- .../dubbo/gen/dubbo/Dubbo3Generator.java | 5 ++ 3 files changed, 65 insertions(+), 27 deletions(-) diff --git a/compiler/pom.xml b/compiler/pom.xml index fe3c2ba1e0..0885db03d7 100644 --- a/compiler/pom.xml +++ b/compiler/pom.xml @@ -26,11 +26,13 @@ org.apache.dubbo dubbo-compiler - 0.0.3 + 0.0.4-SNAPSHOT jar + 1.44.0 + 1.2.1 3.6.0 3.0.2 3.0.1 @@ -41,6 +43,26 @@ + + io.grpc + grpc-core + ${grpc.verison} + + + io.grpc + grpc-stub + ${grpc.verison} + + + io.grpc + grpc-protobuf + ${grpc.verison} + + + io.grpc + grpc-context + ${grpc.verison} + com.salesforce.servicelibs grpc-contrib @@ -49,7 +71,7 @@ com.salesforce.servicelibs jprotoc - 0.9.1 + ${jprotoc.version} 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 68e2c742ef..934c6f0211 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 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 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 buildFile(ServiceContext context) { List 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(" *
\n");
+                .append(prefix).append(" * 
\n");
             Arrays.stream(HtmlEscapers.htmlEscaper().escape(comments).split("\n"))
-                    .map(line -> line.replace("*/", "*/").replace("*", "*"))
-                    .forEach(line -> builder.append(prefix).append(" * ").append(line).append("\n"));
+                .map(line -> line.replace("*/", "*/").replace("*", "*"))
+                .forEach(line -> builder.append(prefix).append(" * ").append(line).append("\n"));
             builder
-                    .append(prefix).append(" * 
\n") - .append(prefix).append(" */"); + .append(prefix).append(" *
\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 ff5e3c8dc8..929ce57246 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; + } }