diff --git a/BUILD.bazel b/BUILD.bazel index e8e17887a3..ec0ea39f63 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -115,6 +115,12 @@ java_binary( runtime_deps = [":gapic_generator_java"] + MAIN_DEPS, ) +java_binary( + name = "protoc-gen-java_gapic_spring", + main_class = "com.google.api.generator.spring.Main", + runtime_deps = [":gapic_generator_java"] + MAIN_DEPS, +) + # Request dumper binary, which dumps the CodeGeneratorRequest to a file on disk # which will be identical to the one passed to the protoc-gen-java_gapic during # normal execution. The dumped file then can be used to run this gapic-generator diff --git a/rules_java_gapic/java_gapic.bzl b/rules_java_gapic/java_gapic.bzl index e5d70b978f..8f2d620739 100644 --- a/rules_java_gapic/java_gapic.bzl +++ b/rules_java_gapic/java_gapic.bzl @@ -22,7 +22,6 @@ def _java_gapic_postprocess_srcjar_impl(ctx): output_main = ctx.outputs.main output_test = ctx.outputs.test output_samples = ctx.outputs.samples - output_spring = ctx.outputs.spring output_resource_name = ctx.outputs.resource_name formatter = ctx.executable.formatter @@ -66,21 +65,10 @@ def _java_gapic_postprocess_srcjar_impl(ctx): cd $WORKING_DIR - unzip -q temp-codegen-spring.srcjar -d {output_dir_path}/spring - # This may fail if there are spaces and/or too many files (exceed max length of command length). - {formatter} --replace $(find {output_dir_path}/spring -type f -printf "%p ") - - # Spring source files. - cd {output_dir_path}/spring - zip -r $WORKING_DIR/{output_srcjar_name}-spring.srcjar ./ - - cd $WORKING_DIR - mv {output_srcjar_name}.srcjar {output_main} mv {output_srcjar_name}-resource-name.srcjar {output_resource_name} mv {output_srcjar_name}-tests.srcjar {output_test} mv {output_srcjar_name}-samples.srcjar {output_samples} - mv {output_srcjar_name}-spring.srcjar {output_spring} """.format( gapic_srcjar = gapic_srcjar.path, output_srcjar_name = output_srcjar_name, @@ -91,14 +79,13 @@ def _java_gapic_postprocess_srcjar_impl(ctx): output_resource_name = output_resource_name.path, output_test = output_test.path, output_samples = output_samples.path, - output_spring = output_spring.path, ) ctx.actions.run_shell( inputs = [gapic_srcjar], tools = [formatter], command = script, - outputs = [output_main, output_resource_name, output_test, output_samples, output_spring], + outputs = [output_main, output_resource_name, output_test, output_samples], ) _java_gapic_postprocess_srcjar = rule( @@ -115,7 +102,6 @@ _java_gapic_postprocess_srcjar = rule( "resource_name": "%{name}-resource-name.srcjar", "test": "%{name}-test.srcjar", "samples": "%{name}-samples.srcjar", - "spring": "%{name}-spring.srcjar", }, implementation = _java_gapic_postprocess_srcjar_impl, ) @@ -175,62 +161,6 @@ _java_gapic_samples_srcjar = rule( implementation = _java_gapic_samples_srcjar_impl, ) - -def _java_gapic_spring_srcjar_impl(ctx): - gapic_srcjar = ctx.file.gapic_srcjar - output_srcjar_name = ctx.label.name - output_spring = ctx.outputs.spring - formatter = ctx.executable.formatter - - output_dir_name = ctx.label.name - output_dir_path = "%s/%s" % (output_spring.dirname, output_dir_name) - - script = """ - unzip -q {gapic_srcjar} - # Sync'd to the output file name in Writer.java. - unzip -q temp-codegen-spring.srcjar -d {output_dir_path} - # This may fail if there are spaces and/or too many files (exceed max length of command length). - {formatter} --replace $(find {output_dir_path}/spring -type f -printf "%p ") - WORKING_DIR=`pwd` - - # Spring source files. - cd $WORKING_DIR/{output_dir_path} - zip -r $WORKING_DIR/{output_srcjar_name}-spring.srcjar ./ - - cd $WORKING_DIR - - mv {output_srcjar_name}-spring.srcjar {output_spring} - """.format( - gapic_srcjar = gapic_srcjar.path, - output_srcjar_name = output_srcjar_name, - formatter = formatter, - output_dir_name = output_dir_name, - output_dir_path = output_dir_path, - output_spring = output_spring.path, - ) - - ctx.actions.run_shell( - inputs = [gapic_srcjar], - tools = [formatter], - command = script, - outputs = [output_spring], - ) - -_java_gapic_spring_srcjar = rule( - attrs = { - "gapic_srcjar": attr.label(mandatory = True, allow_single_file = True), - "formatter": attr.label( - default = Label("//:google_java_format_binary"), - executable = True, - cfg = "host", - ), - }, - outputs = { - "spring": "%{name}-spring.srcjar", - }, - implementation = _java_gapic_spring_srcjar_impl, -) - def _extract_common_proto_dep(dep): return dep[dep.index("/"):] if "//google" in dep else dep @@ -343,12 +273,6 @@ def java_gapic_library( **kwargs ) - _java_gapic_spring_srcjar( - name = "%s_spring" % name, - gapic_srcjar = "%s.srcjar" % raw_srcjar_name, - **kwargs - ) - print("postprocessing done.\n") resource_name_name = "%s_resource_name" % name diff --git a/rules_java_gapic/java_gapic_spring.bzl b/rules_java_gapic/java_gapic_spring.bzl new file mode 100644 index 0000000000..e18914f3a0 --- /dev/null +++ b/rules_java_gapic/java_gapic_spring.bzl @@ -0,0 +1,146 @@ +# Copyright 2022 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 +# +# https://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. + +load("@rules_gapic//:gapic.bzl", "proto_custom_library") + +def _java_gapic_spring_postprocess_srcjar_impl(ctx): + gapic_srcjar = ctx.file.gapic_srcjar + output_srcjar_name = ctx.label.name + srcjar_name = output_srcjar_name + "_raw.srcjar" + output_spring = ctx.outputs.spring + formatter = ctx.executable.formatter + + output_dir_name = ctx.label.name + output_dir_path = "%s/%s" % (output_spring.dirname, output_dir_name) + + script = """ + WORKING_DIR=`pwd` + cd $WORKING_DIR + unzip -q {gapic_srcjar} + unzip -q temp-codegen-spring.srcjar -d {output_dir_path} + # This may fail if there are spaces and/or too many files (exceed max length of command length). + {formatter} --replace $(find {output_dir_path} -type f -printf "%p ") + + # Spring source files. + cd {output_dir_path} + zip -r $WORKING_DIR/{output_srcjar_name}.srcjar ./ + + cd $WORKING_DIR + + mv $WORKING_DIR/{output_srcjar_name}.srcjar {output_spring} + """.format( + output_srcjar_name = output_srcjar_name, + gapic_srcjar = gapic_srcjar.path, + srcjar_name = srcjar_name, + formatter = formatter, + output_dir_name = output_dir_name, + output_dir_path = output_dir_path, + output_spring = output_spring.path, + ) + + ctx.actions.run_shell( + inputs = [gapic_srcjar], + tools = [formatter], + command = script, + outputs = [output_spring], + ) + +_java_gapic_spring_postprocess_srcjar = rule( + attrs = { + "gapic_srcjar": attr.label(mandatory = True, allow_single_file = True), + "formatter": attr.label( + default = Label("//:google_java_format_binary"), + executable = True, + cfg = "host", + ), + }, + outputs = { + "spring": "%{name}-spring.srcjar", + }, + implementation = _java_gapic_spring_postprocess_srcjar_impl, +) + +def java_gapic_spring_library( + name, + srcs, + grpc_service_config = None, + gapic_yaml = None, + service_yaml = None, + transport = None, + **kwargs): + library_name = name + "-spring" + raw_srcjar_name = name + "_raw" + + _java_gapic_spring_srcjar( + name = raw_srcjar_name, + srcs = srcs, + grpc_service_config = grpc_service_config, + gapic_yaml = gapic_yaml, + service_yaml = service_yaml, + transport = transport, + **kwargs + ) + + _java_gapic_spring_postprocess_srcjar( + name = name, + gapic_srcjar = "%s.srcjar" % raw_srcjar_name, + **kwargs + ) + +def _java_gapic_spring_srcjar( + name, + srcs, + grpc_service_config, + gapic_yaml, + service_yaml, + transport, + # Can be used to provide a java_library with a customized generator, + # like the one which dumps descriptor to a file for future debugging. + java_generator_name = "java_gapic_spring", + **kwargs): + file_args_dict = {} + + if grpc_service_config: + file_args_dict[grpc_service_config] = "grpc-service-config" + elif not transport or transport == "grpc": + if "library" not in name: + fail("Missing a gRPC service config file") + + if gapic_yaml: + file_args_dict[gapic_yaml] = "gapic-config" + + if service_yaml: + file_args_dict[service_yaml] = "api-service-config" + + opt_args = [] + + if transport: + opt_args.append("transport=%s" % transport) + + # Produces the GAPIC metadata file if this flag is set. to any value. + # Protoc invocation: --java_gapic_opt=metadata + plugin_args = ["metadata"] + + proto_custom_library( + name = 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, + output_suffix = ".srcjar", + opt_args = opt_args, + **kwargs + ) diff --git a/src/main/java/com/google/api/generator/spring/Main.java b/src/main/java/com/google/api/generator/spring/Main.java new file mode 100644 index 0000000000..ce17171335 --- /dev/null +++ b/src/main/java/com/google/api/generator/spring/Main.java @@ -0,0 +1,31 @@ +// Copyright 2022 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.spring; + +import com.google.api.generator.ProtoRegistry; +import com.google.protobuf.ExtensionRegistry; +import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest; +import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + ExtensionRegistry registry = ExtensionRegistry.newInstance(); + ProtoRegistry.registerAllExtensions(registry); + CodeGeneratorRequest request = CodeGeneratorRequest.parseFrom(System.in, registry); + CodeGeneratorResponse springResponse = SpringGenerator.generateSpring(request); + springResponse.writeTo(System.out); + } +}