diff --git a/CHANGELOG.md b/CHANGELOG.md
index cd8f0c42fd..5c3772c261 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,34 @@
# Changelog
+## [2.10.3](https://github.com/googleapis/gapic-generator-java/compare/v2.10.2...v2.10.3) (2022-11-01)
+
+
+### Bug Fixes
+
+* Fix REST transport client creation generated javadoc sample ([#1077](https://github.com/googleapis/gapic-generator-java/issues/1077)) ([9ac0ca8](https://github.com/googleapis/gapic-generator-java/commit/9ac0ca80b09077f7880f0029b5d7b090a10a10b8))
+* Fixes regionTag breakage ([#1068](https://github.com/googleapis/gapic-generator-java/issues/1068)) ([bed9f72](https://github.com/googleapis/gapic-generator-java/commit/bed9f721fbafb5f2e974b6f43f8455f2fdb581f7))
+
+## [2.10.2](https://github.com/googleapis/gapic-generator-java/compare/v2.10.1...v2.10.2) (2022-10-24)
+
+
+### Bug Fixes
+
+* **deps:** Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.5 ([#1063](https://github.com/googleapis/gapic-generator-java/issues/1063)) ([80ed62c](https://github.com/googleapis/gapic-generator-java/commit/80ed62cf6aff395d150e394a44fb60da37e9a6ae))
+* Update regionTag to use service name ([#1047](https://github.com/googleapis/gapic-generator-java/issues/1047)) ([68b33c2](https://github.com/googleapis/gapic-generator-java/commit/68b33c23948ffe7a2bf6acd53731d786257f6bd1))
+
+## [2.10.1](https://github.com/googleapis/gapic-generator-java/compare/v2.10.0...v2.10.1) (2022-10-20)
+
+
+### Bug Fixes
+
+* **deps:** Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.2 ([#1035](https://github.com/googleapis/gapic-generator-java/issues/1035)) ([f76634a](https://github.com/googleapis/gapic-generator-java/commit/f76634af8497ef2977376af570d175eb0fe91e6f))
+* **deps:** Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.3 ([#1039](https://github.com/googleapis/gapic-generator-java/issues/1039)) ([9d25e47](https://github.com/googleapis/gapic-generator-java/commit/9d25e477126db35efd111a2b8ee76332b549ce91))
+* **deps:** Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.4 ([#1050](https://github.com/googleapis/gapic-generator-java/issues/1050)) ([3b052e2](https://github.com/googleapis/gapic-generator-java/commit/3b052e27bb704124ae3214dd3e8708f8e32afe6c))
+* **deps:** Update dependency org.yaml:snakeyaml to v1.32 ([#1037](https://github.com/googleapis/gapic-generator-java/issues/1037)) ([b520aa0](https://github.com/googleapis/gapic-generator-java/commit/b520aa0d35407daf96123d63c3112b9f29715115))
+* **deps:** Update dependency org.yaml:snakeyaml to v1.33 ([#1043](https://github.com/googleapis/gapic-generator-java/issues/1043)) ([67a5dc5](https://github.com/googleapis/gapic-generator-java/commit/67a5dc5e4dd3302ececd212dd047f5731c4bf74d))
+* Get numeric value for Enum fields if it is configured as query param or path param ([#1042](https://github.com/googleapis/gapic-generator-java/issues/1042)) ([0fdfa67](https://github.com/googleapis/gapic-generator-java/commit/0fdfa67fec84e1983c12b10c7b7ae7a0efa80f4d))
+* Update sample region tag to parse host instead of proto package ([#1040](https://github.com/googleapis/gapic-generator-java/issues/1040)) ([01c14d4](https://github.com/googleapis/gapic-generator-java/commit/01c14d41d4195963c0ed46f310360f39eec6d420))
+
## [2.10.0](https://github.com/googleapis/gapic-generator-java/compare/v2.9.0...v2.10.0) (2022-09-06)
diff --git a/PROPERTIES.bzl b/PROPERTIES.bzl
index 78b7d809c0..4d5e0f286e 100644
--- a/PROPERTIES.bzl
+++ b/PROPERTIES.bzl
@@ -1,5 +1,5 @@
PROPERTIES = {
- "version.com_google_protobuf": "3.19.1",
+ "version.com_google_protobuf": "3.21.7",
# Version of google-java-format is downgraded from 1.8 to 1.7, because 1.8 supports java 11 minimum, while our JRE is java 8.
"version.google_java_format": "1.7",
"version.io_grpc_java": "1.42.1",
@@ -10,7 +10,7 @@ PROPERTIES = {
"maven.com_google_auto_value_auto_value": "com.google.auto.value:auto-value:1.7.2",
"maven.com_google_auto_value_auto_value_annotations": "com.google.auto.value:auto-value-annotations:1.7.2",
"maven.com_google_code_gson": "com.google.code.gson:gson:2.8.6",
- "maven.com_google_protobuf_protobuf_java": "com.google.protobuf:protobuf-java:3.19.1",
+ "maven.com_google_protobuf_protobuf_java": "com.google.protobuf:protobuf-java:3.21.7",
"maven.io_github_java_diff_utils": "io.github.java-diff-utils:java-diff-utils:4.11",
"maven.javax_annotation_javax_annotation_api": "javax.annotation:javax.annotation-api:1.3.2",
diff --git a/pom.xml b/pom.xml
index 10f973578d..76416d39da 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
com.google.cloud
google-cloud-shared-dependencies
- 3.0.2
+ 3.0.5
pom
import
@@ -42,7 +42,7 @@
com.google.auto.value
auto-value
- 1.9
+ 1.10
@@ -155,7 +155,7 @@
protobuf-maven-plugin
0.6.1
- com.google.protobuf:protoc:3.19.4:exe:${os.detected.classifier}
+ com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}
@@ -234,7 +234,7 @@
org.apache.maven.plugins
maven-shade-plugin
- 3.3.0
+ 3.4.1
package
@@ -311,7 +311,7 @@
org.yaml
snakeyaml
- 1.31
+ 1.33
com.google.googlejavaformat
diff --git a/src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java b/src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java
index 0967cea087..b3b2c9d997 100644
--- a/src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java
+++ b/src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java
@@ -183,6 +183,7 @@ public void visit(TernaryExpr ternaryExpr) {
@Override
public void visit(VariableExpr variableExpr) {
variableExpr.variable().type().accept(this);
+ annotations(variableExpr.annotations());
if (variableExpr.exprReferenceExpr() != null) {
variableExpr.exprReferenceExpr().accept(this);
}
diff --git a/src/main/java/com/google/api/generator/gapic/composer/Composer.java b/src/main/java/com/google/api/generator/gapic/composer/Composer.java
index 8306930de1..acd914a163 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/Composer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/Composer.java
@@ -15,6 +15,7 @@
package com.google.api.generator.gapic.composer;
import com.google.api.generator.engine.ast.ClassDefinition;
+import com.google.api.generator.engine.ast.CommentStatement;
import com.google.api.generator.gapic.composer.comment.CommentComposer;
import com.google.api.generator.gapic.composer.grpc.GrpcServiceCallableFactoryClassComposer;
import com.google.api.generator.gapic.composer.grpc.GrpcServiceStubClassComposer;
@@ -47,8 +48,7 @@ public static List composeServiceClasses(GapicContext context) {
clazzes.addAll(generateServiceClasses(context));
clazzes.addAll(generateMockClasses(context, context.mixinServices()));
clazzes.addAll(generateResourceNameHelperClasses(context));
- return addApacheLicense(
- prepareExecutableSamples(clazzes, context.gapicMetadata().getProtoPackage()));
+ return addApacheLicense(prepareExecutableSamples(clazzes));
}
public static GapicPackageInfo composePackageInfo(GapicContext context) {
@@ -190,37 +190,30 @@ public static List generateTestClasses(GapicContext context) {
}
@VisibleForTesting
- static List prepareExecutableSamples(List clazzes, String protoPackage) {
- // parse protoPackage for apiVersion and apiShortName
- String[] pakkage = protoPackage.split("\\.");
- String apiVersion;
- String apiShortName;
- // e.g. v1, v2, v1beta1
- if (pakkage[pakkage.length - 1].matches("v[0-9].*")) {
- apiVersion = pakkage[pakkage.length - 1];
- apiShortName = pakkage[pakkage.length - 2];
- } else {
- apiVersion = "";
- apiShortName = pakkage[pakkage.length - 1];
- }
- // Include license header, apiShortName, and apiVersion
- return clazzes.stream()
- .map(
- gapicClass -> {
- List samples =
- gapicClass.samples().stream()
- .map(
- sample -> addRegionTagAndHeaderToSample(sample, apiShortName, apiVersion))
- .collect(Collectors.toList());
- return gapicClass.withSamples(samples);
- })
- .collect(Collectors.toList());
+ static List prepareExecutableSamples(List clazzes) {
+ // Include license header, apiShortName, and apiVersion
+ List clazzesWithSamples = new ArrayList<>();
+ clazzes.forEach(
+ gapicClass -> {
+ List samples = new ArrayList<>();
+ gapicClass
+ .samples()
+ .forEach(
+ sample ->
+ samples.add(
+ addRegionTagAndHeaderToSample(
+ sample, gapicClass.apiShortName(), gapicClass.apiVersion())));
+ clazzesWithSamples.add(gapicClass.withSamples(samples));
+ });
+ return clazzesWithSamples;
}
- private static Sample addRegionTagAndHeaderToSample(
+ @VisibleForTesting
+ protected static Sample addRegionTagAndHeaderToSample(
Sample sample, String apiShortName, String apiVersion) {
+ final List header = Arrays.asList(CommentComposer.APACHE_LICENSE_COMMENT);
return sample
- .withHeader(Arrays.asList(CommentComposer.APACHE_LICENSE_COMMENT))
+ .withHeader(header)
.withRegionTag(
sample.regionTag().withApiVersion(apiVersion).withApiShortName(apiShortName));
}
diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java
index cf99df8d15..b6095be08b 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java
@@ -163,7 +163,9 @@ public GapicClass generate(GapicContext context, Service service) {
.build();
updateGapicMetadata(context, service, className, grpcRpcsToJavaMethodNames);
- return GapicClass.create(kind, classDef, SampleComposerUtil.handleDuplicateSamples(samples));
+ return GapicClass.create(kind, classDef, SampleComposerUtil.handleDuplicateSamples(samples))
+ .withApiShortName(service.apiShortName())
+ .withApiVersion(service.apiVersion());
}
private static List createClassAnnotations(Service service, TypeStore typeStore) {
@@ -198,9 +200,11 @@ protected List createClassHeaderComments(
ServiceClientHeaderSampleComposer.composeClassHeaderSample(
service, clientType, resourceNames, messageTypes);
Sample credentialsSampleCode =
- ServiceClientHeaderSampleComposer.composeSetCredentialsSample(clientType, settingsType);
+ ServiceClientHeaderSampleComposer.composeSetCredentialsSample(
+ clientType, settingsType, service);
Sample endpointSampleCode =
- ServiceClientHeaderSampleComposer.composeSetEndpointSample(clientType, settingsType);
+ ServiceClientHeaderSampleComposer.composeSetEndpointSample(
+ clientType, settingsType, service);
samples.addAll(Arrays.asList(classMethodSampleCode, credentialsSampleCode, endpointSampleCode));
return ServiceClientCommentComposer.createClassHeaderComments(
service,
@@ -578,7 +582,8 @@ private static List createServiceMethods(
messageTypes,
typeStore,
resourceNames,
- samples);
+ samples,
+ service);
// Collect data for gapic_metadata.json.
grpcRpcToJavaMethodMetadata
@@ -596,7 +601,8 @@ private static List createServiceMethods(
messageTypes,
typeStore,
resourceNames,
- samples);
+ samples,
+ service);
// Collect data for gapic_metadata.json.
grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod));
@@ -636,7 +642,8 @@ private static List createMethodVariants(
Map messageTypes,
TypeStore typeStore,
Map resourceNames,
- List samples) {
+ List samples,
+ Service service) {
List javaMethods = new ArrayList<>();
String methodName = JavaStyle.toLowerCamelCase(method.name());
TypeNode methodInputType = method.inputType();
@@ -700,7 +707,12 @@ private static List createMethodVariants(
Optional methodSample =
Optional.of(
ServiceClientHeaderSampleComposer.composeShowcaseMethodSample(
- method, typeStore.get(clientName), signature, resourceNames, messageTypes));
+ method,
+ typeStore.get(clientName),
+ signature,
+ resourceNames,
+ messageTypes,
+ service));
Optional methodDocSample = Optional.empty();
if (methodSample.isPresent()) {
samples.add(methodSample.get());
@@ -744,7 +756,8 @@ private static MethodDefinition createMethodDefaultMethod(
Map messageTypes,
TypeStore typeStore,
Map resourceNames,
- List samples) {
+ List samples,
+ Service service) {
String methodName = JavaStyle.toLowerCamelCase(method.name());
TypeNode methodInputType = method.inputType();
TypeNode methodOutputType =
@@ -788,7 +801,7 @@ private static MethodDefinition createMethodDefaultMethod(
Optional defaultMethodSample =
Optional.of(
ServiceClientMethodSampleComposer.composeCanonicalSample(
- method, typeStore.get(clientName), resourceNames, messageTypes));
+ method, typeStore.get(clientName), resourceNames, messageTypes, service));
Optional defaultMethodDocSample = Optional.empty();
if (defaultMethodSample.isPresent()) {
samples.add(defaultMethodSample.get());
@@ -930,7 +943,8 @@ private static MethodDefinition createCallableMethod(
method,
typeStore.get(ClassNames.getServiceClientClassName(service)),
resourceNames,
- messageTypes));
+ messageTypes,
+ service));
} else if (callableMethodKind.equals(CallableMethodKind.PAGED)) {
sampleCode =
Optional.of(
@@ -938,7 +952,8 @@ private static MethodDefinition createCallableMethod(
method,
typeStore.get(ClassNames.getServiceClientClassName(service)),
resourceNames,
- messageTypes));
+ messageTypes,
+ service));
} else if (callableMethodKind.equals(CallableMethodKind.REGULAR)) {
if (method.stream().equals(Stream.NONE)) {
sampleCode =
@@ -947,7 +962,8 @@ private static MethodDefinition createCallableMethod(
method,
typeStore.get(ClassNames.getServiceClientClassName(service)),
resourceNames,
- messageTypes));
+ messageTypes,
+ service));
} else {
sampleCode =
Optional.of(
@@ -955,7 +971,8 @@ private static MethodDefinition createCallableMethod(
method,
typeStore.get(ClassNames.getServiceClientClassName(service)),
resourceNames,
- messageTypes));
+ messageTypes,
+ service));
}
}
Optional sampleDocCode = Optional.empty();
diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java
index 68780ed6bc..fdfa33f471 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java
@@ -126,7 +126,9 @@ public GapicClass generate(GapicContext context, Service service) {
.setMethods(createClassMethods(service, typeStore))
.setNestedClasses(Arrays.asList(createNestedBuilderClass(service, typeStore)))
.build();
- return GapicClass.create(kind, classDef, SampleComposerUtil.handleDuplicateSamples(samples));
+ return GapicClass.create(kind, classDef, SampleComposerUtil.handleDuplicateSamples(samples))
+ .withApiShortName(service.apiShortName())
+ .withApiVersion(service.apiVersion());
}
private static List createClassHeaderComments(
diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java
index 1074173850..fe66a11e77 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java
@@ -201,7 +201,9 @@ public GapicClass generate(GapicContext context, Service service) {
Arrays.asList(createNestedBuilderClass(service, serviceConfig, typeStore)))
.build();
return GapicClass.create(
- GapicClass.Kind.STUB, classDef, SampleComposerUtil.handleDuplicateSamples(samples));
+ GapicClass.Kind.STUB, classDef, SampleComposerUtil.handleDuplicateSamples(samples))
+ .withApiShortName(service.apiShortName())
+ .withApiVersion(service.apiVersion());
}
protected MethodDefinition createDefaultCredentialsProviderBuilderMethod() {
diff --git a/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java
index e600ada5d2..8933b7b4ed 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java
@@ -54,12 +54,14 @@ protected List createClassHeaderComments(
ServiceClientHeaderSampleComposer.composeClassHeaderSample(
service, clientType, resourceNames, messageTypes);
Sample credentialsSampleCode =
- ServiceClientHeaderSampleComposer.composeSetCredentialsSample(clientType, settingsType);
+ ServiceClientHeaderSampleComposer.composeSetCredentialsSample(
+ clientType, settingsType, service);
Sample endpointSampleCode =
- ServiceClientHeaderSampleComposer.composeSetEndpointSample(clientType, settingsType);
+ ServiceClientHeaderSampleComposer.composeSetEndpointSample(
+ clientType, settingsType, service);
Sample transportSampleCode =
ServiceClientHeaderSampleComposer.composeTransportSample(
- clientType, settingsType, "defaultHttpJsonTransportProviderBuilder");
+ clientType, settingsType, "newHttpJsonBuilder", service);
samples.addAll(
Arrays.asList(
classMethodSampleCode, credentialsSampleCode, endpointSampleCode, transportSampleCode));
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 fa4d71498c..67e003f50f 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
@@ -59,6 +59,7 @@
import com.google.api.generator.gapic.model.OperationResponse;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.gapic.utils.JavaStyle;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.TypeRegistry;
@@ -74,6 +75,7 @@
import java.util.stream.Collectors;
public class HttpJsonServiceStubClassComposer extends AbstractTransportServiceStubClassComposer {
+
private static final HttpJsonServiceStubClassComposer INSTANCE =
new HttpJsonServiceStubClassComposer();
@@ -940,9 +942,11 @@ private Expr createFieldsExtractorClassInstance(
for (int i = 0; i < descendantFields.length; i++) {
String currFieldName = descendantFields[i];
String bindingFieldMethodName =
- (i < descendantFields.length - 1 || !httpBindingFieldName.isRepeated())
- ? String.format("get%s", JavaStyle.toUpperCamelCase(currFieldName))
- : String.format("get%sList", JavaStyle.toUpperCamelCase(currFieldName));
+ getBindingFieldMethodName(
+ httpBindingFieldName,
+ descendantFields.length,
+ i,
+ JavaStyle.toUpperCamelCase(currFieldName));
requestFieldGetterExprBuilder =
requestFieldGetterExprBuilder.setMethodName(bindingFieldMethodName);
@@ -997,6 +1001,7 @@ private Expr createFieldsExtractorClassInstance(
}
}
+ // Add a fixed query param for numeric enum, see b/232457244 for details
if (restNumericEnumsEnabled && serializerMethodName.equals("putQueryParam")) {
ImmutableList.Builder paramsPutArgs = ImmutableList.builder();
@@ -1023,6 +1028,20 @@ private Expr createFieldsExtractorClassInstance(
.build();
}
+ @VisibleForTesting
+ String getBindingFieldMethodName(
+ HttpBinding httpBindingField, int descendantFieldsLengths, int index, String currFieldName) {
+ if (index == descendantFieldsLengths - 1) {
+ if (httpBindingField.isRepeated()) {
+ return String.format("get%sList", currFieldName);
+ }
+ if (httpBindingField.isEnum()) {
+ return String.format("get%sValue", currFieldName);
+ }
+ }
+ return String.format("get%s", currFieldName);
+ }
+
private List getHttpMethodTypeExpr(Method protoMethod) {
return Collections.singletonList(
ValueExpr.withValue(
diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleComposer.java
index ae1ad2bbb7..342fab52ad 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleComposer.java
@@ -48,6 +48,7 @@
import com.google.api.generator.gapic.model.RegionTag;
import com.google.api.generator.gapic.model.ResourceName;
import com.google.api.generator.gapic.model.Sample;
+import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.gapic.utils.JavaStyle;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
@@ -60,7 +61,7 @@
public class ServiceClientCallableMethodSampleComposer {
private static Sample composeUnaryOrLroCallableSample(
- Method method, VariableExpr clientVarExpr, VariableExpr requestVarExpr) {
+ Method method, VariableExpr clientVarExpr, VariableExpr requestVarExpr, Service service) {
List bodyStatements = new ArrayList<>();
// Create api future variable expression, and assign it with a value by invoking callable
// method.
@@ -124,7 +125,7 @@ private static Sample composeUnaryOrLroCallableSample(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setIsAsynchronous(true)
.build();
@@ -139,7 +140,8 @@ private static Sample composePagedCallableSample(
Method method,
VariableExpr clientVarExpr,
VariableExpr requestVarExpr,
- Map messageTypes) {
+ Map messageTypes,
+ Service service) {
// Find the repeated field.
Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName());
Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapPaginatedRepeatedField();
@@ -278,7 +280,7 @@ private static Sample composePagedCallableSample(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setOverloadDisambiguation("Paged")
.setIsAsynchronous(true)
@@ -294,7 +296,8 @@ public static Sample composeLroCallableMethod(
Method method,
TypeNode clientType,
Map resourceNames,
- Map messageTypes) {
+ Map messageTypes,
+ Service service) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
@@ -394,7 +397,7 @@ public static Sample composeLroCallableMethod(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientType.reference().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setIsAsynchronous(true)
.setOverloadDisambiguation("LRO")
@@ -415,7 +418,8 @@ public static Sample composePagedCallableMethod(
Method method,
TypeNode clientType,
Map resourceNames,
- Map messageTypes) {
+ Map messageTypes,
+ Service service) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
@@ -531,7 +535,7 @@ public static Sample composePagedCallableMethod(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientType.reference().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setIsAsynchronous(true)
.build();
@@ -543,7 +547,8 @@ public static Sample composeRegularCallableMethod(
Method method,
TypeNode clientType,
Map resourceNames,
- Map messageTypes) {
+ Map messageTypes,
+ Service service) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
@@ -575,13 +580,13 @@ public static Sample composeRegularCallableMethod(
RegionTag regionTag;
if (method.isPaged()) {
Sample pagedCallable =
- composePagedCallableSample(method, clientVarExpr, requestVarExpr, messageTypes);
+ composePagedCallableSample(method, clientVarExpr, requestVarExpr, messageTypes, service);
bodyStatements.addAll(pagedCallable.body());
regionTag = pagedCallable.regionTag();
} else {
// e.g. echoClient.echoCallable().futureCall(request)
Sample unaryOrLroCallable =
- composeUnaryOrLroCallableSample(method, clientVarExpr, requestVarExpr);
+ composeUnaryOrLroCallableSample(method, clientVarExpr, requestVarExpr, service);
bodyStatements.addAll(unaryOrLroCallable.body());
regionTag = unaryOrLroCallable.regionTag();
}
@@ -601,7 +606,8 @@ public static Sample composeStreamCallableMethod(
Method method,
TypeNode clientType,
Map resourceNames,
- Map messageTypes) {
+ Map messageTypes,
+ Service service) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
@@ -630,16 +636,19 @@ public static Sample composeStreamCallableMethod(
List bodyStatements = new ArrayList<>();
if (method.stream().equals(Method.Stream.SERVER)) {
// e.g. ServerStream stream = echoClient.expandCallable().call(request);
- Sample streamServer = composeStreamServerSample(method, clientVarExpr, requestAssignmentExpr);
+ Sample streamServer =
+ composeStreamServerSample(method, clientVarExpr, requestAssignmentExpr, service);
bodyStatements.addAll(streamServer.body());
regionTag = streamServer.regionTag();
} else if (method.stream().equals(Method.Stream.BIDI)) {
// e.g. echoClient.collect().clientStreamingCall(responseObserver);
- Sample streamBidi = composeStreamBidiSample(method, clientVarExpr, requestAssignmentExpr);
+ Sample streamBidi =
+ composeStreamBidiSample(method, clientVarExpr, requestAssignmentExpr, service);
bodyStatements.addAll(streamBidi.body());
regionTag = streamBidi.regionTag();
} else if (method.stream().equals(Method.Stream.CLIENT)) {
- Sample streamClient = composeStreamClientSample(method, clientVarExpr, requestAssignmentExpr);
+ Sample streamClient =
+ composeStreamClientSample(method, clientVarExpr, requestAssignmentExpr, service);
bodyStatements.addAll(streamClient.body());
regionTag = streamClient.regionTag();
}
@@ -656,7 +665,10 @@ public static Sample composeStreamCallableMethod(
}
private static Sample composeStreamServerSample(
- Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
+ Method method,
+ VariableExpr clientVarExpr,
+ AssignmentExpr requestAssignmentExpr,
+ Service service) {
List bodyExprs = new ArrayList<>();
bodyExprs.add(requestAssignmentExpr);
@@ -717,7 +729,7 @@ private static Sample composeStreamServerSample(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setIsAsynchronous(true)
.build();
@@ -725,7 +737,10 @@ private static Sample composeStreamServerSample(
}
private static Sample composeStreamBidiSample(
- Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
+ Method method,
+ VariableExpr clientVarExpr,
+ AssignmentExpr requestAssignmentExpr,
+ Service service) {
List bodyExprs = new ArrayList<>();
// Create bidi stream variable expression and assign it with invoking client's bidi stream
@@ -796,7 +811,7 @@ private static Sample composeStreamBidiSample(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setIsAsynchronous(true)
.build();
@@ -804,7 +819,10 @@ private static Sample composeStreamBidiSample(
}
private static Sample composeStreamClientSample(
- Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
+ Method method,
+ VariableExpr clientVarExpr,
+ AssignmentExpr requestAssignmentExpr,
+ Service service) {
List bodyExprs = new ArrayList<>();
// Create responseObserver variable expression.
@@ -928,7 +946,7 @@ private static Sample composeStreamClientSample(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setIsAsynchronous(true)
.build();
diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java
index 6c3389b865..b979f87744 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java
@@ -53,7 +53,7 @@ public static Sample composeClassHeaderSample(
Map resourceNames,
Map messageTypes) {
if (service.methods().isEmpty()) {
- return ServiceClientMethodSampleComposer.composeEmptyServiceSample(clientType);
+ return ServiceClientMethodSampleComposer.composeEmptyServiceSample(clientType, service);
}
// Use the first pure unary RPC method's sample code as showcase, if no such method exists, use
@@ -67,13 +67,18 @@ public static Sample composeClassHeaderSample(
if (method.stream() == Method.Stream.NONE) {
if (method.methodSignatures().isEmpty()) {
return ServiceClientMethodSampleComposer.composeCanonicalSample(
- method, clientType, resourceNames, messageTypes);
+ method, clientType, resourceNames, messageTypes, service);
}
return composeShowcaseMethodSample(
- method, clientType, method.methodSignatures().get(0), resourceNames, messageTypes);
+ method,
+ clientType,
+ method.methodSignatures().get(0),
+ resourceNames,
+ messageTypes,
+ service);
}
return ServiceClientCallableMethodSampleComposer.composeStreamCallableMethod(
- method, clientType, resourceNames, messageTypes);
+ method, clientType, resourceNames, messageTypes, service);
}
public static Sample composeShowcaseMethodSample(
@@ -81,7 +86,8 @@ public static Sample composeShowcaseMethodSample(
TypeNode clientType,
List arguments,
Map resourceNames,
- Map messageTypes) {
+ Map messageTypes,
+ Service service) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
@@ -105,20 +111,20 @@ public static Sample composeShowcaseMethodSample(
if (method.isPaged()) {
Sample unaryPagedRpc =
ServiceClientMethodSampleComposer.composePagedSample(
- method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes);
+ method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes, service);
bodyStatements.addAll(unaryPagedRpc.body());
regionTag = unaryPagedRpc.regionTag();
} else if (method.hasLro()) {
Sample unaryLroRpc =
ServiceClientMethodSampleComposer.composeLroSample(
- method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs);
+ method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, service);
bodyStatements.addAll(unaryLroRpc.body());
regionTag = unaryLroRpc.regionTag();
} else {
// e.g. echoClient.echo(), echoClient.echo(...)
Sample unaryRpc =
ServiceClientMethodSampleComposer.composeSample(
- method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs);
+ method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, service);
bodyStatements.addAll(unaryRpc.body());
regionTag = unaryRpc.regionTag();
}
@@ -134,7 +140,8 @@ public static Sample composeShowcaseMethodSample(
return Sample.builder().setBody(body).setRegionTag(regionTag).build();
}
- public static Sample composeSetCredentialsSample(TypeNode clientType, TypeNode settingsType) {
+ public static Sample composeSetCredentialsSample(
+ TypeNode clientType, TypeNode settingsType, Service service) {
// Initialize clientSettings with builder() method.
// e.g. EchoSettings echoSettings =
// EchoSettings.newBuilder().setCredentialsProvider(FixedCredentialsProvider.create("myCredentials")).build();
@@ -206,14 +213,16 @@ public static Sample composeSetCredentialsSample(TypeNode clientType, TypeNode s
ExprStatement.withExpr(initSettingsVarExpr), ExprStatement.withExpr(initClientVarExpr));
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientName)
+ .setServiceName(service.name())
.setRpcName(rpcName)
.setOverloadDisambiguation("setCredentialsProvider")
.build();
- return Sample.builder().setBody(sampleBody).setRegionTag(regionTag).build();
+ Sample sample = Sample.builder().setBody(sampleBody).setRegionTag(regionTag).build();
+ return sample.withRegionTag(sample.regionTag());
}
- public static Sample composeSetEndpointSample(TypeNode clientType, TypeNode settingsType) {
+ public static Sample composeSetEndpointSample(
+ TypeNode clientType, TypeNode settingsType, Service service) {
// Initialize client settings with builder() method.
// e.g. EchoSettings echoSettings = EchoSettings.newBuilder().setEndpoint("myEndpoint").build();
String settingsName = JavaStyle.toLowerCamelCase(settingsType.reference().name());
@@ -273,7 +282,7 @@ public static Sample composeSetEndpointSample(TypeNode clientType, TypeNode sett
.build();
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientName)
+ .setServiceName(service.name())
.setRpcName(rpcName)
.setOverloadDisambiguation("setEndpoint")
.build();
@@ -284,7 +293,7 @@ public static Sample composeSetEndpointSample(TypeNode clientType, TypeNode sett
}
public static Sample composeTransportSample(
- TypeNode clientType, TypeNode settingsType, String transportProviderMethod) {
+ TypeNode clientType, TypeNode settingsType, String transportBuilderMethod, Service service) {
String settingsName = JavaStyle.toLowerCamelCase(settingsType.reference().name());
String clientName = JavaStyle.toLowerCamelCase(clientType.reference().name());
VariableExpr settingsVarExpr =
@@ -293,26 +302,11 @@ public static Sample composeTransportSample(
MethodInvocationExpr newBuilderMethodExpr =
MethodInvocationExpr.builder()
.setStaticReferenceType(settingsType)
- .setMethodName("newBuilder")
- .build();
- MethodInvocationExpr transportChannelProviderArg =
- MethodInvocationExpr.builder()
- .setExprReferenceExpr(
- MethodInvocationExpr.builder()
- .setStaticReferenceType(settingsType)
- .setMethodName(transportProviderMethod)
- .build())
- .setMethodName("build")
- .build();
- MethodInvocationExpr credentialsMethodExpr =
- MethodInvocationExpr.builder()
- .setExprReferenceExpr(newBuilderMethodExpr)
- .setArguments(transportChannelProviderArg)
- .setMethodName("setTransportChannelProvider")
+ .setMethodName(transportBuilderMethod)
.build();
MethodInvocationExpr buildMethodExpr =
MethodInvocationExpr.builder()
- .setExprReferenceExpr(credentialsMethodExpr)
+ .setExprReferenceExpr(newBuilderMethodExpr)
.setReturnType(settingsType)
.setMethodName("build")
.build();
@@ -346,7 +340,7 @@ public static Sample composeTransportSample(
ExprStatement.withExpr(initSettingsVarExpr), ExprStatement.withExpr(initClientVarExpr));
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientName)
+ .setServiceName(service.name())
.setRpcName(rpcName)
.setOverloadDisambiguation("setCredentialsProvider")
.build();
diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposer.java
index f93383c729..311ebab5ac 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposer.java
@@ -33,6 +33,7 @@
import com.google.api.generator.gapic.model.RegionTag;
import com.google.api.generator.gapic.model.ResourceName;
import com.google.api.generator.gapic.model.Sample;
+import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.gapic.utils.JavaStyle;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
@@ -45,7 +46,7 @@ public class ServiceClientMethodSampleComposer {
// Creates an example for an empty service (no API methods), which is a corner case but can
// happen. Generated example will only show how to instantiate the client class but will not call
// any API methods (because there are no API methods).
- public static Sample composeEmptyServiceSample(TypeNode clientType) {
+ public static Sample composeEmptyServiceSample(TypeNode clientType, Service service) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
@@ -56,10 +57,7 @@ public static Sample composeEmptyServiceSample(TypeNode clientType) {
List bodyStatements = new ArrayList<>();
RegionTag regionTag =
- RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
- .setRpcName("emtpy")
- .build();
+ RegionTag.builder().setServiceName(service.name()).setRpcName("emtpy").build();
List body =
Arrays.asList(
@@ -76,7 +74,8 @@ public static Sample composeCanonicalSample(
Method method,
TypeNode clientType,
Map resourceNames,
- Map messageTypes) {
+ Map messageTypes,
+ Service service) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
@@ -111,16 +110,19 @@ public static Sample composeCanonicalSample(
if (method.isPaged()) {
// e.g. echoClient.pagedExpand(request).iterateAll()
Sample unaryPagedRpc =
- composePagedSample(method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes);
+ composePagedSample(
+ method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes, service);
bodyStatements.addAll(unaryPagedRpc.body());
regionTag = unaryPagedRpc.regionTag();
} else if (method.hasLro()) {
- Sample unaryLroRpc = composeLroSample(method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs);
+ Sample unaryLroRpc =
+ composeLroSample(method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, service);
bodyStatements.addAll(unaryLroRpc.body());
regionTag = unaryLroRpc.regionTag();
} else {
// e.g. echoClient.echo(request)
- Sample unaryRpc = composeSample(method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs);
+ Sample unaryRpc =
+ composeSample(method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, service);
bodyStatements.addAll(unaryRpc.body());
regionTag = unaryRpc.regionTag();
}
@@ -140,7 +142,8 @@ static Sample composeSample(
Method method,
VariableExpr clientVarExpr,
List rpcMethodArgVarExprs,
- List bodyExprs) {
+ List bodyExprs,
+ Service service) {
// Invoke current method based on return type.
// e.g. if return void, echoClient.echo(..); or,
@@ -169,7 +172,7 @@ static Sample composeSample(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setOverloadDisambiguation(
SampleComposerUtil.createOverloadDisambiguation(rpcMethodArgVarExprs))
@@ -186,7 +189,8 @@ static Sample composePagedSample(
VariableExpr clientVarExpr,
List rpcMethodArgVarExprs,
List bodyExprs,
- Map messageTypes) {
+ Map messageTypes,
+ Service service) {
// Find the repeated field.
Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName());
@@ -243,7 +247,7 @@ static Sample composePagedSample(
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setOverloadDisambiguation(
SampleComposerUtil.createOverloadDisambiguation(rpcMethodArgVarExprs))
@@ -255,7 +259,8 @@ static Sample composeLroSample(
Method method,
VariableExpr clientVarExpr,
List rpcMethodArgVarExprs,
- List bodyExprs) {
+ List bodyExprs,
+ Service service) {
// Assign response variable with invoking client's LRO method.
// e.g. if return void, echoClient.waitAsync(ttl).get(); or,
// e.g. if return other type, WaitResponse response = echoClient.waitAsync(ttl).get();
@@ -293,7 +298,7 @@ static Sample composeLroSample(
}
RegionTag regionTag =
RegionTag.builder()
- .setServiceName(clientVarExpr.variable().identifier().name())
+ .setServiceName(service.name())
.setRpcName(method.name())
.setOverloadDisambiguation(
SampleComposerUtil.createOverloadDisambiguation(rpcMethodArgVarExprs))
diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleComposer.java
index 9027f50000..372399ee56 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleComposer.java
@@ -145,6 +145,7 @@ public static Optional composeSettingsSample(
.map(e -> ExprStatement.withExpr(e))
.collect(Collectors.toList());
+ // TODO: alicejli edit RegionTag to match other languages
RegionTag regionTag =
RegionTag.builder()
.setServiceName(classType.reference().name())
diff --git a/src/main/java/com/google/api/generator/gapic/composer/utils/ClassNames.java b/src/main/java/com/google/api/generator/gapic/composer/utils/ClassNames.java
index c0b717fc0a..1228e5d166 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/utils/ClassNames.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/utils/ClassNames.java
@@ -24,7 +24,8 @@ public class ClassNames {
// Using constants since many of these class names are used often.
private static final String MOCK_SERVICE_CLASS_NAME_PATTERN = "Mock%s";
private static final String MOCK_SERVICE_IMPL_CLASS_NAME_PATTERN = "Mock%sImpl";
- private static final String SERVICE_CLIENT_CLASS_NAME_PATTERN = "%sClient";
+ private static final String CLIENT_SUFFIX = "Client";
+ private static final String SERVICE_CLIENT_CLASS_NAME_PATTERN = "%s" + CLIENT_SUFFIX;
private static final String SERVICE_CLIENT_TEST_CLASS_NAME_PATTERN = "%sClientTest";
private static final String SERVICE_CLIENT_TRANSPORT_TEST_CLASS_NAME_PATTERN = "%sClient%sTest";
private static final String SERVICE_SETTINGS_CLASS_NAME_PATTERN = "%sSettings";
diff --git a/src/main/java/com/google/api/generator/gapic/model/GapicClass.java b/src/main/java/com/google/api/generator/gapic/model/GapicClass.java
index eee6349fa8..f05e308290 100644
--- a/src/main/java/com/google/api/generator/gapic/model/GapicClass.java
+++ b/src/main/java/com/google/api/generator/gapic/model/GapicClass.java
@@ -35,6 +35,12 @@ public enum Kind {
public abstract List samples();
+ // Only used for generating the region tag for samples; therefore only used in select Composers.
+ public abstract String apiShortName();
+
+ // Only used for generating the region tag for samples; therefore only used in select Composers.
+ public abstract String apiVersion();
+
public static GapicClass create(Kind kind, ClassDefinition classDefinition) {
return builder().setKind(kind).setClassDefinition(classDefinition).build();
}
@@ -45,7 +51,10 @@ public static GapicClass create(
}
static Builder builder() {
- return new AutoValue_GapicClass.Builder().setSamples(Collections.emptyList());
+ return new AutoValue_GapicClass.Builder()
+ .setSamples(Collections.emptyList())
+ .setApiShortName("")
+ .setApiVersion("");
}
abstract Builder toBuilder();
@@ -54,6 +63,14 @@ public final GapicClass withSamples(List samples) {
return toBuilder().setSamples(samples).build();
}
+ public final GapicClass withApiShortName(String apiShortName) {
+ return toBuilder().setApiShortName(apiShortName).build();
+ }
+
+ public final GapicClass withApiVersion(String apiVersion) {
+ return toBuilder().setApiVersion(apiVersion).build();
+ }
+
@AutoValue.Builder
abstract static class Builder {
abstract Builder setKind(Kind kind);
@@ -62,6 +79,10 @@ abstract static class Builder {
abstract Builder setSamples(List samples);
+ abstract Builder setApiShortName(String apiShortName);
+
+ abstract Builder setApiVersion(String apiVersion);
+
abstract GapicClass build();
}
}
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 e6ecea5c94..696683cefe 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
@@ -36,21 +36,54 @@ public enum HttpVerb {
@AutoValue
public abstract static class HttpBinding implements Comparable {
+
+ // The fully qualified name of the field. e.g. request.complex_object.another_object.name
public abstract String name();
abstract String lowerCamelName();
- public abstract boolean isOptional();
+ // An object that contains all info of the leaf level field
+ @Nullable
+ public abstract Field field();
- public abstract boolean isRepeated();
+ public boolean isOptional() {
+ return field() != null && field().isProto3Optional();
+ }
+
+ public boolean isRepeated() {
+ return field() != null && field().isRepeated();
+ }
+
+ public boolean isEnum() {
+ return field() != null && field().isEnum();
+ }
@Nullable
public abstract String valuePattern();
- public static HttpBinding create(
- String name, boolean isOptional, boolean isRepeated, String valuePattern) {
- return new AutoValue_HttpBindings_HttpBinding(
- name, JavaStyle.toLowerCamelCase(name), isOptional, isRepeated, valuePattern);
+ public static HttpBindings.HttpBinding.Builder builder() {
+ return new AutoValue_HttpBindings_HttpBinding.Builder();
+ }
+
+ @AutoValue.Builder
+ public abstract static class Builder {
+
+ public abstract HttpBindings.HttpBinding.Builder setName(String name);
+
+ public abstract HttpBindings.HttpBinding.Builder setField(Field field);
+
+ abstract HttpBindings.HttpBinding.Builder setLowerCamelName(String lowerCamelName);
+
+ public abstract HttpBindings.HttpBinding.Builder setValuePattern(String valuePattern);
+
+ abstract String name();
+
+ abstract HttpBindings.HttpBinding autoBuild();
+
+ public HttpBindings.HttpBinding build() {
+ setLowerCamelName(JavaStyle.toLowerCamelCase(name()));
+ return autoBuild();
+ }
}
// Do not forget to keep it in sync with equals() implementation.
diff --git a/src/main/java/com/google/api/generator/gapic/model/RegionTag.java b/src/main/java/com/google/api/generator/gapic/model/RegionTag.java
index d98212ef6b..e4643de654 100644
--- a/src/main/java/com/google/api/generator/gapic/model/RegionTag.java
+++ b/src/main/java/com/google/api/generator/gapic/model/RegionTag.java
@@ -20,6 +20,7 @@
import com.google.auto.value.AutoValue;
import com.google.common.base.Preconditions;
+// TODO: alicejli edit RegionTag to match other languages
/**
* This model represents a code sample region tag. Matching region start and end region tag comments
* are used to determine the boundaries of code snippets to be used in documentation.
@@ -137,7 +138,8 @@ public String generate() {
if (!apiVersion().isEmpty()) {
rt = rt + apiVersion() + "_";
}
- rt = rt + "generated_" + serviceName() + "_" + rpcName();
+ rt = rt.toLowerCase() + "generated_" + serviceName() + "_" + rpcName();
+ // TODO: @alicejli overloadDisambiguation will need to be updated to match other languages
if (!overloadDisambiguation().isEmpty()) {
rt = rt + "_" + overloadDisambiguation();
}
@@ -147,7 +149,7 @@ public String generate() {
rt = rt + "_sync";
}
- return rt.toLowerCase();
+ return rt;
}
public static CommentStatement generateTag(
diff --git a/src/main/java/com/google/api/generator/gapic/model/Service.java b/src/main/java/com/google/api/generator/gapic/model/Service.java
index 34d3f97b25..2e3a6be7df 100644
--- a/src/main/java/com/google/api/generator/gapic/model/Service.java
+++ b/src/main/java/com/google/api/generator/gapic/model/Service.java
@@ -16,8 +16,10 @@
import com.google.api.generator.engine.ast.TypeNode;
import com.google.auto.value.AutoValue;
+import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
import java.util.List;
import javax.annotation.Nullable;
@@ -50,6 +52,20 @@ public boolean hasDescription() {
return !Strings.isNullOrEmpty(description());
}
+ public String apiShortName() {
+ if (!Strings.isNullOrEmpty(defaultHost())) {
+ return parseApiShortName(defaultHost());
+ }
+ return "";
+ }
+
+ public String apiVersion() {
+ if (!Strings.isNullOrEmpty(protoPakkage())) {
+ return parseApiVersion(protoPakkage());
+ }
+ return "";
+ }
+
public Method operationPollingMethod() {
for (Method method : methods()) {
if (method.isOperationPollingMethod()) {
@@ -127,4 +143,35 @@ public abstract static class Builder {
public abstract Service build();
}
+
+ private static String parseApiVersion(String protoPackage) {
+ // parse protoPackage for apiVersion
+ String[] pakkage = protoPackage.split("\\.");
+ String apiVersion;
+ // e.g. v1, v2, v1beta1
+ if (pakkage[pakkage.length - 1].matches("v[0-9].*")) {
+ apiVersion = pakkage[pakkage.length - 1];
+ } else {
+ apiVersion = "";
+ }
+ return apiVersion;
+ }
+
+ // Parse defaultHost for apiShortName for the RegionTag. Need to account for regional default
+ // endpoints like
+ // "us-east1-pubsub.googleapis.com".
+ private static String parseApiShortName(String defaultHost) {
+ // If the defaultHost is of the format "**.googleapis.com", take the name before the first
+ // period.
+ String apiShortName = Iterables.getFirst(Splitter.on(".").split(defaultHost), defaultHost);
+ // If the defaultHost is of the format "**-**-**.googleapis.com", take the section before the
+ // first period and after the last dash to follow CSharp's implementation here:
+ // https://github.com/googleapis/gapic-generator-csharp/blob/main/Google.Api.Generator/Generation/ServiceDetails.cs#L70
+ apiShortName = Iterables.getLast(Splitter.on("-").split(apiShortName), defaultHost);
+ // `iam-meta-api` service is an exceptional case and is handled as a one-off
+ if (defaultHost.contains("iam-meta-api")) {
+ apiShortName = "iam";
+ }
+ return apiShortName;
+ }
}
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 bead11e082..87bcd76abb 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
@@ -82,6 +82,11 @@ private static HttpBindings parseHttpRuleHelper(
Map patternSampleValues = constructPathValuePatterns(pattern);
// TODO: support nested message fields bindings
+ // Nested message fields bindings for query params are already supported as part of
+ // https://github.com/googleapis/gax-java/pull/1784,
+ // however we need to excludes fields that are already configured for path params and body, see
+ // https://github.com/googleapis/googleapis/blob/532289228eaebe77c42438f74b8a5afa85fee1b6/google/api/http.proto#L208 for details,
+ // the current logic does not exclude fields that are more than one level deep.
String body = httpRule.getBody();
Set bodyParamNames;
Set queryParamNames;
@@ -133,8 +138,9 @@ private static Set validateAndConstructHttpBindings(
String patternSampleValue =
patternSampleValues != null ? patternSampleValues.get(paramName) : null;
String[] subFields = paramName.split("\\.");
+ HttpBinding.Builder httpBindingBuilder = HttpBinding.builder().setName(paramName);
if (inputMessage == null) {
- httpBindings.add(HttpBinding.create(paramName, false, false, patternSampleValue));
+ httpBindings.add(httpBindingBuilder.setValuePattern(patternSampleValue).build());
continue;
}
Message nestedMessage = inputMessage;
@@ -156,8 +162,7 @@ private static Set validateAndConstructHttpBindings(
}
Field field = nestedMessage.fieldMap().get(subFieldName);
httpBindings.add(
- HttpBinding.create(
- paramName, field.isProto3Optional(), field.isRepeated(), patternSampleValue));
+ httpBindingBuilder.setValuePattern(patternSampleValue).setField(field).build());
}
}
}
diff --git a/src/test/java/com/google/api/generator/engine/writer/ImportWriterVisitorTest.java b/src/test/java/com/google/api/generator/engine/writer/ImportWriterVisitorTest.java
index 07be47a996..bd8d62afb7 100644
--- a/src/test/java/com/google/api/generator/engine/writer/ImportWriterVisitorTest.java
+++ b/src/test/java/com/google/api/generator/engine/writer/ImportWriterVisitorTest.java
@@ -363,6 +363,32 @@ public void writeVariableExprImports_nestedReference() {
writerVisitor.write());
}
+ @Test
+ public void writeVariableExprImports_withAnnotations() {
+ Variable variable =
+ Variable.builder()
+ .setName("expr")
+ .setType(TypeNode.withReference(ConcreteReference.withClazz(Expr.class)))
+ .build();
+
+ VariableExpr variableExpr =
+ VariableExpr.builder()
+ .setVariable(variable)
+ .setIsDecl(true)
+ .setAnnotations(
+ Arrays.asList(
+ AnnotationNode.withType(
+ TypeNode.withReference(ConcreteReference.withClazz(Generated.class)))))
+ .build();
+
+ variableExpr.accept(writerVisitor);
+ assertEquals(
+ LineFormatter.lines(
+ "import com.google.api.generator.engine.ast.Expr;\n",
+ "import javax.annotation.Generated;\n\n"),
+ writerVisitor.write());
+ }
+
@Test
public void writeAnonymousClassExprImports() {
// [Constructing] Function, MethodDefinition>
diff --git a/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java
index 4bbc779dcf..d99325fbe8 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java
@@ -15,6 +15,7 @@
package com.google.api.generator.gapic.composer;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import com.google.api.generator.engine.ast.ClassDefinition;
import com.google.api.generator.engine.ast.ScopeNode;
@@ -25,11 +26,11 @@
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicClass.Kind;
import com.google.api.generator.gapic.model.GapicContext;
+import com.google.api.generator.gapic.model.RegionTag;
import com.google.api.generator.gapic.model.Sample;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.test.framework.Assert;
import com.google.api.generator.test.framework.Utils;
-import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
@@ -41,9 +42,16 @@ public class ComposerTest {
private final Service echoProtoService = context.services().get(0);
private final List clazzes =
Arrays.asList(
- GrpcServiceCallableFactoryClassComposer.instance().generate(context, echoProtoService));
- private final String protoPackage = context.gapicMetadata().getProtoPackage();
- private final List samples = clazzes.get(0).samples();
+ GrpcServiceCallableFactoryClassComposer.instance()
+ .generate(context, echoProtoService)
+ .withApiShortName(echoProtoService.apiShortName())
+ .withApiVersion(echoProtoService.apiVersion()));
+ private final Sample sample =
+ Sample.builder()
+ .setRegionTag(
+ RegionTag.builder().setServiceName("serviceName").setRpcName("rpcName").build())
+ .build();
+ private List ListofSamples = Arrays.asList(new Sample[] {sample});
@Test
public void gapicClass_addApacheLicense() {
@@ -65,59 +73,93 @@ public void gapicClass_addApacheLicense() {
@Test
public void composeSamples_showcase() {
- for (Sample sample : samples) {
- assertEquals(
- "File header will be empty before composing samples",
- sample.fileHeader(),
- ImmutableList.of());
- assertEquals(
- "ApiShortName will be empty before composing samples",
- sample.regionTag().apiShortName(),
- "");
- assertEquals(
- "ApiVersion will be empty before composing samples", sample.regionTag().apiVersion(), "");
- }
+ GapicClass testClass = clazzes.get(0).withSamples(ListofSamples);
+ List testClassList = Arrays.asList(new GapicClass[] {testClass});
List composedSamples =
- Composer.prepareExecutableSamples(clazzes, protoPackage).get(0).samples();
+ Composer.prepareExecutableSamples(testClassList).get(0).samples();
+ assertFalse(composedSamples.isEmpty());
for (Sample sample : composedSamples) {
assertEquals(
- "File header should be apache",
- sample.fileHeader(),
- Arrays.asList(CommentComposer.APACHE_LICENSE_COMMENT));
+ "File header should be APACHE",
+ Arrays.asList(CommentComposer.APACHE_LICENSE_COMMENT),
+ sample.fileHeader());
assertEquals(
- "ApiShortName should be showcase", sample.regionTag().apiShortName(), "showcase");
- assertEquals("ApiVersion should be v1beta1", sample.regionTag().apiVersion(), "v1beta1");
+ "ApiShortName should be Localhost7469",
+ "Localhost7469",
+ sample.regionTag().apiShortName());
+ assertEquals("ApiVersion should be V1Beta1", "V1Beta1", sample.regionTag().apiVersion());
}
}
+ @Test
+ public void gapicClass_addRegionTagAndHeaderToSample() {
+ Sample testSample;
+ testSample = Composer.addRegionTagAndHeaderToSample(sample, "showcase", "v1");
+ assertEquals("Showcase", testSample.regionTag().apiShortName());
+ assertEquals("V1", testSample.regionTag().apiVersion());
+ assertEquals(Arrays.asList(CommentComposer.APACHE_LICENSE_COMMENT), testSample.fileHeader());
+ }
+
@Test
public void composeSamples_parseProtoPackage() {
+
+ String defaultHost = "accessapproval.googleapis.com:443";
String protoPack = "google.cloud.accessapproval.v1";
+ Service testService =
+ echoProtoService.toBuilder().setDefaultHost(defaultHost).setProtoPakkage(protoPack).build();
+ List testClassList = getTestClassListFromService(testService);
List composedSamples =
- Composer.prepareExecutableSamples(clazzes, protoPack).get(0).samples();
+ Composer.prepareExecutableSamples(testClassList).get(0).samples();
+
+ // If samples is empty, the test automatically passes without checking.
+ assertFalse(composedSamples.isEmpty());
for (Sample sample : composedSamples) {
assertEquals(
- "ApiShortName should be accessapproval",
+ "ApiShortName should be Accessapproval",
sample.regionTag().apiShortName(),
- "accessapproval");
- assertEquals("ApiVersion should be v1", sample.regionTag().apiVersion(), "v1");
+ "Accessapproval");
+ assertEquals("ApiVersion should be V1", sample.regionTag().apiVersion(), "V1");
}
protoPack = "google.cloud.vision.v1p1beta1";
- composedSamples = Composer.prepareExecutableSamples(clazzes, protoPack).get(0).samples();
+ defaultHost = "vision.googleapis.com";
+ testService =
+ testService.toBuilder().setDefaultHost(defaultHost).setProtoPakkage(protoPack).build();
+ testClassList = getTestClassListFromService(testService);
+ composedSamples = Composer.prepareExecutableSamples(testClassList).get(0).samples();
+ // If samples is empty, the test automatically passes without checking.
+ assertFalse(composedSamples.isEmpty());
+
for (Sample sample : composedSamples) {
- assertEquals("ApiShortName should be vision", sample.regionTag().apiShortName(), "vision");
- assertEquals("ApiVersion should be v1p1beta1", sample.regionTag().apiVersion(), "v1p1beta1");
+ assertEquals("ApiShortName should be Vision", sample.regionTag().apiShortName(), "Vision");
+ assertEquals("ApiVersion should be V1P1Beta1", sample.regionTag().apiVersion(), "V1P1Beta1");
}
protoPack = "google.cloud.vision";
- composedSamples = Composer.prepareExecutableSamples(clazzes, protoPack).get(0).samples();
+ testService =
+ testService.toBuilder().setDefaultHost(defaultHost).setProtoPakkage(protoPack).build();
+ testClassList = getTestClassListFromService(testService);
+ composedSamples = Composer.prepareExecutableSamples(testClassList).get(0).samples();
+ // If samples is empty, the test automatically passes without checking.
+ assertFalse(composedSamples.isEmpty());
+
for (Sample sample : composedSamples) {
- assertEquals("ApiShortName should be vision", sample.regionTag().apiShortName(), "vision");
+ assertEquals("ApiShortName should be Vision", sample.regionTag().apiShortName(), "Vision");
assertEquals("ApiVersion should be empty", sample.regionTag().apiVersion(), "");
}
}
+
+ private List getTestClassListFromService(Service testService) {
+ GapicClass testClass =
+ GrpcServiceCallableFactoryClassComposer.instance()
+ .generate(context, testService)
+ .withSamples(ListofSamples)
+ .withApiShortName(testService.apiShortName())
+ .withApiVersion(testService.apiVersion());
+ List testClassList = Arrays.asList(new GapicClass[] {testClass});
+ return testClassList;
+ }
}
diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceClientClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceClientClassComposerTest.java
index fe00c3ca04..c169c88eb3 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceClientClassComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceClientClassComposerTest.java
@@ -18,8 +18,7 @@
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.test.framework.Assert;
-import java.util.Arrays;
-import java.util.Collection;
+import java.util.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -30,11 +29,36 @@ public class ServiceClientClassComposerTest {
public static Collection