Skip to content

Commit 6882e97

Browse files
committed
fix(metadata): gate metadata file-gen on a CLI flag
1 parent ce064cb commit 6882e97

7 files changed

Lines changed: 62 additions & 13 deletions

File tree

rules_java_gapic/java_gapic.bzl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,16 @@ def java_gapic_library(
158158
raw_srcjar_name = srcjar_name + "_raw"
159159
output_suffix = ".srcjar"
160160

161+
# Produces the GAPIC metadata file if this flag is set. to any value.
162+
# Protoc invocation: --java_gapic_opt=metadata
163+
plugin_args = ["metadata"]
164+
161165
_java_generator_name = "java_gapic"
162166
proto_custom_library(
163167
name = raw_srcjar_name,
164168
deps = srcs,
165169
plugin = Label("@gapic_generator_java//:protoc-gen-%s" % _java_generator_name),
170+
plugin_args = plugin_args,
166171
plugin_file_args = {},
167172
opt_file_args = file_args_dict,
168173
output_type = _java_generator_name,

src/main/java/com/google/api/generator/gapic/Generator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ public static CodeGeneratorResponse generateGapic(CodeGeneratorRequest request)
3030
List<GapicClass> clazzes = Composer.composeServiceClasses(context);
3131
GapicPackageInfo packageInfo = Composer.composePackageInfo(context);
3232
String outputFilename = "temp-codegen.srcjar";
33-
CodeGeneratorResponse response =
34-
Writer.write(clazzes, packageInfo, context.gapicMetadata(), outputFilename);
33+
CodeGeneratorResponse response = Writer.write(context, clazzes, packageInfo, outputFilename);
3534
return response;
3635
}
3736
}

src/main/java/com/google/api/generator/gapic/model/GapicContext.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public abstract class GapicContext {
4444

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

47+
public abstract boolean gapicMetadataEnabled();
48+
4749
public GapicMetadata gapicMetadata() {
4850
return gapicMetadata;
4951
}
@@ -74,7 +76,9 @@ static GapicMetadata defaultGapicMetadata() {
7476
public abstract Builder toBuilder();
7577

7678
public static Builder builder() {
77-
return new AutoValue_GapicContext.Builder().setMixinServices(Collections.emptyList());
79+
return new AutoValue_GapicContext.Builder()
80+
.setMixinServices(Collections.emptyList())
81+
.setGapicMetadataEnabled(false);
7882
}
7983

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

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

107+
public abstract Builder setGapicMetadataEnabled(boolean gapicMetadataEnabled);
108+
103109
public abstract GapicContext build();
104110
}
105111
}

