Skip to content

Commit 13211d6

Browse files
committed
Simplify jax-rs resource (removes the protobuf message provider)
1 parent 8381062 commit 13211d6

File tree

4 files changed

+134
-147
lines changed

4 files changed

+134
-147
lines changed

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

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.flit.protoc.gen.server.BaseGenerator;
44
import com.flit.protoc.gen.server.TypeMapper;
5+
import com.flit.protoc.gen.server.Types;
56
import com.google.common.net.MediaType;
67
import com.google.protobuf.DescriptorProtos;
78
import com.google.protobuf.DescriptorProtos.MethodDescriptorProto;
@@ -10,6 +11,7 @@
1011
import com.squareup.javapoet.ClassName;
1112
import com.squareup.javapoet.FieldSpec;
1213
import com.squareup.javapoet.MethodSpec;
14+
import com.squareup.javapoet.ParameterSpec;
1315
import com.squareup.javapoet.TypeSpec;
1416
import com.squareup.javapoet.TypeSpec.Builder;
1517
import java.util.Collections;
@@ -22,6 +24,9 @@ public class RpcGenerator extends BaseGenerator {
2224
public static final ClassName POST = ClassName.bestGuess("javax.ws.rs.POST");
2325
public static final ClassName PRODUCES = ClassName.bestGuess("javax.ws.rs.Produces");
2426
public static final ClassName CONSUMES = ClassName.bestGuess("javax.ws.rs.Consumes");
27+
public static final ClassName CONTEXT = ClassName.bestGuess("javax.ws.rs.core.Context");
28+
public static final ClassName HttpServletRequest = ClassName.bestGuess("javax.servlet.http.HttpServletRequest");
29+
public static final ClassName HttpServletResponse = ClassName.bestGuess("javax.servlet.http.HttpServletResponse");
2530
private final String context;
2631
private final Builder rpcResource;
2732

@@ -49,23 +54,49 @@ private void addConstructor() {
4954

5055
private void addHandleMethod(MethodDescriptorProto mdp) {
5156
ClassName inputType = mapper.get(mdp.getInputType());
57+
ClassName outputType = mapper.get(mdp.getOutputType());
5258
rpcResource.addMethod(MethodSpec.methodBuilder("handle" + mdp.getName())
5359
.addModifiers(Modifier.PUBLIC)
5460
.addAnnotation(POST)
5561
.addAnnotation(AnnotationSpec.builder(PATH)
5662
.addMember("value", "$S", "/" + mdp.getName())
5763
.build())
58-
.addAnnotation(AnnotationSpec.builder(PRODUCES)
59-
.addMember("value", "$S", MediaType.PROTOBUF.toString())
60-
.addMember("value", "$S", MediaType.JSON_UTF_8.toString())
61-
.build())
62-
.addAnnotation(AnnotationSpec.builder(CONSUMES)
63-
.addMember("value", "$S", MediaType.PROTOBUF.toString())
64-
.addMember("value", "$S", MediaType.JSON_UTF_8.toString())
65-
.build())
66-
.addParameter(inputType, "request")
67-
.addStatement("return Response.ok(service.handle$L(request)).build()", mdp.getName())
68-
.returns(ClassName.bestGuess("javax.ws.rs.core.Response"))
64+
.addParameter(ParameterSpec.builder(HttpServletRequest, "request")
65+
.addAnnotation(CONTEXT).build())
66+
.addParameter(ParameterSpec.builder(HttpServletResponse, "response")
67+
.addAnnotation(CONTEXT).build())
68+
.addException(Types.Exception)
69+
.addStatement("boolean json = false")
70+
.addStatement("final $T data", inputType)
71+
.beginControlFlow("if (request.getContentType().equals($S))", MediaType.PROTOBUF.toString())
72+
.addStatement("data = $T.parseFrom(request.getInputStream())", inputType)
73+
.nextControlFlow("else if (request.getContentType().startsWith($S))", "application/json")
74+
.addStatement("json = true")
75+
.addStatement("$T.Builder builder = $T.newBuilder()", inputType, inputType)
76+
.addStatement("$T.parser().merge(new $T(request.getInputStream(), $T.UTF_8), builder)",
77+
Types.JsonFormat,
78+
Types.InputStreamReader,
79+
Types.StandardCharsets)
80+
.addStatement("data = builder.build()")
81+
.nextControlFlow("else")
82+
.addStatement("response.setStatus(415)")
83+
.addStatement("response.flushBuffer()")
84+
.addStatement("return")
85+
.endControlFlow()
86+
// route to the service
87+
.addStatement("$T retval = service.handle$L(data)", outputType, mdp.getName())
88+
.addStatement("response.setStatus(200)")
89+
// send the response
90+
.beginControlFlow("if (json)")
91+
.addStatement("response.setContentType($S)", MediaType.JSON_UTF_8.toString())
92+
.addStatement("response.getOutputStream().write($T.printer().omittingInsignificantWhitespace().print(retval).getBytes($T.UTF_8))",
93+
Types.JsonFormat,
94+
Types.StandardCharsets)
95+
.nextControlFlow("else")
96+
.addStatement("response.setContentType($S)", MediaType.PROTOBUF.toString())
97+
.addStatement("retval.writeTo(response.getOutputStream())")
98+
.endControlFlow()
99+
.addStatement("response.flushBuffer()")
69100
.build());
70101
}
71102

plugin/src/test/java/com/flit/protoc/gen/server/jaxrs/HelloworldGeneratorTest.test_Generate.approved.txt

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@ public interface RpcHelloWorld {
88

99
[1] = package com.example.helloworld;
1010

11-
import javax.ws.rs.Consumes;
11+
import com.google.protobuf.util.JsonFormat;
12+
import java.io.InputStreamReader;
13+
import java.lang.Exception;
14+
import java.nio.charset.StandardCharsets;
15+
import javax.servlet.http.HttpServletRequest;
16+
import javax.servlet.http.HttpServletResponse;
1217
import javax.ws.rs.POST;
1318
import javax.ws.rs.Path;
14-
import javax.ws.rs.Produces;
15-
import javax.ws.rs.core.Response;
19+
import javax.ws.rs.core.Context;
1620

1721
@Path("/twirp/com.example.helloworld.HelloWorld")
1822
public class RpcHelloWorldResource {
@@ -24,30 +28,62 @@ public class RpcHelloWorldResource {
2428

2529
@POST
2630
@Path("/Hello")
27-
@Produces({
28-
"application/protobuf",
29-
"application/json; charset=utf-8"
30-
})
31-
@Consumes({
32-
"application/protobuf",
33-
"application/json; charset=utf-8"
34-
})
35-
public Response handleHello(Helloworld.HelloReq request) {
36-
return Response.ok(service.handleHello(request)).build();
31+
public void handleHello(@Context HttpServletRequest request,
32+
@Context HttpServletResponse response) throws Exception {
33+
boolean json = false;
34+
final Helloworld.HelloReq data;
35+
if (request.getContentType().equals("application/protobuf")) {
36+
data = Helloworld.HelloReq.parseFrom(request.getInputStream());
37+
} else if (request.getContentType().startsWith("application/json")) {
38+
json = true;
39+
Helloworld.HelloReq.Builder builder = Helloworld.HelloReq.newBuilder();
40+
JsonFormat.parser().merge(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8), builder);
41+
data = builder.build();
42+
} else {
43+
response.setStatus(415);
44+
response.flushBuffer();
45+
return;
46+
}
47+
Helloworld.HelloResp retval = service.handleHello(data);
48+
response.setStatus(200);
49+
if (json) {
50+
response.setContentType("application/json; charset=utf-8");
51+
response.getOutputStream().write(JsonFormat.printer().omittingInsignificantWhitespace().print(retval).getBytes(StandardCharsets.UTF_8));
52+
} else {
53+
response.setContentType("application/protobuf");
54+
retval.writeTo(response.getOutputStream());
55+
}
56+
response.flushBuffer();
3757
}
3858

3959
@POST
4060
@Path("/HelloAgain")
41-
@Produces({
42-
"application/protobuf",
43-
"application/json; charset=utf-8"
44-
})
45-
@Consumes({
46-
"application/protobuf",
47-
"application/json; charset=utf-8"
48-
})
49-
public Response handleHelloAgain(Helloworld.HelloReq request) {
50-
return Response.ok(service.handleHelloAgain(request)).build();
61+
public void handleHelloAgain(@Context HttpServletRequest request,
62+
@Context HttpServletResponse response) throws Exception {
63+
boolean json = false;
64+
final Helloworld.HelloReq data;
65+
if (request.getContentType().equals("application/protobuf")) {
66+
data = Helloworld.HelloReq.parseFrom(request.getInputStream());
67+
} else if (request.getContentType().startsWith("application/json")) {
68+
json = true;
69+
Helloworld.HelloReq.Builder builder = Helloworld.HelloReq.newBuilder();
70+
JsonFormat.parser().merge(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8), builder);
71+
data = builder.build();
72+
} else {
73+
response.setStatus(415);
74+
response.flushBuffer();
75+
return;
76+
}
77+
Helloworld.HelloResp retval = service.handleHelloAgain(data);
78+
response.setStatus(200);
79+
if (json) {
80+
response.setContentType("application/json; charset=utf-8");
81+
response.getOutputStream().write(JsonFormat.printer().omittingInsignificantWhitespace().print(retval).getBytes(StandardCharsets.UTF_8));
82+
} else {
83+
response.setContentType("application/protobuf");
84+
retval.writeTo(response.getOutputStream());
85+
}
86+
response.flushBuffer();
5187
}
5288
}
5389

plugin/src/test/java/com/flit/protoc/gen/server/jaxrs/StatusGeneratorTest.test_Generate.approved.txt

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ public interface RpcStatus {
66

77
[1] = package com.example.helloworld;
88

9-
import javax.ws.rs.Consumes;
9+
import com.google.protobuf.util.JsonFormat;
10+
import java.io.InputStreamReader;
11+
import java.lang.Exception;
12+
import java.nio.charset.StandardCharsets;
13+
import javax.servlet.http.HttpServletRequest;
14+
import javax.servlet.http.HttpServletResponse;
1015
import javax.ws.rs.POST;
1116
import javax.ws.rs.Path;
12-
import javax.ws.rs.Produces;
13-
import javax.ws.rs.core.Response;
17+
import javax.ws.rs.core.Context;
1418

1519
@Path("/twirp/com.example.helloworld.Status")
1620
public class RpcStatusResource {
@@ -22,16 +26,32 @@ public class RpcStatusResource {
2226

2327
@POST
2428
@Path("/GetStatus")
25-
@Produces({
26-
"application/protobuf",
27-
"application/json; charset=utf-8"
28-
})
29-
@Consumes({
30-
"application/protobuf",
31-
"application/json; charset=utf-8"
32-
})
33-
public Response handleGetStatus(Core.Empty request) {
34-
return Response.ok(service.handleGetStatus(request)).build();
29+
public void handleGetStatus(@Context HttpServletRequest request,
30+
@Context HttpServletResponse response) throws Exception {
31+
boolean json = false;
32+
final Core.Empty data;
33+
if (request.getContentType().equals("application/protobuf")) {
34+
data = Core.Empty.parseFrom(request.getInputStream());
35+
} else if (request.getContentType().startsWith("application/json")) {
36+
json = true;
37+
Core.Empty.Builder builder = Core.Empty.newBuilder();
38+
JsonFormat.parser().merge(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8), builder);
39+
data = builder.build();
40+
} else {
41+
response.setStatus(415);
42+
response.flushBuffer();
43+
return;
44+
}
45+
StatusOuterClass.StatusResponse retval = service.handleGetStatus(data);
46+
response.setStatus(200);
47+
if (json) {
48+
response.setContentType("application/json; charset=utf-8");
49+
response.getOutputStream().write(JsonFormat.printer().omittingInsignificantWhitespace().print(retval).getBytes(StandardCharsets.UTF_8));
50+
} else {
51+
response.setContentType("application/protobuf");
52+
retval.writeTo(response.getOutputStream());
53+
}
54+
response.flushBuffer();
3555
}
3656
}
3757

runtime/jaxrs/src/main/java/com/flit/runtime/jaxrs/ProtobufMessageProvider.java

Lines changed: 0 additions & 100 deletions
This file was deleted.

0 commit comments

Comments
 (0)