Skip to content
This repository was archived by the owner on Sep 26, 2023. It is now read-only.

Commit 3f7628e

Browse files
authoredAug 22, 2022
feat: Add numeric enum support. (#1743)
Add numeric enum support based on go/actools-numeric-enum-impl. Add a new overloaded toBody method that support serializing request object to Json with numeric enums.
1 parent ded44a6 commit 3f7628e

7 files changed

+80
-12
lines changed
 

‎gax-httpjson/src/main/java/com/google/api/gax/httpjson/ProtoMessageResponseParser.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public ResponseT parse(Reader httpContent, TypeRegistry registry) {
7979
/* {@inheritDoc} */
8080
@Override
8181
public String serialize(ResponseT response) {
82-
return ProtoRestSerializer.create(defaultRegistry).toJson(response);
82+
return ProtoRestSerializer.create(defaultRegistry).toJson(response, false);
8383
}
8484

8585
// Convert to @AutoValue if this class gets more complicated

‎gax-httpjson/src/main/java/com/google/api/gax/httpjson/ProtoRestSerializer.java

+22-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.google.protobuf.Message;
3636
import com.google.protobuf.TypeRegistry;
3737
import com.google.protobuf.util.JsonFormat;
38+
import com.google.protobuf.util.JsonFormat.Printer;
3839
import java.io.IOException;
3940
import java.io.Reader;
4041
import java.util.List;
@@ -69,12 +70,19 @@ static <RequestT extends Message> ProtoRestSerializer<RequestT> create(TypeRegis
6970
* protobuf native JSON formatter.
7071
*
7172
* @param message a message to serialize
73+
* @param numericEnum a boolean flag that determine if enum values should be serialized to number
74+
* or not
7275
* @throws InvalidProtocolBufferException if failed to serialize the protobuf message to JSON
7376
* format
7477
*/
75-
String toJson(RequestT message) {
78+
String toJson(RequestT message, boolean numericEnum) {
7679
try {
77-
return JsonFormat.printer().usingTypeRegistry(registry).print(message);
80+
Printer printer = JsonFormat.printer().usingTypeRegistry(registry);
81+
if (numericEnum) {
82+
return printer.printingEnumsAsInts().print(message);
83+
} else {
84+
return printer.print(message);
85+
}
7886
} catch (InvalidProtocolBufferException e) {
7987
throw new RestSerializationException("Failed to serialize message to JSON", e);
8088
}
@@ -138,6 +146,17 @@ public void putQueryParam(Map<String, List<String>> fields, String fieldName, Ob
138146
* @param fieldValue a field value to serialize
139147
*/
140148
public String toBody(String fieldName, RequestT fieldValue) {
141-
return toJson(fieldValue);
149+
return toJson(fieldValue, false);
150+
}
151+
152+
/**
153+
* Serializes a message to a request body in a form of JSON-encoded string.
154+
*
155+
* @param fieldName a name of a request message field this message belongs to
156+
* @param fieldValue a field value to serialize
157+
* @param numericEnum a boolean flag that determine if enum values should be serialized to number
158+
*/
159+
public String toBody(String fieldName, RequestT fieldValue, boolean numericEnum) {
160+
return toJson(fieldValue, numericEnum);
142161
}
143162
}

‎gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonClientInterceptorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public void onClose(int statusCode, HttpJsonMetadata trailers) {
123123
.setRequestBodyExtractor(
124124
request ->
125125
ProtoRestSerializer.create()
126-
.toBody("*", request.toBuilder().clearName().build()))
126+
.toBody("*", request.toBuilder().clearName().build(), false))
127127
.build())
128128
.setResponseParser(
129129
ProtoMessageResponseParser.<Field>newBuilder()

‎gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonDirectCallableTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public class HttpJsonDirectCallableTest {
8383
.setRequestBodyExtractor(
8484
request ->
8585
ProtoRestSerializer.create()
86-
.toBody("*", request.toBuilder().clearName().build()))
86+
.toBody("*", request.toBuilder().clearName().build(), false))
8787
.build())
8888
.setResponseParser(
8989
ProtoMessageResponseParser.<Field>newBuilder()

‎gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonDirectServerStreamingCallableTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ public class HttpJsonDirectServerStreamingCallableTest {
9292
.setRequestBodyExtractor(
9393
request ->
9494
ProtoRestSerializer.create()
95-
.toBody("*", request.toBuilder().clearBlue().clearRed().build()))
95+
.toBody(
96+
"*", request.toBuilder().clearBlue().clearRed().build(), false))
9697
.build())
9798
.setResponseParser(
9899
ProtoMessageResponseParser.<Money>newBuilder()

‎gax-httpjson/src/test/java/com/google/api/gax/httpjson/ProtoMessageRequestFormatterTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void setUp() {
7979
.setRequestBodyExtractor(
8080
request -> {
8181
ProtoRestSerializer<Field> serializer = ProtoRestSerializer.create();
82-
return serializer.toBody("field", request);
82+
return serializer.toBody("field", request, false);
8383
})
8484
.setAdditionalPaths("/api/v1/names/{name=field_name1/**}/hello")
8585
.build();

‎gax-httpjson/src/test/java/com/google/api/gax/httpjson/ProtoRestSerializerTest.java

+52-4
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public class ProtoRestSerializerTest {
4848
private ProtoRestSerializer<Field> requestSerializer;
4949
private Field field;
5050
private String fieldJson;
51+
private String fieldJsonNumericEnum;
52+
private String fieldJsonUnknownNumericEnum;
5153

5254
@Before
5355
public void setUp() {
@@ -72,21 +74,67 @@ public void setUp() {
7274
+ " \"name\": \"opt_name2\"\n"
7375
+ " }]\n"
7476
+ "}";
77+
78+
fieldJsonNumericEnum =
79+
"{\n"
80+
+ " \"cardinality\": 1,\n"
81+
+ " \"number\": 2,\n"
82+
+ " \"name\": \"field_name1\",\n"
83+
+ " \"options\": [{\n"
84+
+ " \"name\": \"opt_name1\"\n"
85+
+ " }, {\n"
86+
+ " \"name\": \"opt_name2\"\n"
87+
+ " }]\n"
88+
+ "}";
89+
90+
fieldJsonUnknownNumericEnum =
91+
"{\n"
92+
+ " \"cardinality\": 7,\n"
93+
+ " \"number\": 2,\n"
94+
+ " \"name\": \"field_name1\",\n"
95+
+ " \"options\": [{\n"
96+
+ " \"name\": \"opt_name1\"\n"
97+
+ " }, {\n"
98+
+ " \"name\": \"opt_name2\"\n"
99+
+ " }]\n"
100+
+ "}";
75101
}
76102

77103
@Test
78-
public void toJson() {
79-
String fieldToJson = requestSerializer.toJson(field);
104+
public void toJson_numericEnumTrue() {
105+
String fieldToJson = requestSerializer.toJson(field, true);
106+
Truth.assertThat(fieldToJson).isEqualTo(fieldJsonNumericEnum);
107+
}
108+
109+
@Test
110+
public void toJson_numericEnumFalse() {
111+
String fieldToJson = requestSerializer.toJson(field, false);
80112
Truth.assertThat(fieldToJson).isEqualTo(fieldJson);
81113
}
82114

83115
@Test
84-
public void fromJson() {
116+
public void fromJson_numericEnumTrue() {
117+
Field fieldFromJson =
118+
requestSerializer.fromJson(new StringReader(fieldJsonNumericEnum), Field.newBuilder());
119+
Truth.assertThat(fieldFromJson).isEqualTo(field);
120+
}
121+
122+
@Test
123+
public void fromJson_numericEnumFalse() {
85124
Field fieldFromJson =
86125
requestSerializer.fromJson(new StringReader(fieldJson), Field.newBuilder());
87126
Truth.assertThat(fieldFromJson).isEqualTo(field);
88127
}
89128

129+
@Test
130+
public void fromJson_numericEnumTrueAndUnknownEnum() {
131+
Field expected = field.toBuilder().setCardinalityValue(7).build();
132+
Field fieldFromJson =
133+
requestSerializer.fromJson(
134+
new StringReader(fieldJsonUnknownNumericEnum), Field.newBuilder());
135+
Truth.assertThat(fieldFromJson).isEqualTo(expected);
136+
}
137+
90138
@Test
91139
public void fromJsonInvalidJson() {
92140
try {
@@ -135,7 +183,7 @@ public void putQueryParam() {
135183

136184
@Test
137185
public void toBody() {
138-
String body = requestSerializer.toBody("bodyField1", field);
186+
String body = requestSerializer.toBody("bodyField1", field, false);
139187
Truth.assertThat(body).isEqualTo(fieldJson);
140188
}
141189
}

0 commit comments

Comments
 (0)
This repository has been archived.