src/main/java/com/google/api/generator/gapic/protoparser/Parser.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ public static GapicContext parse(CodeGeneratorRequest request) {
104104
Optional<GapicLanguageSettings> languageSettingsOpt =
105105
GapicLanguageSettingsParser.parse(gapicYamlConfigPathOpt);
106106

107+
boolean willGenerateMetadata = PluginArgumentParser.hasMetadataFlag(request);
108+
107109
Optional<String> serviceConfigPathOpt = PluginArgumentParser.parseJsonConfigPath(request);
108110
String serviceConfigPath = serviceConfigPathOpt.isPresent() ? serviceConfigPathOpt.get() : null;
109111
Optional<GapicServiceConfig> serviceConfigOpt = ServiceConfigParser.parse(serviceConfigPath);
@@ -179,6 +181,7 @@ public static GapicContext parse(CodeGeneratorRequest request) {
179181
.setResourceNames(resourceNames)
180182
.setHelperResourceNames(outputArgResourceNames)
181183
.setServiceConfig(serviceConfigOpt.isPresent() ? serviceConfigOpt.get() : null)
184+
.setGapicMetadataEnabled(willGenerateMetadata)
182185
.setServiceYamlProto(serviceYamlProtoOpt.isPresent() ? serviceYamlProtoOpt.get() : null)
183186
.build();
184187
}

src/main/java/com/google/api/generator/gapic/protoparser/PluginArgumentParser.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.google.common.annotations.VisibleForTesting;
1818
import com.google.common.base.Strings;
1919
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest;
20+
import java.util.Arrays;
2021
import java.util.Optional;
2122

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

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

50+
static boolean hasMetadataFlag(CodeGeneratorRequest request) {
51+
return hasMetadataFlag(request.getParameter());
52+
}
53+
4854
/** Expects a comma-separated list of file paths. */
4955
@VisibleForTesting
5056
static Optional<String> parseJsonConfigPath(String pluginProtocArgument) {
@@ -61,6 +67,11 @@ static Optional<String> parseServiceYamlConfigPath(String pluginProtocArgument)
6167
return parseArgument(pluginProtocArgument, KEY_SERVICE_YAML_CONFIG, SERVICE_YAML_FILE_ENDING);
6268
}
6369

70+
@VisibleForTesting
71+
static boolean hasMetadataFlag(String pluginProtocArgument) {
72+
return Arrays.stream(pluginProtocArgument.split(COMMA)).anyMatch(s -> s.equals(KEY_METADATA));
73+
}
74+
6475
private static Optional<String> parseArgument(
6576
String pluginProtocArgument, String key, String fileEnding) {
6677
if (Strings.isNullOrEmpty(pluginProtocArgument)) {

src/main/java/com/google/api/generator/gapic/protowriter/Writer.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
import com.google.api.generator.engine.ast.PackageInfoDefinition;
1919
import com.google.api.generator.engine.writer.JavaWriterVisitor;
2020
import com.google.api.generator.gapic.model.GapicClass;
21+
import com.google.api.generator.gapic.model.GapicContext;
2122
import com.google.api.generator.gapic.model.GapicPackageInfo;
22-
import com.google.gapic.metadata.GapicMetadata;
2323
import com.google.protobuf.ByteString;
2424
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse;
2525
import com.google.protobuf.util.JsonFormat;
@@ -36,9 +36,9 @@ public GapicWriterException(String errorMessage) {
3636
}
3737

3838
public static CodeGeneratorResponse write(
39+
GapicContext context,
3940
List<GapicClass> clazzes,
4041
GapicPackageInfo gapicPackageInfo,
41-
GapicMetadata gapicMetadata,
4242
String outputFilePath) {
4343
ByteString.Output output = ByteString.newOutput();
4444
JavaWriterVisitor codeWriter = new JavaWriterVisitor();
@@ -85,13 +85,15 @@ public static CodeGeneratorResponse write(
8585
throw new GapicWriterException("Could not write code for package-info.java");
8686
}
8787

88-
// Write the mdatadata file.
89-
jarEntry = new JarEntry(String.format("%s/gapic_metadata.json", path));
90-
try {
91-
jos.putNextEntry(jarEntry);
92-
jos.write(JsonFormat.printer().print(gapicMetadata).getBytes());
93-
} catch (IOException e) {
94-
throw new GapicWriterException("Could not write gapic_metadata.json");
88+
if (context.gapicMetadataEnabled()) {
89+
// Write the mdatadata file.
90+
jarEntry = new JarEntry(String.format("%s/gapic_metadata.json", path));
91+
try {
92+
jos.putNextEntry(jarEntry);
93+
jos.write(JsonFormat.printer().print(context.gapicMetadata()).getBytes());
94+
} catch (IOException e) {
95+
throw new GapicWriterException("Could not write gapic_metadata.json");
96+
}
9597
}
9698

9799
try {

src/test/java/com/google/api/generator/gapic/protoparser/PluginArgumentParserTest.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616

1717
import static junit.framework.Assert.assertEquals;
1818
import static junit.framework.Assert.assertFalse;
19+
import static junit.framework.Assert.assertTrue;
1920

2021
import java.util.Arrays;
2122
import org.junit.Test;
2223

2324
public class PluginArgumentParserTest {
24-
2525
@Test
2626
public void parseJsonPath_onlyOnePresent() {
2727
String jsonPath = "/tmp/grpc_service_config.json";
@@ -225,6 +225,29 @@ public void parseServiceYamlPath_noneFound() {
225225
assertFalse(PluginArgumentParser.parseServiceYamlConfigPath(rawArgument).isPresent());
226226
}
227227

228+
@Test
229+
public void parseMetadataFlag_noneFound() {
230+
String jsonPath = "/tmp/foo_grpc_service_config.json";
231+
String gapicPath = "";
232+
String rawArgument =
233+
String.join(",", Arrays.asList(createGrpcServiceConfig(jsonPath), gapicPath));
234+
assertFalse(PluginArgumentParser.hasMetadataFlag(rawArgument));
235+
236+
// Wrong casing.
237+
rawArgument =
238+
String.join(",", Arrays.asList("Metadata", createGrpcServiceConfig(jsonPath), gapicPath));
239+
assertFalse(PluginArgumentParser.hasMetadataFlag(rawArgument));
240+
}
241+
242+
@Test
243+
public void parseMetadataFlag_flagFound() {
244+
String jsonPath = "/tmp/foo_grpc_service_config.json";
245+
String gapicPath = "";
246+
String rawArgument =
247+
String.join(",", Arrays.asList("metadata", createGrpcServiceConfig(jsonPath), gapicPath));
248+
assertTrue(PluginArgumentParser.hasMetadataFlag(rawArgument));
249+
}
250+
228251
private static String createGrpcServiceConfig(String path) {
229252
return String.format("%s=%s", PluginArgumentParser.KEY_GRPC_SERVICE_CONFIG, path);
230253
}

0 commit comments

Comments
 (0)