From 8a5c36ccce7540940ec7a4bf8751971c3741d89d Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Thu, 13 May 2021 15:21:38 -0700 Subject: [PATCH 1/4] fix(types): Use fully-qualified message type names [ggj] (#723) * fix(types): Use fully-qualified message type names * fix: cleanup --- .../composer/BatchingDescriptorComposer.java | 4 +- .../composer/ServiceClientClassComposer.java | 3 +- .../ServiceClientTestClassComposer.java | 22 +++--- .../composer/ServiceStubClassComposer.java | 1 - .../ServiceStubSettingsClassComposer.java | 6 +- .../defaultvalue/DefaultValueComposer.java | 2 +- .../ServiceClientSampleCodeComposer.java | 31 ++++---- .../api/generator/gapic/model/Message.java | 7 ++ .../gapic/protoparser/HttpRuleParser.java | 2 +- .../protoparser/MethodSignatureParser.java | 4 +- .../generator/gapic/protoparser/Parser.java | 78 +++++++++++++++---- .../gapic/protoparser/ResourceNameParser.java | 4 +- .../DefaultValueComposerTest.java | 8 +- .../ServiceClientSampleCodeComposerTest.java | 12 ++- .../gapic/protoparser/HttpRuleParserTest.java | 8 +- .../gapic/protoparser/ParserTest.java | 32 ++++---- .../protoparser/ResourceNameParserTest.java | 2 +- 17 files changed, 144 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/BatchingDescriptorComposer.java b/src/main/java/com/google/api/generator/gapic/composer/BatchingDescriptorComposer.java index c2509b2e6c..c89eef053c 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/BatchingDescriptorComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/BatchingDescriptorComposer.java @@ -106,7 +106,7 @@ public static Expr createBatchingDescriptorFieldDeclExpr( private static MethodDefinition createGetBatchPartitionKeyMethod( Method method, GapicBatchingSettings batchingSettings, Map messageTypes) { - String methodInputTypeName = method.inputType().reference().name(); + String methodInputTypeName = method.inputType().reference().fullName(); Message inputMessage = messageTypes.get(methodInputTypeName); Preconditions.checkNotNull( inputMessage, @@ -283,7 +283,7 @@ private static MethodDefinition createSplitResponseMethod( List outerForBody = new ArrayList<>(); if (hasSubresponseField) { - Message outputMessage = messageTypes.get(method.outputType().reference().name()); + Message outputMessage = messageTypes.get(method.outputType().reference().fullName()); Preconditions.checkNotNull( outputMessage, String.format("Output message not found for RPC %s", method.name())); 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 2c67ddf632..67b41d6938 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 @@ -1041,7 +1041,7 @@ private static List createNestedPagingClasses( continue; } // Find the repeated field. - Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName()); + Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName()); Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( repeatedPagedResultsField, @@ -1657,7 +1657,6 @@ private static TypeStore createTypes(Service service, Map messa TimeUnit.class, UnaryCallable.class); TypeStore typeStore = new TypeStore(concreteClazzes); - typeStore.putMessageTypes(service.pakkage(), messageTypes); createVaporTypes(service, typeStore); return typeStore; } 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 0283c9476c..f7315fe9e3 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 @@ -546,7 +546,7 @@ private static MethodDefinition createRpcTestMethod( VariableExpr responsesElementVarExpr = null; String mockServiceVarName = getMockServiceVarName(rpcService); if (method.isPaged()) { - Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName()); + Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName()); Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( repeatedPagedResultsField, @@ -577,7 +577,7 @@ private static MethodDefinition createRpcTestMethod( Variable.builder().setType(methodOutputType).setName("expectedResponse").build()); Expr expectedResponseValExpr = null; if (method.isPaged()) { - Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName()); + Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName()); Field firstRepeatedField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( firstRepeatedField, @@ -589,10 +589,10 @@ private static MethodDefinition createRpcTestMethod( DefaultValueComposer.createSimplePagedResponse( method.outputType(), firstRepeatedField.name(), responsesElementVarExpr); } else { - if (messageTypes.containsKey(methodOutputType.reference().name())) { + if (messageTypes.containsKey(methodOutputType.reference().fullName())) { expectedResponseValExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( - messageTypes.get(methodOutputType.reference().simpleName()), + messageTypes.get(methodOutputType.reference().fullName()), resourceNames, messageTypes); } else { @@ -658,7 +658,7 @@ private static MethodDefinition createRpcTestMethod( VariableExpr.withVariable( Variable.builder().setType(method.inputType()).setName("request").build()); argExprs.add(requestVarExpr); - requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull(requestMessage); Expr valExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( @@ -784,7 +784,7 @@ private static MethodDefinition createRpcTestMethod( .build()); // Assert the responses are equivalent. - Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName()); + Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName()); Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( repeatedPagedResultsField, @@ -1022,10 +1022,10 @@ private static MethodDefinition createStreamingRpcTestMethod( VariableExpr.withVariable( Variable.builder().setType(methodOutputType).setName("expectedResponse").build()); Expr expectedResponseValExpr = null; - if (messageTypes.containsKey(methodOutputType.reference().name())) { + if (messageTypes.containsKey(methodOutputType.reference().fullName())) { expectedResponseValExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( - messageTypes.get(methodOutputType.reference().simpleName()), + messageTypes.get(methodOutputType.reference().fullName()), resourceNames, messageTypes); } else { @@ -1080,7 +1080,7 @@ private static MethodDefinition createStreamingRpcTestMethod( VariableExpr requestVarExpr = VariableExpr.withVariable( Variable.builder().setType(method.inputType()).setName("request").build()); - Message requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + Message requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull(requestMessage); Expr valExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( @@ -1363,7 +1363,7 @@ private static List createStreamingRpcExceptionTestStatements( VariableExpr requestVarExpr = VariableExpr.withVariable( Variable.builder().setType(method.inputType()).setName("request").build()); - Message requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + Message requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull(requestMessage); Expr valExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( @@ -1552,7 +1552,7 @@ private static List createRpcExceptionTestStatements( VariableExpr.withVariable( Variable.builder().setType(method.inputType()).setName("request").build()); argVarExprs.add(varExpr); - Message requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + Message requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull(requestMessage); Expr valExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java index ec737e770b..697de66cc3 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java @@ -248,7 +248,6 @@ private static TypeStore createTypes(Service service, Map messa UnaryCallable.class, UnsupportedOperationException.class); TypeStore typeStore = new TypeStore(concreteClazzes); - typeStore.putMessageTypes(service.pakkage(), messageTypes); typeStore.put("com.google.longrunning.stub", "OperationsStub"); 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 2a6dc6b8c4..2b9694c298 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 @@ -389,11 +389,9 @@ private static List createPagingStaticAssignExprs( } // Find the repeated type. - String pagedResponseMessageKey = - JavaStyle.toUpperCamelCase(method.outputType().reference().simpleName()); + String pagedResponseMessageKey = method.outputType().reference().fullName(); if (method.hasLro()) { - pagedResponseMessageKey = - JavaStyle.toUpperCamelCase(method.lro().responseType().reference().simpleName()); + pagedResponseMessageKey = method.lro().responseType().reference().fullName(); } Message pagedResponseMessage = messageTypes.get(pagedResponseMessageKey); Preconditions.checkNotNull( diff --git a/src/main/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposer.java b/src/main/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposer.java index cf12accdd6..fec4d3050f 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposer.java @@ -236,7 +236,7 @@ public static Expr createSimpleMessageBuilderExpr( if (field.isContainedInOneof() // Avoid colliding fields. || ((field.isMessage() || field.isEnum()) // Avoid importing unparsed messages. && !field.isRepeated() - && !messageTypes.containsKey(field.type().reference().name()))) { + && !messageTypes.containsKey(field.type().reference().fullName()))) { continue; } String setterMethodNamePattern = "set%s"; diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java index 8fb4021490..a9403b54a3 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java @@ -290,11 +290,11 @@ public static String composeRpcDefaultMethodHeaderSampleCode( VariableExpr.withVariable( Variable.builder().setName("request").setType(method.inputType()).build()); List rpcMethodArgVarExprs = Arrays.asList(requestVarExpr); - Message requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + Message requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull( requestMessage, String.format( - "Could not find the message type %s.", method.inputType().reference().simpleName())); + "Could not find the message type %s.", method.inputType().reference().fullName())); Expr requestBuilderExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( requestMessage, resourceNames, messageTypes); @@ -346,11 +346,11 @@ public static String composeLroCallableMethodHeaderSampleCode( VariableExpr requestVarExpr = VariableExpr.withVariable( Variable.builder().setName("request").setType(method.inputType()).build()); - Message requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + Message requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull( requestMessage, String.format( - "Could not find the message type %s.", method.inputType().reference().simpleName())); + "Could not find the message type %s.", method.inputType().reference().fullName())); Expr requestBuilderExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( requestMessage, resourceNames, messageTypes); @@ -458,11 +458,11 @@ public static String composePagedCallableMethodHeaderSampleCode( VariableExpr requestVarExpr = VariableExpr.withVariable( Variable.builder().setName("request").setType(method.inputType()).build()); - Message requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + Message requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull( requestMessage, String.format( - "Could not find the message type %s.", method.inputType().reference().simpleName())); + "Could not find the message type %s.", method.inputType().reference().fullName())); Expr requestBuilderExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( requestMessage, resourceNames, messageTypes); @@ -476,7 +476,7 @@ public static String composePagedCallableMethodHeaderSampleCode( bodyExprs.add(requestAssignmentExpr); // Find the repeated field. - Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName()); + Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName()); Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( repeatedPagedResultsField, @@ -578,11 +578,11 @@ public static String composeRegularCallableMethodHeaderSampleCode( VariableExpr requestVarExpr = VariableExpr.withVariable( Variable.builder().setName("request").setType(method.inputType()).build()); - Message requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + Message requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull( requestMessage, String.format( - "Could not find the message type %s.", method.inputType().reference().simpleName())); + "Could not find the message type %s.", method.inputType().reference().fullName())); Expr requestBuilderExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( requestMessage, resourceNames, messageTypes); @@ -626,11 +626,11 @@ public static String composeStreamCallableMethodHeaderSampleCode( VariableExpr requestVarExpr = VariableExpr.withVariable( Variable.builder().setName("request").setType(method.inputType()).build()); - Message requestMessage = messageTypes.get(method.inputType().reference().simpleName()); + Message requestMessage = messageTypes.get(method.inputType().reference().fullName()); Preconditions.checkNotNull( requestMessage, String.format( - "Could not find the message type %s.", method.inputType().reference().simpleName())); + "Could not find the message type %s.", method.inputType().reference().fullName())); Expr requestBuilderExpr = DefaultValueComposer.createSimpleMessageBuilderExpr( requestMessage, resourceNames, messageTypes); @@ -702,7 +702,12 @@ private static List composeUnaryPagedRpcMethodBodyStatements( Map messageTypes) { // Find the repeated field. - Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName()); + Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName()); + Preconditions.checkNotNull( + methodOutputMessage, + "Output message %s not found, keys: ", + method.outputType().reference().fullName(), + messageTypes.keySet().toString()); Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( repeatedPagedResultsField, @@ -1128,7 +1133,7 @@ private static List composePagedCallableBodyStatements( VariableExpr requestVarExpr, Map messageTypes) { // Find the repeated field. - Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName()); + Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName()); Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); Preconditions.checkNotNull( repeatedPagedResultsField, 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 ea44a02d0b..ad1efa285a 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 @@ -30,6 +30,11 @@ public abstract class Message { public abstract String name(); + // The fully-qualified proto name, which differs from the Java fully-qualified name. + // For example, this would be google.showcase.v1beta1.EchoRequest for echo.proto (see testdata), + // whereas that message's Java fully-qualified name is com.google.showcase.v1beta1.EchoRequest. + public abstract String fullProtoName(); + // TODO(unsupported): oneof fields are parsed as separate ones because field flattening refers to // a specific field. public abstract ImmutableList fields(); @@ -88,6 +93,8 @@ public static Builder builder() { public abstract static class Builder { public abstract Builder setName(String name); + public abstract Builder setFullProtoName(String fullProtoName); + public abstract Builder setFields(List fields); public Builder setEnumValues(List names, List numbers) { 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 488bc52cea..51e84cb57b 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 @@ -74,7 +74,7 @@ public static Optional> parseHttpBindings( String subField = descendantBindings[i]; if (i < descendantBindings.length - 1) { Field field = containingMessage.fieldMap().get(subField); - containingMessage = messageTypes.get(field.type().reference().simpleName()); + containingMessage = messageTypes.get(field.type().reference().fullName()); Preconditions.checkNotNull( containingMessage, String.format( diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/MethodSignatureParser.java b/src/main/java/com/google/api/generator/gapic/protoparser/MethodSignatureParser.java index 742533e107..4d7259790a 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/MethodSignatureParser.java +++ b/src/main/java/com/google/api/generator/gapic/protoparser/MethodSignatureParser.java @@ -57,7 +57,7 @@ public static List> parseMethodSignatures( Map patternsToResourceNames = ResourceParserHelpers.createPatternResourceNameMap(resourceNames); - Message inputMessage = messageTypes.get(methodInputType.reference().simpleName()); + Message inputMessage = messageTypes.get(methodInputType.reference().fullName()); // Example from Expand in echo.proto: // stringSigs: ["content,error", "content,error,info"]. @@ -266,7 +266,7 @@ private static Map parseTypeFromArgumentName( TypeNode.isReferenceType(firstFieldType) && !firstFieldType.equals(TypeNode.STRING), String.format("Field reference on %s cannot be a primitive type", firstFieldName)); - String firstFieldTypeName = firstFieldType.reference().name(); + String firstFieldTypeName = firstFieldType.reference().fullName(); Message firstFieldMessage = messageTypes.get(firstFieldTypeName); Preconditions.checkNotNull( firstFieldMessage, diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java b/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java index fee1587c49..cf74a492ea 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java +++ b/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java @@ -420,11 +420,13 @@ public static Map parseMessages( for (EnumDescriptor enumDescriptor : fileDescriptor.getEnumTypes()) { String name = enumDescriptor.getName(); List valueDescriptors = enumDescriptor.getValues(); + TypeNode enumType = TypeParser.parseType(enumDescriptor); messages.put( - name, + enumType.reference().fullName(), Message.builder() - .setType(TypeParser.parseType(enumDescriptor)) + .setType(enumType) .setName(name) + .setFullProtoName(enumDescriptor.getFullName()) .setEnumValues( valueDescriptors.stream().map(v -> v.getName()).collect(Collectors.toList()), valueDescriptors.stream().map(v -> v.getNumber()).collect(Collectors.toList())) @@ -455,15 +457,13 @@ private static Map parseMessages( parseMessages(nestedMessage, outputResourceReferencesSeen, currentNestedTypes)); } } - String messageKey = - outerNestedTypes.isEmpty() || outerNestedTypes.get(0).equals(messageName) - ? messageName - : String.format("%s.%s", String.join(".", outerNestedTypes), messageName); + TypeNode messageType = TypeParser.parseType(messageDescriptor); messages.put( - messageKey, + messageType.reference().fullName(), Message.builder() - .setType(TypeParser.parseType(messageDescriptor)) + .setType(messageType) .setName(messageName) + .setFullProtoName(messageDescriptor.getFullName()) .setFields(parseFields(messageDescriptor, outputResourceReferencesSeen)) .setOuterNestedTypes(outerNestedTypes) .build()); @@ -553,10 +553,9 @@ static List parseMethods( isDeprecated = protoMethod.getOptions().getDeprecated(); } - Message inputMessage = messageTypes.get(inputType.reference().simpleName()); + Message inputMessage = messageTypes.get(inputType.reference().fullName()); Preconditions.checkNotNull( - inputMessage, - String.format("No message found for %s", inputType.reference().simpleName())); + inputMessage, String.format("No message found for %s", inputType.reference().fullName())); Optional> httpBindingsOpt = HttpRuleParser.parseHttpBindings(protoMethod, inputMessage, messageTypes); List httpBindings = @@ -641,10 +640,53 @@ static LongrunningOperation parseLro( OperationInfo lroInfo = methodDescriptor.getOptions().getExtension(OperationsProto.operationInfo); - String responseTypeName = parseNestedProtoTypeName(lroInfo.getResponseType()); - String metadataTypeName = parseNestedProtoTypeName(lroInfo.getMetadataType()); - Message responseMessage = messageTypes.get(responseTypeName); - Message metadataMessage = messageTypes.get(metadataTypeName); + // These can be short names (e.g. FooMessage) or fully-qualified names with the *proto* package. + String responseTypeName = lroInfo.getResponseType(); + String metadataTypeName = lroInfo.getMetadataType(); + + int lastDotIndex = responseTypeName.lastIndexOf('.'); + boolean isResponseTypeNameShortOnly = lastDotIndex < 0; + String responseTypeShortName = + lastDotIndex >= 0 ? responseTypeName.substring(lastDotIndex + 1) : responseTypeName; + + lastDotIndex = metadataTypeName.lastIndexOf('.'); + boolean isMetadataTypeNameShortOnly = lastDotIndex < 0; + String metadataTypeShortName = + lastDotIndex >= 0 ? metadataTypeName.substring(lastDotIndex + 1) : metadataTypeName; + + Message responseMessage = null; + Message metadataMessage = null; + + // The messageTypes map keys to the Java fully-qualified name. + for (Map.Entry messageEntry : messageTypes.entrySet()) { + String messageKey = messageEntry.getKey(); + int messageLastDotIndex = messageEntry.getKey().lastIndexOf('.'); + String messageShortName = + messageLastDotIndex >= 0 ? messageKey.substring(messageLastDotIndex + 1) : messageKey; + if (responseMessage == null) { + if (isResponseTypeNameShortOnly && responseTypeName.equals(messageShortName)) { + responseMessage = messageEntry.getValue(); + } else if (!isResponseTypeNameShortOnly && responseTypeShortName.equals(messageShortName)) { + // Ensure that the full proto name matches. + Message candidateMessage = messageEntry.getValue(); + if (candidateMessage.fullProtoName().equals(responseTypeName)) { + responseMessage = candidateMessage; + } + } + } + if (metadataMessage == null) { + if (isMetadataTypeNameShortOnly && metadataTypeName.equals(messageShortName)) { + metadataMessage = messageEntry.getValue(); + } else if (!isMetadataTypeNameShortOnly && metadataTypeShortName.equals(messageShortName)) { + // Ensure that the full proto name matches. + Message candidateMessage = messageEntry.getValue(); + if (candidateMessage.fullProtoName().equals(metadataTypeName)) { + metadataMessage = candidateMessage; + } + } + } + } + Preconditions.checkNotNull( responseMessage, String.format( @@ -663,8 +705,10 @@ static LongrunningOperation parseLro( @VisibleForTesting static boolean parseIsPaged( MethodDescriptor methodDescriptor, Map messageTypes) { - Message inputMessage = messageTypes.get(methodDescriptor.getInputType().getName()); - Message outputMessage = messageTypes.get(methodDescriptor.getOutputType().getName()); + TypeNode inputMessageType = TypeParser.parseType(methodDescriptor.getInputType()); + TypeNode outputMessageType = TypeParser.parseType(methodDescriptor.getOutputType()); + Message inputMessage = messageTypes.get(inputMessageType.reference().fullName()); + Message outputMessage = messageTypes.get(outputMessageType.reference().fullName()); // This should technically handle the absence of either of these fields (aip.dev/158), but we // gate on their collective presence to ensure the generated surface is backawrds-compatible diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/ResourceNameParser.java b/src/main/java/com/google/api/generator/gapic/protoparser/ResourceNameParser.java index 16e8f96beb..b03d8aff06 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/ResourceNameParser.java +++ b/src/main/java/com/google/api/generator/gapic/protoparser/ResourceNameParser.java @@ -16,6 +16,7 @@ import com.google.api.ResourceDescriptor; import com.google.api.ResourceProto; +import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.ResourceNameConstants; import com.google.api.pathtemplate.PathTemplate; @@ -131,7 +132,8 @@ static Optional parseResourceNameFromMessageType( messageTypeDescriptor.getName())); } - return createResourceName(protoResource, pakkage, messageTypeDescriptor.getName()); + TypeNode javaMessageType = TypeParser.parseType(messageTypeDescriptor); + return createResourceName(protoResource, pakkage, javaMessageType.reference().fullName()); } private static Optional createResourceName( diff --git a/src/test/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposerTest.java index c77706820a..6a60b91e5d 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposerTest.java @@ -246,7 +246,7 @@ public void createSimpleMessage_basicPrimitivesOnly() { Map messageTypes = Parser.parseMessages(echoFileDescriptor); Map typeStringsToResourceNames = Parser.parseResourceNames(echoFileDescriptor); - Message message = messageTypes.get("Foobar"); + Message message = messageTypes.get("com.google.showcase.v1beta1.Foobar"); Expr expr = DefaultValueComposer.createSimpleMessageBuilderExpr( message, typeStringsToResourceNames, messageTypes); @@ -263,7 +263,7 @@ public void createSimpleMessage_containsMessagesEnumsAndResourceName() { Map messageTypes = Parser.parseMessages(echoFileDescriptor); Map typeStringsToResourceNames = Parser.parseResourceNames(echoFileDescriptor); - Message message = messageTypes.get("EchoRequest"); + Message message = messageTypes.get("com.google.showcase.v1beta1.EchoRequest"); Expr expr = DefaultValueComposer.createSimpleMessageBuilderExpr( message, typeStringsToResourceNames, messageTypes); @@ -283,7 +283,7 @@ public void createSimpleMessage_containsRepeatedField() { Map messageTypes = Parser.parseMessages(echoFileDescriptor); Map typeStringsToResourceNames = Parser.parseResourceNames(echoFileDescriptor); - Message message = messageTypes.get("PagedExpandResponse"); + Message message = messageTypes.get("com.google.showcase.v1beta1.PagedExpandResponse"); Expr expr = DefaultValueComposer.createSimpleMessageBuilderExpr( message, typeStringsToResourceNames, messageTypes); @@ -300,7 +300,7 @@ public void createSimpleMessage_onlyOneofs() { Map messageTypes = Parser.parseMessages(echoFileDescriptor); Map typeStringsToResourceNames = Parser.parseResourceNames(echoFileDescriptor); - Message message = messageTypes.get("WaitRequest"); + Message message = messageTypes.get("com.google.showcase.v1beta1.WaitRequest"); Expr expr = DefaultValueComposer.createSimpleMessageBuilderExpr( message, typeStringsToResourceNames, messageTypes); diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java index 85cabb5fc1..e360b1eb3a 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java @@ -28,7 +28,6 @@ import com.google.api.generator.gapic.model.Method.Stream; import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; -import com.google.api.generator.gapic.model.ResourceReference; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.testutils.LineFormatter; @@ -329,6 +328,7 @@ public void composeClassHeaderEndpointSampleCode() { } // =======================================Unary RPC Method Sample Code=======================// + /* @Test public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); @@ -950,6 +950,7 @@ public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithMethodReturnVo "}"); assertEquals(results, expected); } + */ // ===================================Unary Paged RPC Method Sample Code ======================// @Test @@ -1025,10 +1026,11 @@ public void validComposeRpcMethodHeaderSampleCode_pagedRpcWithMultipleMethodArgu Message listContentResponseMessage = Message.builder() .setName("ListContentResponse") + .setFullProtoName("google.showcase.v1beta1.ListContentResponse") .setType(outputType) .setFields(Arrays.asList(repeatedField, nextPagedTokenField)) .build(); - messageTypes.put("ListContentResponse", listContentResponseMessage); + messageTypes.put("com.google.showcase.v1beta1.ListContentResponse", listContentResponseMessage); String results = ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( @@ -1097,10 +1099,11 @@ public void validComposeRpcMethodHeaderSampleCode_pagedRpcWithNoMethodArguments( Message listContentResponseMessage = Message.builder() .setName("ListContentResponse") + .setFullProtoName("google.showcase.v1beta1.ListContentResponse") .setType(outputType) .setFields(Arrays.asList(repeatedField, nextPagedTokenField)) .build(); - messageTypes.put("ListContentResponse", listContentResponseMessage); + messageTypes.put("com.google.showcase.v1beta1.ListContentResponse", listContentResponseMessage); String results = ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( @@ -1203,6 +1206,7 @@ public void invalidComposeRpcMethodHeaderSampleCode_noRepeatedResponseTypeInPage Message noRepeatedFieldMessage = Message.builder() .setName("PagedResponse") + .setFullProtoName("google.showcase.v1beta1.PagedResponse") .setType(outputType) .setFields(Arrays.asList(responseField, nextPageToken)) .build(); @@ -1963,6 +1967,7 @@ public void invalidComposePagedCallableMethodHeaderSampleCode_noRepeatedResponse Message noRepeatedResponseMessage = Message.builder() .setName("NoRepeatedResponse") + .setFullProtoName("google.showcase.v1beta1.NoRepeatedResponse") .setType( TypeNode.withReference( VaporReference.builder() @@ -2577,6 +2582,7 @@ public void invalidComposeRegularCallableMethodHeaderSampleCode_noRepeatedRespon Message noRepeatedResponseMessage = Message.builder() .setName("NoRepeatedResponse") + .setFullProtoName("google.showcase.v1beta1.NoRepeatedResponse") .setType( TypeNode.withReference( VaporReference.builder() diff --git a/src/test/java/com/google/api/generator/gapic/protoparser/HttpRuleParserTest.java b/src/test/java/com/google/api/generator/gapic/protoparser/HttpRuleParserTest.java index 1aed7b9f92..f238f3e7cd 100644 --- a/src/test/java/com/google/api/generator/gapic/protoparser/HttpRuleParserTest.java +++ b/src/test/java/com/google/api/generator/gapic/protoparser/HttpRuleParserTest.java @@ -41,14 +41,14 @@ public void parseHttpAnnotation_basic() { // CreateSession method. MethodDescriptor rpcMethod = testingService.getMethods().get(0); - Message inputMessage = messages.get("CreateSessionRequest"); + Message inputMessage = messages.get("com.google.showcase.v1beta1.CreateSessionRequest"); Optional> httpBindingsOpt = HttpRuleParser.parseHttpBindings(rpcMethod, inputMessage, messages); assertFalse(httpBindingsOpt.isPresent()); // GetSession method. rpcMethod = testingService.getMethods().get(1); - inputMessage = messages.get("GetSessionRequest"); + inputMessage = messages.get("com.google.showcase.v1beta1.GetSessionRequest"); httpBindingsOpt = HttpRuleParser.parseHttpBindings(rpcMethod, inputMessage, messages); assertTrue(httpBindingsOpt.isPresent()); assertThat(httpBindingsOpt.get()).containsExactly("name"); @@ -65,7 +65,7 @@ public void parseHttpAnnotation_multipleBindings() { // VerityTest method. MethodDescriptor rpcMethod = testingService.getMethods().get(testingService.getMethods().size() - 1); - Message inputMessage = messages.get("VerifyTestRequest"); + Message inputMessage = messages.get("com.google.showcase.v1beta1.VerifyTestRequest"); Optional> httpBindingsOpt = HttpRuleParser.parseHttpBindings(rpcMethod, inputMessage, messages); assertTrue(httpBindingsOpt.isPresent()); @@ -84,7 +84,7 @@ public void parseHttpAnnotation_missingFieldFromMessage() { // VerityTest method. MethodDescriptor rpcMethod = testingService.getMethods().get(testingService.getMethods().size() - 1); - Message inputMessage = messages.get("CreateSessionRequest"); + Message inputMessage = messages.get("com.google.showcase.v1beta1.CreateSessionRequest"); assertThrows( IllegalStateException.class, () -> HttpRuleParser.parseHttpBindings(rpcMethod, inputMessage, messages)); diff --git a/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java b/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java index 62a5026ee0..b19aa30b92 100644 --- a/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java +++ b/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java @@ -65,7 +65,7 @@ public void parseMessages_basic() { // TODO(miraleung): Add more tests for oneofs and other message-parsing edge cases. Map messageTypes = Parser.parseMessages(echoFileDescriptor); - Message echoRequestMessage = messageTypes.get("EchoRequest"); + Message echoRequestMessage = messageTypes.get("com.google.showcase.v1beta1.EchoRequest"); Field echoRequestNameField = echoRequestMessage.fieldMap().get("name"); assertTrue(echoRequestNameField.hasResourceReference()); @@ -88,10 +88,12 @@ public void parseMessages_basic() { Message.builder() .setType(echoResponseType) .setName(echoResponseName) + .setFullProtoName("google.showcase.v1beta1." + echoResponseName) .setFields(Arrays.asList(echoResponseContentField, echoResponseSeverityField)) .build(); - assertEquals(echoResponseMessage, messageTypes.get(echoResponseName)); + assertEquals( + echoResponseMessage, messageTypes.get("com.google.showcase.v1beta1." + echoResponseName)); } @Test @@ -171,8 +173,8 @@ public void parseMethods_basicLro() { Method waitMethod = methods.get(7); assertEquals("Wait", waitMethod.name()); assertTrue(waitMethod.hasLro()); - TypeNode waitResponseType = messageTypes.get("WaitResponse").type(); - TypeNode waitMetadataType = messageTypes.get("WaitMetadata").type(); + TypeNode waitResponseType = messageTypes.get("com.google.showcase.v1beta1.WaitResponse").type(); + TypeNode waitMetadataType = messageTypes.get("com.google.showcase.v1beta1.WaitMetadata").type(); assertThat(waitMethod.lro().responseType()).isEqualTo(waitResponseType); assertThat(waitMethod.lro().metadataType()).isEqualTo(waitMetadataType); } @@ -182,7 +184,7 @@ public void parseLro_missingResponseType() { Map messageTypes = Parser.parseMessages(echoFileDescriptor); MethodDescriptor waitMethodDescriptor = echoService.getMethods().get(7); assertEquals("Wait", waitMethodDescriptor.getName()); - messageTypes.remove("WaitResponse"); + messageTypes.remove("com.google.showcase.v1beta1.WaitResponse"); assertThrows( NullPointerException.class, () -> Parser.parseLro(waitMethodDescriptor, messageTypes)); } @@ -192,7 +194,7 @@ public void parseLro_missingMetadataType() { Map messageTypes = Parser.parseMessages(echoFileDescriptor); MethodDescriptor waitMethodDescriptor = echoService.getMethods().get(7); assertEquals("Wait", waitMethodDescriptor.getName()); - messageTypes.remove("WaitMetadata"); + messageTypes.remove("com.google.showcase.v1beta1.WaitMetadata"); assertThrows( NullPointerException.class, () -> Parser.parseLro(waitMethodDescriptor, messageTypes)); } @@ -341,18 +343,18 @@ public void parseMessagesAndResourceNames_update() { FileDescriptor lockerServiceFileDescriptor = LockerProto.getDescriptor(); Map messageTypes = Parser.parseMessages(lockerServiceFileDescriptor); - Message documentMessage = messageTypes.get("Document"); + Message documentMessage = messageTypes.get("com.google.testgapic.v1beta1.Document"); assertFalse(documentMessage.hasResource()); - Message folderMessage = messageTypes.get("Folder"); + Message folderMessage = messageTypes.get("com.google.testgapic.v1beta1.Folder"); assertFalse(folderMessage.hasResource()); Map resourceNames = ResourceNameParser.parseResourceNames(lockerServiceFileDescriptor); messageTypes = Parser.updateResourceNamesInMessages(messageTypes, resourceNames.values()); - documentMessage = messageTypes.get("Document"); + documentMessage = messageTypes.get("com.google.testgapic.v1beta1.Document"); assertTrue(documentMessage.hasResource()); - folderMessage = messageTypes.get("Folder"); + folderMessage = messageTypes.get("com.google.testgapic.v1beta1.Folder"); assertFalse(folderMessage.hasResource()); } @@ -362,7 +364,7 @@ public void parseMessages_fieldsHaveResourceReferences() { Map messageTypes = Parser.parseMessages(lockerServiceFileDescriptor); // Child type. - Message message = messageTypes.get("CreateFolderRequest"); + Message message = messageTypes.get("com.google.testgapic.v1beta1.CreateFolderRequest"); Field field = message.fieldMap().get("parent"); assertTrue(field.hasResourceReference()); ResourceReference resourceReference = field.resourceReference(); @@ -371,7 +373,7 @@ public void parseMessages_fieldsHaveResourceReferences() { assertTrue(resourceReference.isChildType()); // Type. - message = messageTypes.get("GetFolderRequest"); + message = messageTypes.get("com.google.testgapic.v1beta1.GetFolderRequest"); field = message.fieldMap().get("name"); assertTrue(field.hasResourceReference()); resourceReference = field.resourceReference(); @@ -380,7 +382,7 @@ public void parseMessages_fieldsHaveResourceReferences() { assertFalse(resourceReference.isChildType()); // Non-RPC-specific message. - message = messageTypes.get("Folder"); + message = messageTypes.get("com.google.testgapic.v1beta1.Folder"); field = message.fieldMap().get("name"); assertTrue(field.hasResourceReference()); resourceReference = field.resourceReference(); @@ -390,7 +392,7 @@ public void parseMessages_fieldsHaveResourceReferences() { // No explicit resource_reference annotation on the field, and the resource annotation is in the // message. - message = messageTypes.get("Document"); + message = messageTypes.get("com.google.testgapic.v1beta1.Document"); field = message.fieldMap().get("name"); assertTrue(field.hasResourceReference()); resourceReference = field.resourceReference(); @@ -405,7 +407,7 @@ public void parseFields_mapType() { assertEquals(testingService.getName(), "Testing"); Map messageTypes = Parser.parseMessages(testingFileDescriptor); - Message message = messageTypes.get("Session"); + Message message = messageTypes.get("com.google.showcase.v1beta1.Session"); Field field = message.fieldMap().get("session_ids_to_descriptor"); assertEquals( TypeNode.withReference( diff --git a/src/test/java/com/google/api/generator/gapic/protoparser/ResourceNameParserTest.java b/src/test/java/com/google/api/generator/gapic/protoparser/ResourceNameParserTest.java index 9ecd696e3a..36395ec10b 100644 --- a/src/test/java/com/google/api/generator/gapic/protoparser/ResourceNameParserTest.java +++ b/src/test/java/com/google/api/generator/gapic/protoparser/ResourceNameParserTest.java @@ -136,7 +136,7 @@ public void parseResourceNames_messageResourceDefinition() { assertEquals(MAIN_PACKAGE, resourceName.pakkage()); assertTrue(resourceName.hasParentMessageName()); - assertEquals("Document", resourceName.parentMessageName()); + assertEquals("com.google.testgapic.v1beta1.Document", resourceName.parentMessageName()); } @Test From cc5475fba8654aaf4925e930df7a9088cbae1475 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 13 May 2021 15:33:52 -0700 Subject: [PATCH 2/4] chore: release 1.0.4 (#716) * chore: release 1.0.4 * Update CHANGELOG.md Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Mira Leung --- CHANGELOG.md | 8 ++++++++ version.txt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b48ca3c6e..87e462606e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +### [1.0.4](https://www.github.com/googleapis/gapic-generator-java/compare/v1.0.3...v1.0.4) (2021-05-13) + + +### Bug Fixes + +* **types:** Use fully-qualified message type names ([#723](https://www.github.com/googleapis/gapic-generator-java/issues/723)) ([8a5c36c](https://www.github.com/googleapis/gapic-generator-java/commit/8a5c36ccce7540940ec7a4bf8751971c3741d89d)) +* Use the right composers in deprecation unit tests ([#715](https://www.github.com/googleapis/gapic-generator-java/issues/715)) ([2318136](https://www.github.com/googleapis/gapic-generator-java/commit/2318136e49060c3212abfd6337e2c3ceb2c2fc69)) + ### [1.0.3](https://www.github.com/googleapis/gapic-generator-java/compare/v1.0.2...v1.0.3) (2021-04-07) diff --git a/version.txt b/version.txt index 21e8796a09..ee90284c27 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.3 +1.0.4 From 925356d659aed4b8550ce526f1772a706661c246 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Mon, 17 May 2021 10:17:44 -0700 Subject: [PATCH 3/4] fix(types): Reorder nested types for legacy protos w/ java_outer_class in one file [ggj] (#724) * fix(types): Use fully-qualified message type names * fix: cleanup * fix(types): Reorder nested types for legacy protos w/o java_multiple_files set --- .../api/generator/engine/ast/Reference.java | 3 +++ .../generator/gapic/protoparser/TypeParser.java | 17 +++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/google/api/generator/engine/ast/Reference.java b/src/main/java/com/google/api/generator/engine/ast/Reference.java index e735f5be1c..fdc2c5c5ee 100644 --- a/src/main/java/com/google/api/generator/engine/ast/Reference.java +++ b/src/main/java/com/google/api/generator/engine/ast/Reference.java @@ -34,6 +34,9 @@ public interface Reference extends AstNode { boolean useFullName(); + // The nested types in left-to-right order, if any. + // Example: com.google.Foo.Bar.Car.ThisType will have the outer types listed in the order + // [Foo, Bar, Car]. @Nullable ImmutableList enclosingClassNames(); diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/TypeParser.java b/src/main/java/com/google/api/generator/gapic/protoparser/TypeParser.java index aef1c1dff7..7a4542ee25 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/TypeParser.java +++ b/src/main/java/com/google/api/generator/gapic/protoparser/TypeParser.java @@ -147,7 +147,8 @@ static Reference parseMessageReference(@Nonnull Descriptor messageDescriptor) { // Handles nesting. while (containingType != null) { // Outermost type in the nested type hierarchy lies at index 0. - outerNestedTypeNames.add(0, containingType.getName()); + // If the Java outer proto class has already been set, apapend after it at index 1. + outerNestedTypeNames.add(hasJavaOuterClass ? 1 : 0, containingType.getName()); containingType = containingType.getContainingType(); } @@ -158,15 +159,17 @@ static Reference parseMessageReference(@Nonnull Descriptor messageDescriptor) { .setPakkage(pakkage) .setEnclosingClassNames(outerNestedTypeNames) .build(); + String protoPackage = messageDescriptor.getFile().getPackage(); String messageFullName = messageDescriptor.getFullName(); if (hasJavaOuterClass) { + int packageIndex = protoPackage.length(); messageFullName = String.format( "%s.%s.%s", - messageFullName.substring(0, messageFullName.lastIndexOf(DOT)), + messageFullName.substring(0, packageIndex), javaOuterClassname, - messageFullName.substring(messageFullName.lastIndexOf(DOT) + 1)); + messageFullName.substring(packageIndex + 1)); } Preconditions.checkState( messageReference.fullName().replace(pakkage, protoPackage).equals(messageFullName), @@ -207,7 +210,8 @@ static Reference parseEnumReference(@Nonnull EnumDescriptor enumDescriptor) { // Handles nesting. while (containingType != null) { // Outermost type in the nested type hierarchy lies at index 0. - outerNestedTypeNames.add(0, containingType.getName()); + // If the Java outer proto class has already been set, apapend after it at index 1. + outerNestedTypeNames.add(hasJavaOuterClass ? 1 : 0, containingType.getName()); containingType = containingType.getContainingType(); } @@ -221,12 +225,13 @@ static Reference parseEnumReference(@Nonnull EnumDescriptor enumDescriptor) { String protoPackage = enumDescriptor.getFile().getPackage(); String enumFullName = enumDescriptor.getFullName(); if (hasJavaOuterClass) { + int packageIndex = protoPackage.length(); enumFullName = String.format( "%s.%s.%s", - enumFullName.substring(0, enumFullName.lastIndexOf(DOT)), + enumFullName.substring(0, packageIndex), javaOuterClassname, - enumFullName.substring(enumFullName.lastIndexOf(DOT) + 1)); + enumFullName.substring(packageIndex + 1)); } Preconditions.checkState( From 83e2e3bd0f00a3715af286a1c4b6dbed4d023fbd Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 10:39:17 -0700 Subject: [PATCH 4/4] chore: release 1.0.5 (#725) * chore: release 1.0.5 * Update CHANGELOG.md Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Mira Leung --- CHANGELOG.md | 7 +++++++ version.txt | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87e462606e..1ca661a4d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### [1.0.5](https://www.github.com/googleapis/gapic-generator-java/compare/v1.0.4...v1.0.5) (2021-05-17) + + +### Bug Fixes + +* **types:** Reorder nested types for legacy protos w/ java_outer_class in one file ([#724](https://www.github.com/googleapis/gapic-generator-java/issues/724)) ([925356d](https://www.github.com/googleapis/gapic-generator-java/commit/925356d659aed4b8550ce526f1772a706661c246)) + ### [1.0.4](https://www.github.com/googleapis/gapic-generator-java/compare/v1.0.3...v1.0.4) (2021-05-13) diff --git a/version.txt b/version.txt index ee90284c27..90a27f9cea 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.4 +1.0.5