diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index a8b830092d..9c6b88bfba 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -817,21 +817,15 @@ private static List createNestedPagingClasses( } // Find the repeated field. Message methodOutputMessage = messageTypes.get(method.outputType().reference().name()); - TypeNode repeatedResponseType = null; - for (Field field : methodOutputMessage.fields()) { - if (field.isRepeated() && !field.isMap()) { - Reference repeatedGenericRef = field.type().reference().generics().get(0); - repeatedResponseType = TypeNode.withReference(repeatedGenericRef); - break; - } - } - + Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( - repeatedResponseType, + repeatedPagedResultsField, String.format( "No repeated field found on message %s for method %s", methodOutputMessage.name(), method.name())); + TypeNode repeatedResponseType = repeatedPagedResultsField.type(); + nestedClasses.add( createNestedRpcPagedResponseClass(method, repeatedResponseType, messageTypes, types)); nestedClasses.add( diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java index 4707ea0744..77e291e01b 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java @@ -478,7 +478,6 @@ private static MethodDefinition createRpcTestMethod( method, serviceName, classMemberVarExprs, resourceNames, messageTypes); } // Construct the expected response. - // TODO(miraleung): Paging here. TypeNode methodOutputType = method.hasLro() ? method.lro().responseType() : method.outputType(); List methodExprs = new ArrayList<>(); @@ -486,12 +485,14 @@ private static MethodDefinition createRpcTestMethod( VariableExpr responsesElementVarExpr = null; if (method.isPaged()) { Message methodOutputMessage = messageTypes.get(method.outputType().reference().name()); - repeatedResponseType = findRepeatedPagedType(methodOutputMessage); + Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( - repeatedResponseType, + repeatedPagedResultsField, String.format( - "No repeated type found for paged method %s with output message type %s", + "No repeated field found for paged method %s with output message type %s", method.name(), methodOutputMessage.name())); + + repeatedResponseType = repeatedPagedResultsField.type(); responsesElementVarExpr = VariableExpr.withVariable( Variable.builder().setType(repeatedResponseType).setName("responsesElement").build()); @@ -1832,16 +1833,6 @@ private static TypeNode getCallableType(Method protoMethod) { ConcreteReference.builder().setClazz(callableClazz).setGenerics(generics).build()); } - private static TypeNode findRepeatedPagedType(Message message) { - for (Field field : message.fields()) { - if (field.isRepeated() && !field.isMap()) { - Reference repeatedGenericRef = field.type().reference().generics().get(0); - return TypeNode.withReference(repeatedGenericRef); - } - } - return null; - } - private static String getCallableMethodName(Method protoMethod) { Preconditions.checkState( !protoMethod.stream().equals(Method.Stream.NONE), diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java index 5ed2d7e28b..1eb5c7e714 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java @@ -354,28 +354,16 @@ private static List createPagingStaticAssignExprs( String.format( "No method found for message type %s for method %s among %s", pagedResponseMessageKey, method.name(), messageTypes.keySet())); - TypeNode repeatedResponseType = null; - String repeatedFieldName = null; - for (Field field : pagedResponseMessage.fields()) { - Preconditions.checkState( - field != null, - String.format("Null field found for message %s", pagedResponseMessage.name())); - if (field.isRepeated() && !field.isMap()) { - // Field is currently a List-type. - Preconditions.checkState( - !field.type().reference().generics().isEmpty(), - String.format("No generics found for field reference %s", field.type().reference())); - repeatedResponseType = TypeNode.withReference(field.type().reference().generics().get(0)); - repeatedFieldName = field.name(); - break; - } - } + Field repeatedPagedResultsField = pagedResponseMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( - repeatedResponseType, + repeatedPagedResultsField, String.format( "No repeated type found for paged reesponse %s for method %s", method.outputType().reference().name(), method.name())); + TypeNode repeatedResponseType = repeatedPagedResultsField.type(); + String repeatedFieldName = repeatedPagedResultsField.name(); + // Create the PAGE_STR_DESC variable. TypeNode pagedListDescType = TypeNode.withReference( diff --git a/src/main/java/com/google/api/generator/gapic/model/Field.java b/src/main/java/com/google/api/generator/gapic/model/Field.java index 890c7043a0..0ab721f1e9 100644 --- a/src/main/java/com/google/api/generator/gapic/model/Field.java +++ b/src/main/java/com/google/api/generator/gapic/model/Field.java @@ -48,6 +48,8 @@ public boolean hasResourceReference() { return type().equals(TypeNode.STRING) && resourceReference() != null; } + abstract Builder toBuilder(); + public static Builder builder() { return new AutoValue_Field.Builder() .setIsMessage(false) diff --git a/src/main/java/com/google/api/generator/gapic/model/Message.java b/src/main/java/com/google/api/generator/gapic/model/Message.java index c0236e4f53..b9a613d000 100644 --- a/src/main/java/com/google/api/generator/gapic/model/Message.java +++ b/src/main/java/com/google/api/generator/gapic/model/Message.java @@ -14,6 +14,7 @@ package com.google.api.generator.gapic.model; +import com.google.api.generator.engine.ast.Reference; import com.google.api.generator.engine.ast.TypeNode; import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; @@ -46,6 +47,18 @@ public boolean hasResource() { return resource() != null; } + /** Returns the first list repeated field in a message, unwrapped from its list type. */ + @Nullable + public Field findAndUnwrapFirstRepeatedField() { + for (Field field : fields()) { + if (field.isRepeated() && !field.isMap()) { + Reference repeatedGenericRef = field.type().reference().generics().get(0); + return field.toBuilder().setType(TypeNode.withReference(repeatedGenericRef)).build(); + } + } + return null; + } + public static Builder builder() { return new AutoValue_Message.Builder(); }