Servlet-flavour transform toolchain

Shared Bazel machinery for generating a second servlet-API flavour of a Java module from one canonical source tree, by rewriting only the servlet (and Jetty EE) package prefixes while preserving Java package names and source line numbers.

It is self-contained: the rewrite is a plain sed package-prefix substitution, so it pulls in no external dependency.

The package mapping lives here, once

The servlet/Jetty package mapping is universal, so it is baked into the rule. Consumers carry no renames data — they select only the direction:

directionRewritesUsed by
to_javaxjakarta.servlet -> javax.servlet, Jetty ee10 -> ee8JGit .ee8 bridge (jakarta-canonical)
to_jakartajavax.servlet -> jakarta.servlet, Jetty ee8 servlet/security -> ee10 servlet/securityGitiles .ee10 bridge (javax-canonical)

If a consumer ever needs a rename outside this universal set, add an optional extra_renames attribute (or reference a .properties hosted here) — not needed today.

Contents

  • servlet_transform.bzltransform_srcjar(name, sources, src_prefix, direction) rule producing a srcjar with the renames applied.
  • Generated test targets reuse the canonical junit_tests macro from junit.bzl via its optional suite_srcs parameter: pass the transformed test .srcjar as srcs (compiled) and the canonical .java test files as suite_srcs (scanned for the @Suite.SuiteClasses names). This works because the transform preserves package and class names, so the canonical files yield exactly the classes inside the srcjar — no separate junit macro is needed.
  • generated_srcs_test.sh — derivation / line-count / residue checker. The residue checks are caller-supplied (--forbid, --require, --require-if-source) so it works in either direction.

Usage

load("@com_googlesource_gerrit_bazlets//tools:servlet_transform.bzl", "transform_srcjar")
load("@com_googlesource_gerrit_bazlets//tools:junit.bzl", "junit_tests")

# Generate the flavour srcjar.
transform_srcjar(
    name = "jgit-servlet-ee8-srcs",
    direction = "to_javax",
    sources = ["//org.eclipse.jgit.http.server:srcs"],
    src_prefix = "org.eclipse.jgit.http.server/src/",
)

# Run the generated tests: compile the transformed srcjar, but derive the
# suite class names from the canonical test files via suite_srcs.
junit_tests(
    name = "http",
    srcs = [":http-test-ee8-srcs"],  # transformed test srcjar (compiled)
    suite_srcs = ["//org.eclipse.jgit.http.test:test-srcs"],  # canonical .java
    deps = ["..."],
)

sh_test(
    name = "generated_srcs_test",
    srcs = ["@com_googlesource_gerrit_bazlets//tools:generated_srcs_test.sh"],
    args = [
        "--forbid", "jakarta\\.servlet",
        "--require", "javax\\.servlet",
        "--module", "org.eclipse.jgit.http.server/src/",
        "$(location :jgit-servlet-ee8-srcs)",
        "$(locations //org.eclipse.jgit.http.server:srcs)",
    ],
    data = [":jgit-servlet-ee8-srcs", "//org.eclipse.jgit.http.server:srcs"],
)

Each repo keeps only its own test target wiring; no renames data is duplicated.