Skip to content

Commit

Permalink
DIREGAPIC LRO implementation without annotations (#826)
Browse files Browse the repository at this point in the history
* fix ServiceStub Goldens

* fix Stub golden

* fix Stub  golden

* fix CallableFactory golden

* fix java format

* add annotation placement comments

* only add machinery to methods that return operation

* add grpc file that contained method that was edited on abstract class

* update HttpJsonComplianceStub.golden

* java format
  • Loading branch information
GabrielGonzalezDiaz committed Aug 23, 2021
1 parent a0f88b9 commit 35cc21c
Show file tree
Hide file tree
Showing 10 changed files with 550 additions and 14 deletions.
2 changes: 1 addition & 1 deletion WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jvm_maven_import_external(
# gapic-generator-java dependencies to match the order in googleapis repository,
# which in its turn, prioritizes actual generated clients runtime dependencies
# over the generator dependencies.
_gax_java_version = "1.65.1"
_gax_java_version = "2.2.0"

http_archive(
name = "com_google_api_gax_java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicClass.Kind;
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.Message;
import com.google.api.generator.gapic.model.Method;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.gapic.utils.JavaStyle;
Expand Down Expand Up @@ -159,12 +160,14 @@ public GapicClass generate(GapicContext context, Service service) {
.setType(getTransportContext().stubCallableFactoryType())
.build()));

Map<String, Message> messageTypes = context.messages();
List<Statement> classStatements =
createClassStatements(
service,
protoMethodNameToDescriptorVarExprs,
callableClassMemberVarExprs,
classMemberVarExprs);
classMemberVarExprs,
messageTypes);

StubCommentComposer commentComposer =
new StubCommentComposer(getTransportContext().transportName());
Expand Down Expand Up @@ -193,7 +196,7 @@ public GapicClass generate(GapicContext context, Service service) {
}

protected abstract Statement createMethodDescriptorVariableDecl(
Service service, Method protoMethod, VariableExpr methodDescriptorVarExpr);
Service service, Method protoMethod, VariableExpr methodDescriptorVarExpr, Map<String, Message> messageTypes);

protected abstract List<MethodDefinition> createOperationsStubGetterMethod(
VariableExpr operationsStubVarExpr);
Expand All @@ -212,10 +215,11 @@ protected List<Statement> createClassStatements(
Service service,
Map<String, VariableExpr> protoMethodNameToDescriptorVarExprs,
Map<String, VariableExpr> callableClassMemberVarExprs,
Map<String, VariableExpr> classMemberVarExprs) {
Map<String, VariableExpr> classMemberVarExprs,
Map<String, Message> messageTypes) {
List<Statement> classStatements = new ArrayList<>();
for (Statement statement :
createMethodDescriptorVariableDecls(service, protoMethodNameToDescriptorVarExprs)) {
createMethodDescriptorVariableDecls(service, protoMethodNameToDescriptorVarExprs, messageTypes)) {
classStatements.add(statement);
classStatements.add(EMPTY_LINE_STATEMENT);
}
Expand All @@ -228,12 +232,12 @@ protected List<Statement> createClassStatements(
}

protected List<Statement> createMethodDescriptorVariableDecls(
Service service, Map<String, VariableExpr> protoMethodNameToDescriptorVarExprs) {
Service service, Map<String, VariableExpr> protoMethodNameToDescriptorVarExprs, Map<String, Message> messageTypes) {
return service.methods().stream()
.map(
m ->
createMethodDescriptorVariableDecl(
service, m, protoMethodNameToDescriptorVarExprs.get(m.name())))
service, m, protoMethodNameToDescriptorVarExprs.get(m.name()), messageTypes))
.collect(Collectors.toList());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import com.google.api.generator.gapic.composer.common.AbstractServiceStubClassComposer;
import com.google.api.generator.gapic.composer.store.TypeStore;
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.Service;
import com.google.api.generator.gapic.utils.JavaStyle;
Expand Down Expand Up @@ -85,7 +86,10 @@ private static TypeStore createStaticTypes() {

@Override
protected Statement createMethodDescriptorVariableDecl(
Service service, Method protoMethod, VariableExpr methodDescriptorVarExpr) {
Service service,
Method protoMethod,
VariableExpr methodDescriptorVarExpr,
Map<String, Message> messageTypes) {
MethodInvocationExpr methodDescriptorMaker =
MethodInvocationExpr.builder()
.setMethodName("newBuilder")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,27 @@

import com.google.api.gax.core.BackgroundResource;
import com.google.api.gax.httpjson.ApiMessage;
import com.google.api.gax.httpjson.HttpJsonCallableFactory;
import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable;
import com.google.api.gax.rpc.OperationCallable;
import com.google.api.gax.rpc.UnaryCallable;
import com.google.api.generator.engine.ast.AnnotationNode;
import com.google.api.generator.engine.ast.AssignmentExpr;
import com.google.api.generator.engine.ast.ConcreteReference;
import com.google.api.generator.engine.ast.ExprStatement;
import com.google.api.generator.engine.ast.MethodDefinition;
import com.google.api.generator.engine.ast.MethodInvocationExpr;
import com.google.api.generator.engine.ast.NewObjectExpr;
import com.google.api.generator.engine.ast.Statement;
import com.google.api.generator.engine.ast.TypeNode;
import com.google.api.generator.engine.ast.ValueExpr;
import com.google.api.generator.engine.ast.VaporReference;
import com.google.api.generator.engine.ast.Variable;
import com.google.api.generator.engine.ast.VariableExpr;
import com.google.api.generator.gapic.composer.common.AbstractServiceCallableFactoryClassComposer;
import com.google.api.generator.gapic.composer.store.TypeStore;
import com.google.api.generator.gapic.model.Service;
import com.google.longrunning.Operation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -90,6 +103,7 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
"The surface for long-running operations is not stable yet and may change in the"
+ " future.");

// Generate generic method without the body
MethodDefinition method =
createGenericCallableMethod(
typeStore,
Expand All @@ -104,6 +118,119 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
.map(n -> (Object) n)
.collect(Collectors.toList()),
Arrays.asList(betaAnnotation));
return method.toBuilder().setReturnExpr(ValueExpr.createNullExpr()).build();

List<Statement> createOperationCallableBody = new ArrayList<Statement>(2);

List<VariableExpr> arguments = method.arguments();
Variable httpJsonCallSettingsVar = arguments.get(0).variable();
Variable callSettingsVar = arguments.get(1).variable();
Variable clientContextVar = arguments.get(2).variable();
Variable operationsStub = arguments.get(3).variable();
// Generate innerCallable
VariableExpr innerCallableVarExpr =
VariableExpr.builder()
.setVariable(
Variable.builder()
.setName("innerCallable")
.setType(
TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class)))
.build())
.setTemplateObjects(Arrays.asList(requestTemplateName, methodVariantName))
.build();
MethodInvocationExpr getInitialCallSettingsExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(VariableExpr.withVariable(callSettingsVar))
.setMethodName("getInitialCallSettings")
.build();
MethodInvocationExpr createBaseUnaryCallableExpr =
MethodInvocationExpr.builder()
.setStaticReferenceType(
TypeNode.withReference(ConcreteReference.withClazz(HttpJsonCallableFactory.class)))
.setMethodName("createBaseUnaryCallable")
.setArguments(
VariableExpr.withVariable(httpJsonCallSettingsVar),
getInitialCallSettingsExpr,
VariableExpr.withVariable(clientContextVar))
.setReturnType(TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class)))
.build();
AssignmentExpr innerCallableAssignExpr =
AssignmentExpr.builder()
.setVariableExpr(innerCallableVarExpr.toBuilder().setIsDecl(true).build())
.setValueExpr(createBaseUnaryCallableExpr)
.build();
createOperationCallableBody.add(ExprStatement.withExpr(innerCallableAssignExpr));

