From 498f4056c079c557b6dfca7b07e2d1eac4dfeeda Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Thu, 1 Sep 2022 13:58:18 +0000 Subject: [PATCH 01/11] added a Spring dep and replace vapor references. not completed. --- BUILD.bazel | 10 +- WORKSPACE | 7 +- .../SpringAutoConfigClassComposer.java | 131 +++++++----------- .../SpringPropertiesClassComposer.java | 48 +++---- 4 files changed, 83 insertions(+), 113 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index e8e17887a3..1626cb7941 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -47,6 +47,12 @@ TEST_DEPS = [ "@io_github_java_diff_utils//jar", ] +SPING_DEPS = [ + "@maven//:org_springframework_boot_spring_boot_starter", + "@maven//:org_springframework_boot_spring_boot_autoconfigure", + "@maven//:org_springframework_boot_spring_boot", +] + proto_library( name = "service_config_proto", srcs = ["src/main/proto/service_config.proto"], @@ -100,7 +106,7 @@ java_library( name = "gapic_generator_java", srcs = glob(["src/main/java/**/*.java"]), plugins = [":autovalue_plugin"], - deps = MAIN_DEPS, + deps = MAIN_DEPS + SPING_DEPS, ) java_library( @@ -112,7 +118,7 @@ java_library( java_binary( name = "protoc-gen-java_gapic", main_class = "com.google.api.generator.Main", - runtime_deps = [":gapic_generator_java"] + MAIN_DEPS, + runtime_deps = [":gapic_generator_java"] + MAIN_DEPS + SPING_DEPS, ) # Request dumper binary, which dumps the CodeGeneratorRequest to a file on disk diff --git a/WORKSPACE b/WORKSPACE index 32f311e27e..4cf7b7cc1b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -79,8 +79,13 @@ load("@com_google_protobuf//:protobuf_deps.bzl", "PROTOBUF_MAVEN_ARTIFACTS", "pr load("@rules_jvm_external//:defs.bzl", "maven_install") + +SRING_MAVEN_ARTIFACTS = [ + "org.springframework.boot:spring-boot-starter:2.6.9", +] + maven_install( - artifacts = PROTOBUF_MAVEN_ARTIFACTS, + artifacts = PROTOBUF_MAVEN_ARTIFACTS + SRING_MAVEN_ARTIFACTS, generate_compat_repositories = True, repositories = [ "https://repo.maven.apache.org/maven2/", diff --git a/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java b/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java index fe33bbdfb9..019111c571 100644 --- a/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java +++ b/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java @@ -14,6 +14,7 @@ package com.google.api.generator.spring.composer; +import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.ExecutorProvider; import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider; import com.google.api.gax.retrying.RetrySettings; @@ -59,6 +60,10 @@ import java.util.Map; import java.util.stream.Collectors; import javax.annotation.Generated; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; public class SpringAutoConfigClassComposer implements ClassComposer { private static final String CLASS_NAME_PATTERN = "%sSpringAutoConfiguration"; @@ -82,14 +87,16 @@ public static SpringAutoConfigClassComposer instance() { @Override public GapicClass generate(GapicContext context, Service service) { String packageName = service.pakkage() + ".spring"; - Map types = createDynamicTypes(service, packageName); + Map dynamicTypes = createDynamicTypes(service, packageName); String className = getThisClassName(service.name()); String libName = Utils.getLibName(context); GapicClass.Kind kind = Kind.MAIN; GapicServiceConfig gapicServiceConfig = context.serviceConfig(); - types.get("CredentialsProvider").isSupertypeOrEquals(types.get("DefaultCredentialsProvider")); + STATIC_TYPES + .get("CredentialsProvider") + .isSupertypeOrEquals(dynamicTypes.get("DefaultCredentialsProvider")); // header -- not used, add later List fileHeader = @@ -101,14 +108,15 @@ public GapicClass generate(GapicContext context, Service service) { .setPackageString(packageName) .setName(className) .setScope(ScopeNode.PUBLIC) - .setStatements(createMemberVariables(service, packageName, types, gapicServiceConfig)) + .setStatements( + createMemberVariables(service, packageName, dynamicTypes, gapicServiceConfig)) .setMethods( Arrays.asList( - createConstructor(service.name(), className, types), - createCredentialsProviderBeanMethod(service, className, types), - createTransportChannelProviderBeanMethod(service, types), - createClientBeanMethod(service, className, types, gapicServiceConfig))) - .setAnnotations(createClassAnnotations(service, types, libName)) + createConstructor(service.name(), className, dynamicTypes), + createCredentialsProviderBeanMethod(service, className, dynamicTypes), + createTransportChannelProviderBeanMethod(service, dynamicTypes), + createClientBeanMethod(service, className, dynamicTypes, gapicServiceConfig))) + .setAnnotations(createClassAnnotations(service, dynamicTypes, libName)) .build(); return GapicClass.create(kind, classDef); } @@ -405,15 +413,12 @@ private static List createClassAnnotations( // and classes. AnnotationNode conditionalOnPropertyNode = AnnotationNode.builder() - .setType(types.get("ConditionalOnProperty")) - .setDescription( - "value = \"" - + Utils.springPropertyPrefix(libName, service.name()) - + ".enabled\", matchIfMissing = false") + .setType(STATIC_TYPES.get("ConditionalOnProperty")) + .setDescription("value = \"spring.cloud.gcp.language.enabled\", matchIfMissing = false") .build(); AnnotationNode conditionalOnClassNode = AnnotationNode.builder() - .setType(types.get("ConditionalOnClass")) + .setType(STATIC_TYPES.get("ConditionalOnClass")) .setDescription( "value = " + ClassNames.getServiceClientClassName(service) @@ -427,7 +432,7 @@ private static List createClassAnnotations( .build(); AnnotationNode enableConfigurationPropertiesNode = AnnotationNode.builder() - .setType(types.get("EnableConfigurationProperties")) + .setType(STATIC_TYPES.get("EnableConfigurationProperties")) .setDescription( types.get(service.name() + "Properties").reference().name() + ".Class") // TODO: change to parameters @@ -470,18 +475,18 @@ private static MethodDefinition createCredentialsProviderBeanMethod( .setType(types.get("DefaultCredentialsProvider")) .setArguments(thisClientProperties) .build()) - .setType(types.get("CredentialsProvider")) + .setType(STATIC_TYPES.get("CredentialsProvider")) .build(); String methodName = "googleCredentials"; return MethodDefinition.builder() .setName(methodName) .setScope(ScopeNode.PUBLIC) - .setReturnType(types.get("CredentialsProvider")) + .setReturnType(STATIC_TYPES.get("CredentialsProvider")) .setAnnotations( Arrays.asList( AnnotationNode.withType(types.get("Bean")), - AnnotationNode.withType(types.get("ConditionalOnMissingBean")))) + AnnotationNode.withType(STATIC_TYPES.get("ConditionalOnMissingBean")))) .setThrowsExceptions(Arrays.asList(TypeNode.withExceptionClazz(IOException.class))) .setReturnExpr(castExpr) .build(); @@ -511,7 +516,7 @@ private static MethodDefinition createTransportChannelProviderBeanMethod( .setAnnotations( Arrays.asList( AnnotationNode.withType(types.get("Bean")), - AnnotationNode.withType(types.get("ConditionalOnMissingBean")))) + AnnotationNode.withType(STATIC_TYPES.get("ConditionalOnMissingBean")))) .setReturnExpr(returnExpr) .build(); } @@ -608,7 +613,7 @@ private static MethodDefinition createClientBeanMethod( VariableExpr.withVariable( Variable.builder() .setName("credentialsProvider") - .setType(types.get("CredentialsProvider")) + .setType(STATIC_TYPES.get("CredentialsProvider")) .build()); VariableExpr transportChannelProviderVariableExpr = VariableExpr.withVariable( @@ -907,7 +912,7 @@ private static MethodDefinition createClientBeanMethod( .setAnnotations( Arrays.asList( AnnotationNode.withType(types.get("Bean")), - AnnotationNode.withType(types.get("ConditionalOnMissingBean")))) + AnnotationNode.withType(STATIC_TYPES.get("ConditionalOnMissingBean")))) .setThrowsExceptions(Arrays.asList(TypeNode.withExceptionClazz(IOException.class))) .setReturnExpr(returnExpr) .setBody(bodyStatements) @@ -922,9 +927,13 @@ private static Map createStaticTypes() { RetrySettings.Builder .class, // name will be just Builder. consider change of more than one builder here. TransportChannelProvider.class, - // import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider; InstantiatingHttpJsonChannelProvider.class, - ExecutorProvider.class); + ExecutorProvider.class, + ConditionalOnClass.class, + ConditionalOnProperty.class, + ConditionalOnMissingBean.class, + EnableConfigurationProperties.class, + CredentialsProvider.class); return concreteClazzes.stream() .collect( Collectors.toMap( @@ -944,12 +953,7 @@ private static Map createDynamicTypes(Service service, String .setName(String.format(p, service.name())) .setPakkage(packageName) .build()))); - TypeNode credentialsProvider = - TypeNode.withReference( - VaporReference.builder() - .setName("CredentialsProvider") - .setPakkage("com.google.api.gax.core") - .build()); + TypeNode clientProperties = TypeNode.withReference( VaporReference.builder() @@ -962,6 +966,25 @@ private static Map createDynamicTypes(Service service, String VaporReference.builder() .setName(service.name() + "SpringAutoConfig") .setPakkage(packageName) + + TypeNode serviceClient = + TypeNode.withReference( + VaporReference.builder() + .setName(ClassNames.getServiceClientClassName(service)) + .setPakkage(service.pakkage()) + .build()); + TypeNode serviceSettings = + TypeNode.withReference( + VaporReference.builder() + .setName(ClassNames.getServiceSettingsClassName(service)) + .setPakkage(service.pakkage()) + .build()); + TypeNode serviceSettingsBuilder = + TypeNode.withReference( + VaporReference.builder() + .setPakkage(service.pakkage()) + .setName("Builder") + .setEnclosingClassNames(ClassNames.getServiceSettingsClassName(service)) .build()); TypeNode gcpProjectIdProvider = @@ -994,26 +1017,6 @@ private static Map createDynamicTypes(Service service, String .build()) .build()); - TypeNode serviceClient = - TypeNode.withReference( - VaporReference.builder() - .setName(ClassNames.getServiceClientClassName(service)) - .setPakkage(service.pakkage()) - .build()); - TypeNode serviceSettings = - TypeNode.withReference( - VaporReference.builder() - .setName(ClassNames.getServiceSettingsClassName(service)) - .setPakkage(service.pakkage()) - .build()); - TypeNode serviceSettingsBuilder = - TypeNode.withReference( - VaporReference.builder() - .setPakkage(service.pakkage()) - .setName("Builder") - .setEnclosingClassNames(ClassNames.getServiceSettingsClassName(service)) - .build()); - TypeNode bean = TypeNode.withReference( VaporReference.builder() @@ -1026,33 +1029,7 @@ private static Map createDynamicTypes(Service service, String .setName("Configuration") .setPakkage("org.springframework.context.annotation") .build()); - TypeNode enableConfigurationProperties = - TypeNode.withReference( - VaporReference.builder() - .setName("EnableConfigurationProperties") - .setPakkage("org.springframework.boot.context.properties") - .build()); - TypeNode conditionalOnMissingBean = - TypeNode.withReference( - VaporReference.builder() - .setName("ConditionalOnMissingBean") - .setPakkage("org.springframework.boot.autoconfigure.condition") - .build()); - - TypeNode conditionalOnProperty = - TypeNode.withReference( - VaporReference.builder() - .setName("ConditionalOnProperty") - .setPakkage("org.springframework.boot.autoconfigure.condition") - .build()); - TypeNode conditionalOnClass = - TypeNode.withReference( - VaporReference.builder() - .setName("ConditionalOnClass") - .setPakkage("org.springframework.boot.autoconfigure.condition") - .build()); - typeMap.put("CredentialsProvider", credentialsProvider); typeMap.put(service.name() + "Properties", clientProperties); typeMap.put(service.name() + "AutoConfig", clientAutoconfig); typeMap.put("GcpProjectIdProvider", gcpProjectIdProvider); @@ -1063,10 +1040,6 @@ private static Map createDynamicTypes(Service service, String typeMap.put("ServiceSettingsBuilder", serviceSettingsBuilder); typeMap.put("Bean", bean); typeMap.put("Configuration", configuration); - typeMap.put("EnableConfigurationProperties", enableConfigurationProperties); - typeMap.put("ConditionalOnMissingBean", conditionalOnMissingBean); - typeMap.put("ConditionalOnProperty", conditionalOnProperty); - typeMap.put("ConditionalOnClass", conditionalOnClass); return typeMap; } diff --git a/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java b/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java index 949e34c4de..9081f06082 100644 --- a/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java +++ b/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java @@ -49,11 +49,13 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; public class SpringPropertiesClassComposer implements ClassComposer { private static final String CLASS_NAME_PATTERN = "%sSpringProperties"; - private static final Map staticTypes = createStaticTypes(); + private static final Map STATIC_TYPES = createStaticTypes(); private static final String RETRY_PARAM_DEFINITIONS_VAR_NAME = "RETRY_PARAM_DEFINITIONS"; private static final SpringPropertiesClassComposer INSTANCE = new SpringPropertiesClassComposer(); @@ -67,14 +69,16 @@ public GapicClass generate(GapicContext context, Service service) { String packageName = service.pakkage() + ".spring"; String className = String.format(CLASS_NAME_PATTERN, service.name()); GapicServiceConfig gapicServiceConfig = context.serviceConfig(); - Map types = createDynamicTypes(service, packageName); + Map dynamicTypes = createDynamicTypes(service, packageName); // TODO: this is the prefix user will use to set properties, may need to change depending on // branding. AnnotationNode classAnnotationNode = AnnotationNode.builder() - .setType(types.get("ConfigurationProperties")) - .setDescription(Utils.springPropertyPrefix(Utils.getLibName(context), service.name())) + .setType(STATIC_TYPES.get("ConfigurationProperties")) + .setDescription( + "google.cloud.spring.autoconfig." + + CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, service.name())) .build(); ClassDefinition classDef = @@ -82,10 +86,11 @@ 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, dynamicTypes, gapicServiceConfig)) + .setMethods(createGetterSetters(service, dynamicTypes, gapicServiceConfig)) .setAnnotations(Arrays.asList(classAnnotationNode)) - .setImplementsTypes(Arrays.asList(types.get("CredentialsSupplier"))) + .setImplementsTypes(Arrays.asList(dynamicTypes.get("CredentialsSupplier"))) .build(); return GapicClass.create(Kind.MAIN, classDef); // return null; @@ -324,40 +329,21 @@ private static Map createDynamicTypes(Service service, String .setName("CredentialsSupplier") .setPakkage("com.google.cloud.spring.core") .build()); - // import org.springframework.boot.context.properties.ConfigurationProperties; - TypeNode configurationProperties = - TypeNode.withReference( - VaporReference.builder() - .setName("ConfigurationProperties") - .setPakkage("org.springframework.boot.context.properties") - .build()); - - // import org.springframework.boot.context.properties.NestedConfigurationProperty; - TypeNode nestedConfigurationProperty = - TypeNode.withReference( - VaporReference.builder() - .setName("NestedConfigurationProperty") - .setPakkage("org.springframework.boot.context.properties") - .build()); - - // import org.threeten.bp.Duration; - TypeNode duration = - TypeNode.withReference( - VaporReference.builder().setName("Duration").setPakkage("org.threeten.bp").build()); typeMap.put(service.name() + "Properties", clientProperties); typeMap.put("Credentials", credentials); - typeMap.put("Duration", duration); typeMap.put("CredentialsSupplier", credentialsSupplier); - typeMap.put("ConfigurationProperties", configurationProperties); - typeMap.put("NestedConfigurationProperty", nestedConfigurationProperty); return typeMap; } private static Map createStaticTypes() { List concreteClazzes = - Arrays.asList(RetrySettings.class, org.threeten.bp.Duration.class); + Arrays.asList( + RetrySettings.class, + org.threeten.bp.Duration.class, + ConfigurationProperties.class, + NestedConfigurationProperty.class); return concreteClazzes.stream() .collect( Collectors.toMap( From dbefb9481d8429efe488855331cf2921b27ee376 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Thu, 1 Sep 2022 17:37:38 +0000 Subject: [PATCH 02/11] added a Spring dep and replace vapor references.continued. --- BUILD.bazel | 2 + WORKSPACE | 1 + .../SpringAutoConfigClassComposer.java | 74 ++++--------------- .../spring/composer/SpringComposer.java | 1 - 4 files changed, 18 insertions(+), 60 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 1626cb7941..8b269d9a5d 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -51,6 +51,8 @@ SPING_DEPS = [ "@maven//:org_springframework_boot_spring_boot_starter", "@maven//:org_springframework_boot_spring_boot_autoconfigure", "@maven//:org_springframework_boot_spring_boot", + "@maven//:org_springframework_spring_context", + "@maven//:com_google_cloud_spring_cloud_gcp_core" ] proto_library( diff --git a/WORKSPACE b/WORKSPACE index 4cf7b7cc1b..45a4851c30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -82,6 +82,7 @@ load("@rules_jvm_external//:defs.bzl", "maven_install") SRING_MAVEN_ARTIFACTS = [ "org.springframework.boot:spring-boot-starter:2.6.9", + "com.google.cloud:spring-cloud-gcp-core:3.3.0", ] maven_install( diff --git a/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java b/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java index 019111c571..14899e50d2 100644 --- a/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java +++ b/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java @@ -21,11 +21,9 @@ import com.google.api.gax.rpc.TransportChannelProvider; import com.google.api.generator.engine.ast.AnnotationNode; import com.google.api.generator.engine.ast.AssignmentExpr; -import com.google.api.generator.engine.ast.BlockComment; import com.google.api.generator.engine.ast.BlockStatement; import com.google.api.generator.engine.ast.CastExpr; import com.google.api.generator.engine.ast.ClassDefinition; -import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.ConcreteReference; import com.google.api.generator.engine.ast.Expr; import com.google.api.generator.engine.ast.ExprStatement; @@ -50,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.cloud.spring.core.DefaultCredentialsProvider; import com.google.common.base.CaseFormat; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableMap; @@ -64,6 +63,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; public class SpringAutoConfigClassComposer implements ClassComposer { private static final String CLASS_NAME_PATTERN = "%sSpringAutoConfiguration"; @@ -96,15 +97,10 @@ public GapicClass generate(GapicContext context, Service service) { STATIC_TYPES .get("CredentialsProvider") - .isSupertypeOrEquals(dynamicTypes.get("DefaultCredentialsProvider")); - - // header -- not used, add later - List fileHeader = - Arrays.asList(CommentStatement.withComment(BlockComment.withComment("Apache License"))); + .isSupertypeOrEquals(STATIC_TYPES.get("DefaultCredentialsProvider")); ClassDefinition classDef = ClassDefinition.builder() - // .setFileHeader(fileHeader) .setPackageString(packageName) .setName(className) .setScope(ScopeNode.PUBLIC) @@ -427,7 +423,7 @@ private static List createClassAnnotations( .build(); AnnotationNode configurationNode = AnnotationNode.builder() - .setType(types.get("Configuration")) + .setType(STATIC_TYPES.get("Configuration")) .setDescription("proxyBeanMethods = false") // TODO: change to parameters .build(); AnnotationNode enableConfigurationPropertiesNode = @@ -472,7 +468,7 @@ private static MethodDefinition createCredentialsProviderBeanMethod( CastExpr.builder() .setExpr( NewObjectExpr.builder() - .setType(types.get("DefaultCredentialsProvider")) + .setType(STATIC_TYPES.get("DefaultCredentialsProvider")) .setArguments(thisClientProperties) .build()) .setType(STATIC_TYPES.get("CredentialsProvider")) @@ -485,7 +481,7 @@ private static MethodDefinition createCredentialsProviderBeanMethod( .setReturnType(STATIC_TYPES.get("CredentialsProvider")) .setAnnotations( Arrays.asList( - AnnotationNode.withType(types.get("Bean")), + AnnotationNode.withType(STATIC_TYPES.get("Bean")), AnnotationNode.withType(STATIC_TYPES.get("ConditionalOnMissingBean")))) .setThrowsExceptions(Arrays.asList(TypeNode.withExceptionClazz(IOException.class))) .setReturnExpr(castExpr) @@ -515,7 +511,7 @@ private static MethodDefinition createTransportChannelProviderBeanMethod( .setReturnType(STATIC_TYPES.get("TransportChannelProvider")) .setAnnotations( Arrays.asList( - AnnotationNode.withType(types.get("Bean")), + AnnotationNode.withType(STATIC_TYPES.get("Bean")), AnnotationNode.withType(STATIC_TYPES.get("ConditionalOnMissingBean")))) .setReturnExpr(returnExpr) .build(); @@ -911,7 +907,7 @@ private static MethodDefinition createClientBeanMethod( transportChannelProviderVariableExpr.toBuilder().setIsDecl(true).build())) .setAnnotations( Arrays.asList( - AnnotationNode.withType(types.get("Bean")), + AnnotationNode.withType(STATIC_TYPES.get("Bean")), AnnotationNode.withType(STATIC_TYPES.get("ConditionalOnMissingBean")))) .setThrowsExceptions(Arrays.asList(TypeNode.withExceptionClazz(IOException.class))) .setReturnExpr(returnExpr) @@ -933,7 +929,12 @@ private static Map createStaticTypes() { ConditionalOnProperty.class, ConditionalOnMissingBean.class, EnableConfigurationProperties.class, - CredentialsProvider.class); + CredentialsProvider.class, + Configuration.class, + Bean.class, + // GcpProjectIdProvider.class, + // Credentials.class, + DefaultCredentialsProvider.class); return concreteClazzes.stream() .collect( Collectors.toMap( @@ -987,49 +988,6 @@ private static Map createDynamicTypes(Service service, String .setEnclosingClassNames(ClassNames.getServiceSettingsClassName(service)) .build()); - TypeNode gcpProjectIdProvider = - TypeNode.withReference( - VaporReference.builder() - .setName("GcpProjectIdProvider") - .setPakkage("com.google.cloud.spring.core") - .build()); - - // import com.google.cloud.spring.core.Credentials; - TypeNode credentials = - TypeNode.withReference( - VaporReference.builder() - .setName("Credentials") - .setPakkage("com.google.cloud.spring.core") - .build()); - - // import com.google.cloud.spring.core.DefaultCredentialsProvider; - TypeNode defaultCredentialsProvider = - TypeNode.withReference( - VaporReference.builder() - .setName("DefaultCredentialsProvider") - .setPakkage("com.google.cloud.spring.core") - // TODO: this supre class info is not used, workaround by casting for now. look into - // VaporReference.isSupertypeOrEquals() - .setSupertypeReference( - VaporReference.builder() - .setName("CredentialsProvider") - .setPakkage("com.google.api.gax.core") - .build()) - .build()); - - TypeNode bean = - TypeNode.withReference( - VaporReference.builder() - .setName("Bean") - .setPakkage("org.springframework.context.annotation") - .build()); - TypeNode configuration = - TypeNode.withReference( - VaporReference.builder() - .setName("Configuration") - .setPakkage("org.springframework.context.annotation") - .build()); - typeMap.put(service.name() + "Properties", clientProperties); typeMap.put(service.name() + "AutoConfig", clientAutoconfig); typeMap.put("GcpProjectIdProvider", gcpProjectIdProvider); @@ -1038,8 +996,6 @@ private static Map createDynamicTypes(Service service, String typeMap.put("ServiceClient", serviceClient); typeMap.put("ServiceSettings", serviceSettings); typeMap.put("ServiceSettingsBuilder", serviceSettingsBuilder); - typeMap.put("Bean", bean); - typeMap.put("Configuration", configuration); return typeMap; } diff --git a/src/main/java/com/google/api/generator/spring/composer/SpringComposer.java b/src/main/java/com/google/api/generator/spring/composer/SpringComposer.java index d05eda85ca..887b08f2f4 100644 --- a/src/main/java/com/google/api/generator/spring/composer/SpringComposer.java +++ b/src/main/java/com/google/api/generator/spring/composer/SpringComposer.java @@ -27,7 +27,6 @@ public class SpringComposer { public static List composeServiceAutoConfigClasses(GapicContext context) { List clazzes = new ArrayList<>(); clazzes.addAll(generateClientAutoConfig(context)); - // TODO: from context, explore if any property settings needed. return addApacheLicense(clazzes); } From 4936a48f6cd1243ba183b6d7e02c9fb5ae8e6861 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Thu, 1 Sep 2022 18:04:44 +0000 Subject: [PATCH 03/11] added a Spring dep and replace vapor references. more. --- BUILD.bazel | 2 +- .../SpringPropertiesClassComposer.java | 45 +++++-------------- 2 files changed, 12 insertions(+), 35 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 8b269d9a5d..881cf8d17c 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -52,7 +52,7 @@ SPING_DEPS = [ "@maven//:org_springframework_boot_spring_boot_autoconfigure", "@maven//:org_springframework_boot_spring_boot", "@maven//:org_springframework_spring_context", - "@maven//:com_google_cloud_spring_cloud_gcp_core" + "@maven//:com_google_cloud_spring_cloud_gcp_core", ] proto_library( diff --git a/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java b/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java index 9081f06082..0273f7b293 100644 --- a/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java +++ b/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java @@ -41,6 +41,8 @@ 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.cloud.spring.core.Credentials; +import com.google.cloud.spring.core.CredentialsSupplier; import com.google.common.base.CaseFormat; import com.google.common.base.Joiner; import java.util.ArrayList; @@ -90,7 +92,7 @@ public GapicClass generate(GapicContext context, Service service) { createMemberVariables(service, packageName, dynamicTypes, gapicServiceConfig)) .setMethods(createGetterSetters(service, dynamicTypes, gapicServiceConfig)) .setAnnotations(Arrays.asList(classAnnotationNode)) - .setImplementsTypes(Arrays.asList(dynamicTypes.get("CredentialsSupplier"))) + .setImplementsTypes(Arrays.asList(STATIC_TYPES.get("CredentialsSupplier"))) .build(); return GapicClass.create(Kind.MAIN, classDef); // return null; @@ -132,7 +134,7 @@ private static List createMemberVariables( // Credentials("https://www.googleapis.com/auth/cloud-language"); NewObjectExpr defaultCredentialScopes = builder() - .setType(types.get("Credentials")) + .setType(STATIC_TYPES.get("Credentials")) .setArguments( service.oauthScopes().stream() .map(x -> ValueExpr.withValue(StringObjectValue.withValue(x))) @@ -141,7 +143,7 @@ private static List createMemberVariables( // TODO: credentials field needs annotation. ExprStatement credentialsStatement = createMemberVarStatement( - "credentials", types.get("Credentials"), true, defaultCredentialScopes); + "credentials", STATIC_TYPES.get("Credentials"), true, defaultCredentialScopes); // private String quotaProjectId; ExprStatement quotaProjectIdVarStatement = @@ -159,7 +161,7 @@ private static List createMemberVariables( // private static final ImmutableMap RETRY_PARAM_DEFINITIONS; // declare each retry settings with its default value. use defaults from serviceConfig - TypeNode thisClassType = types.get(service.name() + "Properties"); + TypeNode thisClassType = types.get(service.name() + "SpringProperties"); List retrySettings = Utils.processRetrySettings( service, @@ -194,14 +196,14 @@ private static List createMemberVariables( private static List createGetterSetters( Service service, Map types, GapicServiceConfig gapicServiceConfig) { - TypeNode thisClassType = types.get(service.name() + "Properties"); + TypeNode thisClassType = types.get(service.name() + "SpringProperties"); List methodDefinitions = new ArrayList<>(); methodDefinitions.add( createGetterMethod( thisClassType, "credentials", - types.get("Credentials"), + STATIC_TYPES.get("Credentials"), Arrays.asList(AnnotationNode.OVERRIDE))); methodDefinitions.add( createGetterMethod(thisClassType, "quotaProjectId", TypeNode.STRING, null)); @@ -307,33 +309,6 @@ private static Map createDynamicTypes(Service service, String .setName(String.format(p, service.name())) .setPakkage(packageName) .build()))); - TypeNode clientProperties = - TypeNode.withReference( - VaporReference.builder() - .setName(service.name() + "SpringProperties") - .setPakkage(packageName) - .build()); - - // import com.google.cloud.spring.core.Credentials; - TypeNode credentials = - TypeNode.withReference( - VaporReference.builder() - .setName("Credentials") - .setPakkage("com.google.cloud.spring.core") - .build()); - - // import com.google.cloud.spring.core.CredentialsSupplier; - TypeNode credentialsSupplier = - TypeNode.withReference( - VaporReference.builder() - .setName("CredentialsSupplier") - .setPakkage("com.google.cloud.spring.core") - .build()); - - typeMap.put(service.name() + "Properties", clientProperties); - typeMap.put("Credentials", credentials); - typeMap.put("CredentialsSupplier", credentialsSupplier); - return typeMap; } @@ -343,7 +318,9 @@ private static Map createStaticTypes() { RetrySettings.class, org.threeten.bp.Duration.class, ConfigurationProperties.class, - NestedConfigurationProperty.class); + NestedConfigurationProperty.class, + CredentialsSupplier.class, + Credentials.class); return concreteClazzes.stream() .collect( Collectors.toMap( From 4028a662c47263b722ef83f8e9841743c1d9e774 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Thu, 1 Sep 2022 18:16:14 +0000 Subject: [PATCH 04/11] minor cleanup unused code. --- .../SpringAutoConfigClassComposer.java | 199 +----------------- 1 file changed, 5 insertions(+), 194 deletions(-) diff --git a/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java b/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java index 14899e50d2..a6df7f5ee3 100644 --- a/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java +++ b/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java @@ -139,22 +139,6 @@ private static List createMemberVariables( GapicServiceConfig serviceConfig) { String serviceName = service.name(); - // TODO create CredentialsProvider bean instead. - // // private final CredentialsProvider credentialsProvider; - // Variable credentialsProviderVar = - // Variable.builder() - // .setName("credentialsProvider") - // .setType(types.get("CredentialsProvider")) - // .build(); - // VariableExpr credentialsProviderVarExpr = - // VariableExpr.builder() - // .setVariable(credentialsProviderVar) - // .setScope(ScopeNode.PRIVATE) - // .setIsFinal(true) - // .setIsDecl(true) - // .build(); - // ExprStatement credentialsProviderVarStatement = - // ExprStatement.withExpr(credentialsProviderVarExpr); // private final LanguageProperties clientProperties; Variable clientPropertiesVar = @@ -171,21 +155,6 @@ private static List createMemberVariables( .build(); ExprStatement clientPropertiesStatement = ExprStatement.withExpr(clientPropertiesVarExpr); - // // private final GcpProjectIdProvider projectIdProvider; - // Variable projectIdProviderVar = - // Variable.builder() - // .setName("projectIdProvider") - // .setType(types.get("GcpProjectIdProvider")) - // .build(); - // VariableExpr projectIdProviderVarExpr = - // VariableExpr.builder() - // .setVariable(projectIdProviderVar) - // .setScope(ScopeNode.PRIVATE) - // .setIsFinal(true) - // .setIsDecl(true) - // .build(); - // ExprStatement projectIdProviderStatement = ExprStatement.withExpr(projectIdProviderVarExpr); - // Declare the RETRY_PARAM_DEFINITIONS map. ExprStatement retryPramStatement = ExprStatement.withExpr( @@ -206,20 +175,6 @@ private static List createMemberVariables( private static MethodDefinition createConstructor( String serviceName, String className, Map types) { - /// constructor - // VariableExpr credentialsProviderBuilderVarExpr = - // VariableExpr.withVariable( - // Variable.builder() - // .setName("coreCredentialsProvider") - // .setType(types.get("CredentialsProvider")) - // .build()); - // - // VariableExpr coreProjectIdProviderVarExpr = - // VariableExpr.withVariable( - // Variable.builder() - // .setName("coreProjectIdProvider") - // .setType(types.get("GcpProjectIdProvider")) - // .build()); VariableExpr propertiesVarExpr = VariableExpr.withVariable( @@ -227,11 +182,7 @@ private static MethodDefinition createConstructor( .setName("clientProperties") .setType(types.get(serviceName + "Properties")) .build()); - // Variable projectIdProviderVar = - // Variable.builder() - // .setName("projectIdProvider") - // .setType(types.get("GcpProjectIdProvider")) - // .build(); + Variable clientPropertiesVar = Variable.builder() .setName("clientProperties") @@ -253,147 +204,11 @@ private static MethodDefinition createConstructor( ExprStatement thisPropertiesAssignmentStatement = ExprStatement.withExpr(thisPropertiesAssignmentExpr); - // /** - // * if (properties.getCredentials().hasKey()) { this.credentialsProvider = new - // * DefaultCredentialsProvider(properties); } else { this.credentialsProvider = - // * coreCredentialsProvider; } - // */ - // - // // expr: properties.getCredentials().hasKey() - // - // MethodInvocationExpr getCredentialsExpr = - // MethodInvocationExpr.builder() - // .setMethodName("getCredentials") - // .setExprReferenceExpr(propertiesVarExpr) - // .setReturnType(types.get("Credentials")) - // .build(); - // MethodInvocationExpr hasKeyExpr = - // MethodInvocationExpr.builder() - // .setMethodName("hasKey") - // .setExprReferenceExpr(getCredentialsExpr) - // .setReturnType(TypeNode.BOOLEAN) - // .build(); - // - // // if body: this.credentialsProvider = new DefaultCredentialsProvider(properties) - // CastExpr castExpr = - // CastExpr.builder() - // .setExpr( - // NewObjectExpr.builder() - // .setType(types.get("DefaultCredentialsProvider")) - // .setArguments(propertiesVarExpr) - // .build()) - // .setType(types.get("CredentialsProvider")) - // .build(); - // Variable credentialsProviderVar = - // Variable.builder() - // .setName("credentialsProvider") - // .setType(types.get("CredentialsProvider")) - // .build(); - // AssignmentExpr credentialsProviderssignExpr = - // AssignmentExpr.builder() - // .setVariableExpr( - // VariableExpr.withVariable(credentialsProviderVar) - // .toBuilder() - // .setExprReferenceExpr(thisExpr) - // .build()) - // .setValueExpr(castExpr) - // .build(); - // - // // else body: this.credentialsProvider = coreCredentialsProvider; - // List coreCredentialsProviderAssignmentExprs = new ArrayList<>(); - // coreCredentialsProviderAssignmentExprs.add( - // AssignmentExpr.builder() - // .setVariableExpr( - // VariableExpr.withVariable(credentialsProviderVar) - // .toBuilder() - // .setExprReferenceExpr(thisExpr) - // .build()) - // .setValueExpr( - // CastExpr.builder() - // .setExpr(coreProjectIdProviderVarExpr) - // .setType(types.get("CredentialsProvider")) - // .build()) - // .build()); - // - // IfStatement credentialIfStatement = - // IfStatement.builder() - // .setConditionExpr(hasKeyExpr) - // .setBody(Arrays.asList(ExprStatement.withExpr(credentialsProviderssignExpr))) - // .setElseBody( - // coreCredentialsProviderAssignmentExprs.stream() - // .map(e -> ExprStatement.withExpr(e)) - // .collect(Collectors.toList())) - // .build(); - // - // /** - // * if (clientProperties.getProjectId() != null) { this.projectIdProvider = - // * clientProperties::getProjectId; } else { this.projectIdProvider = coreProjectIdProvider; } - // */ - // // else body: this.projectIdProvider = coreProjectIdProvider; - // List ctorAssignmentExprs = new ArrayList<>(); - // ctorAssignmentExprs.add( - // AssignmentExpr.builder() - // .setVariableExpr( - // VariableExpr.withVariable(projectIdProviderVar) - // .toBuilder() - // .setExprReferenceExpr(thisExpr) - // .build()) - // .setValueExpr(coreProjectIdProviderVarExpr) - // .build()); - // - // // expr: clientProperties.getProjectId() != null - // MethodInvocationExpr getProjectIdExpr = - // MethodInvocationExpr.builder() - // .setMethodName("getProjectId") - // .setExprReferenceExpr( - // VariableExpr.withVariable(clientPropertiesVar).toBuilder().build()) - // // .setStaticReferenceType(clientType) - // .setReturnType(types.get("CredentialsProvider")) // fake it - // .build(); - // RelationalOperationExpr notEqualSentence = - // RelationalOperationExpr.notEqualToWithExprs(getProjectIdExpr, - // ValueExpr.createNullExpr()); - // - // // () -> clientProperties.getProjectId(); - // LambdaExpr lambdaExpr = LambdaExpr.builder().setReturnExpr(getProjectIdExpr).build(); - // - // // this.projectIdProvider = () -> clientProperties.getProjectId(); - // AssignmentExpr projectIdProviderAssignExpr = - // AssignmentExpr.builder() - // .setVariableExpr( - // VariableExpr.withVariable(projectIdProviderVar) - // .toBuilder() - // .setExprReferenceExpr(thisExpr) - // .build()) - // .setValueExpr( - // CastExpr.builder() - // .setExpr(lambdaExpr) - // .setType(types.get("GcpProjectIdProvider")) - // .build()) - // .build(); - // - // IfStatement projectIdProviderIfStatement = - // IfStatement.builder() - // .setConditionExpr(notEqualSentence) - // .setBody(Arrays.asList(ExprStatement.withExpr(projectIdProviderAssignExpr))) - // .setElseBody( - // ctorAssignmentExprs.stream() - // .map(e -> ExprStatement.withExpr(e)) - // .collect(Collectors.toList())) - // .build(); - return MethodDefinition.constructorBuilder() .setScope(ScopeNode.PROTECTED) .setReturnType(types.get(className)) - .setArguments( - Arrays.asList( - // credentialsProviderBuilderVarExpr.toBuilder().setIsDecl(true).build(), - // coreProjectIdProviderVarExpr.toBuilder().setIsDecl(true).build(), - propertiesVarExpr.toBuilder().setIsDecl(true).build())) + .setArguments(Arrays.asList(propertiesVarExpr.toBuilder().setIsDecl(true).build())) .setBody(Arrays.asList(thisPropertiesAssignmentStatement)) - // credentialIfStatement, - // projectIdProviderIfStatement)) - // .setThrowsExceptions(Arrays.asList(TypeNode.withExceptionClazz(IOException.class))) .build(); } @@ -415,11 +230,8 @@ private static List createClassAnnotations( AnnotationNode conditionalOnClassNode = AnnotationNode.builder() .setType(STATIC_TYPES.get("ConditionalOnClass")) - .setDescription( - "value = " - + ClassNames.getServiceClientClassName(service) - + ".class") // TODO: change after annotation feature merged. need to produce - // XXX.class + // TODO: change after annotation feature merged. need to produce XXX.class + .setDescription("value = " + ClassNames.getServiceClientClassName(service) + ".class") .build(); AnnotationNode configurationNode = AnnotationNode.builder() @@ -657,8 +469,7 @@ private static MethodDefinition createClientBeanMethod( MethodInvocationExpr.builder() .setExprReferenceExpr(settingsBuilderExpr) .setMethodName("setHeaderProvider") - // .setArguments() //TODO add augument here to create new obj. Caveat: decide where to - // UserAgentHeaderProvider class first. + // .setArguments() //TODO: add augument here to create new obj from private class. .setReturnType(settingBuilderVariable.type()) .build(); AssignmentExpr settingCreateExpr = From d7bbe23bc06787383f269a65ba4ed8e505a80002 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Tue, 27 Sep 2022 21:23:50 +0000 Subject: [PATCH 05/11] fix mistakes made when rebasing to autoconfig-gen-draft2. --- .../composer/SpringAutoConfigClassComposer.java | 16 ++++++++++------ .../composer/SpringPropertiesClassComposer.java | 4 +--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java b/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java index a6df7f5ee3..40810fda49 100644 --- a/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java +++ b/src/main/java/com/google/api/generator/spring/composer/SpringAutoConfigClassComposer.java @@ -225,13 +225,19 @@ private static List createClassAnnotations( AnnotationNode conditionalOnPropertyNode = AnnotationNode.builder() .setType(STATIC_TYPES.get("ConditionalOnProperty")) - .setDescription("value = \"spring.cloud.gcp.language.enabled\", matchIfMissing = false") + .setDescription( + "value = \"" + + Utils.springPropertyPrefix(libName, service.name()) + + ".enabled\", matchIfMissing = false") .build(); AnnotationNode conditionalOnClassNode = AnnotationNode.builder() .setType(STATIC_TYPES.get("ConditionalOnClass")) - // TODO: change after annotation feature merged. need to produce XXX.class - .setDescription("value = " + ClassNames.getServiceClientClassName(service) + ".class") + .setDescription( + "value = " + + ClassNames.getServiceClientClassName(service) + + ".class") // TODO: change after annotation feature merged. need to produce + // XXX.class .build(); AnnotationNode configurationNode = AnnotationNode.builder() @@ -778,6 +784,7 @@ private static Map createDynamicTypes(Service service, String VaporReference.builder() .setName(service.name() + "SpringAutoConfig") .setPakkage(packageName) + .build()); TypeNode serviceClient = TypeNode.withReference( @@ -801,9 +808,6 @@ private static Map createDynamicTypes(Service service, String typeMap.put(service.name() + "Properties", clientProperties); typeMap.put(service.name() + "AutoConfig", clientAutoconfig); - typeMap.put("GcpProjectIdProvider", gcpProjectIdProvider); - typeMap.put("Credentials", credentials); - typeMap.put("DefaultCredentialsProvider", defaultCredentialsProvider); typeMap.put("ServiceClient", serviceClient); typeMap.put("ServiceSettings", serviceSettings); typeMap.put("ServiceSettingsBuilder", serviceSettingsBuilder); diff --git a/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java b/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java index 0273f7b293..66fd85b70f 100644 --- a/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java +++ b/src/main/java/com/google/api/generator/spring/composer/SpringPropertiesClassComposer.java @@ -78,9 +78,7 @@ public GapicClass generate(GapicContext context, Service service) { AnnotationNode classAnnotationNode = AnnotationNode.builder() .setType(STATIC_TYPES.get("ConfigurationProperties")) - .setDescription( - "google.cloud.spring.autoconfig." - + CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, service.name())) + .setDescription(Utils.springPropertyPrefix(Utils.getLibName(context), service.name())) .build(); ClassDefinition classDef = From 9776b6c6748fd11b5d71c2a80dc5df20f7fb85a0 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Tue, 27 Sep 2022 21:46:38 +0000 Subject: [PATCH 06/11] use spring-boot-starter 2.7.4 instead of 2.6.x. --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index 45a4851c30..e2e5f267dd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -81,7 +81,7 @@ load("@rules_jvm_external//:defs.bzl", "maven_install") SRING_MAVEN_ARTIFACTS = [ - "org.springframework.boot:spring-boot-starter:2.6.9", + "org.springframework.boot:spring-boot-starter:2.7.4", "com.google.cloud:spring-cloud-gcp-core:3.3.0", ] From f4586aecee7da991b8fe1a930c9c64b9cdd0226a Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Tue, 27 Sep 2022 22:04:39 +0000 Subject: [PATCH 07/11] also add spring dependencies to pom.xml --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 10f973578d..2c9a8e51fc 100644 --- a/pom.xml +++ b/pom.xml @@ -324,6 +324,18 @@ 4.13.2 + + + org.springframework.boot + spring-boot-starter + 2.7.4 + + + com.google.cloud + spring-cloud-gcp-core + 3.3.0 + +