From d13b388d6ce2a6144e9c0f9347069a36b09e9fc3 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 4 Jan 2023 14:03:06 -0500 Subject: [PATCH 01/17] feat: Add callable getter methods for REST --- ...ractTransportServiceStubClassComposer.java | 73 +++++++++++++++---- .../grpcrest/goldens/HttpJsonEchoStub.golden | 13 ++++ 2 files changed, 73 insertions(+), 13 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index c2f4fb7473..6b907dd19c 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -59,6 +59,7 @@ import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.model.Transport; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -126,7 +127,8 @@ private static TypeStore createStaticTypes() { RequestParamsExtractor.class, ServerStreamingCallable.class, TimeUnit.class, - UnaryCallable.class); + UnaryCallable.class, + UnsupportedOperationException.class); return new TypeStore(concreteClazzes); } @@ -190,6 +192,20 @@ public GapicClass generate(GapicContext context, Service service) { messageTypes, context.restNumericEnumsEnabled()); + List methodDefinitions = + createClassMethods( + context, + service, + typeStore, + classMemberVarExprs, + callableClassMemberVarExprs, + protoMethodNameToDescriptorVarExprs, + classStatements); + methodDefinitions.addAll(createInvalidClassMethods(service)); + methodDefinitions.addAll( + createStubOverrideMethods( + classMemberVarExprs.get(BACKGROUND_RESOURCES_MEMBER_NAME), service)); + StubCommentComposer commentComposer = new StubCommentComposer(getTransportContext().transportNames().get(0)); @@ -204,20 +220,54 @@ public GapicClass generate(GapicContext context, Service service) { .setName(className) .setExtendsType( typeStore.get(getTransportContext().classNames().getServiceStubClassName(service))) - .setMethods( - createClassMethods( - context, - service, - typeStore, - classMemberVarExprs, - callableClassMemberVarExprs, - protoMethodNameToDescriptorVarExprs, - classStatements)) + .setMethods(methodDefinitions) .setStatements(classStatements) .build(); return GapicClass.create(kind, classDef); } + private String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { + if (protoMethod.stream() == Method.Stream.BIDI + || protoMethod.stream() == Method.Stream.CLIENT) { + return String.format( + "Not implemented: %s(). %s is not implemented for %s", + callableName, protoMethod.stream(), Transport.REST); + } else if (protoMethod.httpBindings() == null) { + return String.format( + "Not implemented: %s(). RPC is not enabled for %s", callableName, Transport.REST); + } else { + return String.format("Not implemented: %s()", callableName); + } + } + + private List createInvalidClassMethods(Service service) { + List methodDefinitions = new ArrayList<>(); + for (Method protoMethod : service.methods()) { + if (!isSupportedMethod(protoMethod)) { + String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); + String callableName = + String.format(CALLABLE_CLASS_MEMBER_PATTERN, javaStyleProtoMethodName); + methodDefinitions.add( + MethodDefinition.builder() + .setIsOverride(true) + .setScope(ScopeNode.PUBLIC) + .setName(callableName) + .setReturnType(getCallableType(protoMethod)) + .setBody( + Arrays.asList( + ExprStatement.withExpr( + ThrowExpr.builder() + .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) + .setMessageExpr( + getUnsupportedOperationExceptionReason( + callableName, protoMethod)) + .build()))) + .build()); + } + } + return methodDefinitions; + } + protected boolean isSupportedMethod(Method method) { return true; } @@ -470,9 +520,6 @@ protected List createClassMethods( service, classMemberVarExprs.get(getTransportContext().transportOperationsStubNames().get(0)))); javaMethods.addAll(createCallableGetterMethods(callableClassMemberVarExprs)); - javaMethods.addAll( - createStubOverrideMethods( - classMemberVarExprs.get(BACKGROUND_RESOURCES_MEMBER_NAME), service)); return javaMethods; } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden index 6d6d179d9b..2913af8832 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden @@ -16,6 +16,7 @@ import com.google.api.gax.httpjson.ProtoMessageResponseParser; import com.google.api.gax.httpjson.ProtoRestSerializer; import com.google.api.gax.httpjson.longrunning.stub.HttpJsonOperationsStub; import com.google.api.gax.longrunning.OperationSnapshot; +import com.google.api.gax.rpc.BidiStreamingCallable; import com.google.api.gax.rpc.ClientContext; import com.google.api.gax.rpc.OperationCallable; import com.google.api.gax.rpc.ServerStreamingCallable; @@ -544,6 +545,18 @@ public class HttpJsonEchoStub extends EchoStub { return nestedBindingCallable; } + @Override + public BidiStreamingCallable chatCallable() { + throw new UnsupportedOperationException( + "Not implemented: chatCallable(). BIDI is not implemented for REST"); + } + + @Override + public UnaryCallable noBindingCallable() { + throw new UnsupportedOperationException( + "Not implemented: noBindingCallable(). RPC is not enabled for REST"); + } + @Override public final void close() { try { From 1fc3cc71f89bc0eddc7a6acdf06cad71d522f778 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 4 Jan 2023 15:51:53 -0500 Subject: [PATCH 02/17] chore: Update showcase tests --- .../showcase/v1beta1/stub/HttpJsonEchoStub.java | 14 ++++++++++++++ .../v1beta1/stub/HttpJsonMessagingStub.java | 16 ++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java index 3ddb5d3570..64653683bb 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java @@ -32,7 +32,9 @@ import com.google.api.gax.httpjson.ProtoRestSerializer; import com.google.api.gax.httpjson.longrunning.stub.HttpJsonOperationsStub; import com.google.api.gax.longrunning.OperationSnapshot; +import com.google.api.gax.rpc.BidiStreamingCallable; import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.ClientStreamingCallable; import com.google.api.gax.rpc.OperationCallable; import com.google.api.gax.rpc.ServerStreamingCallable; import com.google.api.gax.rpc.UnaryCallable; @@ -524,6 +526,18 @@ public UnaryCallable blockCallable() { return blockCallable; } + @Override + public ClientStreamingCallable collectCallable() { + throw new UnsupportedOperationException( + "Not implemented: collectCallable(). CLIENT is not implemented for REST"); + } + + @Override + public BidiStreamingCallable chatCallable() { + throw new UnsupportedOperationException( + "Not implemented: chatCallable(). BIDI is not implemented for REST"); + } + @Override public final void close() { try { diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java index 41ac603817..b6d778d975 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java @@ -32,7 +32,9 @@ import com.google.api.gax.httpjson.ProtoRestSerializer; import com.google.api.gax.httpjson.longrunning.stub.HttpJsonOperationsStub; import com.google.api.gax.longrunning.OperationSnapshot; +import com.google.api.gax.rpc.BidiStreamingCallable; import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.ClientStreamingCallable; import com.google.api.gax.rpc.OperationCallable; import com.google.api.gax.rpc.ServerStreamingCallable; import com.google.api.gax.rpc.UnaryCallable; @@ -40,6 +42,7 @@ import com.google.protobuf.Empty; import com.google.protobuf.TypeRegistry; import com.google.showcase.v1beta1.Blurb; +import com.google.showcase.v1beta1.ConnectRequest; import com.google.showcase.v1beta1.CreateBlurbRequest; import com.google.showcase.v1beta1.CreateRoomRequest; import com.google.showcase.v1beta1.DeleteBlurbRequest; @@ -54,6 +57,7 @@ import com.google.showcase.v1beta1.SearchBlurbsMetadata; import com.google.showcase.v1beta1.SearchBlurbsRequest; import com.google.showcase.v1beta1.SearchBlurbsResponse; +import com.google.showcase.v1beta1.SendBlurbsResponse; import com.google.showcase.v1beta1.StreamBlurbsRequest; import com.google.showcase.v1beta1.StreamBlurbsResponse; import com.google.showcase.v1beta1.UpdateBlurbRequest; @@ -785,6 +789,18 @@ public ServerStreamingCallable stream return streamBlurbsCallable; } + @Override + public ClientStreamingCallable sendBlurbsCallable() { + throw new UnsupportedOperationException( + "Not implemented: sendBlurbsCallable(). CLIENT is not implemented for REST"); + } + + @Override + public BidiStreamingCallable connectCallable() { + throw new UnsupportedOperationException( + "Not implemented: connectCallable(). BIDI is not implemented for REST"); + } + @Override public final void close() { try { From 516e2e825fd50beeae346709ae8b38a32eb871d8 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 4 Jan 2023 21:06:17 -0500 Subject: [PATCH 03/17] chore: Update error message --- ...bstractTransportServiceStubClassComposer.java | 15 ++------------- .../rest/HttpJsonServiceStubClassComposer.java | 16 ++++++++++++++++ .../grpcrest/goldens/HttpJsonEchoStub.golden | 4 ++-- .../showcase/v1beta1/stub/HttpJsonEchoStub.java | 4 ++-- .../v1beta1/stub/HttpJsonMessagingStub.java | 4 ++-- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index 6b907dd19c..4cf6b1a6f6 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -59,7 +59,6 @@ import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Service; -import com.google.api.generator.gapic.model.Transport; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -226,18 +225,8 @@ public GapicClass generate(GapicContext context, Service service) { return GapicClass.create(kind, classDef); } - private String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { - if (protoMethod.stream() == Method.Stream.BIDI - || protoMethod.stream() == Method.Stream.CLIENT) { - return String.format( - "Not implemented: %s(). %s is not implemented for %s", - callableName, protoMethod.stream(), Transport.REST); - } else if (protoMethod.httpBindings() == null) { - return String.format( - "Not implemented: %s(). RPC is not enabled for %s", callableName, Transport.REST); - } else { - return String.format("Not implemented: %s()", callableName); - } + protected String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { + return String.format("Not implemented: %s()", callableName); } private List createInvalidClassMethods(Service service) { diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 67e003f50f..065dfd6a2c 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -58,6 +58,7 @@ import com.google.api.generator.gapic.model.Method.Stream; import com.google.api.generator.gapic.model.OperationResponse; import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.model.Transport; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.BiMap; @@ -121,6 +122,21 @@ protected boolean isSupportedMethod(Method method) { && method.stream() != Stream.CLIENT; } + protected String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { + if (protoMethod.stream() == Method.Stream.BIDI + || protoMethod.stream() == Method.Stream.CLIENT) { + return String.format( + "Not supported: %s(). %s streaming is not implemented for %s", + callableName, protoMethod.stream(), Transport.REST); + } else if (protoMethod.httpBindings() == null) { + return String.format( + "Not implemented: %s(). %s transport is not supported for this method yet", + callableName, Transport.REST); + } else { + return String.format("Not implemented: %s()", callableName); + } + } + @Override protected boolean generateOperationsStubLogic(Service service) { return service.hasLroMethods(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden index 2913af8832..1e1f0e16df 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden @@ -548,13 +548,13 @@ public class HttpJsonEchoStub extends EchoStub { @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not implemented: chatCallable(). BIDI is not implemented for REST"); + "Not supported: chatCallable(). BIDI streaming is not implemented for REST"); } @Override public UnaryCallable noBindingCallable() { throw new UnsupportedOperationException( - "Not implemented: noBindingCallable(). RPC is not enabled for REST"); + "Not implemented: noBindingCallable(). REST transport is not supported for this method yet"); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java index 64653683bb..e92fea7944 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java @@ -529,13 +529,13 @@ public UnaryCallable blockCallable() { @Override public ClientStreamingCallable collectCallable() { throw new UnsupportedOperationException( - "Not implemented: collectCallable(). CLIENT is not implemented for REST"); + "Not supported: collectCallable(). CLIENT streaming is not implemented for REST"); } @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not implemented: chatCallable(). BIDI is not implemented for REST"); + "Not supported: chatCallable(). BIDI streaming is not implemented for REST"); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java index b6d778d975..caf59606ff 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java @@ -792,13 +792,13 @@ public ServerStreamingCallable stream @Override public ClientStreamingCallable sendBlurbsCallable() { throw new UnsupportedOperationException( - "Not implemented: sendBlurbsCallable(). CLIENT is not implemented for REST"); + "Not supported: sendBlurbsCallable(). CLIENT streaming is not implemented for REST"); } @Override public BidiStreamingCallable connectCallable() { throw new UnsupportedOperationException( - "Not implemented: connectCallable(). BIDI is not implemented for REST"); + "Not supported: connectCallable(). BIDI streaming is not implemented for REST"); } @Override From 3ad09dcca5f0be60ac41691fbab81638d75568da Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 5 Jan 2023 15:49:14 -0500 Subject: [PATCH 04/17] feat: Move httpjson specific logic to sub composer --- ...ractTransportServiceStubClassComposer.java | 53 +++++-------------- .../HttpJsonServiceStubClassComposer.java | 44 +++++++++++++++ 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index 4cf6b1a6f6..d022b4a86a 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -82,18 +82,18 @@ public abstract class AbstractTransportServiceStubClassComposer implements ClassComposer { private static final Statement EMPTY_LINE_STATEMENT = EmptyLineStatement.create(); - private static final String METHOD_DESCRIPTOR_NAME_PATTERN = "%sMethodDescriptor"; - private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; - private static final String PAGED_CALLABLE_CLASS_MEMBER_PATTERN = "%sPagedCallable"; - - private static final String BACKGROUND_RESOURCES_MEMBER_NAME = "backgroundResources"; - private static final String CALLABLE_NAME = "Callable"; - private static final String CALLABLE_FACTORY_MEMBER_NAME = "callableFactory"; - private static final String CALLABLE_CLASS_MEMBER_PATTERN = "%sCallable"; - private static final String OPERATION_CALLABLE_CLASS_MEMBER_PATTERN = "%sOperationCallable"; - private static final String OPERATION_CALLABLE_NAME = "OperationCallable"; + protected static final String METHOD_DESCRIPTOR_NAME_PATTERN = "%sMethodDescriptor"; + protected static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; + protected static final String PAGED_CALLABLE_CLASS_MEMBER_PATTERN = "%sPagedCallable"; + + protected static final String BACKGROUND_RESOURCES_MEMBER_NAME = "backgroundResources"; + protected static final String CALLABLE_NAME = "Callable"; + protected static final String CALLABLE_FACTORY_MEMBER_NAME = "callableFactory"; + protected static final String CALLABLE_CLASS_MEMBER_PATTERN = "%sCallable"; + protected static final String OPERATION_CALLABLE_CLASS_MEMBER_PATTERN = "%sOperationCallable"; + protected static final String OPERATION_CALLABLE_NAME = "OperationCallable"; // private static final String OPERATIONS_STUB_MEMBER_NAME = "operationsStub"; - private static final String PAGED_CALLABLE_NAME = "PagedCallable"; + protected static final String PAGED_CALLABLE_NAME = "PagedCallable"; protected static final TypeStore FIXED_TYPESTORE = createStaticTypes(); @@ -200,7 +200,6 @@ public GapicClass generate(GapicContext context, Service service) { callableClassMemberVarExprs, protoMethodNameToDescriptorVarExprs, classStatements); - methodDefinitions.addAll(createInvalidClassMethods(service)); methodDefinitions.addAll( createStubOverrideMethods( classMemberVarExprs.get(BACKGROUND_RESOURCES_MEMBER_NAME), service)); @@ -229,34 +228,6 @@ protected String getUnsupportedOperationExceptionReason(String callableName, Met return String.format("Not implemented: %s()", callableName); } - private List createInvalidClassMethods(Service service) { - List methodDefinitions = new ArrayList<>(); - for (Method protoMethod : service.methods()) { - if (!isSupportedMethod(protoMethod)) { - String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); - String callableName = - String.format(CALLABLE_CLASS_MEMBER_PATTERN, javaStyleProtoMethodName); - methodDefinitions.add( - MethodDefinition.builder() - .setIsOverride(true) - .setScope(ScopeNode.PUBLIC) - .setName(callableName) - .setReturnType(getCallableType(protoMethod)) - .setBody( - Arrays.asList( - ExprStatement.withExpr( - ThrowExpr.builder() - .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) - .setMessageExpr( - getUnsupportedOperationExceptionReason( - callableName, protoMethod)) - .build()))) - .build()); - } - } - return methodDefinitions; - } - protected boolean isSupportedMethod(Method method) { return true; } @@ -1139,7 +1110,7 @@ private TypeStore createDynamicTypes(Service service, String stubPakkage) { return typeStore; } - private static TypeNode getCallableType(Method protoMethod) { + protected static TypeNode getCallableType(Method protoMethod) { TypeNode callableType = FIXED_TYPESTORE.get("UnaryCallable"); switch (protoMethod.stream()) { case CLIENT: diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 065dfd6a2c..65504c600b 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -45,6 +45,7 @@ import com.google.api.generator.engine.ast.Statement; import com.google.api.generator.engine.ast.StringObjectValue; import com.google.api.generator.engine.ast.ThisObjectValue; +import com.google.api.generator.engine.ast.ThrowExpr; import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.engine.ast.ValueExpr; import com.google.api.generator.engine.ast.VaporReference; @@ -52,6 +53,7 @@ import com.google.api.generator.engine.ast.VariableExpr; import com.google.api.generator.gapic.composer.common.AbstractTransportServiceStubClassComposer; import com.google.api.generator.gapic.composer.store.TypeStore; +import com.google.api.generator.gapic.model.GapicContext; import com.google.api.generator.gapic.model.HttpBindings.HttpBinding; import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; @@ -1264,4 +1266,46 @@ protected List createTypeRegistry(Service service) { .setValueExpr(typeRegistryBuilderExpr) .build())); } + + protected List createClassMethods( + GapicContext context, + Service service, + TypeStore typeStore, + Map classMemberVarExprs, + Map callableClassMemberVarExprs, + Map protoMethodNameToDescriptorVarExprs, + List classStatements) { + List javaMethods = new ArrayList<>(); + javaMethods.addAll(super.createClassMethods(context, service, typeStore, classMemberVarExprs, callableClassMemberVarExprs, protoMethodNameToDescriptorVarExprs, classStatements)); + javaMethods.addAll(createInvalidClassMethods(service)); + return javaMethods; + } + + private List createInvalidClassMethods(Service service) { + List methodDefinitions = new ArrayList<>(); + for (Method protoMethod : service.methods()) { + if (!isSupportedMethod(protoMethod)) { + String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); + String callableName = + String.format(CALLABLE_CLASS_MEMBER_PATTERN, javaStyleProtoMethodName); + methodDefinitions.add( + MethodDefinition.builder() + .setIsOverride(true) + .setScope(ScopeNode.PUBLIC) + .setName(callableName) + .setReturnType(getCallableType(protoMethod)) + .setBody( + Arrays.asList( + ExprStatement.withExpr( + ThrowExpr.builder() + .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) + .setMessageExpr( + getUnsupportedOperationExceptionReason( + callableName, protoMethod)) + .build()))) + .build()); + } + } + return methodDefinitions; + } } From edf088a928d8cdd9f5a266b33014a68bef4564e1 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 5 Jan 2023 16:04:11 -0500 Subject: [PATCH 05/17] feat: Move method supported logic to Method --- .../AbstractTransportServiceStubClassComposer.java | 4 +--- .../grpc/GrpcServiceStubClassComposer.java | 5 +++++ .../rest/HttpJsonServiceStubClassComposer.java | 12 ++++-------- .../google/api/generator/gapic/model/Method.java | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index d022b4a86a..84cc79d141 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -228,9 +228,7 @@ protected String getUnsupportedOperationExceptionReason(String callableName, Met return String.format("Not implemented: %s()", callableName); } - protected boolean isSupportedMethod(Method method) { - return true; - } + protected abstract boolean isSupportedMethod(Method method); protected abstract Statement createMethodDescriptorVariableDecl( Service service, diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java index d6eedb9987..10aa89582a 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java @@ -41,6 +41,7 @@ import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.RoutingHeaderRule.RoutingHeaderParam; import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.model.Transport; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.api.pathtemplate.PathTemplate; import com.google.common.base.Splitter; @@ -90,6 +91,10 @@ private static TypeStore createStaticTypes() { return new TypeStore(concreteClazzes); } + protected boolean isSupportedMethod(Method method) { + return method.isMethodSupportedByTransport(Transport.GRPC); + } + @Override protected Statement createMethodDescriptorVariableDecl( Service service, diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 65504c600b..2d3c65c90b 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -119,23 +119,19 @@ private static TypeStore createStaticTypes() { } protected boolean isSupportedMethod(Method method) { - return method.httpBindings() != null - && method.stream() != Stream.BIDI - && method.stream() != Stream.CLIENT; + return method.isMethodSupportedByTransport(Transport.REST); } protected String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { if (protoMethod.stream() == Method.Stream.BIDI || protoMethod.stream() == Method.Stream.CLIENT) { return String.format( - "Not supported: %s(). %s streaming is not implemented for %s", + "Not supported: %s(). %s streaming is not supported for %s", callableName, protoMethod.stream(), Transport.REST); - } else if (protoMethod.httpBindings() == null) { + } else { return String.format( - "Not implemented: %s(). %s transport is not supported for this method yet", + "Not implemented: %s(). %s transport is not implemented for this method yet", callableName, Transport.REST); - } else { - return String.format("Not implemented: %s()", callableName); } } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java index dc2452f2d5..1102d05b93 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java @@ -99,6 +99,20 @@ public boolean isOperationPollingMethod() { return operationPollingMethod(); } + public boolean isRESTEnabled() { + return httpBindings() != null && stream() != Stream.BIDI && stream() != Stream.CLIENT; + } + + public boolean isMethodSupportedByTransport(Transport transport) { + if (transport == Transport.REST) { + return isRESTEnabled(); + } else if (transport == Transport.GRPC) { + return true; + } else { + throw new IllegalArgumentException("GRPC+REST Transport is not allowed."); + } + } + public abstract Builder toBuilder(); public static Builder builder() { From 66423e7f4f1b2fbbc438add219fa093bd4702c2d Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 5 Jan 2023 16:24:22 -0500 Subject: [PATCH 06/17] feat: Move method supported logic to Method --- .../common/AbstractTransportServiceStubClassComposer.java | 4 +++- .../gapic/composer/grpc/GrpcServiceStubClassComposer.java | 4 ---- .../composer/rest/HttpJsonServiceStubClassComposer.java | 3 +-- .../java/com/google/api/generator/gapic/model/Method.java | 8 +++----- .../composer/grpcrest/goldens/HttpJsonEchoStub.golden | 4 ++-- .../google/showcase/v1beta1/stub/HttpJsonEchoStub.java | 4 ++-- .../showcase/v1beta1/stub/HttpJsonMessagingStub.java | 4 ++-- 7 files changed, 13 insertions(+), 18 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index 84cc79d141..d022b4a86a 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -228,7 +228,9 @@ protected String getUnsupportedOperationExceptionReason(String callableName, Met return String.format("Not implemented: %s()", callableName); } - protected abstract boolean isSupportedMethod(Method method); + protected boolean isSupportedMethod(Method method) { + return true; + } protected abstract Statement createMethodDescriptorVariableDecl( Service service, diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java index 10aa89582a..68a5dc0aed 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java @@ -91,10 +91,6 @@ private static TypeStore createStaticTypes() { return new TypeStore(concreteClazzes); } - protected boolean isSupportedMethod(Method method) { - return method.isMethodSupportedByTransport(Transport.GRPC); - } - @Override protected Statement createMethodDescriptorVariableDecl( Service service, diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 2d3c65c90b..10b8f4344a 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -57,7 +57,6 @@ import com.google.api.generator.gapic.model.HttpBindings.HttpBinding; import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; -import com.google.api.generator.gapic.model.Method.Stream; import com.google.api.generator.gapic.model.OperationResponse; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.model.Transport; @@ -119,7 +118,7 @@ private static TypeStore createStaticTypes() { } protected boolean isSupportedMethod(Method method) { - return method.isMethodSupportedByTransport(Transport.REST); + return method.isSupportedByTransport(Transport.REST); } protected String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java index 1102d05b93..ffe96336f7 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java @@ -99,17 +99,15 @@ public boolean isOperationPollingMethod() { return operationPollingMethod(); } - public boolean isRESTEnabled() { + private boolean isRESTEnabled() { return httpBindings() != null && stream() != Stream.BIDI && stream() != Stream.CLIENT; } - public boolean isMethodSupportedByTransport(Transport transport) { + public boolean isSupportedByTransport(Transport transport) { if (transport == Transport.REST) { return isRESTEnabled(); - } else if (transport == Transport.GRPC) { - return true; } else { - throw new IllegalArgumentException("GRPC+REST Transport is not allowed."); + return true; } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden index 1e1f0e16df..2ea385ba79 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden @@ -548,13 +548,13 @@ public class HttpJsonEchoStub extends EchoStub { @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not supported: chatCallable(). BIDI streaming is not implemented for REST"); + "Not supported: chatCallable(). BIDI streaming is not supported for REST"); } @Override public UnaryCallable noBindingCallable() { throw new UnsupportedOperationException( - "Not implemented: noBindingCallable(). REST transport is not supported for this method yet"); + "Not implemented: noBindingCallable(). REST transport is not implemented for this method yet"); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java index e92fea7944..21ed125c11 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java @@ -529,13 +529,13 @@ public UnaryCallable blockCallable() { @Override public ClientStreamingCallable collectCallable() { throw new UnsupportedOperationException( - "Not supported: collectCallable(). CLIENT streaming is not implemented for REST"); + "Not supported: collectCallable(). CLIENT streaming is not supported for REST"); } @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not supported: chatCallable(). BIDI streaming is not implemented for REST"); + "Not supported: chatCallable(). BIDI streaming is not supported for REST"); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java index caf59606ff..7305de7c02 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java @@ -792,13 +792,13 @@ public ServerStreamingCallable stream @Override public ClientStreamingCallable sendBlurbsCallable() { throw new UnsupportedOperationException( - "Not supported: sendBlurbsCallable(). CLIENT streaming is not implemented for REST"); + "Not supported: sendBlurbsCallable(). CLIENT streaming is not supported for REST"); } @Override public BidiStreamingCallable connectCallable() { throw new UnsupportedOperationException( - "Not supported: connectCallable(). BIDI streaming is not implemented for REST"); + "Not supported: connectCallable(). BIDI streaming is not supported for REST"); } @Override From dc6f0cd57f1e4b8af581926be9d8f6179a0001b2 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 5 Jan 2023 16:27:51 -0500 Subject: [PATCH 07/17] chore: Format the files --- .../grpc/GrpcServiceStubClassComposer.java | 1 - .../HttpJsonServiceStubClassComposer.java | 56 +++++++++++-------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java index 68a5dc0aed..d6eedb9987 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposer.java @@ -41,7 +41,6 @@ import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.RoutingHeaderRule.RoutingHeaderParam; import com.google.api.generator.gapic.model.Service; -import com.google.api.generator.gapic.model.Transport; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.api.pathtemplate.PathTemplate; import com.google.common.base.Splitter; diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 10b8f4344a..09538a19fc 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -1263,15 +1263,23 @@ protected List createTypeRegistry(Service service) { } protected List createClassMethods( - GapicContext context, - Service service, - TypeStore typeStore, - Map classMemberVarExprs, - Map callableClassMemberVarExprs, - Map protoMethodNameToDescriptorVarExprs, - List classStatements) { + GapicContext context, + Service service, + TypeStore typeStore, + Map classMemberVarExprs, + Map callableClassMemberVarExprs, + Map protoMethodNameToDescriptorVarExprs, + List classStatements) { List javaMethods = new ArrayList<>(); - javaMethods.addAll(super.createClassMethods(context, service, typeStore, classMemberVarExprs, callableClassMemberVarExprs, protoMethodNameToDescriptorVarExprs, classStatements)); + javaMethods.addAll( + super.createClassMethods( + context, + service, + typeStore, + classMemberVarExprs, + callableClassMemberVarExprs, + protoMethodNameToDescriptorVarExprs, + classStatements)); javaMethods.addAll(createInvalidClassMethods(service)); return javaMethods; } @@ -1282,23 +1290,23 @@ private List createInvalidClassMethods(Service service) { if (!isSupportedMethod(protoMethod)) { String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); String callableName = - String.format(CALLABLE_CLASS_MEMBER_PATTERN, javaStyleProtoMethodName); + String.format(CALLABLE_CLASS_MEMBER_PATTERN, javaStyleProtoMethodName); methodDefinitions.add( - MethodDefinition.builder() - .setIsOverride(true) - .setScope(ScopeNode.PUBLIC) - .setName(callableName) - .setReturnType(getCallableType(protoMethod)) - .setBody( - Arrays.asList( - ExprStatement.withExpr( - ThrowExpr.builder() - .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) - .setMessageExpr( - getUnsupportedOperationExceptionReason( - callableName, protoMethod)) - .build()))) - .build()); + MethodDefinition.builder() + .setIsOverride(true) + .setScope(ScopeNode.PUBLIC) + .setName(callableName) + .setReturnType(getCallableType(protoMethod)) + .setBody( + Arrays.asList( + ExprStatement.withExpr( + ThrowExpr.builder() + .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) + .setMessageExpr( + getUnsupportedOperationExceptionReason( + callableName, protoMethod)) + .build()))) + .build()); } } return methodDefinitions; From 1940216a2424995ed6f9fde967ddec5cee756b19 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 5 Jan 2023 17:42:56 -0500 Subject: [PATCH 08/17] chore: Cleanup Abstract composer --- ...ractTransportServiceStubClassComposer.java | 19 ++++++++++--------- .../HttpJsonServiceStubClassComposer.java | 7 ++++--- .../api/generator/gapic/model/Method.java | 6 +----- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index d022b4a86a..18563a7329 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -59,6 +59,7 @@ import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.model.Transport; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -228,8 +229,8 @@ protected String getUnsupportedOperationExceptionReason(String callableName, Met return String.format("Not implemented: %s()", callableName); } - protected boolean isSupportedMethod(Method method) { - return true; + protected Transport getTransport() { + return Transport.GRPC; } protected abstract Statement createMethodDescriptorVariableDecl( @@ -317,7 +318,7 @@ protected List createMethodDescriptorVariableDecls( Map messageTypes, boolean restNumericEnumsEnabled) { return service.methods().stream() - .filter(this::isSupportedMethod) + .filter(x -> x.isSupportedByTransport(getTransport())) .map( m -> createMethodDescriptorVariableDecl( @@ -346,7 +347,7 @@ private static List createClassMemberFieldDeclarations( protected Map createProtoMethodNameToDescriptorClassMembers( Service service, Class descriptorClass) { return service.methods().stream() - .filter(this::isSupportedMethod) + .filter(x -> x.isSupportedByTransport(getTransport())) .collect( Collectors.toMap( Method::name, @@ -378,7 +379,7 @@ private Map createCallableClassMembers( Map callableClassMembers = new LinkedHashMap<>(); // Using a for-loop because the output cardinality is not a 1:1 mapping to the input set. for (Method protoMethod : service.methods()) { - if (!isSupportedMethod(protoMethod)) { + if (!protoMethod.isSupportedByTransport(getTransport())) { continue; } String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); @@ -667,7 +668,7 @@ protected List createConstructorMethods( // Transport settings local variables. Map javaStyleMethodNameToTransportSettingsVarExprs = service.methods().stream() - .filter(this::isSupportedMethod) + .filter(x -> x.isSupportedByTransport(getTransport())) .collect( Collectors.toMap( m -> JavaStyle.toLowerCamelCase(m.name()), @@ -691,7 +692,7 @@ protected List createConstructorMethods( secondCtorExprs.addAll( service.methods().stream() - .filter(this::isSupportedMethod) + .filter(x -> x.isSupportedByTransport(getTransport())) .map( m -> createTransportSettingsInitExpr( @@ -1062,7 +1063,7 @@ private List createStubOverrideMethods( private boolean checkOperationPollingMethod(Service service) { return service.methods().stream() - .filter(this::isSupportedMethod) + .filter(x -> x.isSupportedByTransport(getTransport())) .anyMatch(Method::isOperationPollingMethod); } @@ -1101,7 +1102,7 @@ private TypeStore createDynamicTypes(Service service, String stubPakkage) { typeStore.putAll( service.pakkage(), service.methods().stream() - .filter(this::isSupportedMethod) + .filter(x -> x.isSupportedByTransport(getTransport())) .filter(Method::isPaged) .map(m -> String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, m.name())) .collect(Collectors.toList()), diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 09538a19fc..5177bb07b2 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -117,8 +117,9 @@ private static TypeStore createStaticTypes() { TypeRegistry.class)); } - protected boolean isSupportedMethod(Method method) { - return method.isSupportedByTransport(Transport.REST); + @Override + protected Transport getTransport() { + return Transport.REST; } protected String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { @@ -1287,7 +1288,7 @@ protected List createClassMethods( private List createInvalidClassMethods(Service service) { List methodDefinitions = new ArrayList<>(); for (Method protoMethod : service.methods()) { - if (!isSupportedMethod(protoMethod)) { + if (!protoMethod.isSupportedByTransport(getTransport())) { String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); String callableName = String.format(CALLABLE_CLASS_MEMBER_PATTERN, javaStyleProtoMethodName); diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java index ffe96336f7..174213ef20 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java @@ -99,13 +99,9 @@ public boolean isOperationPollingMethod() { return operationPollingMethod(); } - private boolean isRESTEnabled() { - return httpBindings() != null && stream() != Stream.BIDI && stream() != Stream.CLIENT; - } - public boolean isSupportedByTransport(Transport transport) { if (transport == Transport.REST) { - return isRESTEnabled(); + return httpBindings() != null && stream() != Stream.BIDI && stream() != Stream.CLIENT; } else { return true; } From eb372638d21d7985a7a2bd658d929998c020af96 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 5 Jan 2023 17:51:30 -0500 Subject: [PATCH 09/17] chore: Move code to httpjson composer --- .../common/AbstractTransportServiceStubClassComposer.java | 4 ---- .../gapic/composer/rest/HttpJsonServiceStubClassComposer.java | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index 18563a7329..d48e85ee09 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -225,10 +225,6 @@ public GapicClass generate(GapicContext context, Service service) { return GapicClass.create(kind, classDef); } - protected String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { - return String.format("Not implemented: %s()", callableName); - } - protected Transport getTransport() { return Transport.GRPC; } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 5177bb07b2..2edff85353 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -122,7 +122,7 @@ protected Transport getTransport() { return Transport.REST; } - protected String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { + private String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { if (protoMethod.stream() == Method.Stream.BIDI || protoMethod.stream() == Method.Stream.CLIENT) { return String.format( From 5a3515f01ee6f61bcd93b1f79f51ecb6d4b05cf2 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 5 Jan 2023 18:03:13 -0500 Subject: [PATCH 10/17] chore: Resolve code smell --- .../gapic/composer/rest/HttpJsonServiceStubClassComposer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 2edff85353..f5d086b173 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -1263,6 +1263,7 @@ protected List createTypeRegistry(Service service) { .build())); } + @Override protected List createClassMethods( GapicContext context, Service service, From 0169f6a6afa85b3571fb1b11de270138bc4b22b4 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 6 Jan 2023 14:47:49 -0500 Subject: [PATCH 11/17] feat: Use generic error message --- .../rest/HttpJsonServiceStubClassComposer.java | 16 +--------------- .../grpcrest/goldens/HttpJsonEchoStub.golden | 2 +- .../showcase/v1beta1/stub/HttpJsonEchoStub.java | 4 ++-- .../v1beta1/stub/HttpJsonMessagingStub.java | 4 ++-- 4 files changed, 6 insertions(+), 20 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index f5d086b173..a25e940602 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -122,19 +122,6 @@ protected Transport getTransport() { return Transport.REST; } - private String getUnsupportedOperationExceptionReason(String callableName, Method protoMethod) { - if (protoMethod.stream() == Method.Stream.BIDI - || protoMethod.stream() == Method.Stream.CLIENT) { - return String.format( - "Not supported: %s(). %s streaming is not supported for %s", - callableName, protoMethod.stream(), Transport.REST); - } else { - return String.format( - "Not implemented: %s(). %s transport is not implemented for this method yet", - callableName, Transport.REST); - } - } - @Override protected boolean generateOperationsStubLogic(Service service) { return service.hasLroMethods(); @@ -1305,8 +1292,7 @@ private List createInvalidClassMethods(Service service) { ThrowExpr.builder() .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) .setMessageExpr( - getUnsupportedOperationExceptionReason( - callableName, protoMethod)) + String.format("Not implemented: %s(). %s transport is not implemented for this method yet", callableName, getTransport())) .build()))) .build()); } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden index 2ea385ba79..862df7c3a5 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden @@ -548,7 +548,7 @@ public class HttpJsonEchoStub extends EchoStub { @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not supported: chatCallable(). BIDI streaming is not supported for REST"); + "Not implemented: chatCallable(). REST transport is not implemented for this method yet"); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java index 21ed125c11..f8101c7f42 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java @@ -529,13 +529,13 @@ public UnaryCallable blockCallable() { @Override public ClientStreamingCallable collectCallable() { throw new UnsupportedOperationException( - "Not supported: collectCallable(). CLIENT streaming is not supported for REST"); + "Not implemented: collectCallable(). REST transport is not implemented for this method yet"); } @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not supported: chatCallable(). BIDI streaming is not supported for REST"); + "Not implemented: chatCallable(). REST transport is not implemented for this method yet"); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java index 7305de7c02..0c21679e6a 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java @@ -792,13 +792,13 @@ public ServerStreamingCallable stream @Override public ClientStreamingCallable sendBlurbsCallable() { throw new UnsupportedOperationException( - "Not supported: sendBlurbsCallable(). CLIENT streaming is not supported for REST"); + "Not implemented: sendBlurbsCallable(). REST transport is not implemented for this method yet"); } @Override public BidiStreamingCallable connectCallable() { throw new UnsupportedOperationException( - "Not supported: connectCallable(). BIDI streaming is not supported for REST"); + "Not implemented: connectCallable(). REST transport is not implemented for this method yet"); } @Override From 44e75806dc6fbb84a776aa044a2230daf1716231 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 6 Jan 2023 14:59:18 -0500 Subject: [PATCH 12/17] chore: Fix format issues --- .../gapic/composer/rest/HttpJsonServiceStubClassComposer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index a25e940602..e05a79003b 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -1292,7 +1292,9 @@ private List createInvalidClassMethods(Service service) { ThrowExpr.builder() .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) .setMessageExpr( - String.format("Not implemented: %s(). %s transport is not implemented for this method yet", callableName, getTransport())) + String.format( + "Not implemented: %s(). %s transport is not implemented for this method yet", + callableName, getTransport())) .build()))) .build()); } From 37088069324c7ccdf52aa2f7e34ef20e52eddd02 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 9 Jan 2023 16:30:44 -0500 Subject: [PATCH 13/17] feat: Add tests for Method.isSupportedByTransport() --- .../api/generator/gapic/model/Method.java | 13 ++++- .../api/generator/gapic/model/MethodTest.java | 55 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java index 174213ef20..98e34efe6c 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java @@ -99,11 +99,22 @@ public boolean isOperationPollingMethod() { return operationPollingMethod(); } + /** + * Determines if method is both eligible and enabled for the Transport. GRPC+REST Transport is not + * supported as each transport's sub composers will invoke this method the specific transport + * (GRPC or REST) + * + * @param transport Expects either GRPC or REST Transport + * @return boolean is method should be generated for the transport + */ public boolean isSupportedByTransport(Transport transport) { if (transport == Transport.REST) { return httpBindings() != null && stream() != Stream.BIDI && stream() != Stream.CLIENT; - } else { + } else if (transport == Transport.GRPC) { return true; + } else { + throw new IllegalArgumentException( + String.format("Invalid Transport: %s. Expecting GRPC or REST", transport.name())); } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java index cecee806f9..547def5a8c 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java @@ -112,4 +112,59 @@ public void shouldSetParamsExtractor_shouldReturnFalseIfHasNoHttpBindingsAndNoRo Method method = METHOD.toBuilder().setHttpBindings(null).setRoutingHeaderRule(null).build(); assertThat(method.shouldSetParamsExtractor()).isFalse(); } + + @Test + public void + isSupportedByTransport_shouldReturnTrueIfHasHttpBindingsAndIsRESTEligibleForRESTTransport() { + Method methodNoStreaming = + METHOD.toBuilder().setHttpBindings(HTTP_BINDINGS).setStream(Method.Stream.NONE).build(); + assertThat(methodNoStreaming.isSupportedByTransport(Transport.REST)).isTrue(); + Method methodServerSideStreaming = + METHOD.toBuilder().setHttpBindings(HTTP_BINDINGS).setStream(Method.Stream.SERVER).build(); + assertThat(methodServerSideStreaming.isSupportedByTransport(Transport.REST)).isTrue(); + } + + @Test + public void isSupportedByTransport_shouldReturnFalseIfNoHttpBindingsForRESTTransport() { + Method methodNoStreaming = + METHOD.toBuilder().setHttpBindings(null).setStream(Method.Stream.NONE).build(); + assertThat(methodNoStreaming.isSupportedByTransport(Transport.REST)).isFalse(); + Method methodServerSideStreaming = + METHOD.toBuilder().setHttpBindings(null).setStream(Method.Stream.SERVER).build(); + assertThat(methodServerSideStreaming.isSupportedByTransport(Transport.REST)).isFalse(); + } + + @Test + public void + isSupportedByTransport_shouldReturnFalseIfHasHttpBindingsAndIsNotRESTEligibleForRESTTransport() { + Method methodClientSideStreaming = + METHOD.toBuilder().setHttpBindings(HTTP_BINDINGS).setStream(Method.Stream.CLIENT).build(); + assertThat(methodClientSideStreaming.isSupportedByTransport(Transport.REST)).isFalse(); + Method methodBiDiStreaming = + METHOD.toBuilder().setHttpBindings(HTTP_BINDINGS).setStream(Method.Stream.BIDI).build(); + assertThat(methodBiDiStreaming.isSupportedByTransport(Transport.REST)).isFalse(); + } + + @Test + public void isSupportedByTransport_shouldReturnTrueForGRPCTransport() { + Method methodNoStreaming = + METHOD.toBuilder().setHttpBindings(HTTP_BINDINGS).setStream(Method.Stream.NONE).build(); + assertThat(methodNoStreaming.isSupportedByTransport(Transport.GRPC)).isTrue(); + Method methodBiDiStreaming = + METHOD.toBuilder().setHttpBindings(HTTP_BINDINGS).setStream(Method.Stream.BIDI).build(); + assertThat(methodBiDiStreaming.isSupportedByTransport(Transport.GRPC)).isTrue(); + Method methodNoStreamingNoHttpBindings = + METHOD.toBuilder().setStream(Method.Stream.NONE).build(); + assertThat(methodNoStreamingNoHttpBindings.isSupportedByTransport(Transport.GRPC)).isTrue(); + Method methodBiDiStreamingNoHttpBindings = + METHOD.toBuilder().setStream(Method.Stream.BIDI).build(); + assertThat(methodBiDiStreamingNoHttpBindings.isSupportedByTransport(Transport.GRPC)).isTrue(); + } + + @Test(expected = IllegalArgumentException.class) + public void isSupportedByTransport_shouldThrowExceptionIfPassedGRPCRESTTransport() { + Method methodClientStreaming = + METHOD.toBuilder().setHttpBindings(HTTP_BINDINGS).setStream(Method.Stream.CLIENT).build(); + methodClientStreaming.isSupportedByTransport(Transport.GRPC_REST); + } } From e05b385f50dbb07ea1662dd4f0e4713925bedcf5 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 10 Jan 2023 14:32:41 -0500 Subject: [PATCH 14/17] feat: Resolve PR comments --- .../HttpJsonServiceStubClassComposer.java | 42 +++++++++---------- .../grpcrest/goldens/HttpJsonEchoStub.golden | 4 +- .../api/generator/gapic/model/MethodTest.java | 7 +++- .../v1beta1/stub/HttpJsonEchoStub.java | 4 +- .../v1beta1/stub/HttpJsonMessagingStub.java | 4 +- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index e05a79003b..29ffcb8a07 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -1276,28 +1276,28 @@ protected List createClassMethods( private List createInvalidClassMethods(Service service) { List methodDefinitions = new ArrayList<>(); for (Method protoMethod : service.methods()) { - if (!protoMethod.isSupportedByTransport(getTransport())) { - String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); - String callableName = - String.format(CALLABLE_CLASS_MEMBER_PATTERN, javaStyleProtoMethodName); - methodDefinitions.add( - MethodDefinition.builder() - .setIsOverride(true) - .setScope(ScopeNode.PUBLIC) - .setName(callableName) - .setReturnType(getCallableType(protoMethod)) - .setBody( - Arrays.asList( - ExprStatement.withExpr( - ThrowExpr.builder() - .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) - .setMessageExpr( - String.format( - "Not implemented: %s(). %s transport is not implemented for this method yet", - callableName, getTransport())) - .build()))) - .build()); + if (protoMethod.isSupportedByTransport(getTransport())) { + continue; } + String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); + String callableName = String.format(CALLABLE_CLASS_MEMBER_PATTERN, javaStyleProtoMethodName); + methodDefinitions.add( + MethodDefinition.builder() + .setIsOverride(true) + .setScope(ScopeNode.PUBLIC) + .setName(callableName) + .setReturnType(getCallableType(protoMethod)) + .setBody( + Arrays.asList( + ExprStatement.withExpr( + ThrowExpr.builder() + .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) + .setMessageExpr( + String.format( + "Not implemented: %s(). %s transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)", + callableName, getTransport())) + .build()))) + .build()); } return methodDefinitions; } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden index 862df7c3a5..8c5b26c81e 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden @@ -548,13 +548,13 @@ public class HttpJsonEchoStub extends EchoStub { @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not implemented: chatCallable(). REST transport is not implemented for this method yet"); + "Not implemented: chatCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); } @Override public UnaryCallable noBindingCallable() { throw new UnsupportedOperationException( - "Not implemented: noBindingCallable(). REST transport is not implemented for this method yet"); + "Not implemented: noBindingCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); } @Override diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java index 547def5a8c..00754113ae 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java @@ -15,6 +15,7 @@ package com.google.api.generator.gapic.model; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.gapic.model.HttpBindings.HttpBinding; @@ -161,10 +162,12 @@ public void isSupportedByTransport_shouldReturnTrueForGRPCTransport() { assertThat(methodBiDiStreamingNoHttpBindings.isSupportedByTransport(Transport.GRPC)).isTrue(); } - @Test(expected = IllegalArgumentException.class) + @Test public void isSupportedByTransport_shouldThrowExceptionIfPassedGRPCRESTTransport() { Method methodClientStreaming = METHOD.toBuilder().setHttpBindings(HTTP_BINDINGS).setStream(Method.Stream.CLIENT).build(); - methodClientStreaming.isSupportedByTransport(Transport.GRPC_REST); + assertThrows( + IllegalArgumentException.class, + () -> methodClientStreaming.isSupportedByTransport(Transport.GRPC_REST)); } } diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java index f8101c7f42..6e147c8de3 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java @@ -529,13 +529,13 @@ public UnaryCallable blockCallable() { @Override public ClientStreamingCallable collectCallable() { throw new UnsupportedOperationException( - "Not implemented: collectCallable(). REST transport is not implemented for this method yet"); + "Not implemented: collectCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); } @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not implemented: chatCallable(). REST transport is not implemented for this method yet"); + "Not implemented: chatCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java index 0c21679e6a..0d3f77a118 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java @@ -792,13 +792,13 @@ public ServerStreamingCallable stream @Override public ClientStreamingCallable sendBlurbsCallable() { throw new UnsupportedOperationException( - "Not implemented: sendBlurbsCallable(). REST transport is not implemented for this method yet"); + "Not implemented: sendBlurbsCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); } @Override public BidiStreamingCallable connectCallable() { throw new UnsupportedOperationException( - "Not implemented: connectCallable(). REST transport is not implemented for this method yet"); + "Not implemented: connectCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); } @Override From 738200ffd8705c77b9138ffc7fa6f39adec08da3 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 10 Jan 2023 15:01:11 -0500 Subject: [PATCH 15/17] feat: Update back to private --- ...tractTransportServiceStubClassComposer.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index d48e85ee09..ebbaac698f 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -83,18 +83,18 @@ public abstract class AbstractTransportServiceStubClassComposer implements ClassComposer { private static final Statement EMPTY_LINE_STATEMENT = EmptyLineStatement.create(); - protected static final String METHOD_DESCRIPTOR_NAME_PATTERN = "%sMethodDescriptor"; - protected static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; - protected static final String PAGED_CALLABLE_CLASS_MEMBER_PATTERN = "%sPagedCallable"; + private static final String METHOD_DESCRIPTOR_NAME_PATTERN = "%sMethodDescriptor"; + private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; + private static final String PAGED_CALLABLE_CLASS_MEMBER_PATTERN = "%sPagedCallable"; - protected static final String BACKGROUND_RESOURCES_MEMBER_NAME = "backgroundResources"; - protected static final String CALLABLE_NAME = "Callable"; - protected static final String CALLABLE_FACTORY_MEMBER_NAME = "callableFactory"; + private static final String BACKGROUND_RESOURCES_MEMBER_NAME = "backgroundResources"; + private static final String CALLABLE_NAME = "Callable"; + private static final String CALLABLE_FACTORY_MEMBER_NAME = "callableFactory"; protected static final String CALLABLE_CLASS_MEMBER_PATTERN = "%sCallable"; - protected static final String OPERATION_CALLABLE_CLASS_MEMBER_PATTERN = "%sOperationCallable"; - protected static final String OPERATION_CALLABLE_NAME = "OperationCallable"; + private static final String OPERATION_CALLABLE_CLASS_MEMBER_PATTERN = "%sOperationCallable"; + private static final String OPERATION_CALLABLE_NAME = "OperationCallable"; // private static final String OPERATIONS_STUB_MEMBER_NAME = "operationsStub"; - protected static final String PAGED_CALLABLE_NAME = "PagedCallable"; + private static final String PAGED_CALLABLE_NAME = "PagedCallable"; protected static final TypeStore FIXED_TYPESTORE = createStaticTypes(); From cc0d97b9ac00f6398d4305c50f741134d2b17a0f Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 10 Jan 2023 15:38:10 -0500 Subject: [PATCH 16/17] feat: Update error message --- .../gapic/composer/rest/HttpJsonServiceStubClassComposer.java | 2 +- .../gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden | 4 ++-- .../com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java | 4 ++-- .../google/showcase/v1beta1/stub/HttpJsonMessagingStub.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 29ffcb8a07..277a5f2c7e 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -1294,7 +1294,7 @@ private List createInvalidClassMethods(Service service) { .setType(FIXED_TYPESTORE.get("UnsupportedOperationException")) .setMessageExpr( String.format( - "Not implemented: %s(). %s transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)", + "Not implemented: %s(). %s transport is not implemented for this method yet.", callableName, getTransport())) .build()))) .build()); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden index 8c5b26c81e..d027d9ed10 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden @@ -548,13 +548,13 @@ public class HttpJsonEchoStub extends EchoStub { @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not implemented: chatCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); + "Not implemented: chatCallable(). REST transport is not implemented for this method yet."); } @Override public UnaryCallable noBindingCallable() { throw new UnsupportedOperationException( - "Not implemented: noBindingCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); + "Not implemented: noBindingCallable(). REST transport is not implemented for this method yet."); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java index 6e147c8de3..ed6ea0f01f 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonEchoStub.java @@ -529,13 +529,13 @@ public UnaryCallable blockCallable() { @Override public ClientStreamingCallable collectCallable() { throw new UnsupportedOperationException( - "Not implemented: collectCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); + "Not implemented: collectCallable(). REST transport is not implemented for this method yet."); } @Override public BidiStreamingCallable chatCallable() { throw new UnsupportedOperationException( - "Not implemented: chatCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); + "Not implemented: chatCallable(). REST transport is not implemented for this method yet."); } @Override diff --git a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java index 0d3f77a118..4eba21b87f 100644 --- a/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java +++ b/showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonMessagingStub.java @@ -792,13 +792,13 @@ public ServerStreamingCallable stream @Override public ClientStreamingCallable sendBlurbsCallable() { throw new UnsupportedOperationException( - "Not implemented: sendBlurbsCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); + "Not implemented: sendBlurbsCallable(). REST transport is not implemented for this method yet."); } @Override public BidiStreamingCallable connectCallable() { throw new UnsupportedOperationException( - "Not implemented: connectCallable(). REST transport is not implemented for this method yet. It is either not enabled or not supported (BIDI or Client Streaming)"); + "Not implemented: connectCallable(). REST transport is not implemented for this method yet."); } @Override From 14e7d9eaff988690c2af3261f3cbf5e51ab60d35 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 10 Jan 2023 15:40:01 -0500 Subject: [PATCH 17/17] feat: Update javadoc comment --- .../main/java/com/google/api/generator/gapic/model/Method.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java index 98e34efe6c..4fd5c4f384 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java @@ -105,7 +105,7 @@ public boolean isOperationPollingMethod() { * (GRPC or REST) * * @param transport Expects either GRPC or REST Transport - * @return boolean is method should be generated for the transport + * @return boolean if method should be generated for the transport */ public boolean isSupportedByTransport(Transport transport) { if (transport == Transport.REST) {