// Generate initialCallable
VariableExpr initialCallableVarExpr =
VariableExpr.builder()
.setVariable(
Variable.builder()
.setName("initialCallable")
.setType(
TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class)))
.build())
.setTemplateObjects(Arrays.asList(requestTemplateName, methodVariantName))
.build();
MethodInvocationExpr getMethodDescriptorExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(VariableExpr.withVariable(httpJsonCallSettingsVar))
.setMethodName("getMethodDescriptor")
.build();
MethodInvocationExpr getOperationSnapshotFactoryExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(getMethodDescriptorExpr)
.setMethodName("getOperationSnapshotFactory")
.build();
// This is a temporary solution
VaporReference requestT =
VaporReference.builder()
.setName("RequestT")
.setPakkage("com.google.cloud.compute.v1.stub")
.build();
TypeNode operationSnapshotCallableType =
TypeNode.withReference(
ConcreteReference.builder()
.setClazz(HttpJsonOperationSnapshotCallable.class)
.setGenerics(requestT, ConcreteReference.withClazz(Operation.class))
.build());
NewObjectExpr initialCallableObject =
NewObjectExpr.builder()
.setType(operationSnapshotCallableType)
.setIsGeneric(true)
.setArguments(innerCallableVarExpr, getOperationSnapshotFactoryExpr)
.build();
AssignmentExpr initialCallableAssignExpr =
AssignmentExpr.builder()
.setVariableExpr(initialCallableVarExpr.toBuilder().setIsDecl(true).build())
.setValueExpr(initialCallableObject)
.build();
createOperationCallableBody.add(ExprStatement.withExpr(initialCallableAssignExpr));

// Generate return statement
MethodInvocationExpr longRunningClient =
MethodInvocationExpr.builder()
.setExprReferenceExpr(VariableExpr.withVariable(operationsStub))
.setMethodName("longRunningClient")
.build();
MethodInvocationExpr createOperationCallable =
MethodInvocationExpr.builder()
.setStaticReferenceType(
TypeNode.withReference(ConcreteReference.withClazz(HttpJsonCallableFactory.class)))
.setMethodName("createOperationCallable")
.setArguments(
VariableExpr.withVariable(callSettingsVar),
VariableExpr.withVariable(clientContextVar),
longRunningClient,
initialCallableVarExpr)
.setReturnType(
TypeNode.withReference(ConcreteReference.withClazz(OperationCallable.class)))
.build();

// Add body and return statement to method
return method
.toBuilder()
.setBody(createOperationCallableBody)
.setReturnExpr(createOperationCallable)
.build();
}
}

0 comments on commit 35cc21c

Please sign in to comment.