Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.GapicServiceConfig;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.gapic.model.Transport;
import com.google.api.generator.spring.composer.comment.SpringAutoconfigCommentComposer;
import com.google.api.generator.spring.utils.LoggerUtils;
import com.google.api.generator.spring.utils.Utils;
Expand Down Expand Up @@ -96,6 +97,9 @@ public GapicClass generate(GapicContext context, Service service) {

types.get("CredentialsProvider").isSupertypeOrEquals(types.get("DefaultCredentialsProvider"));

Transport transport = context.transport();
boolean hasRestOption = transport.equals(Transport.GRPC_REST);

ClassDefinition classDef =
ClassDefinition.builder()
.setPackageString(packageName)
Expand All @@ -104,6 +108,7 @@ public GapicClass generate(GapicContext context, Service service) {
.setHeaderCommentStatements(
SpringAutoconfigCommentComposer.createClassHeaderComments(className, serviceName))
.setStatements(createMemberVariables(service, packageName, types, gapicServiceConfig))
.setAnnotations(createClassAnnotations(service, types))
.setMethods(
Arrays.asList(
createConstructor(service.name(), className, types),
Expand All @@ -118,9 +123,10 @@ public GapicClass generate(GapicContext context, Service service) {
transportChannelProviderName,
clientName,
types,
gapicServiceConfig)))
.setAnnotations(createClassAnnotations(service, types))
gapicServiceConfig,
hasRestOption)))
.build();

return GapicClass.create(kind, classDef);
}

