From f5efbfa625f72beb270cb30b79cb58f24c2c4fbe Mon Sep 17 00:00:00 2001 From: Jiaqi Guo Date: Wed, 26 Feb 2020 21:34:44 -0800 Subject: [PATCH 1/3] Reserve the data file structure and make them available for runtime (#1) --- appengine/java/appengine_runner.sh.template | 6 +++ appengine/java_appengine.bzl | 44 +++++++++++++-------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/appengine/java/appengine_runner.sh.template b/appengine/java/appengine_runner.sh.template index 33c151b..19110f5 100644 --- a/appengine/java/appengine_runner.sh.template +++ b/appengine/java/appengine_runner.sh.template @@ -47,6 +47,12 @@ for i in $(echo $classpath | tr ":" "\n"); do ln -s "$i" "$jar" done +for f in $(echo "%{data_files}" | tr ":" "\n"); do + rm -f "$f" + mkdir -p `dirname "$f"` + ln -s "$JAVA_RUNFILES/$f" "$f" +done + JVM_FLAGS_CMDLINE=() # Processes an argument for the wrapper. Returns 0 if the given argument diff --git a/appengine/java_appengine.bzl b/appengine/java_appengine.bzl index cd89aaa..8b35669 100644 --- a/appengine/java_appengine.bzl +++ b/appengine/java_appengine.bzl @@ -75,22 +75,24 @@ load("@bazel_tools//tools/build_defs/repo:jvm.bzl", "jvm_maven_import_external") load(":variables.bzl", "JAVA_SDK_SHA256", "JAVA_SDK_VERSION") load(":sdk.bzl", "find_locally_or_download") -def _add_file(in_file, output, path = None): - output_path = output - input_path = in_file.path +def _link_file(source, dest): + return [ + "mkdir -p $(dirname %s)" % dest, + "test -L %s || ln -s $(pwd)/%s %s" % (dest, source, dest), + ] - if path and in_file.short_path.startswith(path): - output_path += in_file.short_path[len(path):] +def _relative_path(file): + return file.path if file.is_source else file.short_path - if in_file.basename.endswith(".jar") and in_file.owner.package: - filename = "%s/%s" % (in_file.owner.package, in_file.basename) - filename = filename.replace("/", "_").replace("=", "_") - output_path = "%s/%s" % (output_path, filename) +def _add_dep(dep_file, dep_output_dir): + output_path = "%s/%s" % (dep_output_dir, dep_file.basename) + return _link_file(dep_file.path, output_path) - return [ - "mkdir -p $(dirname %s)" % output_path, - "test -L %s || ln -s $(pwd)/%s %s" % (output_path, input_path, output_path), - ] +def _add_data_file(data_file, output_dir, path): + dest_path = _relative_path(data_file) + if dest_path.startswith(path): + dest_path = dest_path[len(path):] + return _link_file(data_file.path, "%s/%s" % (output_dir, dest_path)) def _make_war(zipper, input_dir, output): return [ @@ -147,22 +149,22 @@ def _war_impl(ctxt): ] inputs = [zipper] - cmd += ["mkdir -p %s/WEB-INF/lib" % build_output] + cmd.append("mkdir -p %s/WEB-INF/lib" % build_output) transitive_deps = _collect_transitive_runtime_deps_for(ctxt.attr.jars) for dep in transitive_deps.to_list(): - cmd += _add_file(dep, build_output + "/WEB-INF/lib") + cmd += _add_dep(dep, build_output + "/WEB-INF/lib") inputs.append(dep) for jar in ctxt.files._appengine_deps: - cmd += _add_file(jar, build_output + "/WEB-INF/lib") + cmd += _add_dep(jar, build_output + "/WEB-INF/lib") inputs.append(jar) inputs += ctxt.files.data for res in ctxt.files.data: # Add the data file - cmd += _add_file(res, build_output, path = data_path) + cmd += _add_data_file(res, build_output, data_path) cmd += _make_war(zipper, build_output, war) @@ -193,6 +195,13 @@ def _war_impl(ctxt): for jar in ctxt.files._appengine_deps ] + data_files = [] + for target in ctxt.attr.data: + for file in target.files.to_list(): + path = _relative_path(file) + if not path.startswith(data_path): + data_files.append(path) + substitutions = { "%{workspace_name}": ctxt.workspace_name, "%{zipper}": ctxt.file._zipper.short_path, @@ -202,6 +211,7 @@ def _war_impl(ctxt): "%{classpath}": (":".join(classpath)), "%{data_path}": data_path, "%{local_jvm_flags}": (" ".join(ctxt.attr.local_jvm_flags)), + "%{data_files}": (":".join(data_files)), } ctxt.actions.expand_template( From b92574d3047d852a35463d2989265b8839a821f2 Mon Sep 17 00:00:00 2001 From: Jiaqi Guo Date: Wed, 26 Feb 2020 22:02:45 -0800 Subject: [PATCH 2/3] Add a demo static file to Java example --- examples/java/BUILD | 5 ++++- examples/java/static.txt | 0 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 examples/java/static.txt diff --git a/examples/java/BUILD b/examples/java/BUILD index d555a4f..94513f2 100644 --- a/examples/java/BUILD +++ b/examples/java/BUILD @@ -2,7 +2,10 @@ load("//appengine:java_appengine.bzl", "appengine_war") appengine_war( name = "examples", - data = ["//examples/java/webapp"], + data = [ + ":static.txt", + "//examples/java/webapp", + ], data_path = "/examples/java/webapp", jars = ["//examples/java/src:src_deploy.jar"], ) diff --git a/examples/java/static.txt b/examples/java/static.txt new file mode 100644 index 0000000..e69de29 From 0f13e73fa1be4df2efd18051376e2a3acf9b876b Mon Sep 17 00:00:00 2001 From: Jiaqi Guo Date: Wed, 26 Feb 2020 23:00:35 -0800 Subject: [PATCH 3/3] Name the dependency according to the test and add a data file to test --- appengine/java_appengine.bzl | 6 +++++- test/java/BUILD | 1 + test/java/check_war.sh | 1 + test/resource/BUILD | 5 +++++ test/resource/empty.txt | 0 5 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 test/resource/BUILD create mode 100644 test/resource/empty.txt diff --git a/appengine/java_appengine.bzl b/appengine/java_appengine.bzl index 8b35669..e3a8560 100644 --- a/appengine/java_appengine.bzl +++ b/appengine/java_appengine.bzl @@ -85,7 +85,11 @@ def _relative_path(file): return file.path if file.is_source else file.short_path def _add_dep(dep_file, dep_output_dir): - output_path = "%s/%s" % (dep_output_dir, dep_file.basename) + filename = dep_file.basename + if dep_file.owner.package: + package_prefix = dep_file.owner.package.replace("/", "_").replace("=", "_") + filename = "%s_%s" % (package_prefix, filename) + output_path = "%s/%s" % (dep_output_dir, filename) return _link_file(dep_file.path, output_path) def _add_data_file(data_file, output_dir, path): diff --git a/test/java/BUILD b/test/java/BUILD index 0b52ade..46014be 100644 --- a/test/java/BUILD +++ b/test/java/BUILD @@ -7,6 +7,7 @@ appengine_war( ":web-inf", "//test/java/data:gen-data", "//test/java/data:test-data", + "//test/resource", ], data_path = "/test/java", jars = [":app_deploy.jar"], diff --git a/test/java/check_war.sh b/test/java/check_war.sh index f29f0d6..617c6fc 100755 --- a/test/java/check_war.sh +++ b/test/java/check_war.sh @@ -24,3 +24,4 @@ assert_war_contains "./WEB-INF/appengine-web.xml" assert_war_contains "./WEB-INF/web.xml" assert_war_contains "./data/welcome.jsp" assert_war_contains "./data/gen-data.out" +assert_war_contains "./test/resource/empty.txt" diff --git a/test/resource/BUILD b/test/resource/BUILD new file mode 100644 index 0000000..45ddb34 --- /dev/null +++ b/test/resource/BUILD @@ -0,0 +1,5 @@ +filegroup( + name = "resource", + srcs = [":empty.txt"], + visibility = ["//visibility:public"], +) diff --git a/test/resource/empty.txt b/test/resource/empty.txt new file mode 100644 index 0000000..e69de29