Skip to content

Commit

Permalink
[ggj][codegen] feat: Add alpha/beta API detection and fix per-class a…
Browse files Browse the repository at this point in the history
…nnotation (#633)

* fix: fix dep ordering in Bazel dedupe rules

* feat: Add alpha/beta API detection and fix per-class annotations

* fix: update integration tests
  • Loading branch information
miraleung authored Jan 8, 2021
1 parent 2085654 commit c5a32cc
Show file tree
Hide file tree
Showing 57 changed files with 404 additions and 265 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package com.google.api.generator.gapic.composer;

import com.google.api.core.BetaApi;
import com.google.api.gax.grpc.GrpcCallSettings;
import com.google.api.gax.grpc.GrpcCallableFactory;
import com.google.api.gax.grpc.GrpcStubCallableFactory;
Expand All @@ -40,6 +41,7 @@
import com.google.api.generator.gapic.composer.comment.StubCommentComposer;
import com.google.api.generator.gapic.composer.store.TypeStore;
import com.google.api.generator.gapic.composer.utils.ClassNames;
import com.google.api.generator.gapic.composer.utils.PackageChecker;
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicClass.Kind;
import com.google.api.generator.gapic.model.Message;
Expand Down Expand Up @@ -77,7 +79,7 @@ public GapicClass generate(Service service, Map<String, Message> ignore) {
.setHeaderCommentStatements(
StubCommentComposer.createGrpcServiceCallableFactoryClassHeaderComments(
service.name()))
.setAnnotations(createClassAnnotations(typeStore))
.setAnnotations(createClassAnnotations(service.pakkage(), typeStore))
.setImplementsTypes(createClassImplements(typeStore))
.setName(className)
.setMethods(createClassMethods(typeStore))
Expand All @@ -86,12 +88,17 @@ public GapicClass generate(Service service, Map<String, Message> ignore) {
return GapicClass.create(kind, classDef);
}

private static List<AnnotationNode> createClassAnnotations(TypeStore typeStore) {
return Arrays.asList(
private static List<AnnotationNode> createClassAnnotations(String pakkage, TypeStore typeStore) {
List<AnnotationNode> annotations = new ArrayList<>();
if (!PackageChecker.isGaApi(pakkage)) {
annotations.add(AnnotationNode.withType(typeStore.get("BetaApi")));
}
annotations.add(
AnnotationNode.builder()
.setType(typeStore.get("Generated"))
.setDescription("by gapic-generator")
.setDescription("by gapic-generator-java")
.build());
return annotations;
}

private static List<TypeNode> createClassImplements(TypeStore typeStore) {
Expand Down Expand Up @@ -343,6 +350,7 @@ private static TypeStore createTypes(Service service) {
Arrays.asList(
// Gax-java classes.
BatchingCallSettings.class,
BetaApi.class,
BidiStreamingCallable.class,
ClientContext.class,
ClientStreamingCallable.class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package com.google.api.generator.gapic.composer;

import com.google.api.core.BetaApi;
import com.google.api.gax.core.BackgroundResource;
import com.google.api.gax.core.BackgroundResourceAggregation;
import com.google.api.gax.grpc.GrpcCallSettings;
Expand Down Expand Up @@ -51,6 +52,7 @@
import com.google.api.generator.gapic.composer.comment.StubCommentComposer;
import com.google.api.generator.gapic.composer.store.TypeStore;
import com.google.api.generator.gapic.composer.utils.ClassNames;
import com.google.api.generator.gapic.composer.utils.PackageChecker;
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicClass.Kind;
import com.google.api.generator.gapic.model.Message;
Expand Down Expand Up @@ -161,7 +163,7 @@ public GapicClass generate(Service service, Map<String, Message> ignore) {
.setPackageString(pakkage)
.setHeaderCommentStatements(
StubCommentComposer.createGrpcServiceStubClassHeaderComments(service.name()))
.setAnnotations(createClassAnnotations())
.setAnnotations(createClassAnnotations(service.pakkage()))
.setScope(ScopeNode.PUBLIC)
.setName(className)
.setExtendsType(typeStore.get(ClassNames.getServiceStubClassName(service)))
Expand Down Expand Up @@ -385,12 +387,17 @@ private static Map<String, VariableExpr> createCallableClassMembers(
return callableClassMembers;
}

private static List<AnnotationNode> createClassAnnotations() {
return Arrays.asList(
private static List<AnnotationNode> createClassAnnotations(String pakkage) {
List<AnnotationNode> annotations = new ArrayList<>();
if (!PackageChecker.isGaApi(pakkage)) {
annotations.add(AnnotationNode.withType(FIXED_TYPESTORE.get("BetaApi")));
}
annotations.add(
AnnotationNode.builder()
.setType(FIXED_TYPESTORE.get("Generated"))
.setDescription("by gapic-generator-java")
.build());
return annotations;
}

private static List<MethodDefinition> createClassMethods(
Expand Down Expand Up @@ -1024,6 +1031,7 @@ private static TypeStore createStaticTypes() {
Arrays.asList(
BackgroundResource.class,
BackgroundResourceAggregation.class,
BetaApi.class,
BidiStreamingCallable.class,
ClientContext.class,
ClientStreamingCallable.class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import com.google.api.generator.gapic.composer.samplecode.ServiceClientSampleCodeComposer;
import com.google.api.generator.gapic.composer.store.TypeStore;
import com.google.api.generator.gapic.composer.utils.ClassNames;
import com.google.api.generator.gapic.composer.utils.PackageChecker;
import com.google.api.generator.gapic.model.Field;
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicClass.Kind;
Expand Down Expand Up @@ -128,7 +129,7 @@ public GapicClass generate(Service service, Map<String, Message> messageTypes) {
ClassDefinition.builder()
.setHeaderCommentStatements(createClassHeaderComments(service, typeStore))
.setPackageString(pakkage)
.setAnnotations(createClassAnnotations(typeStore))
.setAnnotations(createClassAnnotations(pakkage, typeStore))
.setScope(ScopeNode.PUBLIC)
.setName(className)
.setImplementsTypes(createClassImplements(typeStore))
Expand All @@ -139,13 +140,17 @@ public GapicClass generate(Service service, Map<String, Message> messageTypes) {
return GapicClass.create(kind, classDef);
}

private static List<AnnotationNode> createClassAnnotations(TypeStore typeStore) {
return Arrays.asList(
AnnotationNode.withType(typeStore.get("BetaApi")),
private static List<AnnotationNode> createClassAnnotations(String pakkage, TypeStore typeStore) {
List<AnnotationNode> annotations = new ArrayList<>();
if (!PackageChecker.isGaApi(pakkage)) {
annotations.add(AnnotationNode.withType(typeStore.get("BetaApi")));
}
annotations.add(
AnnotationNode.builder()
.setType(typeStore.get("Generated"))
.setDescription("by gapic-generator")
.setDescription("by gapic-generator-java")
.build());
return annotations;
}

private static List<TypeNode> createClassImplements(TypeStore typeStore) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
import com.google.api.generator.gapic.composer.samplecode.SettingsSampleCodeComposer;
import com.google.api.generator.gapic.composer.store.TypeStore;
import com.google.api.generator.gapic.composer.utils.ClassNames;
import com.google.api.generator.gapic.composer.utils.PackageChecker;
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicClass.Kind;
import com.google.api.generator.gapic.model.Message;
Expand Down Expand Up @@ -104,7 +105,7 @@ public GapicClass generate(Service service, Map<String, Message> ignore) {
.setPackageString(pakkage)
.setHeaderCommentStatements(
createClassHeaderComments(service, typeStore.get(className)))
.setAnnotations(createClassAnnotations())
.setAnnotations(createClassAnnotations(service.pakkage()))
.setScope(ScopeNode.PUBLIC)
.setName(className)
.setExtendsType(
Expand Down Expand Up @@ -147,12 +148,17 @@ private static List<CommentStatement> createClassHeaderComments(
classType);
}

private static List<AnnotationNode> createClassAnnotations() {
return Arrays.asList(
private static List<AnnotationNode> createClassAnnotations(String pakkage) {
List<AnnotationNode> annotations = new ArrayList<>();
if (!PackageChecker.isGaApi(pakkage)) {
annotations.add(AnnotationNode.withType(FIXED_TYPESTORE.get("BetaApi")));
}
annotations.add(
AnnotationNode.builder()
.setType(FIXED_TYPESTORE.get("Generated"))
.setDescription("by gapic-generator-java")
.build());
return annotations;
}

private static List<MethodDefinition> createClassMethods(Service service, TypeStore typeStore) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package com.google.api.generator.gapic.composer;

import com.google.api.core.BetaApi;
import com.google.api.gax.core.BackgroundResource;
import com.google.api.gax.rpc.BidiStreamingCallable;
import com.google.api.gax.rpc.ClientStreamingCallable;
Expand All @@ -32,6 +33,7 @@
import com.google.api.generator.gapic.composer.comment.StubCommentComposer;
import com.google.api.generator.gapic.composer.store.TypeStore;
import com.google.api.generator.gapic.composer.utils.ClassNames;
import com.google.api.generator.gapic.composer.utils.PackageChecker;
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicClass.Kind;
import com.google.api.generator.gapic.model.Message;
Expand Down Expand Up @@ -69,7 +71,7 @@ public GapicClass generate(Service service, Map<String, Message> messageTypes) {
.setPackageString(pakkage)
.setHeaderCommentStatements(
StubCommentComposer.createServiceStubClassHeaderComments(service.name()))
.setAnnotations(createClassAnnotations(typeStore))
.setAnnotations(createClassAnnotations(service.pakkage(), typeStore))
.setIsAbstract(true)
.setImplementsTypes(createClassImplements(typeStore))
.setName(className)
Expand All @@ -79,12 +81,17 @@ public GapicClass generate(Service service, Map<String, Message> messageTypes) {
return GapicClass.create(kind, classDef);
}

private static List<AnnotationNode> createClassAnnotations(TypeStore typeStore) {
return Arrays.asList(
private static List<AnnotationNode> createClassAnnotations(String pakkage, TypeStore typeStore) {
List<AnnotationNode> annotations = new ArrayList<>();
if (!PackageChecker.isGaApi(pakkage)) {
annotations.add(AnnotationNode.withType(typeStore.get("BetaApi")));
}
annotations.add(
AnnotationNode.builder()
.setType(typeStore.get("Generated"))
.setDescription("by gapic-generator")
.setDescription("by gapic-generator-java")
.build());
return annotations;
}

private static List<TypeNode> createClassImplements(TypeStore typeStore) {
Expand Down Expand Up @@ -215,6 +222,7 @@ private static TypeStore createTypes(Service service, Map<String, Message> messa
List<Class> concreteClazzes =
Arrays.asList(
BackgroundResource.class,
BetaApi.class,
BidiStreamingCallable.class,
ClientStreamingCallable.class,
Generated.class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
import com.google.api.generator.gapic.composer.samplecode.SettingsSampleCodeComposer;
import com.google.api.generator.gapic.composer.store.TypeStore;
import com.google.api.generator.gapic.composer.utils.ClassNames;
import com.google.api.generator.gapic.composer.utils.PackageChecker;
import com.google.api.generator.gapic.model.Field;
import com.google.api.generator.gapic.model.GapicBatchingSettings;
import com.google.api.generator.gapic.model.GapicClass;
Expand Down Expand Up @@ -175,7 +176,7 @@ public GapicClass generate(
.setPackageString(pakkage)
.setHeaderCommentStatements(
createClassHeaderComments(service, typeStore.get(className)))
.setAnnotations(createClassAnnotations())
.setAnnotations(createClassAnnotations(service.pakkage()))
.setScope(ScopeNode.PUBLIC)
.setName(className)
.setExtendsType(createExtendsType(service, typeStore))
Expand All @@ -189,13 +190,17 @@ public GapicClass generate(
return GapicClass.create(GapicClass.Kind.STUB, classDef);
}

private static List<AnnotationNode> createClassAnnotations() {
return Arrays.asList(
AnnotationNode.withType(FIXED_TYPESTORE.get("BetaApi")),
private static List<AnnotationNode> createClassAnnotations(String pakkage) {
List<AnnotationNode> annotations = new ArrayList<>();
if (!PackageChecker.isGaApi(pakkage)) {
annotations.add(AnnotationNode.withType(FIXED_TYPESTORE.get("BetaApi")));
}
annotations.add(
AnnotationNode.builder()
.setType(FIXED_TYPESTORE.get("Generated"))
.setDescription("by gapic-generator-java")
.build());
return annotations;
}

private static List<CommentStatement> createClassHeaderComments(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ java_library(
],
deps = [
"//src/main/java/com/google/api/generator/gapic/model",
"@com_google_guava_guava//jar",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.api.generator.gapic.composer.utils;

import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PackageChecker {
private PackageChecker() {}

/**
* Identifies whether a Java package is GA API. Assumes that the version appears in the last
* component of the package, e.g. com.google.cloud.dataproc.v1beta1.
*/
public static boolean isGaApi(String pakkage) {
String[] packageComponents = pakkage.split("\\.");
Preconditions.checkState(
packageComponents.length > 0, "No subcomponents found in Java package %s", pakkage);
String versionComponent = packageComponents[packageComponents.length - 1];
Matcher matcher = Pattern.compile("^v[0-9]+").matcher(versionComponent);
Preconditions.checkState(
matcher.find(),
"No version component found in last subpackage %s of %s",
versionComponent,
pakkage);
String versionSubstr = versionComponent.replace(matcher.group(), "");
return Strings.isNullOrEmpty(versionSubstr)
|| (!versionSubstr.contains("alpha") && !versionSubstr.contains("beta"));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
load("@rules_java//java:defs.bzl", "java_library")

package(default_visibility = ["//visibility:public"])

filegroup(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ import javax.annotation.Generated;
* <p>Please refer to the GitHub repository's samples for more quickstart code snippets.
*/
@BetaApi
@Generated("by gapic-generator")
@Generated("by gapic-generator-java")
public class EchoClient implements BackgroundResource {
private final EchoSettings settings;
private final EchoStub stub;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import javax.annotation.Generated;
* EchoSettings echoSettings = echoSettingsBuilder.build();
* }</pre>
*/
@BetaApi
@Generated("by gapic-generator-java")
public class EchoSettings extends ClientSettings<EchoSettings> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.google.showcase.v1beta1.stub;
import static com.google.showcase.v1beta1.EchoClient.PagedExpandPagedResponse;
import static com.google.showcase.v1beta1.EchoClient.SimplePagedExpandPagedResponse;

import com.google.api.core.BetaApi;
import com.google.api.gax.core.BackgroundResource;
import com.google.api.gax.rpc.BidiStreamingCallable;
import com.google.api.gax.rpc.ClientStreamingCallable;
Expand All @@ -29,7 +30,8 @@ import javax.annotation.Generated;
*
* <p>This class is for advanced usage and reflects the underlying API directly.
*/
@Generated("by gapic-generator")
@BetaApi
@Generated("by gapic-generator-java")
public abstract class EchoStub implements BackgroundResource {

public OperationsStub getOperationsStub() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.google.showcase.v1beta1.stub;

import com.google.api.core.BetaApi;
import com.google.api.gax.grpc.GrpcCallSettings;
import com.google.api.gax.grpc.GrpcCallableFactory;
import com.google.api.gax.grpc.GrpcStubCallableFactory;
Expand All @@ -25,7 +26,8 @@ import javax.annotation.Generated;
*
* <p>This class is for advanced usage.
*/
@Generated("by gapic-generator")
@BetaApi
@Generated("by gapic-generator-java")
public class GrpcEchoCallableFactory implements GrpcStubCallableFactory {

@Override
Expand Down
Loading

0 comments on commit c5a32cc

Please sign in to comment.