Expand Down Expand Up @@ -465,7 +471,8 @@ private static MethodDefinition createClientBeanMethod(
String transportChannelProviderName,
String clientName,
Map<String, TypeNode> types,
GapicServiceConfig gapicServiceConfig) {
GapicServiceConfig gapicServiceConfig,
boolean hasRestOption) {
// argument variables:
VariableExpr credentialsProviderVariableExpr =
VariableExpr.withVariable(
Expand Down Expand Up @@ -513,6 +520,7 @@ private static MethodDefinition createClientBeanMethod(
.setMethodName("setTransportChannelProvider")
.setArguments(transportChannelProviderVariableExpr)
.build();

// .setHeaderProvider(
// new UserAgentHeaderProvider(this.getClass()));
settingsBuilderExpr =
Expand Down Expand Up @@ -654,50 +662,51 @@ private static MethodDefinition createClientBeanMethod(

bodyStatements.add(setBackgroundExecutorProviderStatement);

// if (clientProperties.getUseRest()) {
// clientSettingsBuilder.setTransportChannelProvider(
// LanguageServiceSettings.defaultHttpJsonTransportProviderBuilder().build());
// }

MethodInvocationExpr getUseRest =
MethodInvocationExpr.builder()
.setMethodName("getUseRest")
.setReturnType(TypeNode.BOOLEAN)
.setExprReferenceExpr(thisClientPropertiesVarExpr)
.build();

// LanguageServiceSettings.defaultHttpJsonTransportProviderBuilder().build()
Expr defaultTransportProviderBuider =
MethodInvocationExpr.builder()
.setStaticReferenceType(types.get("ServiceSettings"))
.setMethodName("defaultHttpJsonTransportProviderBuilder")
.build();
defaultTransportProviderBuider =
MethodInvocationExpr.builder()
.setExprReferenceExpr(defaultTransportProviderBuider)
.setMethodName("build")
.setReturnType(STATIC_TYPES.get("InstantiatingHttpJsonChannelProvider"))
.build();

MethodInvocationExpr setTransportProvider =
MethodInvocationExpr.builder()
.setExprReferenceExpr(VariableExpr.withVariable(settingBuilderVariable))
.setMethodName("setTransportChannelProvider")
.setArguments(defaultTransportProviderBuider)
.build();
IfStatement setTransportChannelProviderStatement =
createIfStatement(
getUseRest,
Arrays.asList(
ExprStatement.withExpr(setTransportProvider),
LoggerUtils.createLoggerStatement(
ValueExpr.withValue(
StringObjectValue.withValue("Using HTTP transport channel")),
types)),
null);

bodyStatements.add(setTransportChannelProviderStatement);

if (hasRestOption) {
// if (clientProperties.getUseRest()) {
// clientSettingsBuilder.setTransportChannelProvider(
// LanguageServiceSettings.defaultHttpJsonTransportProviderBuilder().build());
// }

MethodInvocationExpr getUseRest =
MethodInvocationExpr.builder()
.setMethodName("getUseRest")
.setReturnType(TypeNode.BOOLEAN)
.setExprReferenceExpr(thisClientPropertiesVarExpr)
.build();

// LanguageServiceSettings.defaultHttpJsonTransportProviderBuilder().build()
Expr defaultTransportProviderExprChain =
MethodInvocationExpr.builder()
.setStaticReferenceType(types.get("ServiceSettings"))
.setMethodName("defaultHttpJsonTransportProviderBuilder")
.build();
defaultTransportProviderExprChain =
MethodInvocationExpr.builder()
.setExprReferenceExpr(defaultTransportProviderExprChain)
.setMethodName("build")
.setReturnType(STATIC_TYPES.get("InstantiatingHttpJsonChannelProvider"))
.build();

MethodInvocationExpr setTransportProvider =
MethodInvocationExpr.builder()
.setExprReferenceExpr(VariableExpr.withVariable(settingBuilderVariable))
.setMethodName("setTransportChannelProvider")
.setArguments(defaultTransportProviderExprChain)
.build();
IfStatement setTransportChannelProviderStatement =
createIfStatement(
getUseRest,
Arrays.asList(
ExprStatement.withExpr(setTransportProvider),
LoggerUtils.createLoggerStatement(
ValueExpr.withValue(
StringObjectValue.withValue("Using HTTP transport channel")),
types)),
null);

bodyStatements.add(setTransportChannelProviderStatement);
}
// retry settings for each method
TypeNode thisClassType = types.get(service.name() + "AutoConfig");
List retrySettings =
Expand Down Expand Up @@ -786,6 +795,28 @@ private static MethodDefinition createClientBeanMethod(
.setReturnType(types.get("ServiceClient"))
.setArguments(serviceSettingsBuilt)
.build();
List<VariableExpr> argumentsVariableExprs =
Arrays.asList(
credentialsProviderVariableExpr
.toBuilder()
.setIsDecl(true)
.setAnnotations(
Arrays.asList(
AnnotationNode.builder()
.setType(types.get("Qualifier"))
.setDescription(credentialsProviderName)
.build()))
.build(),
transportChannelProviderVariableExpr
.toBuilder()
.setIsDecl(true)
.setAnnotations(
Arrays.asList(
AnnotationNode.builder()
.setType(types.get("Qualifier"))
.setDescription(transportChannelProviderName)
.build()))
.build());

String methodName =
CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, service.name()) + "Client";
Expand All @@ -798,28 +829,7 @@ private static MethodDefinition createClientBeanMethod(
.setName(methodName)
.setScope(ScopeNode.PUBLIC)
.setReturnType(types.get("ServiceClient"))
.setArguments(
Arrays.asList(
credentialsProviderVariableExpr
.toBuilder()
.setIsDecl(true)
.setAnnotations(
Arrays.asList(
AnnotationNode.builder()
.setType(types.get("Qualifier"))
.setDescription(credentialsProviderName)
.build()))
.build(),
transportChannelProviderVariableExpr
.toBuilder()
.setIsDecl(true)
.setAnnotations(
Arrays.asList(
AnnotationNode.builder()
.setType(types.get("Qualifier"))
.setDescription(transportChannelProviderName)
.build()))
.build()))
.setArguments(argumentsVariableExprs)
.setAnnotations(
Arrays.asList(
AnnotationNode.withType(types.get("Bean")),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ protected static List<GapicClass> generatePerServiceClasses(GapicContext context
.services()
.forEach(
s -> {
// Transport.REST is out of scope for Spring composers.
if (context.transport() == Transport.GRPC
|| context.transport() == Transport.GRPC_REST) {
clazzes.add(SpringAutoConfigClassComposer.instance().generate(context, s));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.google.api.generator.engine.ast.ExprStatement;
import com.google.api.generator.engine.ast.MethodDefinition;
import com.google.api.generator.engine.ast.NewObjectExpr;
import com.google.api.generator.engine.ast.PrimitiveValue;
import com.google.api.generator.engine.ast.ScopeNode;
import com.google.api.generator.engine.ast.Statement;
import com.google.api.generator.engine.ast.StringObjectValue;
Expand All @@ -41,6 +42,7 @@
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.GapicServiceConfig;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.gapic.model.Transport;
import com.google.api.generator.spring.composer.comment.SpringPropertiesCommentComposer;
import com.google.api.generator.spring.utils.Utils;
import com.google.common.base.CaseFormat;
Expand Down Expand Up @@ -70,6 +72,7 @@ public GapicClass generate(GapicContext context, Service service) {
String className = String.format(CLASS_NAME_PATTERN, service.name());
GapicServiceConfig gapicServiceConfig = context.serviceConfig();
Map<String, TypeNode> types = createDynamicTypes(service, packageName);
boolean hasRestOption = context.transport().equals(Transport.GRPC_REST);

// TODO: this is the prefix user will use to set properties, may need to change depending on
// branding.
Expand All @@ -87,8 +90,10 @@ public GapicClass generate(GapicContext context, Service service) {
.setPackageString(packageName)
.setName(className)
.setScope(ScopeNode.PUBLIC)
.setStatements(createMemberVariables(service, packageName, types, gapicServiceConfig))
.setMethods(createGetterSetters(service, types, gapicServiceConfig))
.setStatements(
createMemberVariables(
service, packageName, types, gapicServiceConfig, hasRestOption))
.setMethods(createGetterSetters(service, types, gapicServiceConfig, hasRestOption))
.setAnnotations(Arrays.asList(classAnnotationNode))
.setImplementsTypes(Arrays.asList(types.get("CredentialsSupplier")))
.build();
Expand Down Expand Up @@ -129,9 +134,11 @@ private static List<Statement> createMemberVariables(
Service service,
String packageName,
Map<String, TypeNode> types,
GapicServiceConfig serviceConfig) {
GapicServiceConfig serviceConfig,
boolean hasRestOption) {

String serviceName = service.name();
List<Statement> statements = new ArrayList<>();
// @NestedConfigurationProperty
// private final Credentials credentials = new
// Credentials("https://www.googleapis.com/auth/cloud-language");
Expand All @@ -155,20 +162,27 @@ private static List<Statement> createMemberVariables(
true,
defaultCredentialScopes,
credentialsAnnotations);

statements.add(credentialsStatement);
// private String quotaProjectId;
ExprStatement quotaProjectIdVarStatement =
createMemberVarStatement("quotaProjectId", TypeNode.STRING, false, null, null);

statements.add(quotaProjectIdVarStatement);
// private Integer executorThreadCount;
ExprStatement executorThreadCountVarStatement =
createMemberVarStatement("executorThreadCount", TypeNode.INT_OBJECT, false, null, null);
statements.add(executorThreadCountVarStatement);
if (hasRestOption) {
ExprStatement useRestVarStatement =
createMemberVarStatement(
"useRest",
TypeNode.BOOLEAN,
false,
ValueExpr.withValue(
PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()),
null);
statements.add(useRestVarStatement);
}

// private boolean useRest = false;
ExprStatement useRestVarStatement =
createMemberVarStatement("useRest", TypeNode.BOOLEAN, false, null, null);

//
// private static final ImmutableMap<String, RetrySettings> RETRY_PARAM_DEFINITIONS;

// declare each retry settings with its default value. use defaults from serviceConfig
Expand All @@ -194,18 +208,17 @@ private static List<Statement> createMemberVariables(
},
(String propertyName) -> new ArrayList<>());

List<Statement> statements =
retrySettings.stream().map(x -> (Statement) x).collect(Collectors.toList());
statements.addAll(
retrySettings.stream().map(Statement.class::cast).collect(Collectors.toList()));

statements.add(0, useRestVarStatement);
statements.add(0, executorThreadCountVarStatement);
statements.add(0, quotaProjectIdVarStatement);
statements.add(0, credentialsStatement);
return statements;
}

private static List<MethodDefinition> createGetterSetters(
Service service, Map<String, TypeNode> types, GapicServiceConfig gapicServiceConfig) {
Service service,
Map<String, TypeNode> types,
GapicServiceConfig gapicServiceConfig,
boolean hasRestOption) {

TypeNode thisClassType = types.get(service.name() + "Properties");
List<MethodDefinition> methodDefinitions = new ArrayList<>();
Expand All @@ -219,7 +232,10 @@ private static List<MethodDefinition> createGetterSetters(
methodDefinitions.add(
createGetterMethod(thisClassType, "quotaProjectId", TypeNode.STRING, null));
methodDefinitions.add(createSetterMethod(thisClassType, "quotaProjectId", TypeNode.STRING));
methodDefinitions.add(createGetterMethod(thisClassType, "useRest", TypeNode.BOOLEAN, null));
if (hasRestOption) {
methodDefinitions.add(createGetterMethod(thisClassType, "useRest", TypeNode.BOOLEAN, null));
methodDefinitions.add(createSetterMethod(thisClassType, "useRest", TypeNode.BOOLEAN));
}
methodDefinitions.add(
createGetterMethod(thisClassType, "executorThreadCount", TypeNode.INT_OBJECT, null));
methodDefinitions.add(
Expand All @@ -246,15 +262,6 @@ private static List<MethodDefinition> createGetterSetters(
(String propertyName) -> new ArrayList<>());

methodDefinitions.addAll(retrySettings);
// TODO: This can be for future stages. for long running operations:
// for (Method method : service.methods()) {
// if (!method.hasLro()) {
// continue;
// }
// //
// com.google.api.generator.gapic.composer.common.RetrySettingsComposer.createLroSettingsBuilderExpr
// // %sOperationSettings
// }

return methodDefinitions;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.gapic.model.Transport;
import com.google.api.generator.test.framework.Assert;
import org.junit.Before;
import org.junit.Test;
Expand All @@ -33,10 +34,21 @@ public void setUp() {
}

@Test
public void generateAutoConfigClazzTest() {
public void generateAutoConfigClazzGrpcTest() {
GapicClass clazz =
SpringAutoConfigClassComposer.instance().generate(this.context, this.echoProtoService);
String fileName = clazz.classDefinition().classIdentifier() + ".golden";
String fileName = clazz.classDefinition().classIdentifier() + "Grpc.golden";
Assert.assertGoldenClass(this.getClass(), clazz, fileName);
}

@Test
public void generateAutoConfigClazzGrpcRestTest() {

GapicContext contextGrpcRest =
this.context.toBuilder().setTransport(Transport.GRPC_REST).build();
GapicClass clazz =
SpringAutoConfigClassComposer.instance().generate(contextGrpcRest, this.echoProtoService);
String fileName = clazz.classDefinition().classIdentifier() + "GrpcRest.golden";
Assert.assertGoldenClass(this.getClass(), clazz, fileName);
}
}
Loading