Skip to content

Commit

Permalink
fix(metadata): gate metadata file-gen on a CLI flag (#684)
Browse files Browse the repository at this point in the history
  • Loading branch information
miraleung committed Mar 3, 2021
1 parent 0645de4 commit 738bf8a
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 13 deletions.
5 changes: 5 additions & 0 deletions rules_java_gapic/java_gapic.bzl
Expand Up @@ -158,11 +158,16 @@ def java_gapic_library(
raw_srcjar_name = srcjar_name + "_raw"
output_suffix = ".srcjar"

# Produces the GAPIC metadata file if this flag is set. to any value.
# Protoc invocation: --java_gapic_opt=metadata
plugin_args = ["metadata"]

_java_generator_name = "java_gapic"
proto_custom_library(
name = raw_srcjar_name,
deps = srcs,
plugin = Label("@gapic_generator_java//:protoc-gen-%s" % _java_generator_name),
plugin_args = plugin_args,
plugin_file_args = {},
opt_file_args = file_args_dict,
output_type = _java_generator_name,
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/com/google/api/generator/gapic/Generator.java
Expand Up @@ -30,8 +30,7 @@ public static CodeGeneratorResponse generateGapic(CodeGeneratorRequest request)
List<GapicClass> clazzes = Composer.composeServiceClasses(context);
GapicPackageInfo packageInfo = Composer.composePackageInfo(context);
String outputFilename = "temp-codegen.srcjar";
CodeGeneratorResponse response =
Writer.write(clazzes, packageInfo, context.gapicMetadata(), outputFilename);
CodeGeneratorResponse response = Writer.write(context, clazzes, packageInfo, outputFilename);
return response;
}
}
Expand Up @@ -44,6 +44,8 @@ public abstract class GapicContext {

public abstract ImmutableMap<String, ResourceName> helperResourceNames();

public abstract boolean gapicMetadataEnabled();

public GapicMetadata gapicMetadata() {
return gapicMetadata;
}
Expand Down Expand Up @@ -74,7 +76,9 @@ static GapicMetadata defaultGapicMetadata() {
public abstract Builder toBuilder();

public static Builder builder() {
return new AutoValue_GapicContext.Builder().setMixinServices(Collections.emptyList());
return new AutoValue_GapicContext.Builder()
.setMixinServices(Collections.emptyList())
.setGapicMetadataEnabled(false);
}

@AutoValue.Builder
Expand All @@ -100,6 +104,8 @@ public Builder setHelperResourceNames(Set<ResourceName> helperResourceNames) {

public abstract Builder setServiceYamlProto(com.google.api.Service serviceYamlProto);

public abstract Builder setGapicMetadataEnabled(boolean gapicMetadataEnabled);

public abstract GapicContext build();
}
}
Expand Up @@ -104,6 +104,8 @@ public static GapicContext parse(CodeGeneratorRequest request) {
Optional<GapicLanguageSettings> languageSettingsOpt =
GapicLanguageSettingsParser.parse(gapicYamlConfigPathOpt);

boolean willGenerateMetadata = PluginArgumentParser.hasMetadataFlag(request);

Optional<String> serviceConfigPathOpt = PluginArgumentParser.parseJsonConfigPath(request);
String serviceConfigPath = serviceConfigPathOpt.isPresent() ? serviceConfigPathOpt.get() : null;
Optional<GapicServiceConfig> serviceConfigOpt = ServiceConfigParser.parse(serviceConfigPath);
Expand Down Expand Up @@ -179,6 +181,7 @@ public static GapicContext parse(CodeGeneratorRequest request) {
.setResourceNames(resourceNames)
.setHelperResourceNames(outputArgResourceNames)
.setServiceConfig(serviceConfigOpt.isPresent() ? serviceConfigOpt.get() : null)
.setGapicMetadataEnabled(willGenerateMetadata)
.setServiceYamlProto(serviceYamlProtoOpt.isPresent() ? serviceYamlProtoOpt.get() : null)
.build();
}
Expand Down
Expand Up @@ -17,6 +17,7 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest;
import java.util.Arrays;
import java.util.Optional;

// Parses the arguments from the protoc plugin.
Expand All @@ -27,6 +28,7 @@ public class PluginArgumentParser {
// Synced to rules_java_gapic/java_gapic.bzl.
@VisibleForTesting static final String KEY_GRPC_SERVICE_CONFIG = "grpc-service-config";
@VisibleForTesting static final String KEY_GAPIC_CONFIG = "gapic-config";
@VisibleForTesting static final String KEY_METADATA = "metadata";
@VisibleForTesting static final String KEY_SERVICE_YAML_CONFIG = "api-service-config";

private static final String JSON_FILE_ENDING = "grpc_service_config.json";
Expand All @@ -45,6 +47,10 @@ static Optional<String> parseServiceYamlConfigPath(CodeGeneratorRequest request)
return parseServiceYamlConfigPath(request.getParameter());
}

static boolean hasMetadataFlag(CodeGeneratorRequest request) {
return hasMetadataFlag(request.getParameter());
}

/** Expects a comma-separated list of file paths. */
@VisibleForTesting
static Optional<String> parseJsonConfigPath(String pluginProtocArgument) {
Expand All @@ -61,6 +67,11 @@ static Optional<String> parseServiceYamlConfigPath(String pluginProtocArgument)
return parseArgument(pluginProtocArgument, KEY_SERVICE_YAML_CONFIG, SERVICE_YAML_FILE_ENDING);
}

@VisibleForTesting
static boolean hasMetadataFlag(String pluginProtocArgument) {
return Arrays.stream(pluginProtocArgument.split(COMMA)).anyMatch(s -> s.equals(KEY_METADATA));
}

private static Optional<String> parseArgument(
String pluginProtocArgument, String key, String fileEnding) {
if (Strings.isNullOrEmpty(pluginProtocArgument)) {
Expand Down
Expand Up @@ -18,8 +18,8 @@
import com.google.api.generator.engine.ast.PackageInfoDefinition;
import com.google.api.generator.engine.writer.JavaWriterVisitor;
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.GapicPackageInfo;
import com.google.gapic.metadata.GapicMetadata;
import com.google.protobuf.ByteString;
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse;
import com.google.protobuf.util.JsonFormat;
Expand All @@ -36,9 +36,9 @@ public GapicWriterException(String errorMessage) {
}

public static CodeGeneratorResponse write(
GapicContext context,
List<GapicClass> clazzes,
GapicPackageInfo gapicPackageInfo,
GapicMetadata gapicMetadata,
String outputFilePath) {
ByteString.Output output = ByteString.newOutput();
JavaWriterVisitor codeWriter = new JavaWriterVisitor();
Expand Down Expand Up @@ -85,13 +85,15 @@ public static CodeGeneratorResponse write(
throw new GapicWriterException("Could not write code for package-info.java");
}

// Write the mdatadata file.
jarEntry = new JarEntry(String.format("%s/gapic_metadata.json", path));
try {
jos.putNextEntry(jarEntry);
jos.write(JsonFormat.printer().print(gapicMetadata).getBytes());
} catch (IOException e) {
throw new GapicWriterException("Could not write gapic_metadata.json");
if (context.gapicMetadataEnabled()) {
// Write the mdatadata file.
jarEntry = new JarEntry(String.format("%s/gapic_metadata.json", path));
try {
jos.putNextEntry(jarEntry);
jos.write(JsonFormat.printer().print(context.gapicMetadata()).getBytes());
} catch (IOException e) {
throw new GapicWriterException("Could not write gapic_metadata.json");
}
}

try {
Expand Down
Expand Up @@ -16,12 +16,12 @@

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;

import java.util.Arrays;
import org.junit.Test;

public class PluginArgumentParserTest {

@Test
public void parseJsonPath_onlyOnePresent() {
String jsonPath = "/tmp/grpc_service_config.json";
Expand Down Expand Up @@ -225,6 +225,29 @@ public void parseServiceYamlPath_noneFound() {
assertFalse(PluginArgumentParser.parseServiceYamlConfigPath(rawArgument).isPresent());
}

@Test
public void parseMetadataFlag_noneFound() {
String jsonPath = "/tmp/foo_grpc_service_config.json";
String gapicPath = "";
String rawArgument =
String.join(",", Arrays.asList(createGrpcServiceConfig(jsonPath), gapicPath));
assertFalse(PluginArgumentParser.hasMetadataFlag(rawArgument));

// Wrong casing.
rawArgument =
String.join(",", Arrays.asList("Metadata", createGrpcServiceConfig(jsonPath), gapicPath));
assertFalse(PluginArgumentParser.hasMetadataFlag(rawArgument));
}

@Test
public void parseMetadataFlag_flagFound() {
String jsonPath = "/tmp/foo_grpc_service_config.json";
String gapicPath = "";
String rawArgument =
String.join(",", Arrays.asList("metadata", createGrpcServiceConfig(jsonPath), gapicPath));
assertTrue(PluginArgumentParser.hasMetadataFlag(rawArgument));
}

private static String createGrpcServiceConfig(String path) {
return String.format("%s=%s", PluginArgumentParser.KEY_GRPC_SERVICE_CONFIG, path);
}
Expand Down

0 comments on commit 738bf8a

Please sign in to comment.