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
5 changes: 5 additions & 0 deletions rules_java_gapic/java_gapic.bzl
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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;
}
}
Original file line number Diff line number Diff line change
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();
}
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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