diff --git a/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index f02ca75deb..7cf0532a06 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -907,7 +907,9 @@ private Expr createFieldsExtractorClassInstance( for (int i = 0; i < descendantFields.length; i++) { String currFieldName = descendantFields[i]; String bindingFieldMethodName = - String.format("get%s", JavaStyle.toUpperCamelCase(currFieldName)); + (i < descendantFields.length - 1 || !httpBindingFieldName.isRepeated()) + ? String.format("get%s", JavaStyle.toUpperCamelCase(currFieldName)) + : String.format("get%sList", JavaStyle.toUpperCamelCase(currFieldName)); requestFieldGetterExprBuilder = requestFieldGetterExprBuilder.setMethodName(bindingFieldMethodName); diff --git a/src/main/java/com/google/api/generator/gapic/model/HttpBindings.java b/src/main/java/com/google/api/generator/gapic/model/HttpBindings.java index 32fa39c136..7126bfc3ba 100644 --- a/src/main/java/com/google/api/generator/gapic/model/HttpBindings.java +++ b/src/main/java/com/google/api/generator/gapic/model/HttpBindings.java @@ -40,12 +40,15 @@ public abstract static class HttpBinding implements Comparable { public abstract boolean isOptional(); + public abstract boolean isRepeated(); + @Nullable public abstract String valuePattern(); - public static HttpBinding create(String name, boolean isOptional, String valuePattern) { + public static HttpBinding create( + String name, boolean isOptional, boolean isRepeated, String valuePattern) { return new AutoValue_HttpBindings_HttpBinding( - name, JavaStyle.toLowerCamelCase(name), isOptional, valuePattern); + name, JavaStyle.toLowerCamelCase(name), isOptional, isRepeated, valuePattern); } // Do not forget to keep it in sync with equals() implementation. diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java b/src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java index db8f74292a..86012e9bcd 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java +++ b/src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java @@ -128,7 +128,7 @@ private static Set validateAndConstructHttpBindings( patternSampleValues != null ? patternSampleValues.get(paramName) : null; String[] subFields = paramName.split("\\."); if (inputMessage == null) { - httpBindings.add(HttpBinding.create(paramName, false, patternSampleValue)); + httpBindings.add(HttpBinding.create(paramName, false, false, patternSampleValue)); continue; } Message nestedMessage = inputMessage; @@ -150,7 +150,8 @@ private static Set validateAndConstructHttpBindings( } Field field = nestedMessage.fieldMap().get(subFieldName); httpBindings.add( - HttpBinding.create(paramName, field.isProto3Optional(), patternSampleValue)); + HttpBinding.create( + paramName, field.isProto3Optional(), field.isRepeated(), patternSampleValue)); } } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoClient.golden b/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoClient.golden index d98a99ae95..8d0880523e 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoClient.golden @@ -407,7 +407,10 @@ public class EchoClient implements BackgroundResource { * // It may require modifications to work in your environment. * try (EchoClient echoClient = EchoClient.create()) { * ExpandRequest request = - * ExpandRequest.newBuilder().setContent("content951530617").setInfo("info3237038").build(); + * ExpandRequest.newBuilder() + * .setContent("content951530617") + * .addAllInfo(new ArrayList()) + * .build(); * ServerStream stream = echoClient.expandCallable().call(request); * for (EchoResponse response : stream) { * // Do something when a response is received. diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoClientTest.golden b/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoClientTest.golden index 1b9556231e..a3bf758c6c 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoClientTest.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoClientTest.golden @@ -23,6 +23,7 @@ import com.google.protobuf.Timestamp; import com.google.rpc.Status; import io.grpc.StatusRuntimeException; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -400,7 +401,10 @@ public class EchoClientTest { .build(); mockEcho.addResponse(expectedResponse); ExpandRequest request = - ExpandRequest.newBuilder().setContent("content951530617").setInfo("info3237038").build(); + ExpandRequest.newBuilder() + .setContent("content951530617") + .addAllInfo(new ArrayList()) + .build(); MockStreamObserver responseObserver = new MockStreamObserver<>(); @@ -417,7 +421,10 @@ public class EchoClientTest { StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); mockEcho.addException(exception); ExpandRequest request = - ExpandRequest.newBuilder().setContent("content951530617").setInfo("info3237038").build(); + ExpandRequest.newBuilder() + .setContent("content951530617") + .addAllInfo(new ArrayList()) + .build(); MockStreamObserver responseObserver = new MockStreamObserver<>(); diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden b/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden index 1660428fea..f0c7db88f6 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden @@ -108,11 +108,12 @@ public class HttpJsonEchoStub extends EchoStub { Map> fields = new HashMap<>(); ProtoRestSerializer serializer = ProtoRestSerializer.create(); + serializer.putQueryParam(fields, "content", request.getContent()); + serializer.putQueryParam(fields, "info", request.getInfoList()); return fields; }) .setRequestBodyExtractor( - request -> - ProtoRestSerializer.create().toBody("*", request.toBuilder().build())) + request -> ProtoRestSerializer.create().toBody("error", request.getError())) .build()) .setResponseParser( ProtoMessageResponseParser.newBuilder() diff --git a/src/test/java/com/google/api/generator/gapic/model/MethodTest.java b/src/test/java/com/google/api/generator/gapic/model/MethodTest.java index fd5bba4b49..43b59c73fe 100644 --- a/src/test/java/com/google/api/generator/gapic/model/MethodTest.java +++ b/src/test/java/com/google/api/generator/gapic/model/MethodTest.java @@ -33,7 +33,7 @@ public class MethodTest { .build(); private static final HttpBindings HTTP_BINDINGS = HttpBindings.builder() - .setPathParameters(ImmutableSet.of(HttpBinding.create("table", true, ""))) + .setPathParameters(ImmutableSet.of(HttpBinding.create("table", true, false, ""))) .setPattern("/pattern/test") .setIsAsteriskBody(false) .setHttpVerb(HttpVerb.GET) diff --git a/src/test/proto/echo_grpcrest.proto b/src/test/proto/echo_grpcrest.proto index 1c71c96fbc..21b5a6e40c 100644 --- a/src/test/proto/echo_grpcrest.proto +++ b/src/test/proto/echo_grpcrest.proto @@ -65,7 +65,7 @@ service Echo { rpc Expand(ExpandRequest) returns (stream EchoResponse) { option (google.api.http) = { post: "/v1beta1/echo:expand" - body: "*" + body: "error" }; option (google.api.method_signature) = "content,error"; } @@ -202,7 +202,7 @@ message ExpandRequest { // The error that is thrown after all words are sent on the stream. google.rpc.Status error = 2; - string info = 3; + repeated string info = 3; } // The request for the PagedExpand method.