Skip to content

Commit 3a4eece

Browse files
authored
Optionally pass request to service interface (#7)
1 parent 99a203f commit 3a4eece

21 files changed

Lines changed: 554 additions & 68 deletions

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,12 @@ The plugin is executed as part of a protoc compilation step:
6666

6767
The flit plugin accepts the following plugin parameters:
6868

69-
| Name | Required | Type | Description |
70-
|:--------------|:---------:|:----------------------------------|:----------------------------------------------------------|
71-
| `target` | Y | `enum[server]` | The type of target to generate e.g. server, client etc |
72-
| `type` | Y | `enum[spring,undertow,boot,jaxrs]`| Type of target to generate |
73-
| `context` | N | `string` | Base context for routing, default is `/twirp` |
69+
| Name | Required | Type | Description |
70+
|:----------|:---------:|:----------------------------------|:-------------------------------------------------------|
71+
| `target` | Y | `enum[server]` | The type of target to generate e.g. server, client etc |
72+
| `type` | Y | `enum[spring,undertow,boot,jaxrs]`| Type of target to generate |
73+
| `context` | N | `string` | Base context for routing, default is `/twirp` |
74+
| `request` | N | `string` | If the request parameter should pass to the service |
7475

7576
# Development
7677

plugin/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=1.2.0
1+
version=1.2.1

plugin/src/main/java/com/flit/protoc/Parameter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
package com.flit.protoc;
22

33
import com.flit.protoc.gen.GeneratorException;
4-
import lombok.Getter;
5-
import lombok.ToString;
6-
74
import java.util.Arrays;
85
import java.util.Map;
96
import java.util.function.Function;
107
import java.util.stream.Collectors;
8+
import lombok.Getter;
9+
import lombok.ToString;
1110

1211
@Getter @ToString public class Parameter {
1312

1413
public static final String PARAM_TARGET = "target";
1514
public static final String PARAM_CLIENT = "client";
1615
public static final String PARAM_TYPE = "type";
1716
public static final String PARAM_CONTEXT = "context";
17+
public static final String PARAM_REQUEST = "request";
1818

19-
private String key;
20-
private String value;
19+
private final String key;
20+
private final String value;
2121

2222
public Parameter(String[] strings) {
2323
this.key = strings[0];

plugin/src/main/java/com/flit/protoc/Plugin.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package com.flit.protoc;
22

3+
import static com.flit.protoc.Parameter.PARAM_REQUEST;
4+
import static com.flit.protoc.Parameter.PARAM_TARGET;
5+
import static com.flit.protoc.Parameter.PARAM_TYPE;
6+
37
import com.flit.protoc.gen.Generator;
48
import com.flit.protoc.gen.GeneratorException;
59
import com.flit.protoc.gen.server.jaxrs.JaxrsGenerator;
610
import com.flit.protoc.gen.server.spring.SpringGenerator;
711
import com.flit.protoc.gen.server.undertow.UndertowGenerator;
812
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest;
913
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse;
10-
14+
import java.util.Arrays;
15+
import java.util.Collections;
16+
import java.util.List;
1117
import java.util.Map;
1218

13-
import static com.flit.protoc.Parameter.PARAM_TARGET;
14-
import static com.flit.protoc.Parameter.PARAM_TYPE;
15-
1619
public class Plugin {
1720

1821
private final CodeGeneratorRequest request;
@@ -23,7 +26,9 @@ public Plugin(CodeGeneratorRequest request) {
2326

2427
public CodeGeneratorResponse process() {
2528
if (!request.hasParameter()) {
26-
return CodeGeneratorResponse.newBuilder().setError("Usage: --flit_out=target=server,type=[spring|undertow|jaxrs]:<PATH>").build();
29+
return CodeGeneratorResponse.newBuilder()
30+
.setError("Usage: --flit_out=target=server,type=[spring|undertow|jaxrs][,request=[class(es)]]:<PATH>")
31+
.build();
2732
}
2833

2934
Map<String, Parameter> params = Parameter.of(request.getParameter());
@@ -43,21 +48,31 @@ private Generator resolveGenerator(Map<String, Parameter> params) {
4348
if (!params.containsKey(PARAM_TYPE)) {
4449
throw new GeneratorException("No argument specified for type");
4550
}
51+
List<String> requestServices = getRequestServices(params);
4652
switch (params.get(PARAM_TARGET).getValue()) {
4753
case "server":
4854
switch (params.get(PARAM_TYPE).getValue()) {
4955
case "boot":
5056
case "spring":
51-
return new SpringGenerator();
57+
return new SpringGenerator(requestServices);
5258
case "undertow":
53-
return new UndertowGenerator();
59+
return new UndertowGenerator(requestServices);
5460
case "jaxrs":
55-
return new JaxrsGenerator();
61+
return new JaxrsGenerator(requestServices);
5662
default:
5763
throw new GeneratorException("Unknown server type: " + params.get(PARAM_TYPE).getValue());
5864
}
5965
default:
6066
throw new GeneratorException("Unknown target type: " + params.get(PARAM_TARGET).getValue());
6167
}
6268
}
69+
70+
private List<String> getRequestServices(Map<String, Parameter> params) {
71+
Parameter requestServices = params.get(PARAM_REQUEST);
72+
if (requestServices == null) {
73+
return Collections.emptyList();
74+
} else {
75+
return Arrays.asList(requestServices.getValue().split(","));
76+
}
77+
}
6378
}

plugin/src/main/java/com/flit/protoc/gen/server/BaseServerGenerator.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package com.flit.protoc.gen.server;
22

3+
import static com.flit.protoc.Parameter.PARAM_CONTEXT;
4+
35
import com.flit.protoc.Parameter;
46
import com.flit.protoc.gen.Generator;
57
import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
68
import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto;
79
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest;
810
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse;
9-
11+
import com.squareup.javapoet.TypeName;
1012
import java.util.ArrayList;
1113
import java.util.List;
1214
import java.util.Map;
1315

14-
import static com.flit.protoc.Parameter.PARAM_CONTEXT;
15-
1616
/**
1717
* Implements the basic "generate a service interface + impl dispatcher".
1818
*
@@ -21,13 +21,19 @@
2121
*/
2222
public abstract class BaseServerGenerator implements Generator {
2323

24+
private final List<String> requestServices;
25+
26+
protected BaseServerGenerator(List<String> requestServices) {
27+
this.requestServices = requestServices;
28+
}
29+
2430
@Override public List<CodeGeneratorResponse.File> generate(CodeGeneratorRequest request, Map<String, Parameter> params) {
2531
List<CodeGeneratorResponse.File> files = new ArrayList<>();
2632
String context = getContext(params);
2733
TypeMapper mapper = new TypeMapper(request.getProtoFileList());
2834
request.getProtoFileList().forEach(proto -> {
2935
proto.getServiceList().forEach(s -> {
30-
files.addAll(new ServiceGenerator(proto, s, mapper).getFiles());
36+
files.addAll(new ServiceGenerator(proto, s, mapper, isRequestBasedClass(s), getHttpRequestTypeName()).getFiles());
3137
files.addAll(getRpcGenerator(proto, s, context, mapper).getFiles());
3238
});
3339
});
@@ -41,5 +47,11 @@ private static String getContext(Map<String, Parameter> params) {
4147
return null;
4248
}
4349

50+
protected boolean isRequestBasedClass(ServiceDescriptorProto service) {
51+
return requestServices.contains(service.getName());
52+
}
53+
4454
protected abstract BaseGenerator getRpcGenerator(FileDescriptorProto proto, ServiceDescriptorProto service, String context, TypeMapper mapper);
55+
56+
protected abstract TypeName getHttpRequestTypeName();
4557
}

plugin/src/main/java/com/flit/protoc/gen/server/ServiceGenerator.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,48 @@
44
import com.google.protobuf.compiler.PluginProtos;
55
import com.squareup.javapoet.ClassName;
66
import com.squareup.javapoet.MethodSpec;
7+
import com.squareup.javapoet.TypeName;
78
import com.squareup.javapoet.TypeSpec;
8-
9-
import javax.lang.model.element.Modifier;
109
import java.util.Collections;
1110
import java.util.List;
11+
import javax.lang.model.element.Modifier;
1212

1313
/**
1414
* Generates the `Rpc${SerivceName}` interface.
1515
*
16-
* Currently this is the same interface across both undertow and spring.
16+
* Currently, this is the same interface across both undertow and spring.
1717
*/
1818
public class ServiceGenerator extends BaseGenerator {
1919

2020
private final TypeSpec.Builder rpcInterface;
21+
private final boolean passRequest;
22+
private final TypeName httpRequestType;
2123

22-
public ServiceGenerator(DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto s, TypeMapper mapper) {
24+
public ServiceGenerator(
25+
DescriptorProtos.FileDescriptorProto proto,
26+
DescriptorProtos.ServiceDescriptorProto s,
27+
TypeMapper mapper,
28+
boolean passRequest,
29+
TypeName httpRequestType
30+
) {
2331
super(proto, s, mapper);
32+
this.passRequest = passRequest;
33+
this.httpRequestType = httpRequestType;
2434
rpcInterface = TypeSpec.interfaceBuilder(ClassName.get(javaPackage, "Rpc" + service.getName()));
2535
rpcInterface.addModifiers(Modifier.PUBLIC);
2636
service.getMethodList().forEach(this::addHandleMethod);
2737
}
2838

2939
private void addHandleMethod(DescriptorProtos.MethodDescriptorProto m) {
30-
rpcInterface.addMethod(MethodSpec.methodBuilder("handle" + m.getName())
40+
MethodSpec.Builder builder = MethodSpec.methodBuilder("handle" + m.getName());
41+
if (passRequest) {
42+
builder.addParameter(httpRequestType, "request");
43+
}
44+
builder
3145
.addParameter(mapper.get(m.getInputType()), "in")
3246
.addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
33-
.returns(mapper.get(m.getOutputType()))
34-
.build());
47+
.returns(mapper.get(m.getOutputType()));
48+
rpcInterface.addMethod(builder.build());
3549
}
3650

3751
@Override public List<PluginProtos.CodeGeneratorResponse.File> getFiles() {
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,29 @@
11
package com.flit.protoc.gen.server.jaxrs;
22

3+
import static com.flit.protoc.gen.server.jaxrs.RpcGenerator.HttpServletRequest;
4+
35
import com.flit.protoc.gen.server.BaseGenerator;
46
import com.flit.protoc.gen.server.BaseServerGenerator;
57
import com.flit.protoc.gen.server.TypeMapper;
68
import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
79
import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto;
10+
import com.squareup.javapoet.TypeName;
11+
import java.util.List;
812

913
public class JaxrsGenerator extends BaseServerGenerator {
1014

15+
public JaxrsGenerator(List<String> requestServices) {
16+
super(requestServices);
17+
}
18+
1119
@Override
1220
protected BaseGenerator getRpcGenerator(FileDescriptorProto proto, ServiceDescriptorProto service,
1321
String context, TypeMapper mapper) {
14-
return new RpcGenerator(proto, service, context, mapper);
22+
return new RpcGenerator(proto, service, context, mapper, isRequestBasedClass(service));
23+
}
24+
25+
@Override
26+
protected TypeName getHttpRequestTypeName() {
27+
return HttpServletRequest;
1528
}
1629
}

plugin/src/main/java/com/flit/protoc/gen/server/jaxrs/RpcGenerator.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,18 @@ public class RpcGenerator extends BaseGenerator {
2929
public static final ClassName HttpServletResponse = ClassName.bestGuess("javax.servlet.http.HttpServletResponse");
3030
private final String context;
3131
private final Builder rpcResource;
32+
private final boolean passRequest;
3233

33-
RpcGenerator(DescriptorProtos.FileDescriptorProto proto,
34-
DescriptorProtos.ServiceDescriptorProto service, String context, TypeMapper mapper) {
34+
RpcGenerator(
35+
DescriptorProtos.FileDescriptorProto proto,
36+
DescriptorProtos.ServiceDescriptorProto service,
37+
String context,
38+
TypeMapper mapper,
39+
boolean passRequest
40+
) {
3541
super(proto, service, mapper);
3642
this.context = getContext(context);
43+
this.passRequest = passRequest;
3744
this.rpcResource = TypeSpec.classBuilder(getResourceName(service))
3845
.addModifiers(Modifier.PUBLIC)
3946
.addAnnotation(
@@ -84,7 +91,7 @@ private void addHandleMethod(MethodDescriptorProto mdp) {
8491
.addStatement("return")
8592
.endControlFlow()
8693
// route to the service
87-
.addStatement("$T retval = service.handle$L(data)", outputType, mdp.getName())
94+
.addStatement(getRouteToService(), outputType, mdp.getName())
8895
.addStatement("response.setStatus(200)")
8996
// send the response
9097
.beginControlFlow("if (json)")
@@ -100,6 +107,14 @@ private void addHandleMethod(MethodDescriptorProto mdp) {
100107
.build());
101108
}
102109

110+
private String getRouteToService() {
111+
if (passRequest) {
112+
return "$T retval = service.handle$L(request, data)";
113+
} else {
114+
return "$T retval = service.handle$L(data)";
115+
}
116+
}
117+
103118
private ClassName getResourceName(DescriptorProtos.ServiceDescriptorProto service) {
104119
return ClassName.get(javaPackage, "Rpc" + service.getName() + "Resource");
105120
}

plugin/src/main/java/com/flit/protoc/gen/server/spring/RpcGenerator.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,18 @@ class RpcGenerator extends BaseGenerator {
2222

2323
private final String context;
2424
private final TypeSpec.Builder rpcController;
25+
private final boolean passRequest;
2526

26-
RpcGenerator(DescriptorProtos.FileDescriptorProto proto, DescriptorProtos.ServiceDescriptorProto service, String context, TypeMapper mapper) {
27+
RpcGenerator(
28+
DescriptorProtos.FileDescriptorProto proto,
29+
DescriptorProtos.ServiceDescriptorProto service,
30+
String context,
31+
TypeMapper mapper,
32+
boolean passRequest
33+
) {
2734
super(proto, service, mapper);
2835
this.context = getContext(context);
36+
this.passRequest = passRequest;
2937
rpcController = TypeSpec.classBuilder(getControllerName()).addModifiers(Modifier.PUBLIC).addAnnotation(RestController);
3038
addInstanceFields();
3139
service.getMethodList().forEach(this::addHandleMethod);
@@ -63,7 +71,7 @@ private void addHandleMethod(DescriptorProtos.MethodDescriptorProto m) {
6371
.addStatement("return")
6472
.endControlFlow()
6573
// route to the service
66-
.addStatement("$T retval = service.handle$L(data)", outputType, m.getName())
74+
.addStatement(getRouteToService(), outputType, m.getName())
6775
.addStatement("response.setStatus(200)")
6876
// send the response
6977
.beginControlFlow("if (json)")
@@ -76,7 +84,14 @@ private void addHandleMethod(DescriptorProtos.MethodDescriptorProto m) {
7684
.addStatement("retval.writeTo(response.getOutputStream())")
7785
.endControlFlow()
7886
.build());
87+
}
7988

89+
private String getRouteToService() {
90+
if (passRequest) {
91+
return "$T retval = service.handle$L(request, data)";
92+
} else {
93+
return "$T retval = service.handle$L(data)";
94+
}
8095
}
8196

8297
private ClassName getControllerName() {
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,32 @@
11
package com.flit.protoc.gen.server.spring;
22

3+
import static com.flit.protoc.gen.server.spring.RpcGenerator.HttpServletRequest;
4+
35
import com.flit.protoc.gen.server.BaseGenerator;
46
import com.flit.protoc.gen.server.BaseServerGenerator;
57
import com.flit.protoc.gen.server.TypeMapper;
68
import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
79
import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto;
10+
import com.squareup.javapoet.TypeName;
11+
import java.util.List;
812

913
/**
1014
* Spring specific generator that will output MVC style routes.
1115
*/
1216
public class SpringGenerator extends BaseServerGenerator {
1317

14-
@Override protected BaseGenerator getRpcGenerator(
18+
public SpringGenerator(List<String> requestServices) {
19+
super(requestServices);
20+
}
21+
22+
@Override
23+
protected BaseGenerator getRpcGenerator(
1524
FileDescriptorProto proto, ServiceDescriptorProto service, String context, TypeMapper mapper) {
16-
return new RpcGenerator(proto, service, context, mapper);
25+
return new RpcGenerator(proto, service, context, mapper, isRequestBasedClass(service));
1726
}
1827

28+
@Override
29+
protected TypeName getHttpRequestTypeName() {
30+
return HttpServletRequest;
31+
}
1932
}

0 commit comments

Comments
 (0)