[3.0-compiler] proto3 support optional (#9688)

* proto3 support optional

* fix grpc compiler error

* update grpc version

* Compatible with grpc
This commit is contained in:
earthchen 2022-03-02 15:42:50 +08:00 committed by GitHub
parent 1add77ed6e
commit 8f9d0eebd7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 65 additions and 27 deletions

View File

@ -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>
@ -41,6 +43,26 @@
</properties>
<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>
@ -49,7 +71,7 @@
<dependency>
<groupId>com.salesforce.servicelibs</groupId>
<artifactId>jprotoc</artifactId>
<version>0.9.1</version>
<version>${jprotoc.version}</version>
</dependency>
</dependencies>

View File

@ -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;

View File

@ -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;
}
}