Skip to content

Commit 9c06bc9

Browse files
lqiu96burkedavison
andauthored
feat: Do not generate Service REST code if there are no matching RPC in a Service (#1236)
* feat: Add callable getter methods for REST * chore: Update showcase tests * chore: Update error message * feat: Move httpjson specific logic to sub composer * feat: Move method supported logic to Method * feat: Move method supported logic to Method * chore: Format the files * chore: Cleanup Abstract composer * chore: Move code to httpjson composer * chore: Resolve code smell * feat: Use generic error message * chore: Fix format issues * feat: Add tests for Method.isSupportedByTransport() * feat: Resolve PR comments * feat: Update back to private * feat: Update error message * feat: Update javadoc comment * feat: Do not generate Service REST code if there are no matching RPC in a Service * chore: Pull in latest part 1 changes * fix: Update Kind to NON_GENERATED * feat: Do not generate secondary Transport sample if no rest code is generated * feat: Do not generate httpjson tests if no matching RPCs * chore: Run mvn test -DupdateUnitGoldens * chore: Update formatting * chore: Add apigeeconnect to test REGAPIC * chore: Create directory for new modules * chore: Update googleapis commit to a later version for grpc+rest enabled APIs * chore Add in goldens for apigeeconnect * chore: Add comments for funcs * chore: Refactor ServiceClientClassComposer for GRPC_REST * chore: Remove unused import * chore: Remove unnecessary if/else check * chore: Fix transport sample name * chore: Update apigeeconnect IT goldens * chore: Update asset IT goldens * chore: Update asset goldens * chore: Update credentials IT goldens * chore: Update library IT goldens * chore: Update redis IT goldens * chore: Fix linting issues * chore: Add showcase extended proto framework * chore: Use seperate Bazel rules for showcase extended * chore: Seperate GRPC jar into separate jobs * chore: Update bazel build file * Apply suggestions from code review Co-authored-by: Burke Davison <[email protected]> * chore: Update showcase tests * chore: Resolve sonar comments * chore: Update unit tests for wicked proto * chore: Resolve format * chore: Update sonar comments * chore: Update PR comments * chore: Update golden test cases * chore: Revert back to original sample name * chore: Update showcase and goldens * chore: Leave framework but remove wicked proto from showcase extended * chore: Update showcase project with extended info * chore: Remove comment * chore: Use TransportContext instead of duplicate transportName() * chore: Fix formatting issues * chore: Remove the changed spacing in the file * chore: Use transportContext where possible * chore: Fix format issues * chore: Fix compile issue --------- Co-authored-by: Burke Davison <[email protected]>
1 parent bdf12b0 commit 9c06bc9

File tree

82 files changed

+6445
-144
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+6445
-144
lines changed

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java

+5
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ protected TransportContext getTransportContext() {
6262

6363
@Override
6464
public GapicClass generate(GapicContext context, Service service) {
65+
// Do not generate the Callable Factory if there are no RPCs enabled for the Transport
66+
if (!service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) {
67+
return GapicClass.createNonGeneratedGapicClass();
68+
}
69+
6570
TypeStore typeStore = createTypes(service);
6671

6772
String className =

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientTestClassComposer.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ public GapicClass generate(GapicContext context, Service service) {
109109
}
110110

111111
protected GapicClass generate(String className, GapicContext context, Service service) {
112+
// Do not generate Client Test code for Transport if there are no matching RPCs for a Transport
113+
if (!service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) {
114+
return GapicClass.createNonGeneratedGapicClass();
115+
}
116+
112117
Map<String, ResourceName> resourceNames = context.helperResourceNames();
113118
String pakkage = service.pakkage();
114119
TypeStore typeStore = new TypeStore();
@@ -131,10 +136,6 @@ protected GapicClass generate(String className, GapicContext context, Service se
131136
return GapicClass.create(kind, classDef);
132137
}
133138

134-
protected boolean isSupportedMethod(Method method) {
135-
return true;
136-
}
137-
138139
private List<AnnotationNode> createClassAnnotations() {
139140
return Arrays.asList(
140141
AnnotationNode.builder()
@@ -230,7 +231,7 @@ private List<MethodDefinition> createTestMethods(
230231
Map<String, Message> messageTypes = context.messages();
231232
List<MethodDefinition> javaMethods = new ArrayList<>();
232233
for (Method method : service.methods()) {
233-
if (!isSupportedMethod(method)) {
234+
if (!method.isSupportedByTransport(getTransportContext().transport())) {
234235
javaMethods.add(createUnsupportedTestMethod(method));
235236
continue;
236237
}

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,14 @@ private List<MethodDefinition> createDefaultGetterMethods(Service service, TypeS
385385
while (providerBuilderNamesIt.hasNext()
386386
&& channelProviderClassesIt.hasNext()
387387
&& transportNamesIt.hasNext()) {
388+
String providerBuilderName = providerBuilderNamesIt.next();
389+
Class<?> channelProviderClass = channelProviderClassesIt.next();
390+
String transportName = transportNamesIt.next();
391+
392+
if (!service.hasAnyEnabledMethodsForTransport(transportName)) {
393+
continue;
394+
}
395+
388396
List<AnnotationNode> annotations = ImmutableList.of();
389397

390398
// For clients supporting multiple transports (mainly grpc+rest case) make secondary transport
@@ -397,16 +405,13 @@ private List<MethodDefinition> createDefaultGetterMethods(Service service, TypeS
397405
SettingsCommentComposer.DEFAULT_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT;
398406
if (getTransportContext().transportNames().size() > 1) {
399407
commentStatement =
400-
new SettingsCommentComposer(transportNamesIt.next())
401-
.getTransportProviderBuilderMethodComment();
408+
new SettingsCommentComposer(transportName).getTransportProviderBuilderMethodComment();
402409
}
403410

404411
javaMethods.add(
405412
methodMakerFn.apply(
406413
methodStarterFn
407-
.apply(
408-
providerBuilderNamesIt.next(),
409-
typeMakerFn.apply(channelProviderClassesIt.next()))
414+
.apply(providerBuilderName, typeMakerFn.apply(channelProviderClass))
410415
.setAnnotations(annotations),
411416
commentStatement));
412417
secondaryTransportProviderBuilder = true;

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java

+38-18
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,8 @@ protected MethodDefinition createDefaultCredentialsProviderBuilderMethod() {
243243
.build();
244244
}
245245

246-
protected List<MethodDefinition> createDefaultTransportTransportProviderBuilderMethods() {
246+
protected List<MethodDefinition> createDefaultTransportTransportProviderBuilderMethods(
247+
Service service) {
247248
// Create the defaultGrpcTransportProviderBuilder method.
248249
Iterator<Class<?>> providerClassIt =
249250
getTransportContext().instantiatingChannelProviderClasses().iterator();
@@ -259,10 +260,19 @@ protected List<MethodDefinition> createDefaultTransportTransportProviderBuilderM
259260
&& providerBuilderClassIt.hasNext()
260261
&& builderNamesIt.hasNext()
261262
&& transportNamesIt.hasNext()) {
263+
Class<?> providerClass = providerClassIt.next();
264+
Class<?> providerBuilderClass = providerBuilderClassIt.next();
265+
String builderName = builderNamesIt.next();
266+
String transportName = transportNamesIt.next();
267+
268+
if (!service.hasAnyEnabledMethodsForTransport(transportName)) {
269+
continue;
270+
}
271+
262272
TypeNode returnType =
263-
TypeNode.withReference(ConcreteReference.withClazz(providerBuilderClassIt.next()));
273+
TypeNode.withReference(ConcreteReference.withClazz(providerBuilderClass));
264274
TypeNode channelProviderType =
265-
TypeNode.withReference(ConcreteReference.withClazz(providerClassIt.next()));
275+
TypeNode.withReference(ConcreteReference.withClazz(providerClass));
266276

267277
MethodInvocationExpr transportChannelProviderBuilderExpr =
268278
MethodInvocationExpr.builder()
@@ -281,8 +291,7 @@ protected List<MethodDefinition> createDefaultTransportTransportProviderBuilderM
281291
SettingsCommentComposer.DEFAULT_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT;
282292
if (getTransportContext().transportNames().size() > 1) {
283293
commentStatement =
284-
new SettingsCommentComposer(transportNamesIt.next())
285-
.getTransportProviderBuilderMethodComment();
294+
new SettingsCommentComposer(transportName).getTransportProviderBuilderMethodComment();
286295
}
287296

288297
MethodDefinition method =
@@ -292,7 +301,7 @@ protected List<MethodDefinition> createDefaultTransportTransportProviderBuilderM
292301
.setScope(ScopeNode.PUBLIC)
293302
.setIsStatic(true)
294303
.setReturnType(returnType)
295-
.setName(builderNamesIt.next())
304+
.setName(builderName)
296305
.setReturnExpr(returnExpr)
297306
.build();
298307

@@ -1047,17 +1056,23 @@ private MethodDefinition createCreateStubMethod(Service service, TypeStore typeS
10471056
.setMethodName("getTransportName")
10481057
.build();
10491058

1059+
Iterator<String> transportNamesIt = getTransportContext().transportNames().iterator();
10501060
Iterator<TypeNode> channelTypesIt = getTransportContext().transportChannelTypes().iterator();
10511061
Iterator<String> getterNameIt = getTransportContext().transportGetterNames().iterator();
10521062
Iterator<String> serivceStubClassNameIt =
10531063
getTransportContext().classNames().getTransportServiceStubClassNames(service).iterator();
10541064

10551065
while (channelTypesIt.hasNext() && getterNameIt.hasNext()) {
1066+
String transportName = transportNamesIt.next();
10561067
TypeNode channelType = channelTypesIt.next();
10571068
String getterName = getterNameIt.next();
10581069
String serivceStubClassName = serivceStubClassNameIt.next();
10591070

1060-
Expr tRansportNameExpr =
1071+
if (!service.hasAnyEnabledMethodsForTransport(transportName)) {
1072+
continue;
1073+
}
1074+
1075+
Expr transportNameExpr =
10611076
MethodInvocationExpr.builder()
10621077
.setStaticReferenceType(channelType)
10631078
.setMethodName(getterName)
@@ -1067,7 +1082,7 @@ private MethodDefinition createCreateStubMethod(Service service, TypeStore typeS
10671082
MethodInvocationExpr.builder()
10681083
.setExprReferenceExpr(getTransportNameExpr)
10691084
.setMethodName("equals")
1070-
.setArguments(tRansportNameExpr)
1085+
.setArguments(transportNameExpr)
10711086
.setReturnType(TypeNode.BOOLEAN)
10721087
.build();
10731088

@@ -1191,7 +1206,7 @@ private List<MethodDefinition> createDefaultHelperAndGetterMethods(
11911206
.build());
11921207

11931208
javaMethods.add(createDefaultCredentialsProviderBuilderMethod());
1194-
javaMethods.addAll(createDefaultTransportTransportProviderBuilderMethods());
1209+
javaMethods.addAll(createDefaultTransportTransportProviderBuilderMethods(service));
11951210
javaMethods.add(createDefaultTransportChannelProviderMethod());
11961211
javaMethods.addAll(createApiClientHeaderProviderBuilderMethods(service, typeStore));
11971212

@@ -1424,7 +1439,7 @@ private List<MethodDefinition> createNestedClassMethods(
14241439
nestedClassMethods.addAll(
14251440
createNestedClassConstructorMethods(
14261441
service, serviceConfig, nestedMethodSettingsMemberVarExprs, typeStore));
1427-
nestedClassMethods.addAll(createNestedClassCreateDefaultMethods(typeStore));
1442+
nestedClassMethods.addAll(createNestedClassCreateDefaultMethods(service, typeStore));
14281443
nestedClassMethods.add(createNestedClassInitDefaultsMethod(service, serviceConfig, typeStore));
14291444
nestedClassMethods.add(createNestedClassApplyToAllUnaryMethodsMethod(superType, typeStore));
14301445
nestedClassMethods.add(createNestedClassUnaryMethodSettingsBuilderGetterMethod());
@@ -1762,14 +1777,19 @@ private static List<MethodDefinition> createNestedClassConstructorMethods(
17621777
return ctorMethods;
17631778
}
17641779

1765-
protected List<MethodDefinition> createNestedClassCreateDefaultMethods(TypeStore typeStore) {
1766-
return Collections.singletonList(
1767-
createNestedClassCreateDefaultMethod(
1768-
typeStore,
1769-
"createDefault",
1770-
"defaultTransportChannelProvider",
1771-
null,
1772-
"defaultApiClientHeaderProviderBuilder"));
1780+
protected List<MethodDefinition> createNestedClassCreateDefaultMethods(
1781+
Service service, TypeStore typeStore) {
1782+
if (service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) {
1783+
return Arrays.asList(
1784+
createNestedClassCreateDefaultMethod(
1785+
typeStore,
1786+
"createDefault",
1787+
"defaultTransportChannelProvider",
1788+
null,
1789+
"defaultApiClientHeaderProviderBuilder"));
1790+
} else {
1791+
return Collections.emptyList();
1792+
}
17731793
}
17741794

17751795
protected MethodDefinition createNestedClassCreateDefaultMethod(

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java

+12-13
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
import com.google.api.generator.gapic.model.Message;
6060
import com.google.api.generator.gapic.model.Method;
6161
import com.google.api.generator.gapic.model.Service;
62-
import com.google.api.generator.gapic.model.Transport;
6362
import com.google.api.generator.gapic.utils.JavaStyle;
6463
import com.google.common.base.Preconditions;
6564
import com.google.common.collect.ImmutableList;
@@ -94,7 +93,7 @@ public abstract class AbstractTransportServiceStubClassComposer implements Class
9493
private static final String OPERATION_CALLABLE_CLASS_MEMBER_PATTERN = "%sOperationCallable";
9594
private static final String OPERATION_CALLABLE_NAME = "OperationCallable";
9695
// private static final String OPERATIONS_STUB_MEMBER_NAME = "operationsStub";
97-
private static final String PAGED_CALLABLE_NAME = "PagedCallable";
96+
protected static final String PAGED_CALLABLE_NAME = "PagedCallable";
9897

9998
protected static final TypeStore FIXED_TYPESTORE = createStaticTypes();
10099

@@ -134,6 +133,10 @@ private static TypeStore createStaticTypes() {
134133

135134
@Override
136135
public GapicClass generate(GapicContext context, Service service) {
136+
if (!service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) {
137+
return GapicClass.createNonGeneratedGapicClass();
138+
}
139+
137140
String pakkage = service.pakkage() + ".stub";
138141
TypeStore typeStore = createDynamicTypes(service, pakkage);
139142
String className = getTransportContext().classNames().getTransportServiceStubClassName(service);
@@ -225,10 +228,6 @@ public GapicClass generate(GapicContext context, Service service) {
225228
return GapicClass.create(kind, classDef);
226229
}
227230

228-
protected Transport getTransport() {
229-
return Transport.GRPC;
230-
}
231-
232231
protected abstract Statement createMethodDescriptorVariableDecl(
233232
Service service,
234233
Method protoMethod,
@@ -314,7 +313,7 @@ protected List<Statement> createMethodDescriptorVariableDecls(
314313
Map<String, Message> messageTypes,
315314
boolean restNumericEnumsEnabled) {
316315
return service.methods().stream()
317-
.filter(x -> x.isSupportedByTransport(getTransport()))
316+
.filter(x -> x.isSupportedByTransport(getTransportContext().transport()))
318317
.map(
319318
m ->
320319
createMethodDescriptorVariableDecl(
@@ -343,7 +342,7 @@ private static List<Statement> createClassMemberFieldDeclarations(
343342
protected Map<String, VariableExpr> createProtoMethodNameToDescriptorClassMembers(
344343
Service service, Class<?> descriptorClass) {
345344
return service.methods().stream()
346-
.filter(x -> x.isSupportedByTransport(getTransport()))
345+
.filter(x -> x.isSupportedByTransport(getTransportContext().transport()))
347346
.collect(
348347
Collectors.toMap(
349348
Method::name,
@@ -375,7 +374,7 @@ private Map<String, VariableExpr> createCallableClassMembers(
375374
Map<String, VariableExpr> callableClassMembers = new LinkedHashMap<>();
376375
// Using a for-loop because the output cardinality is not a 1:1 mapping to the input set.
377376
for (Method protoMethod : service.methods()) {
378-
if (!protoMethod.isSupportedByTransport(getTransport())) {
377+
if (!protoMethod.isSupportedByTransport(getTransportContext().transport())) {
379378
continue;
380379
}
381380
String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name());
@@ -664,7 +663,7 @@ protected List<MethodDefinition> createConstructorMethods(
664663
// Transport settings local variables.
665664
Map<String, VariableExpr> javaStyleMethodNameToTransportSettingsVarExprs =
666665
service.methods().stream()
667-
.filter(x -> x.isSupportedByTransport(getTransport()))
666+
.filter(x -> x.isSupportedByTransport(getTransportContext().transport()))
668667
.collect(
669668
Collectors.toMap(
670669
m -> JavaStyle.toLowerCamelCase(m.name()),
@@ -688,7 +687,7 @@ protected List<MethodDefinition> createConstructorMethods(
688687

689688
secondCtorExprs.addAll(
690689
service.methods().stream()
691-
.filter(x -> x.isSupportedByTransport(getTransport()))
690+
.filter(x -> x.isSupportedByTransport(getTransportContext().transport()))
692691
.map(
693692
m ->
694693
createTransportSettingsInitExpr(
@@ -1059,7 +1058,7 @@ private List<MethodDefinition> createStubOverrideMethods(
10591058

10601059
private boolean checkOperationPollingMethod(Service service) {
10611060
return service.methods().stream()
1062-
.filter(x -> x.isSupportedByTransport(getTransport()))
1061+
.filter(x -> x.isSupportedByTransport(getTransportContext().transport()))
10631062
.anyMatch(Method::isOperationPollingMethod);
10641063
}
10651064

@@ -1098,7 +1097,7 @@ private TypeStore createDynamicTypes(Service service, String stubPakkage) {
10981097
typeStore.putAll(
10991098
service.pakkage(),
11001099
service.methods().stream()
1101-
.filter(x -> x.isSupportedByTransport(getTransport()))
1100+
.filter(x -> x.isSupportedByTransport(getTransportContext().transport()))
11021101
.filter(Method::isPaged)
11031102
.map(m -> String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, m.name()))
11041103
.collect(Collectors.toList()),

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposer.java

-8
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import com.google.api.generator.gapic.composer.store.TypeStore;
2222
import com.google.api.generator.gapic.model.GapicClass;
2323
import com.google.api.generator.gapic.model.GapicContext;
24-
import com.google.api.generator.gapic.model.Method;
25-
import com.google.api.generator.gapic.model.Method.Stream;
2624
import com.google.api.generator.gapic.model.Service;
2725
import java.util.Map;
2826

@@ -46,12 +44,6 @@ protected GapicClass generate(String className, GapicContext context, Service se
4644
service);
4745
}
4846

49-
protected boolean isSupportedMethod(Method method) {
50-
return method.httpBindings() != null
51-
&& method.stream() != Stream.BIDI
52-
&& method.stream() != Stream.CLIENT;
53-
}
54-
5547
@Override
5648
protected MethodDefinition createStartStaticServerMethod(
5749
Service service,

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposer.java

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public static HttpJsonServiceStubClassComposer instance() {
3535
@Override
3636
protected List<MethodDefinition> createStaticCreatorMethods(
3737
Service service, TypeStore typeStore, String newBuilderMethod) {
38+
// No need to check if REST Transport is enabled
39+
// AbstractTransportServiceStubClassComposer won't generate a file if REST isn't enabled
3840
return super.createStaticCreatorMethods(service, typeStore, "newHttpJsonBuilder");
3941
}
4042
}

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java

+5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.google.api.generator.gapic.model.ResourceName;
2727
import com.google.api.generator.gapic.model.Sample;
2828
import com.google.api.generator.gapic.model.Service;
29+
import com.google.api.generator.gapic.model.Transport;
2930
import java.util.Arrays;
3031
import java.util.List;
3132
import java.util.Map;
@@ -48,6 +49,10 @@ protected List<CommentStatement> createClassHeaderComments(
4849
Map<String, ResourceName> resourceNames,
4950
Map<String, Message> messageTypes,
5051
List<Sample> samples) {
52+
if (!service.hasAnyEnabledMethodsForTransport(Transport.REST)) {
53+
return super.createClassHeaderComments(
54+
service, typeStore, resourceNames, messageTypes, samples);
55+
}
5156
TypeNode clientType = typeStore.get(ClassNames.getServiceClientClassName(service));
5257
TypeNode settingsType = typeStore.get(ClassNames.getServiceSettingsClassName(service));
5358
Sample classMethodSampleCode =

0 commit comments

Comments
 (0)