From 87239d5dd6fc540cf3fbe91756a6dbbc37747410 Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Mon, 23 Dec 2019 13:17:58 -0600 Subject: [PATCH 01/11] Beginning to add client generator --- .../src/main/java/com/flit/protoc/Plugin.java | 7 ++ .../gen/{server => }/BaseGenerator.java | 3 +- .../gen/client/BaseClientGenerator.java | 39 +++++++ .../gen/client/okhttp/OkhttpGenerator.java | 14 +++ .../gen/client/okhttp/RpcGenerator.java | 109 ++++++++++++++++++ .../gen/server/BaseServerGenerator.java | 1 + .../protoc/gen/server/ServiceGenerator.java | 1 + .../gen/server/spring/RpcGenerator.java | 2 +- .../gen/server/spring/SpringGenerator.java | 2 +- .../gen/server/undertow/RpcGenerator.java | 2 +- .../server/undertow/UndertowGenerator.java | 2 +- runtime/core/build.gradle | 2 + 12 files changed, 179 insertions(+), 5 deletions(-) rename plugin/src/main/java/com/flit/protoc/gen/{server => }/BaseGenerator.java (96%) create mode 100644 plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java create mode 100644 plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkhttpGenerator.java create mode 100644 plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java diff --git a/plugin/src/main/java/com/flit/protoc/Plugin.java b/plugin/src/main/java/com/flit/protoc/Plugin.java index e238204..1357fc4 100644 --- a/plugin/src/main/java/com/flit/protoc/Plugin.java +++ b/plugin/src/main/java/com/flit/protoc/Plugin.java @@ -53,6 +53,13 @@ private Generator resolveGenerator(Map params) { default: throw new GeneratorException("Unknown server type: " + params.get(PARAM_TYPE).getValue()); } + case "client": + switch(params.get(PARAM_TYPE).getValue()) { + case "okhttp": + return new OkHttpGenerator(); + default: + throw new GeneratorException("Unknown client type: " + params.get(PARAM_TYPE).getValue()); + } default: throw new GeneratorException("Unknown target type: " + params.get(PARAM_TARGET).getValue()); } diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/BaseGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/BaseGenerator.java similarity index 96% rename from plugin/src/main/java/com/flit/protoc/gen/server/BaseGenerator.java rename to plugin/src/main/java/com/flit/protoc/gen/BaseGenerator.java index d7076e5..063273b 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/BaseGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/BaseGenerator.java @@ -1,5 +1,6 @@ -package com.flit.protoc.gen.server; +package com.flit.protoc.gen; +import com.flit.protoc.gen.server.TypeMapper; import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; import com.squareup.javapoet.ClassName; diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java new file mode 100644 index 0000000..bdac0b3 --- /dev/null +++ b/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java @@ -0,0 +1,39 @@ +package com.flit.protoc.gen.client; + +import com.flit.protoc.Parameter; +import com.flit.protoc.gen.BaseGenerator; +import com.flit.protoc.gen.Generator; +import com.flit.protoc.gen.server.ServiceGenerator; +import com.flit.protoc.gen.server.TypeMapper; +import com.google.protobuf.DescriptorProtos; +import com.google.protobuf.compiler.PluginProtos; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static com.flit.protoc.Parameter.PARAM_CONTEXT; + +public class BaseClientGenerator implements Generator { + @Override public List generate(PluginProtos.CodeGeneratorRequest request, Map params) { + List files = new ArrayList<>(); + String context = getContext(params); + TypeMapper mapper = new TypeMapper(request.getProtoFileList()); + request.getProtoFileList().forEach(proto -> { + proto.getServiceList().forEach(s -> { + files.addAll(new ServiceGenerator(proto, s, mapper).getFiles()); + files.addAll(getRpcGenerator(proto, s, context, mapper).getFiles()); + }); + }); + return files; + } + + private static String getContext(Map params) { + if (params.containsKey(PARAM_CONTEXT)) { + return params.get(PARAM_CONTEXT).getValue(); + } + return null; + } + + protected abstract BaseGenerator getRpcGenerator(DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto service, String context, TypeMapper mapper); +} diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkhttpGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkhttpGenerator.java new file mode 100644 index 0000000..c0f4629 --- /dev/null +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkhttpGenerator.java @@ -0,0 +1,14 @@ +package com.flit.protoc.gen.client.okhttp; + +import com.flit.protoc.gen.BaseGenerator; +import com.flit.protoc.gen.client.BaseClientGenerator; +import com.flit.protoc.gen.server.TypeMapper; +import com.flit.protoc.gen.server.undertow.RpcGenerator; +import com.google.protobuf.DescriptorProtos; + +public class OkhttpGenerator extends BaseClientGenerator { + @Override protected BaseGenerator getRpcGenerator( + DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto service, String context, TypeMapper mapper) { + return new RpcGenerator(proto, service, context, mapper); + } +} diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java new file mode 100644 index 0000000..d185979 --- /dev/null +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java @@ -0,0 +1,109 @@ +package com.flit.protoc.gen.client.okhttp; + +import com.flit.protoc.gen.BaseGenerator; +import com.flit.protoc.gen.server.TypeMapper; +import com.flit.protoc.gen.server.Types; +import com.google.protobuf.DescriptorProtos; +import com.squareup.javapoet.*; +import okhttp3.OkHttpClient; + +import static javax.lang.model.element.Modifier.*; + +public class RpcGenerator extends BaseGenerator { + private final String context; + private final TypeSpec.Builder rpcHandler; + + // TODO - both protobuf and json clients need to be generated? + RpcGenerator(DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto service, String context, TypeMapper mapper) { + super(proto, service, mapper); + this.context = getContext(context); + rpcHandler = TypeSpec.classBuilder(getClientName(service)) + .addModifiers(PUBLIC); + addStaticFields(); + addInstanceFields(); + addConstructor(); + service.getMethodList().forEach(this::writeDispatchMethod); + } + + private ClassName getClientName(DescriptorProtos.ServiceDescriptorProto service) { + return ClassName.get(javaPackage, "Rpc" + service.getName() + "Client"); + } + + private void addStaticFields() { + // Add service path prix + rpcHandler.addField(FieldSpec.builder(Types.String, "SERVICE_PATH_PREFIX") + .addModifiers(PUBLIC, STATIC, FINAL) + .initializer("\"$L/$L$L\"", context, proto.hasPackage() ? proto.getPackage() + "." : "", service.getName()) + .build()); + } + + private void addInstanceFields() { + rpcHandler.addField(FieldSpec.builder(String.class, "baseAddress").addModifiers(PRIVATE, FINAL).build()); + rpcHandler.addField(FieldSpec.builder(OkHttpClient.class, "client").build()); + } + + private void addConstructor() { + rpcHandler.addMethod(MethodSpec.constructorBuilder() + .addModifiers(PUBLIC) + .addParameter(String.class, "address") + .addParameter(OkHttpClient.class, "client") + .addStatement("this.baseAddress = address") + .addStatement("this.client = client") + .build()); + } + +// RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf")); +// Request request = new Request.Builder() +// .addHeader("Accept", "application/protobuf") +// .addHeader("Content-Type", "application/protobuf") +// .url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "/Healthz")) +// .post(requestBody) +// .build(); +// +// String responseString; +// InputStream responseStream; +// try(Response response = client.newCall(request).execute()) { +// if(response.code() != 200) { +// responseString = response.body().toString(); +// throw FlitException.builder() +// .withErrorCode(ErrorCode.INTERNAL) +// .withMeta("code", response.code()) +// .withMeta("message", responseString) +// .withMessage("RPC error") +// .build(); +// } else { +// responseStream = response.body().byteStream(); +// return Query.HealthzResponse.parseFrom(responseStream); +// } +// } + private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { + ClassName inputType = mapper.get(m.getInputType()); + ClassName outputType = mapper.get(m.getOutputType()); + rpcHandler.addMethod( + MethodSpec.methodBuilder("dispatch" + m.getName()) + .addModifiers(PRIVATE) + .addParameter(inputType, "in") + .returns(outputType) + .addException(Exception.class) + // TODO - look into control flow builders! + .addStatement("RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get(\"application/protobuf\"));") + .addStatement("Request request = new Request.Builder()") + .addStatement(".addHeader(\"Accept\", \"application/protobuf\")") + .addStatement(".addHeader(\"Content-Type\", \"application/protobuf\")") + .addStatement(".addHeader(\"Twirp-Version\", \"v1.1.0\")") + .addStatement(".url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + \"/$S\")", m.getName()) + .addStatement(".post(requestBody).build()") + .addStatement("String responseString") + .addStatement("InputStream responseStream") + .addStatement("try(Response response = client.newCall(request).execute()) {") + .addStatement("if(response.code() != 200) {") + .addStatement("responseString = response.body().toString()") + .addStatement("throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta(\"message\", responseString).withMessage(\"RPC error\").build()") + .addStatement("} else {") + .addStatement("responseStream = response.body().byteStream()") + .addStatement("return $T.parseFrom(responseStream)", m.getOutputType()) + .addStatement("}") + .build() + ); + } +} diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java index cb94509..9e07c07 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java @@ -1,6 +1,7 @@ package com.flit.protoc.gen.server; import com.flit.protoc.Parameter; +import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.Generator; import com.google.protobuf.DescriptorProtos.FileDescriptorProto; import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java index 4eb993d..7bc4749 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java @@ -1,5 +1,6 @@ package com.flit.protoc.gen.server; +import com.flit.protoc.gen.BaseGenerator; import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; import com.squareup.javapoet.ClassName; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java index 2ea7459..61b26c8 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java @@ -1,6 +1,6 @@ package com.flit.protoc.gen.server.spring; -import com.flit.protoc.gen.server.BaseGenerator; +import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.server.TypeMapper; import com.flit.protoc.gen.server.Types; import com.google.protobuf.DescriptorProtos; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/spring/SpringGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/spring/SpringGenerator.java index abfe4f3..2d0d36e 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/spring/SpringGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/spring/SpringGenerator.java @@ -1,6 +1,6 @@ package com.flit.protoc.gen.server.spring; -import com.flit.protoc.gen.server.BaseGenerator; +import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.server.BaseServerGenerator; import com.flit.protoc.gen.server.TypeMapper; import com.google.protobuf.DescriptorProtos.FileDescriptorProto; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/undertow/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/undertow/RpcGenerator.java index c751944..3a8466d 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/undertow/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/undertow/RpcGenerator.java @@ -1,6 +1,6 @@ package com.flit.protoc.gen.server.undertow; -import com.flit.protoc.gen.server.BaseGenerator; +import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.server.TypeMapper; import com.flit.protoc.gen.server.Types; import com.google.protobuf.DescriptorProtos; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/undertow/UndertowGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/undertow/UndertowGenerator.java index fa11771..86ddcd3 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/undertow/UndertowGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/undertow/UndertowGenerator.java @@ -1,6 +1,6 @@ package com.flit.protoc.gen.server.undertow; -import com.flit.protoc.gen.server.BaseGenerator; +import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.server.BaseServerGenerator; import com.flit.protoc.gen.server.TypeMapper; import com.google.protobuf.DescriptorProtos.FileDescriptorProto; diff --git a/runtime/core/build.gradle b/runtime/core/build.gradle index ee87f0f..a0f3438 100644 --- a/runtime/core/build.gradle +++ b/runtime/core/build.gradle @@ -15,5 +15,7 @@ dependencies { compile "com.google.protobuf:protobuf-java:${protobufVersion}" compile "com.google.protobuf:protobuf-java-util:${protobufVersion}" + compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.0.0' + testCompile 'junit:junit:4.12' } From 30854ef47d31d26f8aa74bace67deb7172857c70 Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Mon, 23 Dec 2019 19:39:30 -0600 Subject: [PATCH 02/11] Making some progress --- Dockerfile | 23 +++++++ plugin/build.gradle | 1 + .../src/main/java/com/flit/protoc/Plugin.java | 1 + .../gen/client/BaseClientGenerator.java | 2 +- ...ttpGenerator.java => OkHttpGenerator.java} | 6 +- .../gen/client/okhttp/RpcGenerator.java | 65 ++++++++--------- plugin/src/main/shell/protoc-gen-flit | 2 +- .../okhttp/HelloworldGeneratorTest.java | 30 ++++++++ .../protoc/gen/client/okhttp/TestClass.java | 69 +++++++++++++++++++ .../src/test/resources/helloworld.okhttp.json | 49 +++++++++++++ settings.gradle | 2 +- 11 files changed, 207 insertions(+), 43 deletions(-) create mode 100644 Dockerfile rename plugin/src/main/java/com/flit/protoc/gen/client/okhttp/{OkhttpGenerator.java => OkHttpGenerator.java} (72%) create mode 100644 plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.java create mode 100644 plugin/src/test/java/com/flit/protoc/gen/client/okhttp/TestClass.java create mode 100644 plugin/src/test/resources/helloworld.okhttp.json diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f704c78 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM gradle:5.4.1-jdk8 +MAINTAINER chris@thinkdataworks.com + +ENV APPDIR /app +ENV PROTOC_VERSION 3.5.1 + +WORKDIR $APPDIR +RUN mkdir -p $APPDIR + +RUN apt-get update -yqq && \ + apt-get install -yqq build-essential + +ENV CLASSPATH ".:/usr/local/lib:$CLASSPATH" + +# install protoc; used for protobuff stuff +RUN curl -OL https://storage.googleapis.com/tdw-static/mirrored/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ + unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d protoc3 && \ + mv protoc3/bin/* /usr/local/bin/ && \ + mv protoc3/include/* /usr/local/include/ + +COPY . $APPDIR + +RUN ./gradlew clean build pack \ No newline at end of file diff --git a/plugin/build.gradle b/plugin/build.gradle index db5e390..1354e33 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -40,6 +40,7 @@ dependencies { compile 'com.google.protobuf:protobuf-java:3.5.1' compile 'com.google.protobuf:protobuf-java-util:3.5.1' compile 'com.squareup:javapoet:1.11.1' + compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.0.0' compileOnly('org.projectlombok:lombok:+') diff --git a/plugin/src/main/java/com/flit/protoc/Plugin.java b/plugin/src/main/java/com/flit/protoc/Plugin.java index 1357fc4..be1e953 100644 --- a/plugin/src/main/java/com/flit/protoc/Plugin.java +++ b/plugin/src/main/java/com/flit/protoc/Plugin.java @@ -2,6 +2,7 @@ import com.flit.protoc.gen.Generator; import com.flit.protoc.gen.GeneratorException; +import com.flit.protoc.gen.client.okhttp.OkHttpGenerator; import com.flit.protoc.gen.server.spring.SpringGenerator; import com.flit.protoc.gen.server.undertow.UndertowGenerator; import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest; diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java index bdac0b3..0fb3bf6 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java @@ -14,7 +14,7 @@ import static com.flit.protoc.Parameter.PARAM_CONTEXT; -public class BaseClientGenerator implements Generator { +public abstract class BaseClientGenerator implements Generator { @Override public List generate(PluginProtos.CodeGeneratorRequest request, Map params) { List files = new ArrayList<>(); String context = getContext(params); diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkhttpGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkHttpGenerator.java similarity index 72% rename from plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkhttpGenerator.java rename to plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkHttpGenerator.java index c0f4629..02314f6 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkhttpGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkHttpGenerator.java @@ -3,11 +3,11 @@ import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.client.BaseClientGenerator; import com.flit.protoc.gen.server.TypeMapper; -import com.flit.protoc.gen.server.undertow.RpcGenerator; import com.google.protobuf.DescriptorProtos; -public class OkhttpGenerator extends BaseClientGenerator { - @Override protected BaseGenerator getRpcGenerator( +public class OkHttpGenerator extends BaseClientGenerator { + @Override + protected BaseGenerator getRpcGenerator( DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto service, String context, TypeMapper mapper) { return new RpcGenerator(proto, service, context, mapper); } diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java index d185979..e11f700 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java @@ -4,16 +4,21 @@ import com.flit.protoc.gen.server.TypeMapper; import com.flit.protoc.gen.server.Types; import com.google.protobuf.DescriptorProtos; +import com.google.protobuf.compiler.PluginProtos; import com.squareup.javapoet.*; +import okhttp3.Headers; import okhttp3.OkHttpClient; +import java.util.Collections; +import java.util.List; +import java.util.Map; + import static javax.lang.model.element.Modifier.*; public class RpcGenerator extends BaseGenerator { private final String context; private final TypeSpec.Builder rpcHandler; - // TODO - both protobuf and json clients need to be generated? RpcGenerator(DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto service, String context, TypeMapper mapper) { super(proto, service, mapper); this.context = getContext(context); @@ -40,6 +45,7 @@ private void addStaticFields() { private void addInstanceFields() { rpcHandler.addField(FieldSpec.builder(String.class, "baseAddress").addModifiers(PRIVATE, FINAL).build()); rpcHandler.addField(FieldSpec.builder(OkHttpClient.class, "client").build()); + rpcHandler.addField(FieldSpec.builder(Headers.class, "headers").build()); } private void addConstructor() { @@ -47,35 +53,13 @@ private void addConstructor() { .addModifiers(PUBLIC) .addParameter(String.class, "address") .addParameter(OkHttpClient.class, "client") + .addParameter(Map.class, "headers") .addStatement("this.baseAddress = address") .addStatement("this.client = client") + .addStatement("this.headers = Headers.of(headers)") .build()); } -// RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf")); -// Request request = new Request.Builder() -// .addHeader("Accept", "application/protobuf") -// .addHeader("Content-Type", "application/protobuf") -// .url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "/Healthz")) -// .post(requestBody) -// .build(); -// -// String responseString; -// InputStream responseStream; -// try(Response response = client.newCall(request).execute()) { -// if(response.code() != 200) { -// responseString = response.body().toString(); -// throw FlitException.builder() -// .withErrorCode(ErrorCode.INTERNAL) -// .withMeta("code", response.code()) -// .withMeta("message", responseString) -// .withMessage("RPC error") -// .build(); -// } else { -// responseStream = response.body().byteStream(); -// return Query.HealthzResponse.parseFrom(responseStream); -// } -// } private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { ClassName inputType = mapper.get(m.getInputType()); ClassName outputType = mapper.get(m.getOutputType()); @@ -85,25 +69,32 @@ private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { .addParameter(inputType, "in") .returns(outputType) .addException(Exception.class) - // TODO - look into control flow builders! .addStatement("RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get(\"application/protobuf\"));") - .addStatement("Request request = new Request.Builder()") - .addStatement(".addHeader(\"Accept\", \"application/protobuf\")") - .addStatement(".addHeader(\"Content-Type\", \"application/protobuf\")") - .addStatement(".addHeader(\"Twirp-Version\", \"v1.1.0\")") - .addStatement(".url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + \"/$S\")", m.getName()) - .addStatement(".post(requestBody).build()") + .addStatement("Request.Builder builder = new Request.Builder()") + .addStatement("builder.addHeader(\"Accept\", \"application/protobuf\")") + .addStatement("builder.addHeader(\"Content-Type\", \"application/protobuf\")") + .addStatement("builder.addHeader(\"Flit-Version\", \"v1.1.0\")") + .addStatement("builder.headers(headers)") + .addStatement("builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + \"$S\")", m.getName()) + .addStatement("builder.post(requestBody)") + .addStatement("Request request = builder.build()") .addStatement("String responseString") .addStatement("InputStream responseStream") - .addStatement("try(Response response = client.newCall(request).execute()) {") - .addStatement("if(response.code() != 200) {") + .beginControlFlow("try(Response response = client.newCall(request).execute())") + .beginControlFlow("if(response.code() != 200)") .addStatement("responseString = response.body().toString()") .addStatement("throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta(\"message\", responseString).withMessage(\"RPC error\").build()") - .addStatement("} else {") + .nextControlFlow("else") .addStatement("responseStream = response.body().byteStream()") - .addStatement("return $T.parseFrom(responseStream)", m.getOutputType()) - .addStatement("}") + .addStatement("return $T.parseFrom(responseStream)", outputType) + .endControlFlow() + .endControlFlow() .build() ); } + + @Override + public List getFiles() { + return Collections.singletonList(toFile(getClientName(service), rpcHandler.build())); + } } diff --git a/plugin/src/main/shell/protoc-gen-flit b/plugin/src/main/shell/protoc-gen-flit index ec5d7ac..b87c7d1 100755 --- a/plugin/src/main/shell/protoc-gen-flit +++ b/plugin/src/main/shell/protoc-gen-flit @@ -15,7 +15,7 @@ # The quiet flag is required otherwise the tooling will dump output to stdout which will break the # plugin output and generation will fail. # ----------------------------------------------------------------------------- -DIR=$(dirname $(readlink -f "$0")) +DIR=$(dirname $(greadlink -f "$0")) JAR=$(ls -c ${DIR}/plugin-*-all.jar | head -1) java ${FLIT_JAVA_OPTS} -jar $JAR $@ \ No newline at end of file diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.java b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.java new file mode 100644 index 0000000..d4ccd37 --- /dev/null +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.java @@ -0,0 +1,30 @@ +package com.flit.protoc.gen.client.okhttp; + +import com.flit.protoc.Plugin; +import com.flit.protoc.gen.BaseGeneratorTest; +import com.google.protobuf.compiler.PluginProtos; +import org.approvaltests.Approvals; +import org.junit.Test; + +import static java.util.stream.Collectors.toList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class HelloworldGeneratorTest extends BaseGeneratorTest { + + @Test public void test_Generate() throws Exception { + PluginProtos.CodeGeneratorRequest request = loadJson("helloworld.okhttp.json"); + + Plugin plugin = new Plugin(request); + PluginProtos.CodeGeneratorResponse response = plugin.process(); + + assertNotNull(response); + assertEquals(2, response.getFileCount()); + assertEquals(response.getFile(0).getName(), "com/example/helloworld/RpcHelloWorld.java"); + assertEquals(response.getFile(1).getName(), "com/example/helloworld/RpcHelloWorldClient.java"); + + Approvals.verifyAll("", response.getFileList().stream().map(f -> f.getContent()).collect(toList())); + response.getFileList().forEach(f -> assertParses(f)); + } + +} diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/TestClass.java b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/TestClass.java new file mode 100644 index 0000000..9b20b65 --- /dev/null +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/TestClass.java @@ -0,0 +1,69 @@ +package com.example.helloworld; + +import java.lang.Exception; +import java.lang.String; +import java.util.Map; +import okhttp3.Headers; +import okhttp3.OkHttpClient; + +public class RpcHelloWorldClient { + public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.HelloWorld"; + + private final String baseAddress; + + OkHttpClient client; + + Headers headers; + + public RpcHelloWorldClient(String address, OkHttpClient client, Map headers) { + this.baseAddress = address; + this.client = client; + this.headers = Headers.of(headers); + } + + private Helloworld.HelloResp dispatchHello(Helloworld.HelloReq in) throws Exception { + RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf"));; + Request.Builder builder = new Request.Builder(); + builder.addHeader("Accept", "application/protobuf"); + builder.addHeader("Content-Type", "application/protobuf"); + builder.addHeader("Flit-Version", "v1.1.0"); + builder.headers(headers); + builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + ""Hello""); + builder.post(requestBody); + Request request = builder.build(); + String responseString; + InputStream responseStream; + try(Response response = client.newCall(request).execute()) { + if(response.code() != 200) { + responseString = response.body().toString(); + throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); + } else { + responseStream = response.body().byteStream(); + return Helloworld.HelloResp.parseFrom(responseStream); + } + } + } + + private Helloworld.HelloResp dispatchHelloAgain(Helloworld.HelloReq in) throws Exception { + RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf"));; + Request.Builder builder = new Request.Builder(); + builder.addHeader("Accept", "application/protobuf"); + builder.addHeader("Content-Type", "application/protobuf"); + builder.addHeader("Flit-Version", "v1.1.0"); + builder.headers(headers); + builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + ""HelloAgain""); + builder.post(requestBody); + Request request = builder.build(); + String responseString; + InputStream responseStream; + try(Response response = client.newCall(request).execute()) { + if(response.code() != 200) { + responseString = response.body().toString(); + throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); + } else { + responseStream = response.body().byteStream(); + return Helloworld.HelloResp.parseFrom(responseStream); + } + } + } +} diff --git a/plugin/src/test/resources/helloworld.okhttp.json b/plugin/src/test/resources/helloworld.okhttp.json new file mode 100644 index 0000000..55ff634 --- /dev/null +++ b/plugin/src/test/resources/helloworld.okhttp.json @@ -0,0 +1,49 @@ +{ + "fileToGenerate": ["helloworld.proto"], + "parameter": "target=client,type=okhttp", + "compilerVersion": { + "major": 3, + "minor": 5, + "patch": 1, + "suffix": "" + }, + "protoFile": [{ + "name": "helloworld.proto", + "package": "com.example.helloworld", + "messageType": [{ + "name": "HelloReq", + "field": [{ + "name": "subject", + "number": 1, + "label": "LABEL_OPTIONAL", + "type": "TYPE_STRING", + "jsonName": "subject" + }] + }, { + "name": "HelloResp", + "field": [{ + "name": "text", + "number": 1, + "label": "LABEL_OPTIONAL", + "type": "TYPE_STRING", + "jsonName": "text" + }] + }], + "service": [{ + "name": "HelloWorld", + "method": [{ + "name": "Hello", + "inputType": ".com.example.helloworld.HelloReq", + "outputType": ".com.example.helloworld.HelloResp" + }, { + "name": "HelloAgain", + "inputType": ".com.example.helloworld.HelloReq", + "outputType": ".com.example.helloworld.HelloResp" + }] + }], + "options": { + "javaPackage": "com.example.helloworld" + }, + "syntax": "proto3" + }] +} diff --git a/settings.gradle b/settings.gradle index f7e38a2..aa9a5e6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,5 @@ include "plugin" include 'runtime:core' include 'runtime:spring' -include 'runtime:undertow' + include 'runtime:undertow' From afd20c05c3422e25d72c27b6fad1ec2ad98a0d63 Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Tue, 24 Dec 2019 09:11:22 -0600 Subject: [PATCH 03/11] Finished adding generator tests --- .../gen/client/okhttp/RpcGenerator.java | 13 ++- ...ldGeneratorTest.test_Generate.approved.txt | 83 +++++++++++++++++++ .../client/okhttp/StatusGeneratorTest.java | 34 ++++++++ ...usGeneratorTest.test_Generate.approved.txt | 58 +++++++++++++ .../protoc/gen/client/okhttp/TestClass.java | 69 --------------- plugin/src/test/resources/status.okhttp.json | 79 ++++++++++++++++++ plugin/src/test/resources/status.proto | 1 - 7 files changed, 260 insertions(+), 77 deletions(-) create mode 100644 plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt create mode 100644 plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.java create mode 100644 plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt delete mode 100644 plugin/src/test/java/com/flit/protoc/gen/client/okhttp/TestClass.java create mode 100644 plugin/src/test/resources/status.okhttp.json diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java index e11f700..d307627 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java @@ -6,8 +6,7 @@ import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; import com.squareup.javapoet.*; -import okhttp3.Headers; -import okhttp3.OkHttpClient; +import okhttp3.*; import java.util.Collections; import java.util.List; @@ -69,18 +68,18 @@ private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { .addParameter(inputType, "in") .returns(outputType) .addException(Exception.class) - .addStatement("RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get(\"application/protobuf\"));") - .addStatement("Request.Builder builder = new Request.Builder()") + .addStatement("$T requestBody = $T.create(in.toByteArray(), $T.get(\"application/protobuf\"))", RequestBody.class, RequestBody.class, MediaType.class) + .addStatement("$T builder = new $T()", Request.Builder.class, Request.Builder.class) .addStatement("builder.addHeader(\"Accept\", \"application/protobuf\")") .addStatement("builder.addHeader(\"Content-Type\", \"application/protobuf\")") .addStatement("builder.addHeader(\"Flit-Version\", \"v1.1.0\")") .addStatement("builder.headers(headers)") - .addStatement("builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + \"$S\")", m.getName()) + .addStatement("builder.url($T.parse(baseAddress + SERVICE_PATH_PREFIX + $S))", HttpUrl.class, m.getName()) .addStatement("builder.post(requestBody)") - .addStatement("Request request = builder.build()") + .addStatement("$T request = builder.build()", Request.class) .addStatement("String responseString") .addStatement("InputStream responseStream") - .beginControlFlow("try(Response response = client.newCall(request).execute())") + .beginControlFlow("try($T response = client.newCall(request).execute())", Response.class) .beginControlFlow("if(response.code() != 200)") .addStatement("responseString = response.body().toString()") .addStatement("throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta(\"message\", responseString).withMessage(\"RPC error\").build()") diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt new file mode 100644 index 0000000..94a69d5 --- /dev/null +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt @@ -0,0 +1,83 @@ +[0] = package com.example.helloworld; + +public interface RpcHelloWorld { + Helloworld.HelloResp handleHello(Helloworld.HelloReq in); + + Helloworld.HelloResp handleHelloAgain(Helloworld.HelloReq in); +} + +[1] = package com.example.helloworld; + +import java.lang.Exception; +import java.lang.String; +import java.util.Map; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class RpcHelloWorldClient { + public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.HelloWorld"; + + private final String baseAddress; + + OkHttpClient client; + + Headers headers; + + public RpcHelloWorldClient(String address, OkHttpClient client, Map headers) { + this.baseAddress = address; + this.client = client; + this.headers = Headers.of(headers); + } + + private Helloworld.HelloResp dispatchHello(Helloworld.HelloReq in) throws Exception { + RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf")); + Request.Builder builder = new Request.Builder(); + builder.addHeader("Accept", "application/protobuf"); + builder.addHeader("Content-Type", "application/protobuf"); + builder.addHeader("Flit-Version", "v1.1.0"); + builder.headers(headers); + builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "Hello")); + builder.post(requestBody); + Request request = builder.build(); + String responseString; + InputStream responseStream; + try(Response response = client.newCall(request).execute()) { + if(response.code() != 200) { + responseString = response.body().toString(); + throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); + } else { + responseStream = response.body().byteStream(); + return Helloworld.HelloResp.parseFrom(responseStream); + } + } + } + + private Helloworld.HelloResp dispatchHelloAgain(Helloworld.HelloReq in) throws Exception { + RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf")); + Request.Builder builder = new Request.Builder(); + builder.addHeader("Accept", "application/protobuf"); + builder.addHeader("Content-Type", "application/protobuf"); + builder.addHeader("Flit-Version", "v1.1.0"); + builder.headers(headers); + builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "HelloAgain")); + builder.post(requestBody); + Request request = builder.build(); + String responseString; + InputStream responseStream; + try(Response response = client.newCall(request).execute()) { + if(response.code() != 200) { + responseString = response.body().toString(); + throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); + } else { + responseStream = response.body().byteStream(); + return Helloworld.HelloResp.parseFrom(responseStream); + } + } + } +} + diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.java b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.java new file mode 100644 index 0000000..858ab7e --- /dev/null +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.java @@ -0,0 +1,34 @@ +package com.flit.protoc.gen.client.okhttp; + +import com.flit.protoc.Plugin; +import com.flit.protoc.gen.BaseGeneratorTest; +import com.google.protobuf.compiler.PluginProtos; +import org.approvaltests.Approvals; +import org.junit.Test; + +import static java.util.stream.Collectors.toList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Tests the generation of a service that has core definition imported from another file + */ +public class StatusGeneratorTest extends BaseGeneratorTest { + + @Test public void test_Generate() throws Exception { + PluginProtos.CodeGeneratorRequest request = loadJson("status.okhttp.json"); + + Plugin plugin = new Plugin(request); + PluginProtos.CodeGeneratorResponse response = plugin.process(); + + assertNotNull(response); + assertEquals(2, response.getFileCount()); + + assertEquals(response.getFile(0).getName(), "com/example/helloworld/RpcStatus.java"); + assertEquals(response.getFile(1).getName(), "com/example/helloworld/RpcStatusClient.java"); + + Approvals.verifyAll("", response.getFileList().stream().map(f -> f.getContent()).collect(toList())); + response.getFileList().forEach(f -> assertParses(f)); + } + +} diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt new file mode 100644 index 0000000..2d65df2 --- /dev/null +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt @@ -0,0 +1,58 @@ +[0] = package com.example.helloworld; + +public interface RpcStatus { + StatusOuterClass.StatusResponse handleGetStatus(Core.Empty in); +} + +[1] = package com.example.helloworld; + +import java.lang.Exception; +import java.lang.String; +import java.util.Map; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class RpcStatusClient { + public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.Status"; + + private final String baseAddress; + + OkHttpClient client; + + Headers headers; + + public RpcStatusClient(String address, OkHttpClient client, Map headers) { + this.baseAddress = address; + this.client = client; + this.headers = Headers.of(headers); + } + + private StatusOuterClass.StatusResponse dispatchGetStatus(Core.Empty in) throws Exception { + RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf")); + Request.Builder builder = new Request.Builder(); + builder.addHeader("Accept", "application/protobuf"); + builder.addHeader("Content-Type", "application/protobuf"); + builder.addHeader("Flit-Version", "v1.1.0"); + builder.headers(headers); + builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "GetStatus")); + builder.post(requestBody); + Request request = builder.build(); + String responseString; + InputStream responseStream; + try(Response response = client.newCall(request).execute()) { + if(response.code() != 200) { + responseString = response.body().toString(); + throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); + } else { + responseStream = response.body().byteStream(); + return StatusOuterClass.StatusResponse.parseFrom(responseStream); + } + } + } +} + diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/TestClass.java b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/TestClass.java deleted file mode 100644 index 9b20b65..0000000 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/TestClass.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.example.helloworld; - -import java.lang.Exception; -import java.lang.String; -import java.util.Map; -import okhttp3.Headers; -import okhttp3.OkHttpClient; - -public class RpcHelloWorldClient { - public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.HelloWorld"; - - private final String baseAddress; - - OkHttpClient client; - - Headers headers; - - public RpcHelloWorldClient(String address, OkHttpClient client, Map headers) { - this.baseAddress = address; - this.client = client; - this.headers = Headers.of(headers); - } - - private Helloworld.HelloResp dispatchHello(Helloworld.HelloReq in) throws Exception { - RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf"));; - Request.Builder builder = new Request.Builder(); - builder.addHeader("Accept", "application/protobuf"); - builder.addHeader("Content-Type", "application/protobuf"); - builder.addHeader("Flit-Version", "v1.1.0"); - builder.headers(headers); - builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + ""Hello""); - builder.post(requestBody); - Request request = builder.build(); - String responseString; - InputStream responseStream; - try(Response response = client.newCall(request).execute()) { - if(response.code() != 200) { - responseString = response.body().toString(); - throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); - } else { - responseStream = response.body().byteStream(); - return Helloworld.HelloResp.parseFrom(responseStream); - } - } - } - - private Helloworld.HelloResp dispatchHelloAgain(Helloworld.HelloReq in) throws Exception { - RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf"));; - Request.Builder builder = new Request.Builder(); - builder.addHeader("Accept", "application/protobuf"); - builder.addHeader("Content-Type", "application/protobuf"); - builder.addHeader("Flit-Version", "v1.1.0"); - builder.headers(headers); - builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + ""HelloAgain""); - builder.post(requestBody); - Request request = builder.build(); - String responseString; - InputStream responseStream; - try(Response response = client.newCall(request).execute()) { - if(response.code() != 200) { - responseString = response.body().toString(); - throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); - } else { - responseStream = response.body().byteStream(); - return Helloworld.HelloResp.parseFrom(responseStream); - } - } - } -} diff --git a/plugin/src/test/resources/status.okhttp.json b/plugin/src/test/resources/status.okhttp.json new file mode 100644 index 0000000..cde91ab --- /dev/null +++ b/plugin/src/test/resources/status.okhttp.json @@ -0,0 +1,79 @@ +{ + "fileToGenerate": ["core.proto", "status.proto"], + "parameter": "target=client,type=okhttp", + "compilerVersion": { + "major": 3, + "minor": 5, + "patch": 1, + "suffix": "" + }, + "protoFile": [{ + "name": "core.proto", + "package": "com.example.helloworld", + "messageType": [{ + "name": "Empty" + }], + "options": { + "javaPackage": "com.example.helloworld" + }, + "syntax": "proto3" + }, { + "name": "status.proto", + "package": "com.example.helloworld", + "dependency": ["core.proto"], + "messageType": [{ + "name": "StatusResponse", + "field": [{ + "name": "status", + "number": 1, + "label": "LABEL_OPTIONAL", + "type": "TYPE_ENUM", + "typeName": ".com.example.helloworld.StatusResponse.StatusType", + "jsonName": "status" + }, { + "name": "sha", + "number": 2, + "label": "LABEL_OPTIONAL", + "type": "TYPE_STRING", + "jsonName": "sha" + }, { + "name": "date", + "number": 3, + "label": "LABEL_OPTIONAL", + "type": "TYPE_STRING", + "jsonName": "date" + }, { + "name": "version", + "number": 4, + "label": "LABEL_OPTIONAL", + "type": "TYPE_STRING", + "jsonName": "version" + }], + "enumType": [{ + "name": "StatusType", + "value": [{ + "name": "UNKNOWN", + "number": 0 + }, { + "name": "RUNNING", + "number": 1 + }, { + "name": "ERROR", + "number": 2 + }] + }] + }], + "service": [{ + "name": "Status", + "method": [{ + "name": "GetStatus", + "inputType": ".com.example.helloworld.Empty", + "outputType": ".com.example.helloworld.StatusResponse" + }] + }], + "options": { + "javaPackage": "com.example.helloworld" + }, + "syntax": "proto3" + }] +} diff --git a/plugin/src/test/resources/status.proto b/plugin/src/test/resources/status.proto index 4fd97a9..9db689e 100644 --- a/plugin/src/test/resources/status.proto +++ b/plugin/src/test/resources/status.proto @@ -3,7 +3,6 @@ syntax = "proto3"; package com.example.helloworld; option java_package = "com.example.helloworld"; - import "core.proto"; // ----------------------------------------------------------------------------------- From a45202c3843feb1d9e58924a2119426373cb8305 Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Tue, 24 Dec 2019 09:16:47 -0600 Subject: [PATCH 04/11] Bumping plugin version --- plugin/gradle.properties | 2 +- plugin/src/main/shell/protoc-gen-flit | 7 ++++++- runtime/spring/gradle.properties | 2 +- runtime/undertow/gradle.properties | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/plugin/gradle.properties b/plugin/gradle.properties index beb72cc..166aa4a 100644 --- a/plugin/gradle.properties +++ b/plugin/gradle.properties @@ -1 +1 @@ -version=1.0.0 \ No newline at end of file +version=1.1.0 \ No newline at end of file diff --git a/plugin/src/main/shell/protoc-gen-flit b/plugin/src/main/shell/protoc-gen-flit index b87c7d1..9faaef7 100755 --- a/plugin/src/main/shell/protoc-gen-flit +++ b/plugin/src/main/shell/protoc-gen-flit @@ -15,7 +15,12 @@ # The quiet flag is required otherwise the tooling will dump output to stdout which will break the # plugin output and generation will fail. # ----------------------------------------------------------------------------- -DIR=$(dirname $(greadlink -f "$0")) + +# Running locally on osx: +# DIR=$(dirname $(greadlink -f "$0")) + +# Running on *nix: +DIR=$(dirname $(readlink -f "$0")) JAR=$(ls -c ${DIR}/plugin-*-all.jar | head -1) java ${FLIT_JAVA_OPTS} -jar $JAR $@ \ No newline at end of file diff --git a/runtime/spring/gradle.properties b/runtime/spring/gradle.properties index beb72cc..166aa4a 100644 --- a/runtime/spring/gradle.properties +++ b/runtime/spring/gradle.properties @@ -1 +1 @@ -version=1.0.0 \ No newline at end of file +version=1.1.0 \ No newline at end of file diff --git a/runtime/undertow/gradle.properties b/runtime/undertow/gradle.properties index beb72cc..166aa4a 100644 --- a/runtime/undertow/gradle.properties +++ b/runtime/undertow/gradle.properties @@ -1 +1 @@ -version=1.0.0 \ No newline at end of file +version=1.1.0 \ No newline at end of file From 0c6a2f7a1cb7606d8f0d0262b6d9538ad23fae0b Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Tue, 24 Dec 2019 09:24:19 -0600 Subject: [PATCH 05/11] Removing some small things --- Dockerfile | 23 ----------------------- settings.gradle | 2 +- 2 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index f704c78..0000000 --- a/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM gradle:5.4.1-jdk8 -MAINTAINER chris@thinkdataworks.com - -ENV APPDIR /app -ENV PROTOC_VERSION 3.5.1 - -WORKDIR $APPDIR -RUN mkdir -p $APPDIR - -RUN apt-get update -yqq && \ - apt-get install -yqq build-essential - -ENV CLASSPATH ".:/usr/local/lib:$CLASSPATH" - -# install protoc; used for protobuff stuff -RUN curl -OL https://storage.googleapis.com/tdw-static/mirrored/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ - unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d protoc3 && \ - mv protoc3/bin/* /usr/local/bin/ && \ - mv protoc3/include/* /usr/local/include/ - -COPY . $APPDIR - -RUN ./gradlew clean build pack \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index aa9a5e6..f7e38a2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,5 @@ include "plugin" include 'runtime:core' include 'runtime:spring' - include 'runtime:undertow' +include 'runtime:undertow' From f8404cb2c2be109bb491edae7d71dba09ec82ac0 Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Tue, 24 Dec 2019 09:46:57 -0600 Subject: [PATCH 06/11] okhttp-client-gen adding dockerfile and instructions for build --- Dockerfile | 22 ++++++++++++++++++++++ README.md | 8 ++++++++ docker-compose.yml | 8 ++++++++ plugin/src/main/shell/protoc-gen-flit | 5 ----- 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2970acd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +# Dockerfile for building artifacts +FROM gradle:5.4.1-jdk8 +MAINTAINER chris@thinkdataworks.com + +ENV APPDIR /app +ENV PROTOC_VERSION 3.5.1 + +WORKDIR $APPDIR +RUN mkdir -p $APPDIR + +RUN apt-get update -yqq && \ + apt-get install -yqq build-essential + +ENV CLASSPATH ".:/usr/local/lib:$CLASSPATH" + +# install protoc; used for protobuff stuff +RUN curl -OL https://storage.googleapis.com/tdw-static/mirrored/protoc-${PROTOC_VERSION}-linux-x86_64.zip && \ + unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d protoc3 && \ + mv protoc3/bin/* /usr/local/bin/ && \ + mv protoc3/include/* /usr/local/include/ + +COPY . $APPDIR \ No newline at end of file diff --git a/README.md b/README.md index f7f438f..55ba922 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,14 @@ To build the various components, run the following: git clone git@github.com:devork/flit.git cd flit ./gradlew clean build pack + +### Building with docker + +```bash + $ docker-compose up -d + $ docker-compose run gen + gen > ./gradlew clean build pack +``` ### Installation diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..836f6d1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,8 @@ +version: "3.4" + +services: + gen: + build: . + volumes: + - .:/app + command: sleep 10000 \ No newline at end of file diff --git a/plugin/src/main/shell/protoc-gen-flit b/plugin/src/main/shell/protoc-gen-flit index 9faaef7..ec5d7ac 100755 --- a/plugin/src/main/shell/protoc-gen-flit +++ b/plugin/src/main/shell/protoc-gen-flit @@ -15,11 +15,6 @@ # The quiet flag is required otherwise the tooling will dump output to stdout which will break the # plugin output and generation will fail. # ----------------------------------------------------------------------------- - -# Running locally on osx: -# DIR=$(dirname $(greadlink -f "$0")) - -# Running on *nix: DIR=$(dirname $(readlink -f "$0")) JAR=$(ls -c ${DIR}/plugin-*-all.jar | head -1) From 8ef9f1bbbd78302ac6713550e4aca957aaa0051b Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Tue, 24 Dec 2019 09:58:00 -0600 Subject: [PATCH 07/11] Tweaking generators --- .../com/flit/protoc/gen/client/okhttp/RpcGenerator.java | 7 +++++-- .../HelloworldGeneratorTest.test_Generate.approved.txt | 3 +++ .../okhttp/StatusGeneratorTest.test_Generate.approved.txt | 3 +++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java index d307627..23de135 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java @@ -8,10 +8,13 @@ import com.squareup.javapoet.*; import okhttp3.*; +import java.io.InputStream; import java.util.Collections; import java.util.List; import java.util.Map; +import static com.flit.protoc.gen.server.Types.ErrorCode; +import static com.flit.protoc.gen.server.Types.FlitException; import static javax.lang.model.element.Modifier.*; public class RpcGenerator extends BaseGenerator { @@ -78,11 +81,11 @@ private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { .addStatement("builder.post(requestBody)") .addStatement("$T request = builder.build()", Request.class) .addStatement("String responseString") - .addStatement("InputStream responseStream") + .addStatement("$T responseStream", InputStream.class) .beginControlFlow("try($T response = client.newCall(request).execute())", Response.class) .beginControlFlow("if(response.code() != 200)") .addStatement("responseString = response.body().toString()") - .addStatement("throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta(\"message\", responseString).withMessage(\"RPC error\").build()") + .addStatement("throw $T.builder().withErrorCode($T.INTERNAL).withMeta(\"message\", responseString).withMessage(\"RPC error\").build()", FlitException, ErrorCode) .nextControlFlow("else") .addStatement("responseStream = response.body().byteStream()") .addStatement("return $T.parseFrom(responseStream)", outputType) diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt index 94a69d5..127470c 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt @@ -8,6 +8,9 @@ public interface RpcHelloWorld { [1] = package com.example.helloworld; +import com.flit.runtime.ErrorCode; +import com.flit.runtime.FlitException; +import java.io.InputStream; import java.lang.Exception; import java.lang.String; import java.util.Map; diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt index 2d65df2..5bb41d9 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt @@ -6,6 +6,9 @@ public interface RpcStatus { [1] = package com.example.helloworld; +import com.flit.runtime.ErrorCode; +import com.flit.runtime.FlitException; +import java.io.InputStream; import java.lang.Exception; import java.lang.String; import java.util.Map; From 46c9203e66ea01c7443cc4d51868ac3be5492be2 Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Thu, 2 Jan 2020 16:33:06 -0500 Subject: [PATCH 08/11] Adding function to the generator --- .../com/flit/protoc/gen/BaseGenerator.java | 1 - .../protoc/gen/{server => }/TypeMapper.java | 2 +- .../gen/client/BaseClientGenerator.java | 5 +- .../protoc/gen/client/ClientGenerator.java | 37 ++++++++++ .../com/flit/protoc/gen/client/Types.java | 20 ++++++ .../gen/client/okhttp/OkHttpGenerator.java | 2 +- .../gen/client/okhttp/RpcGenerator.java | 71 ++++++++++++------- .../gen/server/BaseServerGenerator.java | 1 + .../protoc/gen/server/ServiceGenerator.java | 4 +- .../gen/server/spring/RpcGenerator.java | 2 +- .../gen/server/spring/SpringGenerator.java | 2 +- .../gen/server/undertow/RpcGenerator.java | 2 +- .../server/undertow/UndertowGenerator.java | 2 +- 13 files changed, 113 insertions(+), 38 deletions(-) rename plugin/src/main/java/com/flit/protoc/gen/{server => }/TypeMapper.java (98%) create mode 100644 plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java create mode 100644 plugin/src/main/java/com/flit/protoc/gen/client/Types.java diff --git a/plugin/src/main/java/com/flit/protoc/gen/BaseGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/BaseGenerator.java index 063273b..f953c06 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/BaseGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/BaseGenerator.java @@ -1,6 +1,5 @@ package com.flit.protoc.gen; -import com.flit.protoc.gen.server.TypeMapper; import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; import com.squareup.javapoet.ClassName; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/TypeMapper.java b/plugin/src/main/java/com/flit/protoc/gen/TypeMapper.java similarity index 98% rename from plugin/src/main/java/com/flit/protoc/gen/server/TypeMapper.java rename to plugin/src/main/java/com/flit/protoc/gen/TypeMapper.java index 5a459d9..1e3598c 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/TypeMapper.java +++ b/plugin/src/main/java/com/flit/protoc/gen/TypeMapper.java @@ -1,4 +1,4 @@ -package com.flit.protoc.gen.server; +package com.flit.protoc.gen; import com.google.protobuf.DescriptorProtos; import com.squareup.javapoet.ClassName; diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java index 0fb3bf6..d5d7e3c 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/BaseClientGenerator.java @@ -3,8 +3,7 @@ import com.flit.protoc.Parameter; import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.Generator; -import com.flit.protoc.gen.server.ServiceGenerator; -import com.flit.protoc.gen.server.TypeMapper; +import com.flit.protoc.gen.TypeMapper; import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; @@ -21,7 +20,7 @@ public abstract class BaseClientGenerator implements Generator { TypeMapper mapper = new TypeMapper(request.getProtoFileList()); request.getProtoFileList().forEach(proto -> { proto.getServiceList().forEach(s -> { - files.addAll(new ServiceGenerator(proto, s, mapper).getFiles()); + files.addAll(new ClientGenerator(proto, s, mapper).getFiles()); files.addAll(getRpcGenerator(proto, s, context, mapper).getFiles()); }); }); diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java new file mode 100644 index 0000000..85be820 --- /dev/null +++ b/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java @@ -0,0 +1,37 @@ +package com.flit.protoc.gen.client; + +import com.flit.protoc.gen.BaseGenerator; +import com.flit.protoc.gen.TypeMapper; +import com.google.protobuf.DescriptorProtos; +import com.google.protobuf.compiler.PluginProtos; +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.TypeSpec; + +import javax.lang.model.element.Modifier; +import java.util.Collections; +import java.util.List; + +public class ClientGenerator extends BaseGenerator { + private final TypeSpec.Builder rpcInterface; + + public ClientGenerator(DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto s, TypeMapper mapper) { + super(proto, s, mapper); + rpcInterface = TypeSpec.interfaceBuilder(ClassName.get(javaPackage, service.getName()) + "Client"); + rpcInterface.addModifiers(Modifier.PUBLIC); + service.getMethodList().forEach(this::addDispatchMethod); + } + + private void addDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { + rpcInterface.addMethod(MethodSpec.methodBuilder("dispatch" + m.getName()) + .addParameter(mapper.get(m.getInputType()), "in") + .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) + .returns(mapper.get(m.getOutputType())) + .build()); + } + + @Override + public List getFiles() { + return Collections.singletonList(toFile(getServiceInterface(), rpcInterface.build())); + } +} diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/Types.java b/plugin/src/main/java/com/flit/protoc/gen/client/Types.java new file mode 100644 index 0000000..76c4c50 --- /dev/null +++ b/plugin/src/main/java/com/flit/protoc/gen/client/Types.java @@ -0,0 +1,20 @@ +package com.flit.protoc.gen.client; + +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.ParameterizedTypeName; + +import java.util.function.Function; + +public class Types { + public static final ClassName String = ClassName.get(String.class); + public static final ClassName OkHttpClient = ClassName.bestGuess("okhttp3.OkHttpClient"); + public static final ClassName Exception = ClassName.get(java.lang.Exception.class); + public static final ClassName RequestBody = ClassName.bestGuess("okhttp3.RequestBody"); + public static final ClassName RequestBuilder = ClassName.bestGuess("okhttp3.Request.Builder"); + public static final ClassName MediaType = ClassName.bestGuess("okhttp3.MediaType"); + public static final ClassName InputStream = ClassName.bestGuess("java.io.InputStream"); + public static final ClassName HttpUrl = ClassName.bestGuess("okhttp3.HttpUrl"); + public static final ClassName Request = ClassName.bestGuess("okhttp3.Request"); + public static final ClassName Response = ClassName.bestGuess("okhttp3.Response"); + public static final ParameterizedTypeName BeforeRequestFunction = ParameterizedTypeName.get(ClassName.bestGuess("java.util.function.Function"), ClassName.bestGuess("BeforeRequestPayload"), RequestBuilder); +} diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkHttpGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkHttpGenerator.java index 02314f6..a4ba2ec 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkHttpGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/OkHttpGenerator.java @@ -2,7 +2,7 @@ import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.client.BaseClientGenerator; -import com.flit.protoc.gen.server.TypeMapper; +import com.flit.protoc.gen.TypeMapper; import com.google.protobuf.DescriptorProtos; public class OkHttpGenerator extends BaseClientGenerator { diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java index 23de135..170ccf4 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java @@ -1,31 +1,29 @@ package com.flit.protoc.gen.client.okhttp; import com.flit.protoc.gen.BaseGenerator; -import com.flit.protoc.gen.server.TypeMapper; -import com.flit.protoc.gen.server.Types; +import com.flit.protoc.gen.TypeMapper; import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; import com.squareup.javapoet.*; -import okhttp3.*; -import java.io.InputStream; import java.util.Collections; import java.util.List; -import java.util.Map; import static com.flit.protoc.gen.server.Types.ErrorCode; import static com.flit.protoc.gen.server.Types.FlitException; import static javax.lang.model.element.Modifier.*; +import static com.flit.protoc.gen.client.Types.*; public class RpcGenerator extends BaseGenerator { private final String context; - private final TypeSpec.Builder rpcHandler; + private final TypeSpec.Builder rpcDispatcher; RpcGenerator(DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto service, String context, TypeMapper mapper) { super(proto, service, mapper); this.context = getContext(context); - rpcHandler = TypeSpec.classBuilder(getClientName(service)) + rpcDispatcher = TypeSpec.classBuilder(getClientName(service)) .addModifiers(PUBLIC); + addRequestPayload(); addStaticFields(); addInstanceFields(); addConstructor(); @@ -33,56 +31,75 @@ public class RpcGenerator extends BaseGenerator { } private ClassName getClientName(DescriptorProtos.ServiceDescriptorProto service) { - return ClassName.get(javaPackage, "Rpc" + service.getName() + "Client"); + return ClassName.get(javaPackage, "Rpc" + service.getName() + "Dispatcher"); + } + + // TODO + // add setBeforeRequest + // re-do dispatch method to call function + + private void addRequestPayload() { + // Add inner class for request payload + TypeSpec.Builder payloadBuilder = TypeSpec.classBuilder("BeforeRequestPayload").addModifiers(PUBLIC); + payloadBuilder.addMethod(MethodSpec.constructorBuilder() + .addModifiers(PUBLIC) + .addParameter(RequestBuilder, "builder") + .addParameter(HttpUrl, "url") + .addStatement("this.builder = builder") + .addStatement("this.url = url") + .build()); + payloadBuilder.addField(FieldSpec.builder(RequestBuilder, "builder").addModifiers(PUBLIC).build()); + payloadBuilder.addField(FieldSpec.builder(HttpUrl, "url").addModifiers(PUBLIC).build()); + + // Add to dispatcher + rpcDispatcher.addType(payloadBuilder.build()); } private void addStaticFields() { // Add service path prix - rpcHandler.addField(FieldSpec.builder(Types.String, "SERVICE_PATH_PREFIX") + rpcDispatcher.addField(FieldSpec.builder(String, "SERVICE_PATH_PREFIX") .addModifiers(PUBLIC, STATIC, FINAL) .initializer("\"$L/$L$L\"", context, proto.hasPackage() ? proto.getPackage() + "." : "", service.getName()) .build()); } private void addInstanceFields() { - rpcHandler.addField(FieldSpec.builder(String.class, "baseAddress").addModifiers(PRIVATE, FINAL).build()); - rpcHandler.addField(FieldSpec.builder(OkHttpClient.class, "client").build()); - rpcHandler.addField(FieldSpec.builder(Headers.class, "headers").build()); + rpcDispatcher.addField(FieldSpec.builder(String, "baseAddress").addModifiers(PRIVATE, FINAL).build()); + rpcDispatcher.addField(FieldSpec.builder(OkHttpClient, "client").addModifiers(PRIVATE).build()); + rpcDispatcher.addField(FieldSpec.builder(BeforeRequestFunction, "beforeRequest").build()); } private void addConstructor() { - rpcHandler.addMethod(MethodSpec.constructorBuilder() + rpcDispatcher.addMethod(MethodSpec.constructorBuilder() .addModifiers(PUBLIC) - .addParameter(String.class, "address") - .addParameter(OkHttpClient.class, "client") - .addParameter(Map.class, "headers") + .addParameter(String, "address") + .addParameter(OkHttpClient, "client") .addStatement("this.baseAddress = address") .addStatement("this.client = client") - .addStatement("this.headers = Headers.of(headers)") .build()); } private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { ClassName inputType = mapper.get(m.getInputType()); ClassName outputType = mapper.get(m.getOutputType()); - rpcHandler.addMethod( + rpcDispatcher.addMethod( MethodSpec.methodBuilder("dispatch" + m.getName()) - .addModifiers(PRIVATE) + .addModifiers(PUBLIC) .addParameter(inputType, "in") .returns(outputType) - .addException(Exception.class) - .addStatement("$T requestBody = $T.create(in.toByteArray(), $T.get(\"application/protobuf\"))", RequestBody.class, RequestBody.class, MediaType.class) - .addStatement("$T builder = new $T()", Request.Builder.class, Request.Builder.class) + .addException(Exception) + .addStatement("$T requestBody = $T.create(in.toByteArray(), $T.get(\"application/protobuf\"))", RequestBody, RequestBody, MediaType) + .addStatement("$T builder = new $T()", RequestBuilder, RequestBuilder) .addStatement("builder.addHeader(\"Accept\", \"application/protobuf\")") .addStatement("builder.addHeader(\"Content-Type\", \"application/protobuf\")") .addStatement("builder.addHeader(\"Flit-Version\", \"v1.1.0\")") .addStatement("builder.headers(headers)") - .addStatement("builder.url($T.parse(baseAddress + SERVICE_PATH_PREFIX + $S))", HttpUrl.class, m.getName()) + .addStatement("builder.url($T.parse(baseAddress + SERVICE_PATH_PREFIX + $S))", HttpUrl, m.getName()) .addStatement("builder.post(requestBody)") - .addStatement("$T request = builder.build()", Request.class) + .addStatement("$T request = builder.build()", Request) .addStatement("String responseString") - .addStatement("$T responseStream", InputStream.class) - .beginControlFlow("try($T response = client.newCall(request).execute())", Response.class) + .addStatement("$T responseStream", InputStream) + .beginControlFlow("try($T response = client.newCall(request).execute())", Response) .beginControlFlow("if(response.code() != 200)") .addStatement("responseString = response.body().toString()") .addStatement("throw $T.builder().withErrorCode($T.INTERNAL).withMeta(\"message\", responseString).withMessage(\"RPC error\").build()", FlitException, ErrorCode) @@ -97,6 +114,6 @@ private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { @Override public List getFiles() { - return Collections.singletonList(toFile(getClientName(service), rpcHandler.build())); + return Collections.singletonList(toFile(getClientName(service), rpcDispatcher.build())); } } diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java index 9e07c07..208f8f2 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java @@ -3,6 +3,7 @@ import com.flit.protoc.Parameter; import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.Generator; +import com.flit.protoc.gen.TypeMapper; import com.google.protobuf.DescriptorProtos.FileDescriptorProto; import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto; import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java index 7bc4749..d308580 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java @@ -1,6 +1,7 @@ package com.flit.protoc.gen.server; import com.flit.protoc.gen.BaseGenerator; +import com.flit.protoc.gen.TypeMapper; import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; import com.squareup.javapoet.ClassName; @@ -35,7 +36,8 @@ private void addHandleMethod(DescriptorProtos.MethodDescriptorProto m) { .build()); } - @Override public List getFiles() { + @Override + public List getFiles() { return Collections.singletonList(toFile(getServiceInterface(), rpcInterface.build())); } } diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java index 61b26c8..bf275bc 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java @@ -1,7 +1,7 @@ package com.flit.protoc.gen.server.spring; import com.flit.protoc.gen.BaseGenerator; -import com.flit.protoc.gen.server.TypeMapper; +import com.flit.protoc.gen.TypeMapper; import com.flit.protoc.gen.server.Types; import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/spring/SpringGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/spring/SpringGenerator.java index 2d0d36e..c5ddd3d 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/spring/SpringGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/spring/SpringGenerator.java @@ -2,7 +2,7 @@ import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.server.BaseServerGenerator; -import com.flit.protoc.gen.server.TypeMapper; +import com.flit.protoc.gen.TypeMapper; import com.google.protobuf.DescriptorProtos.FileDescriptorProto; import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/undertow/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/undertow/RpcGenerator.java index 3a8466d..6383015 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/undertow/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/undertow/RpcGenerator.java @@ -1,7 +1,7 @@ package com.flit.protoc.gen.server.undertow; import com.flit.protoc.gen.BaseGenerator; -import com.flit.protoc.gen.server.TypeMapper; +import com.flit.protoc.gen.TypeMapper; import com.flit.protoc.gen.server.Types; import com.google.protobuf.DescriptorProtos; import com.google.protobuf.compiler.PluginProtos; diff --git a/plugin/src/main/java/com/flit/protoc/gen/server/undertow/UndertowGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/server/undertow/UndertowGenerator.java index 86ddcd3..5124551 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/server/undertow/UndertowGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/server/undertow/UndertowGenerator.java @@ -2,7 +2,7 @@ import com.flit.protoc.gen.BaseGenerator; import com.flit.protoc.gen.server.BaseServerGenerator; -import com.flit.protoc.gen.server.TypeMapper; +import com.flit.protoc.gen.TypeMapper; import com.google.protobuf.DescriptorProtos.FileDescriptorProto; import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto; From 50ffb1af64f1cd9b0a6098920b903a2063573f71 Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Fri, 3 Jan 2020 09:58:43 -0500 Subject: [PATCH 09/11] Updating client class name to dispatcher and adding function generation --- README.md | 4 +- .../protoc/gen/client/ClientGenerator.java | 2 +- .../gen/client/okhttp/RpcGenerator.java | 20 ++++++-- .../okhttp/HelloworldGeneratorTest.java | 2 +- ...ldGeneratorTest.test_Generate.approved.txt | 49 +++++++++++++------ .../client/okhttp/StatusGeneratorTest.java | 2 +- ...usGeneratorTest.test_Generate.approved.txt | 38 +++++++++----- 7 files changed, 80 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 55ba922..7a5dd9d 100644 --- a/README.md +++ b/README.md @@ -42,9 +42,7 @@ To build the various components, run the following: ### Building with docker ```bash - $ docker-compose up -d - $ docker-compose run gen - gen > ./gradlew clean build pack + $ docker-compose run gen ./gradlew clean build pack ``` ### Installation diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java index 85be820..90d1f22 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java @@ -17,7 +17,7 @@ public class ClientGenerator extends BaseGenerator { public ClientGenerator(DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto s, TypeMapper mapper) { super(proto, s, mapper); - rpcInterface = TypeSpec.interfaceBuilder(ClassName.get(javaPackage, service.getName()) + "Client"); + rpcInterface = TypeSpec.interfaceBuilder(ClassName.get(javaPackage, "Rpc" + service.getName())); rpcInterface.addModifiers(Modifier.PUBLIC); service.getMethodList().forEach(this::addDispatchMethod); } diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java index 170ccf4..4a0d064 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java @@ -27,6 +27,7 @@ public class RpcGenerator extends BaseGenerator { addStaticFields(); addInstanceFields(); addConstructor(); + addBeforeRequestFunctionSetter(); service.getMethodList().forEach(this::writeDispatchMethod); } @@ -34,9 +35,15 @@ private ClassName getClientName(DescriptorProtos.ServiceDescriptorProto service) return ClassName.get(javaPackage, "Rpc" + service.getName() + "Dispatcher"); } - // TODO - // add setBeforeRequest - // re-do dispatch method to call function + private void addBeforeRequestFunctionSetter() { + rpcDispatcher.addMethod( + MethodSpec.methodBuilder("setBeforeRequest") + .addModifiers(PUBLIC) + .addParameter(BeforeRequestFunction, "beforeRequest") + .addStatement("this.beforeRequest = beforeRequest") + .build() + ); + } private void addRequestPayload() { // Add inner class for request payload @@ -88,13 +95,16 @@ private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { .addParameter(inputType, "in") .returns(outputType) .addException(Exception) + .addStatement("$T url = $T.parse(baseAddress + SERVICE_PATH_PREFIX + $S)", HttpUrl, HttpUrl, m.getName()) .addStatement("$T requestBody = $T.create(in.toByteArray(), $T.get(\"application/protobuf\"))", RequestBody, RequestBody, MediaType) .addStatement("$T builder = new $T()", RequestBuilder, RequestBuilder) + .beginControlFlow("if(beforeRequest != null)") + .addStatement("builder = beforeRequest.apply(new BeforeRequestPayload(builder, url))") + .endControlFlow() .addStatement("builder.addHeader(\"Accept\", \"application/protobuf\")") .addStatement("builder.addHeader(\"Content-Type\", \"application/protobuf\")") .addStatement("builder.addHeader(\"Flit-Version\", \"v1.1.0\")") - .addStatement("builder.headers(headers)") - .addStatement("builder.url($T.parse(baseAddress + SERVICE_PATH_PREFIX + $S))", HttpUrl, m.getName()) + .addStatement("builder.url(url)") .addStatement("builder.post(requestBody)") .addStatement("$T request = builder.build()", Request) .addStatement("String responseString") diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.java b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.java index d4ccd37..091bfac 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.java +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.java @@ -21,7 +21,7 @@ public class HelloworldGeneratorTest extends BaseGeneratorTest { assertNotNull(response); assertEquals(2, response.getFileCount()); assertEquals(response.getFile(0).getName(), "com/example/helloworld/RpcHelloWorld.java"); - assertEquals(response.getFile(1).getName(), "com/example/helloworld/RpcHelloWorldClient.java"); + assertEquals(response.getFile(1).getName(), "com/example/helloworld/RpcHelloWorldDispatcher.java"); Approvals.verifyAll("", response.getFileList().stream().map(f -> f.getContent()).collect(toList())); response.getFileList().forEach(f -> assertParses(f)); diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt index 127470c..007f591 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt @@ -1,9 +1,9 @@ [0] = package com.example.helloworld; public interface RpcHelloWorld { - Helloworld.HelloResp handleHello(Helloworld.HelloReq in); + Helloworld.HelloResp dispatchHello(Helloworld.HelloReq in); - Helloworld.HelloResp handleHelloAgain(Helloworld.HelloReq in); + Helloworld.HelloResp dispatchHelloAgain(Helloworld.HelloReq in); } [1] = package com.example.helloworld; @@ -13,8 +13,7 @@ import com.flit.runtime.FlitException; import java.io.InputStream; import java.lang.Exception; import java.lang.String; -import java.util.Map; -import okhttp3.Headers; +import java.util.function.Function; import okhttp3.HttpUrl; import okhttp3.MediaType; import okhttp3.OkHttpClient; @@ -22,29 +21,35 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -public class RpcHelloWorldClient { +public class RpcHelloWorldDispatcher { public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.HelloWorld"; private final String baseAddress; - OkHttpClient client; + private OkHttpClient client; - Headers headers; + Function beforeRequest; - public RpcHelloWorldClient(String address, OkHttpClient client, Map headers) { + public RpcHelloWorldDispatcher(String address, OkHttpClient client) { this.baseAddress = address; this.client = client; - this.headers = Headers.of(headers); } - private Helloworld.HelloResp dispatchHello(Helloworld.HelloReq in) throws Exception { + public void setBeforeRequest(Function beforeRequest) { + this.beforeRequest = beforeRequest; + } + + public Helloworld.HelloResp dispatchHello(Helloworld.HelloReq in) throws Exception { + HttpUrl url = HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "Hello"); RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf")); Request.Builder builder = new Request.Builder(); + if(beforeRequest != null) { + builder = beforeRequest.apply(new BeforeRequestPayload(builder, url)); + } builder.addHeader("Accept", "application/protobuf"); builder.addHeader("Content-Type", "application/protobuf"); builder.addHeader("Flit-Version", "v1.1.0"); - builder.headers(headers); - builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "Hello")); + builder.url(url); builder.post(requestBody); Request request = builder.build(); String responseString; @@ -60,14 +65,17 @@ public class RpcHelloWorldClient { } } - private Helloworld.HelloResp dispatchHelloAgain(Helloworld.HelloReq in) throws Exception { + public Helloworld.HelloResp dispatchHelloAgain(Helloworld.HelloReq in) throws Exception { + HttpUrl url = HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "HelloAgain"); RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf")); Request.Builder builder = new Request.Builder(); + if(beforeRequest != null) { + builder = beforeRequest.apply(new BeforeRequestPayload(builder, url)); + } builder.addHeader("Accept", "application/protobuf"); builder.addHeader("Content-Type", "application/protobuf"); builder.addHeader("Flit-Version", "v1.1.0"); - builder.headers(headers); - builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "HelloAgain")); + builder.url(url); builder.post(requestBody); Request request = builder.build(); String responseString; @@ -82,5 +90,16 @@ public class RpcHelloWorldClient { } } } + + public class BeforeRequestPayload { + public Request.Builder builder; + + public HttpUrl url; + + public BeforeRequestPayload(Request.Builder builder, HttpUrl url) { + this.builder = builder; + this.url = url; + } + } } diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.java b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.java index 858ab7e..7f35253 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.java +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.java @@ -25,7 +25,7 @@ public class StatusGeneratorTest extends BaseGeneratorTest { assertEquals(2, response.getFileCount()); assertEquals(response.getFile(0).getName(), "com/example/helloworld/RpcStatus.java"); - assertEquals(response.getFile(1).getName(), "com/example/helloworld/RpcStatusClient.java"); + assertEquals(response.getFile(1).getName(), "com/example/helloworld/RpcStatusDispatcher.java"); Approvals.verifyAll("", response.getFileList().stream().map(f -> f.getContent()).collect(toList())); response.getFileList().forEach(f -> assertParses(f)); diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt index 5bb41d9..03c9c7e 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt @@ -1,7 +1,7 @@ [0] = package com.example.helloworld; public interface RpcStatus { - StatusOuterClass.StatusResponse handleGetStatus(Core.Empty in); + StatusOuterClass.StatusResponse dispatchGetStatus(Core.Empty in); } [1] = package com.example.helloworld; @@ -11,8 +11,7 @@ import com.flit.runtime.FlitException; import java.io.InputStream; import java.lang.Exception; import java.lang.String; -import java.util.Map; -import okhttp3.Headers; +import java.util.function.Function; import okhttp3.HttpUrl; import okhttp3.MediaType; import okhttp3.OkHttpClient; @@ -20,29 +19,35 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -public class RpcStatusClient { +public class RpcStatusDispatcher { public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.Status"; private final String baseAddress; - OkHttpClient client; + private OkHttpClient client; - Headers headers; + Function beforeRequest; - public RpcStatusClient(String address, OkHttpClient client, Map headers) { + public RpcStatusDispatcher(String address, OkHttpClient client) { this.baseAddress = address; this.client = client; - this.headers = Headers.of(headers); } - private StatusOuterClass.StatusResponse dispatchGetStatus(Core.Empty in) throws Exception { + public void setBeforeRequest(Function beforeRequest) { + this.beforeRequest = beforeRequest; + } + + public StatusOuterClass.StatusResponse dispatchGetStatus(Core.Empty in) throws Exception { + HttpUrl url = HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "GetStatus"); RequestBody requestBody = RequestBody.create(in.toByteArray(), MediaType.get("application/protobuf")); Request.Builder builder = new Request.Builder(); + if(beforeRequest != null) { + builder = beforeRequest.apply(new BeforeRequestPayload(builder, url)); + } builder.addHeader("Accept", "application/protobuf"); builder.addHeader("Content-Type", "application/protobuf"); builder.addHeader("Flit-Version", "v1.1.0"); - builder.headers(headers); - builder.url(HttpUrl.parse(baseAddress + SERVICE_PATH_PREFIX + "GetStatus")); + builder.url(url); builder.post(requestBody); Request request = builder.build(); String responseString; @@ -57,5 +62,16 @@ public class RpcStatusClient { } } } + + public class BeforeRequestPayload { + public Request.Builder builder; + + public HttpUrl url; + + public BeforeRequestPayload(Request.Builder builder, HttpUrl url) { + this.builder = builder; + this.url = url; + } + } } From 42b3e5dad77ddcd30cc3552c3755e850284cabfe Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Fri, 3 Jan 2020 11:55:32 -0500 Subject: [PATCH 10/11] Adding exception to generated client dispatcher interface --- README.md | 2 +- .../com/flit/protoc/gen/client/ClientGenerator.java | 1 + .../flit/protoc/gen/client/okhttp/RpcGenerator.java | 10 +++++----- .../HelloworldGeneratorTest.test_Generate.approved.txt | 6 ++++-- .../StatusGeneratorTest.test_Generate.approved.txt | 4 +++- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7a5dd9d..cf85655 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ The flit plugin accepts the following plugin parameters: | Name | Required | Type | Description | |:--------------|:---------:|:------------------------------|:----------------------------------------------------------| -| `target` | Y | `enum[server]` | The type of target to generate e.g. server, client etc | +| `target` | Y | `enum[server,client]` | The type of target to generate e.g. server, client etc | | `type` | Y | `enum[spring,undertow,boot]` | Type of target to generate | | `context` | N | `string` | Base context for routing, default is `/twirp` | diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java index 90d1f22..46db9df 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/ClientGenerator.java @@ -27,6 +27,7 @@ private void addDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { .addParameter(mapper.get(m.getInputType()), "in") .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) .returns(mapper.get(m.getOutputType())) + .addException(Exception.class) .build()); } diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java index 4a0d064..d8c5334 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java @@ -37,11 +37,11 @@ private ClassName getClientName(DescriptorProtos.ServiceDescriptorProto service) private void addBeforeRequestFunctionSetter() { rpcDispatcher.addMethod( - MethodSpec.methodBuilder("setBeforeRequest") - .addModifiers(PUBLIC) - .addParameter(BeforeRequestFunction, "beforeRequest") - .addStatement("this.beforeRequest = beforeRequest") - .build() + MethodSpec.methodBuilder("setBeforeRequest") + .addModifiers(PUBLIC) + .addParameter(BeforeRequestFunction, "beforeRequest") + .addStatement("this.beforeRequest = beforeRequest") + .build() ); } diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt index 007f591..a079806 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt @@ -1,9 +1,11 @@ [0] = package com.example.helloworld; +import java.lang.Exception; + public interface RpcHelloWorld { - Helloworld.HelloResp dispatchHello(Helloworld.HelloReq in); + Helloworld.HelloResp dispatchHello(Helloworld.HelloReq in) throws Exception; - Helloworld.HelloResp dispatchHelloAgain(Helloworld.HelloReq in); + Helloworld.HelloResp dispatchHelloAgain(Helloworld.HelloReq in) throws Exception; } [1] = package com.example.helloworld; diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt index 03c9c7e..b2a8b47 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt @@ -1,7 +1,9 @@ [0] = package com.example.helloworld; +import java.lang.Exception; + public interface RpcStatus { - StatusOuterClass.StatusResponse dispatchGetStatus(Core.Empty in); + StatusOuterClass.StatusResponse dispatchGetStatus(Core.Empty in) throws Exception; } [1] = package com.example.helloworld; From b5c7f178126da2571a86a3e6c6831ef122bd9fda Mon Sep 17 00:00:00 2001 From: Chris Sandison Date: Tue, 21 Jan 2020 13:14:11 -0500 Subject: [PATCH 11/11] Small chnages to generated code, updated readme --- README.md | 2 +- .../com/flit/protoc/gen/client/okhttp/RpcGenerator.java | 4 ++-- .../HelloworldGeneratorTest.test_Generate.approved.txt | 6 +++--- .../okhttp/StatusGeneratorTest.test_Generate.approved.txt | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index cf85655..3b847ba 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ To build the various components, run the following: ### Building with docker ```bash - $ docker-compose run gen ./gradlew clean build pack + $ docker-compose run gen ./gradlew build pack ``` ### Installation diff --git a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java index d8c5334..6f8221f 100644 --- a/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java +++ b/plugin/src/main/java/com/flit/protoc/gen/client/okhttp/RpcGenerator.java @@ -66,7 +66,7 @@ private void addStaticFields() { // Add service path prix rpcDispatcher.addField(FieldSpec.builder(String, "SERVICE_PATH_PREFIX") .addModifiers(PUBLIC, STATIC, FINAL) - .initializer("\"$L/$L$L\"", context, proto.hasPackage() ? proto.getPackage() + "." : "", service.getName()) + .initializer("\"$L/$L$L/\"", context, proto.hasPackage() ? proto.getPackage() + "." : "", service.getName()) .build()); } @@ -111,7 +111,7 @@ private void writeDispatchMethod(DescriptorProtos.MethodDescriptorProto m) { .addStatement("$T responseStream", InputStream) .beginControlFlow("try($T response = client.newCall(request).execute())", Response) .beginControlFlow("if(response.code() != 200)") - .addStatement("responseString = response.body().toString()") + .addStatement("responseString = response.body().string()") .addStatement("throw $T.builder().withErrorCode($T.INTERNAL).withMeta(\"message\", responseString).withMessage(\"RPC error\").build()", FlitException, ErrorCode) .nextControlFlow("else") .addStatement("responseStream = response.body().byteStream()") diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt index a079806..60f839e 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/HelloworldGeneratorTest.test_Generate.approved.txt @@ -24,7 +24,7 @@ import okhttp3.RequestBody; import okhttp3.Response; public class RpcHelloWorldDispatcher { - public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.HelloWorld"; + public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.HelloWorld/"; private final String baseAddress; @@ -58,7 +58,7 @@ public class RpcHelloWorldDispatcher { InputStream responseStream; try(Response response = client.newCall(request).execute()) { if(response.code() != 200) { - responseString = response.body().toString(); + responseString = response.body().string(); throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); } else { responseStream = response.body().byteStream(); @@ -84,7 +84,7 @@ public class RpcHelloWorldDispatcher { InputStream responseStream; try(Response response = client.newCall(request).execute()) { if(response.code() != 200) { - responseString = response.body().toString(); + responseString = response.body().string(); throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); } else { responseStream = response.body().byteStream(); diff --git a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt index b2a8b47..ef7e9f7 100644 --- a/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt +++ b/plugin/src/test/java/com/flit/protoc/gen/client/okhttp/StatusGeneratorTest.test_Generate.approved.txt @@ -22,7 +22,7 @@ import okhttp3.RequestBody; import okhttp3.Response; public class RpcStatusDispatcher { - public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.Status"; + public static final String SERVICE_PATH_PREFIX = "/twirp/com.example.helloworld.Status/"; private final String baseAddress; @@ -56,7 +56,7 @@ public class RpcStatusDispatcher { InputStream responseStream; try(Response response = client.newCall(request).execute()) { if(response.code() != 200) { - responseString = response.body().toString(); + responseString = response.body().string(); throw FlitException.builder().withErrorCode(ErrorCode.INTERNAL).withMeta("message", responseString).withMessage("RPC error").build(); } else { responseStream = response.body().byteStream();