diff --git a/MODULE.bazel b/MODULE.bazel index b2415347d..2f23dfeba 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -272,6 +272,14 @@ dev_maven.install( "https://repo.spring.io/plugins-release/", ], ) +dev_maven.install( + name = "service_indexing_testing", + artifacts = [ + "org.projectlombok:lombok:1.18.22", + ], + lock_file = "//tests/custom_maven_install:service_indexing_testing.json", +) + dev_maven.install( name = "jvm_import_test", artifacts = [ @@ -675,6 +683,10 @@ use_repo( "json_artifacts_testing", "unpinned_json_artifacts_testing", + # Pinned repo + "service_indexing_testing", + "unpinned_service_indexing_testing", + # Unpinned repo "jvm_import_test", "manifest_stamp_testing", @@ -791,3 +803,12 @@ http_file( "https://repo1.maven.org/maven2/com/google/apis/google-api-services-compute/v1-rev235-1.25.0/google-api-services-compute-v1-rev235-1.25.0-javadoc.jar", ], ) + +http_file( + name = "lombok_for_test", + downloaded_file_path = "lombok-1.18.22.jar", + sha256 = "ecef1581411d7a82cc04281667ee0bac5d7c0a5aae74cfc38430396c91c31831", + urls = [ + "https://repo1.maven.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar", + ], +) diff --git a/WORKSPACE b/WORKSPACE index bb2ae512c..aa717128f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -440,6 +440,14 @@ maven_install( ], ) +maven_install( + name = "service_indexing_testing", + artifacts = [ + "org.projectlombok.lombok:1.18.22", + ], + maven_install_json = "//tests/custom_maven_install:service_indexing_testing.json" +) + maven_install( name = "jvm_import_test", artifacts = [ @@ -695,6 +703,15 @@ http_file( ], ) +http_file( + name = "lombok_for_test", + downloaded_file_path = "lombok-1.18.22.jar", + sha256 = "ecef1581411d7a82cc04281667ee0bac5d7c0a5aae74cfc38430396c91c31831", + urls = [ + "https://repo1.maven.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar", + ], +) + # End test dependencies http_archive( diff --git a/coursier.bzl b/coursier.bzl index 50908242b..634949a79 100644 --- a/coursier.bzl +++ b/coursier.bzl @@ -1125,20 +1125,20 @@ def _coursier_fetch_impl(repository_ctx): path = str(repository_ctx.path(parts[1])) shas[path] = parts[0] - list_packages_stdout = _execute_with_argsfile( + index_jars_stdout = _execute_with_argsfile( repository_ctx, - repository_ctx.attr._list_packages, - "package_lister", - "Indexing jar packages", - "indexing jar packages", + repository_ctx.attr._index_jar, + "jar_indexer", + "Indexing jars", + "indexing jars", files_to_inspect, ) - jars_to_packages = json.decode(list_packages_stdout) - for jar, packages in jars_to_packages.items(): + jars_to_index_results = json.decode(index_jars_stdout) + for jar, index_results in jars_to_index_results.items(): path = str(repository_ctx.path(jar)) if path != jar: - jars_to_packages[path] = jars_to_packages.pop(jar) + jars_to_index_results[path] = jars_to_index_results.pop(jar) for artifact in dep_tree["dependencies"]: file = artifact["file"] @@ -1159,7 +1159,10 @@ def _coursier_fetch_impl(repository_ctx): artifact.pop("url") continue artifact.update({"sha256": shas[path]}) - artifact.update({"packages": jars_to_packages[path]}) + artifact.update({"packages": jars_to_index_results[path]["packages"]}) + service_implementations = jars_to_index_results[path].get("serviceImplementations", {}) + if service_implementations: + artifact.update({"services": service_implementations}) # Keep the original output from coursier for debugging repository_ctx.file( @@ -1375,7 +1378,7 @@ pinned_coursier_fetch = repository_rule( coursier_fetch = repository_rule( attrs = { "_sha256_hasher": attr.label(default = "//private/tools/prebuilt:hasher_deploy.jar"), - "_list_packages": attr.label(default = "//private/tools/prebuilt:list_packages_deploy.jar"), + "_index_jar": attr.label(default = "//private/tools/prebuilt:index_jar_deploy.jar"), "_lock_file_converter": attr.label(default = "//private/tools/prebuilt:lock_file_converter_deploy.jar"), "_pin": attr.label(default = "//private:pin.sh"), "_compat_repository": attr.label(default = "//private:compat_repository.bzl"), diff --git a/maven_install.json b/maven_install.json index 89b8e4ad8..5a3b04dcd 100644 --- a/maven_install.json +++ b/maven_install.json @@ -430,6 +430,7 @@ "org.objectweb.asm.signature" ] }, + "services": {}, "repositories": { "https://repo1.maven.org/maven2/": [ "com.google.auto.value:auto-value-annotations", diff --git a/private/rules/v2_lock_file.bzl b/private/rules/v2_lock_file.bzl index 86f2c8e0b..029a76716 100644 --- a/private/rules/v2_lock_file.bzl +++ b/private/rules/v2_lock_file.bzl @@ -165,6 +165,7 @@ def _render_lock_file(lock_file_contents, input_hash): if lock_file_contents.get("skipped"): contents.append(" \"skipped\": %s," % json.encode_indent(lock_file_contents["skipped"], prefix = " ", indent = " ")) contents.append(" \"packages\": %s," % json.encode_indent(lock_file_contents["packages"], prefix = " ", indent = " ")) + contents.append(" \"services\": %s," % json.encode_indent(lock_file_contents["services"], prefix = " ", indent = " ")) if lock_file_contents.get("m2local"): contents.append(" \"m2local\": true,") contents.append(" \"repositories\": {") diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier/LockFileConverter.java b/private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier/LockFileConverter.java index 09bc5c882..20a729ccb 100644 --- a/private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier/LockFileConverter.java +++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier/LockFileConverter.java @@ -38,6 +38,9 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; import java.util.TreeSet; import java.util.stream.Collectors; @@ -178,6 +181,12 @@ public Set getDependencies() { packages = new TreeSet<>(depPackages); } + SortedMap> services = new TreeMap<>(); + Object rawServices = coursierDep.get("services"); + if (rawServices != null) { + services = new TreeMap<>((Map>) rawServices); + } + toReturn.add( new DependencyInfo( coords, @@ -185,7 +194,8 @@ public Set getDependencies() { Optional.ofNullable(file).map(Paths::get), Optional.ofNullable((String) coursierDep.get("sha256")), directDeps, - packages)); + packages, + services)); } return toReturn; diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier/NebulaFormat.java b/private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier/NebulaFormat.java index 22af559bb..06e5afaf1 100644 --- a/private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier/NebulaFormat.java +++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier/NebulaFormat.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import java.util.stream.Collectors; @@ -41,6 +42,7 @@ public Map render( Map> artifacts = new TreeMap<>(); Map> deps = new TreeMap<>(); Map> packages = new TreeMap<>(); + Map>> services = new TreeMap<>(); Map> repos = new LinkedHashMap<>(); repositories.forEach(r -> repos.put(stripAuthenticationInformation(r), new TreeSet<>())); @@ -99,6 +101,7 @@ public Map render( .map(Object::toString) .collect(Collectors.toCollection(TreeSet::new))); packages.put(key, info.getPackages()); + services.put(key, info.getServices()); if (info.getPath().isPresent()) { // Regularise paths to UNIX format @@ -110,6 +113,7 @@ public Map render( lock.put("artifacts", ensureArtifactsAllHaveAtLeastOneShaSum(artifacts)); lock.put("dependencies", removeEmptyItems(deps)); lock.put("packages", removeEmptyItems(packages)); + lock.put("services", removeEmptyItemsMap(services)); if (isUsingM2Local) { lock.put("m2local", true); } @@ -153,6 +157,20 @@ private Map removeEmptyItems(Map input) { TreeMap::new)); } + private Map> removeEmptyItemsMap(Map> input) { + return input.entrySet().stream() + .filter(e -> !e.getValue().isEmpty()) + .collect( + Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (l, r) -> { + l.putAll(r); + return l; + }, + TreeMap::new)); +} + private String stripAuthenticationInformation(String possibleUri) { try { URI uri = new URI(possibleUri); diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/BUILD b/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/BUILD index 08c6bd2d8..7a8088965 100644 --- a/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/BUILD +++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/BUILD @@ -17,8 +17,11 @@ java_binary( ) java_library( - name = "ListPackages-lib", - srcs = ["ListPackages.java"], + name = "IndexJar-lib", + srcs = [ + "IndexJar.java", + "PerJarIndexResults.java", + ], visibility = [ "//private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd:__pkg__", "//tests/com/github/bazelbuild/rules_jvm_external/jar:__pkg__", @@ -32,11 +35,11 @@ java_library( ) java_binary( - name = "ListPackages", - main_class = "com.github.bazelbuild.rules_jvm_external.jar.ListPackages", + name = "IndexJar", + main_class = "com.github.bazelbuild.rules_jvm_external.jar.IndexJar", visibility = ["//visibility:public"], runtime_deps = [ - ":ListPackages-lib", + ":IndexJar-lib", ], ) diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/ListPackages.java b/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/IndexJar.java similarity index 65% rename from private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/ListPackages.java rename to private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/IndexJar.java index eecef256a..a2c3ab2a3 100644 --- a/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/ListPackages.java +++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/IndexJar.java @@ -15,9 +15,12 @@ package com.github.bazelbuild.rules_jvm_external.jar; import com.google.gson.Gson; + import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; @@ -25,6 +28,8 @@ import java.util.AbstractMap; import java.util.Arrays; import java.util.Map; +import java.util.Enumeration; +import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; @@ -34,13 +39,16 @@ import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipException; +import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; -public class ListPackages { +public class IndexJar { private static final Predicate IS_NUMERIC_VERSION = Pattern.compile("[1-9][0-9]*").asPredicate(); + private static final String SERVICES_DIRECTORY_PREFIX = "META-INF/services/"; + public static void main(String[] args) throws IOException { if (args.length != 2 || !"--argsfile".equals(args[0])) { System.err.printf("Required args: --argsfile /path/to/argsfile%n"); @@ -48,19 +56,19 @@ public static void main(String[] args) throws IOException { } Path argsFile = Paths.get(args[1]); - Map> index = new ListPackages().getPackages(Files.lines(argsFile)); + Map index = new IndexJar().index(Files.lines(argsFile)); System.out.println(new Gson().toJson(index)); } - public Map> getPackages(Stream source) { - TreeMap> index = + public Map index(Stream source) { + TreeMap index = source .parallel() .map( path -> { try { - SortedSet packages = getPackages(Paths.get(path)); - return new AbstractMap.SimpleEntry<>(path, packages); + PerJarIndexResults results = index(Paths.get(path)); + return new AbstractMap.SimpleEntry<>(path, results); } catch (IOException e) { throw new UncheckedIOException(e); } @@ -77,18 +85,32 @@ public Map> getPackages(Stream source) { return index; } - public SortedSet getPackages(Path path) throws IOException { + public PerJarIndexResults index(Path path) throws IOException { SortedSet packages = new TreeSet<>(); - try (InputStream fis = new BufferedInputStream(Files.newInputStream(path)); - ZipInputStream zis = new ZipInputStream(fis)) { + SortedMap> serviceImplementations = new TreeMap<>(); + try (InputStream fis = new BufferedInputStream(Files.newInputStream(path)); ZipInputStream zis = new ZipInputStream(fis)) { try { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { + if (entry.getName().startsWith(SERVICES_DIRECTORY_PREFIX) && !SERVICES_DIRECTORY_PREFIX.equals(entry.getName())) { + String serviceInterface = entry.getName().substring(SERVICES_DIRECTORY_PREFIX.length()); + SortedSet implementingClasses = new TreeSet<>(); + // We can't close zis here or it will also prevent us from reading subsequent entries. + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(zis)); + String implementingClass = bufferedReader.readLine(); + while (implementingClass != null) { + if (!implementingClass.isEmpty() && !implementingClass.startsWith("#")) { + implementingClasses.add(implementingClass); + } + implementingClass = bufferedReader.readLine(); + } + serviceImplementations.put(serviceInterface, implementingClasses); + } if (!entry.getName().endsWith(".class")) { continue; } if ("module-info.class".equals(entry.getName()) - || entry.getName().endsWith("/module-info.class")) { + || entry.getName().endsWith("/module-info.class")) { continue; } packages.add(extractPackageName(entry.getName())); @@ -96,8 +118,8 @@ public SortedSet getPackages(Path path) throws IOException { } catch (ZipException e) { System.err.printf("Caught ZipException: %s%n", e); } + return new PerJarIndexResults(packages, serviceImplementations); } - return packages; } private String extractPackageName(String zipEntryName) { diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/PerJarIndexResults.java b/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/PerJarIndexResults.java new file mode 100644 index 000000000..7a07f6ff6 --- /dev/null +++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/PerJarIndexResults.java @@ -0,0 +1,22 @@ +package com.github.bazelbuild.rules_jvm_external.jar; + +import java.util.SortedMap; +import java.util.SortedSet; + +public class PerJarIndexResults { + private final SortedSet packages; + private final SortedMap> serviceImplementations; + + public PerJarIndexResults(SortedSet packages, SortedMap> serviceImplementations) { + this.packages = packages; + this.serviceImplementations = serviceImplementations; + } + + public SortedSet getPackages() { + return this.packages; + } + + public SortedMap> getServiceImplementations() { + return this.serviceImplementations; + } +} \ No newline at end of file diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/DependencyInfo.java b/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/DependencyInfo.java index d7aab961b..5ad3e6dde 100644 --- a/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/DependencyInfo.java +++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/DependencyInfo.java @@ -21,6 +21,8 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; import java.util.TreeSet; public class DependencyInfo { @@ -31,6 +33,7 @@ public class DependencyInfo { private final Optional sha256; private final Set dependencies; private final Set packages; + private final SortedMap> services; public DependencyInfo( Coordinates coordinates, @@ -38,7 +41,8 @@ public DependencyInfo( Optional path, Optional sha256, Set dependencies, - Set packages) { + Set packages, + SortedMap> services) { this.coordinates = coordinates; this.repos = ImmutableSet.copyOf(repos); this.path = path; @@ -46,6 +50,7 @@ public DependencyInfo( this.dependencies = ImmutableSet.copyOf(new TreeSet<>(dependencies)); this.packages = ImmutableSet.copyOf(new TreeSet<>(packages)); + this.services = services; } public Coordinates getCoordinates() { @@ -72,6 +77,10 @@ public Optional getPath() { return path; } + public SortedMap> getServices() { + return services; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -84,11 +93,12 @@ public boolean equals(Object o) { return Objects.equals(coordinates, that.coordinates) && Objects.equals(sha256, that.sha256) && Objects.equals(dependencies, that.dependencies) - && Objects.equals(packages, that.packages); + && Objects.equals(packages, that.packages) + && Objects.equals(services, that.services); } @Override public int hashCode() { - return Objects.hash(coordinates, sha256, dependencies, packages); + return Objects.hash(coordinates, sha256, dependencies, packages, services); } } diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/BUILD b/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/BUILD index 60088db3d..aa0de6b96 100644 --- a/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/BUILD +++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/BUILD @@ -9,7 +9,7 @@ java_library( deps = [ "//private/tools/java/com/github/bazelbuild/rules_jvm_external", "//private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier", - "//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:ListPackages-lib", + "//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:IndexJar-lib", "//private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver", "//private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/events", "//private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/maven", diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/Main.java b/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/Main.java index 4b2e7e0fa..abbfea5c6 100644 --- a/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/Main.java +++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/Main.java @@ -18,7 +18,8 @@ import com.github.bazelbuild.rules_jvm_external.Coordinates; import com.github.bazelbuild.rules_jvm_external.coursier.NebulaFormat; -import com.github.bazelbuild.rules_jvm_external.jar.ListPackages; +import com.github.bazelbuild.rules_jvm_external.jar.IndexJar; +import com.github.bazelbuild.rules_jvm_external.jar.PerJarIndexResults; import com.github.bazelbuild.rules_jvm_external.resolver.Conflict; import com.github.bazelbuild.rules_jvm_external.resolver.DependencyInfo; import com.github.bazelbuild.rules_jvm_external.resolver.ResolutionRequest; @@ -33,6 +34,7 @@ import com.github.bazelbuild.rules_jvm_external.resolver.ui.NullListener; import com.github.bazelbuild.rules_jvm_external.resolver.ui.PlainConsoleListener; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSortedMap; import com.google.common.graph.Graph; import com.google.gson.GsonBuilder; import java.io.BufferedOutputStream; @@ -49,7 +51,6 @@ import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import java.util.concurrent.CompletableFuture; @@ -201,15 +202,15 @@ private static Set getDependencyInfos( return toReturn.build(); } - SortedSet packages; + PerJarIndexResults indexResults; if (result.getPath().isPresent()) { try { - packages = new ListPackages().getPackages(result.getPath().get()); + indexResults = new IndexJar().index(result.getPath().get()); } catch (IOException e) { throw new UncheckedIOException(e); } } else { - packages = new TreeSet<>(); + indexResults = new PerJarIndexResults(new TreeSet<>(), new TreeMap<>()); } toReturn.add( @@ -219,7 +220,8 @@ private static Set getDependencyInfos( result.getPath(), result.getSha256(), dependencies, - packages)); + indexResults.getPackages(), + indexResults.getServiceImplementations())); if (fetchSources) { Coordinates sourceCoords = coords.setClassifier("sources").setExtension("jar"); @@ -232,7 +234,8 @@ private static Set getDependencyInfos( source.getPath(), source.getSha256(), ImmutableSet.of(), - ImmutableSet.of())); + ImmutableSet.of(), + ImmutableSortedMap.of())); } } @@ -247,7 +250,8 @@ private static Set getDependencyInfos( javadoc.getPath(), javadoc.getSha256(), ImmutableSet.of(), - ImmutableSet.of())); + ImmutableSet.of(), + ImmutableSortedMap.of())); } } diff --git a/private/tools/prebuilt/BUILD b/private/tools/prebuilt/BUILD index 0e236ec06..4d6ea3b29 100644 --- a/private/tools/prebuilt/BUILD +++ b/private/tools/prebuilt/BUILD @@ -3,7 +3,7 @@ exports_files([ "hasher_deploy.jar", # built from //private/tools/java/com/github/bazelbuild/rules_jvm_external:hasher-tool_deploy.jar - "list_packages_deploy.jar", # built from //private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:ListPackages_deploy.jar + "index_jar_deploy.jar", # built from //private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:IndexJar_deploy.jar "lock_file_converter_deploy.jar", # built from //private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier:LockFileConverter_deploy.jar "outdated_deploy.jar", # built from //private/tools/java/com/github/bazelbuild/rules_jvm_external/maven:outdated_deploy.jar ]) diff --git a/private/tools/prebuilt/hasher_deploy.jar b/private/tools/prebuilt/hasher_deploy.jar index da02c9ff0..883d7f00f 100755 Binary files a/private/tools/prebuilt/hasher_deploy.jar and b/private/tools/prebuilt/hasher_deploy.jar differ diff --git a/private/tools/prebuilt/list_packages_deploy.jar b/private/tools/prebuilt/index_jar_deploy.jar similarity index 92% rename from private/tools/prebuilt/list_packages_deploy.jar rename to private/tools/prebuilt/index_jar_deploy.jar index f329d705e..ad3018f98 100755 Binary files a/private/tools/prebuilt/list_packages_deploy.jar and b/private/tools/prebuilt/index_jar_deploy.jar differ diff --git a/private/tools/prebuilt/lock_file_converter_deploy.jar b/private/tools/prebuilt/lock_file_converter_deploy.jar index 812f66103..6b8009291 100755 Binary files a/private/tools/prebuilt/lock_file_converter_deploy.jar and b/private/tools/prebuilt/lock_file_converter_deploy.jar differ diff --git a/private/tools/prebuilt/outdated_deploy.jar b/private/tools/prebuilt/outdated_deploy.jar index 32bc6a482..fafde6b54 100755 Binary files a/private/tools/prebuilt/outdated_deploy.jar and b/private/tools/prebuilt/outdated_deploy.jar differ diff --git a/scripts/BUILD b/scripts/BUILD index b9fd20787..e4c838c6d 100644 --- a/scripts/BUILD +++ b/scripts/BUILD @@ -102,15 +102,15 @@ sh_binary( "hasher_deploy.jar", "$(location //private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier:LockFileConverter_deploy.jar)", "lock_file_converter_deploy.jar", - "$(location //private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:ListPackages_deploy.jar)", - "list_packages_deploy.jar", + "$(location //private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:IndexJar_deploy.jar)", + "index_jar_deploy.jar", "$(location //private/tools/java/com/github/bazelbuild/rules_jvm_external/maven:outdated_deploy.jar)", "outdated_deploy.jar", ], data = [ "//private/tools/java/com/github/bazelbuild/rules_jvm_external:hasher-tool_deploy.jar", "//private/tools/java/com/github/bazelbuild/rules_jvm_external/coursier:LockFileConverter_deploy.jar", - "//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:ListPackages_deploy.jar", + "//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:IndexJar_deploy.jar", "//private/tools/java/com/github/bazelbuild/rules_jvm_external/maven:outdated_deploy.jar", ], ) diff --git a/tests/com/github/bazelbuild/rules_jvm_external/coursier/NebulaFormatTest.java b/tests/com/github/bazelbuild/rules_jvm_external/coursier/NebulaFormatTest.java index d076e6377..993496eed 100644 --- a/tests/com/github/bazelbuild/rules_jvm_external/coursier/NebulaFormatTest.java +++ b/tests/com/github/bazelbuild/rules_jvm_external/coursier/NebulaFormatTest.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.TreeMap; import java.util.stream.Collectors; import org.junit.Test; @@ -39,7 +40,8 @@ public void shouldRenderAggregatingJarsAsJarWithNullShasum() { Optional.empty(), Optional.empty(), Set.of(), - Set.of()); + Set.of(), + new TreeMap<>()); Map rendered = new NebulaFormat() diff --git a/tests/com/github/bazelbuild/rules_jvm_external/jar/BUILD b/tests/com/github/bazelbuild/rules_jvm_external/jar/BUILD index cd89a305b..065c92931 100644 --- a/tests/com/github/bazelbuild/rules_jvm_external/jar/BUILD +++ b/tests/com/github/bazelbuild/rules_jvm_external/jar/BUILD @@ -17,19 +17,22 @@ java_test( ) java_test( - name = "ListPackagesTest", - srcs = ["ListPackagesTest.java"], + name = "IndexJarTest", + srcs = ["IndexJarTest.java"], data = [ "@google_api_services_compute_javadoc_for_test//file", "@gson_for_test//file", "@hamcrest_core_for_test//file", "@hamcrest_core_srcs_for_test//file", "@junit_platform_commons_for_test//file", + "@lombok_for_test//file", + "//tests/custom_maven_install:service_indexing_testing.json", ], - test_class = "com.github.bazelbuild.rules_jvm_external.jar.ListPackagesTest", + test_class = "com.github.bazelbuild.rules_jvm_external.jar.IndexJarTest", deps = [ - "//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:ListPackages-lib", + "//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:IndexJar-lib", "@bazel_tools//tools/java/runfiles", + "@rules_jvm_external_deps//:com_google_code_gson_gson", artifact( "junit:junit", repository_name = "regression_testing", diff --git a/tests/com/github/bazelbuild/rules_jvm_external/jar/IndexJarTest.java b/tests/com/github/bazelbuild/rules_jvm_external/jar/IndexJarTest.java new file mode 100644 index 000000000..d318be646 --- /dev/null +++ b/tests/com/github/bazelbuild/rules_jvm_external/jar/IndexJarTest.java @@ -0,0 +1,149 @@ +// Copyright 2024 The Bazel Authors. All rights reserved. +// +// 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.github.bazelbuild.rules_jvm_external.jar; + +import static org.junit.Assert.assertEquals; + +import com.google.devtools.build.runfiles.Runfiles; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; +import org.junit.Test; + +public class IndexJarTest { + @Test + public void simplePackages() throws Exception { + doTest( + "hamcrest_core_for_test/file/hamcrest-core-1.3.jar", + sortedSet( + "org.hamcrest", + "org.hamcrest.core", + "org.hamcrest.internal"), + new TreeMap<>()); + } + + @Test + public void hasModuleInfo() throws Exception { + doTest( + "gson_for_test/file/gson-2.9.0.jar", + sortedSet( + "com.google.gson", + "com.google.gson.annotations", + "com.google.gson.internal", + "com.google.gson.internal.bind", + "com.google.gson.internal.bind.util", + "com.google.gson.internal.reflect", + "com.google.gson.internal.sql", + "com.google.gson.reflect", + "com.google.gson.stream"), + new TreeMap<>()); + } + + @Test + public void multiVersioned() throws Exception { + doTest( + "junit_platform_commons_for_test/file/junit-platform-commons-1.8.2.jar", + sortedSet( + "org.junit.platform.commons", + "org.junit.platform.commons.annotation", + "org.junit.platform.commons.function", + "org.junit.platform.commons.logging", + "org.junit.platform.commons.support", + "org.junit.platform.commons.util"), + new TreeMap<>()); + } + + @Test + public void noPackages() throws Exception { + doTest("hamcrest_core_srcs_for_test/file/hamcrest-core-1.3-sources.jar", sortedSet(), new TreeMap<>()); + } + + @Test + public void serviceImplementations() throws Exception { + doTest("lombok_for_test/file/lombok-1.18.22.jar", + sortedSet( + "lombok", + "lombok.delombok.ant", + "lombok.experimental", + "lombok.extern.apachecommons", + "lombok.extern.flogger", + "lombok.extern.jackson", + "lombok.extern.java", + "lombok.extern.jbosslog", + "lombok.extern.log4j", + "lombok.extern.slf4j", + "lombok.javac.apt", + "lombok.launch"), + getLombokServiceImplementations()); + } + + @Test + public void invalidCRC() throws Exception { + doTest( + "google_api_services_compute_javadoc_for_test/file/google-api-services-compute-v1-rev235-1.25.0-javadoc.jar", sortedSet(), new TreeMap<>()); + } + + private static class Lockfile { + public TreeMap>> services; + } + + @Test + public void testLockfile() throws Exception { + Path lockfilePath = Paths.get(Runfiles.create().rlocation("rules_jvm_external/tests/custom_maven_install/service_indexing_testing.json")); + try (Reader reader = Files.newBufferedReader(lockfilePath)) { + Gson gson = new Gson(); + Lockfile lockfile = gson.fromJson(reader, Lockfile.class); + assertEquals(getLombokServiceImplementations(), lockfile.services.get("org.projectlombok:lombok")); + } + } + + private void doTest(String runfileJar, SortedSet expectedPackages, TreeMap> expectedServiceImplementations) throws IOException { + Path jar = Paths.get(Runfiles.create().rlocation(runfileJar)); + PerJarIndexResults perJarIndexResults = new IndexJar().index(jar); + assertEquals(expectedPackages, perJarIndexResults.getPackages()); + assertEquals(expectedServiceImplementations, perJarIndexResults.getServiceImplementations()); + } + + private TreeMap> getLombokServiceImplementations() { + TreeMap> lombokServiceImplementations = new TreeMap<>(); + lombokServiceImplementations.put("javax.annotation.processing.Processor", sortedSet("lombok.launch.AnnotationProcessorHider$AnnotationProcessor", "lombok.launch.AnnotationProcessorHider$ClaimingProcessor")); + lombokServiceImplementations.put("lombok.core.LombokApp", sortedSet("lombok.bytecode.PoolConstantsApp", "lombok.bytecode.PostCompilerApp", "lombok.core.Main$LicenseApp", "lombok.core.Main$VersionApp", "lombok.core.PublicApiCreatorApp", "lombok.core.configuration.ConfigurationApp", "lombok.core.runtimeDependencies.CreateLombokRuntimeApp", "lombok.delombok.DelombokApp", "lombok.installer.Installer$CommandLineInstallerApp", "lombok.installer.Installer$CommandLineUninstallerApp", "lombok.installer.Installer$GraphicalInstallerApp")); + lombokServiceImplementations.put("lombok.core.PostCompilerTransformation", sortedSet("lombok.bytecode.PreventNullAnalysisRemover", "lombok.bytecode.SneakyThrowsRemover")); + lombokServiceImplementations.put("lombok.core.runtimeDependencies.RuntimeDependencyInfo", sortedSet("lombok.core.handlers.SneakyThrowsAndCleanupDependencyInfo")); + lombokServiceImplementations.put("lombok.eclipse.EclipseASTVisitor", sortedSet("lombok.eclipse.handlers.HandleFieldDefaults", "lombok.eclipse.handlers.HandleVal")); + lombokServiceImplementations.put("lombok.eclipse.EclipseAnnotationHandler", sortedSet("lombok.eclipse.handlers.HandleAccessors", "lombok.eclipse.handlers.HandleBuilder", "lombok.eclipse.handlers.HandleBuilderDefault", "lombok.eclipse.handlers.HandleCleanup", "lombok.eclipse.handlers.HandleConstructor$HandleAllArgsConstructor", "lombok.eclipse.handlers.HandleConstructor$HandleNoArgsConstructor", "lombok.eclipse.handlers.HandleConstructor$HandleRequiredArgsConstructor", "lombok.eclipse.handlers.HandleData", "lombok.eclipse.handlers.HandleDelegate", "lombok.eclipse.handlers.HandleEqualsAndHashCode", "lombok.eclipse.handlers.HandleExtensionMethod", "lombok.eclipse.handlers.HandleFieldNameConstants", "lombok.eclipse.handlers.HandleGetter", "lombok.eclipse.handlers.HandleHelper", "lombok.eclipse.handlers.HandleJacksonized", "lombok.eclipse.handlers.HandleLog$HandleCommonsLog", "lombok.eclipse.handlers.HandleLog$HandleCustomLog", "lombok.eclipse.handlers.HandleLog$HandleFloggerLog", "lombok.eclipse.handlers.HandleLog$HandleJBossLog", "lombok.eclipse.handlers.HandleLog$HandleJulLog", "lombok.eclipse.handlers.HandleLog$HandleLog4j2Log", "lombok.eclipse.handlers.HandleLog$HandleLog4jLog", "lombok.eclipse.handlers.HandleLog$HandleSlf4jLog", "lombok.eclipse.handlers.HandleLog$HandleXSlf4jLog", "lombok.eclipse.handlers.HandleNonNull", "lombok.eclipse.handlers.HandlePrintAST", "lombok.eclipse.handlers.HandleSetter", "lombok.eclipse.handlers.HandleSneakyThrows", "lombok.eclipse.handlers.HandleStandardException", "lombok.eclipse.handlers.HandleSuperBuilder", "lombok.eclipse.handlers.HandleSynchronized", "lombok.eclipse.handlers.HandleToString", "lombok.eclipse.handlers.HandleUtilityClass", "lombok.eclipse.handlers.HandleValue", "lombok.eclipse.handlers.HandleWith", "lombok.eclipse.handlers.HandleWithBy")); + lombokServiceImplementations.put("lombok.eclipse.handlers.EclipseSingularsRecipes$EclipseSingularizer", sortedSet("lombok.eclipse.handlers.singulars.EclipseGuavaMapSingularizer", "lombok.eclipse.handlers.singulars.EclipseGuavaSetListSingularizer", "lombok.eclipse.handlers.singulars.EclipseGuavaTableSingularizer", "lombok.eclipse.handlers.singulars.EclipseJavaUtilListSingularizer", "lombok.eclipse.handlers.singulars.EclipseJavaUtilMapSingularizer", "lombok.eclipse.handlers.singulars.EclipseJavaUtilSetSingularizer")); + lombokServiceImplementations.put("lombok.installer.IdeLocationProvider", sortedSet("lombok.installer.eclipse.AngularIDELocationProvider", "lombok.installer.eclipse.EclipseLocationProvider", "lombok.installer.eclipse.JbdsLocationProvider", "lombok.installer.eclipse.MyEclipseLocationProvider", "lombok.installer.eclipse.RhcrLocationProvider", "lombok.installer.eclipse.RhdsLocationProvider", "lombok.installer.eclipse.STS4LocationProvider", "lombok.installer.eclipse.STSLocationProvider")); + lombokServiceImplementations.put("lombok.javac.JavacASTVisitor", sortedSet("lombok.javac.handlers.HandleFieldDefaults", "lombok.javac.handlers.HandleVal")); + lombokServiceImplementations.put("lombok.javac.JavacAnnotationHandler", sortedSet("lombok.javac.handlers.HandleAccessors", "lombok.javac.handlers.HandleBuilder", "lombok.javac.handlers.HandleBuilderDefault", "lombok.javac.handlers.HandleBuilderDefaultRemove", "lombok.javac.handlers.HandleBuilderRemove", "lombok.javac.handlers.HandleCleanup", "lombok.javac.handlers.HandleConstructor$HandleAllArgsConstructor", "lombok.javac.handlers.HandleConstructor$HandleNoArgsConstructor", "lombok.javac.handlers.HandleConstructor$HandleRequiredArgsConstructor", "lombok.javac.handlers.HandleData", "lombok.javac.handlers.HandleDelegate", "lombok.javac.handlers.HandleEqualsAndHashCode", "lombok.javac.handlers.HandleExtensionMethod", "lombok.javac.handlers.HandleFieldNameConstants", "lombok.javac.handlers.HandleGetter", "lombok.javac.handlers.HandleHelper", "lombok.javac.handlers.HandleJacksonized", "lombok.javac.handlers.HandleLog$HandleCommonsLog", "lombok.javac.handlers.HandleLog$HandleCustomLog", "lombok.javac.handlers.HandleLog$HandleFloggerLog", "lombok.javac.handlers.HandleLog$HandleJBossLog", "lombok.javac.handlers.HandleLog$HandleJulLog", "lombok.javac.handlers.HandleLog$HandleLog4j2Log", "lombok.javac.handlers.HandleLog$HandleLog4jLog", "lombok.javac.handlers.HandleLog$HandleSlf4jLog", "lombok.javac.handlers.HandleLog$HandleXSlf4jLog", "lombok.javac.handlers.HandleNonNull", "lombok.javac.handlers.HandlePrintAST", "lombok.javac.handlers.HandleSetter", "lombok.javac.handlers.HandleSneakyThrows", "lombok.javac.handlers.HandleStandardException", "lombok.javac.handlers.HandleSuperBuilder", "lombok.javac.handlers.HandleSuperBuilderRemove", "lombok.javac.handlers.HandleSynchronized", "lombok.javac.handlers.HandleToString", "lombok.javac.handlers.HandleUtilityClass", "lombok.javac.handlers.HandleValue", "lombok.javac.handlers.HandleWith", "lombok.javac.handlers.HandleWithBy")); + lombokServiceImplementations.put("lombok.javac.handlers.JavacSingularsRecipes$JavacSingularizer", sortedSet("lombok.javac.handlers.singulars.JavacGuavaMapSingularizer", "lombok.javac.handlers.singulars.JavacGuavaSetListSingularizer", "lombok.javac.handlers.singulars.JavacGuavaTableSingularizer", "lombok.javac.handlers.singulars.JavacJavaUtilListSingularizer", "lombok.javac.handlers.singulars.JavacJavaUtilMapSingularizer", "lombok.javac.handlers.singulars.JavacJavaUtilSetSingularizer")); + return lombokServiceImplementations; + } + + private TreeSet sortedSet(String... contents) { + TreeSet set = new TreeSet<>(); + for (String string : contents) { + set.add(string); + } + return set; + } +} diff --git a/tests/com/github/bazelbuild/rules_jvm_external/jar/ListPackagesTest.java b/tests/com/github/bazelbuild/rules_jvm_external/jar/ListPackagesTest.java deleted file mode 100644 index b5cd21294..000000000 --- a/tests/com/github/bazelbuild/rules_jvm_external/jar/ListPackagesTest.java +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2024 The Bazel Authors. All rights reserved. -// -// 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.github.bazelbuild.rules_jvm_external.jar; - -import static org.junit.Assert.assertEquals; - -import com.google.devtools.build.runfiles.Runfiles; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.SortedSet; -import java.util.TreeSet; -import org.junit.Test; - -public class ListPackagesTest { - @Test - public void simplePackages() throws Exception { - doTest( - "hamcrest_core_for_test/file/hamcrest-core-1.3.jar", - "org.hamcrest", - "org.hamcrest.core", - "org.hamcrest.internal"); - } - - @Test - public void hasModuleInfo() throws Exception { - doTest( - "gson_for_test/file/gson-2.9.0.jar", - "com.google.gson", - "com.google.gson.annotations", - "com.google.gson.internal", - "com.google.gson.internal.bind", - "com.google.gson.internal.bind.util", - "com.google.gson.internal.reflect", - "com.google.gson.internal.sql", - "com.google.gson.reflect", - "com.google.gson.stream"); - } - - @Test - public void multiVersioned() throws Exception { - doTest( - "junit_platform_commons_for_test/file/junit-platform-commons-1.8.2.jar", - "org.junit.platform.commons", - "org.junit.platform.commons.annotation", - "org.junit.platform.commons.function", - "org.junit.platform.commons.logging", - "org.junit.platform.commons.support", - "org.junit.platform.commons.util"); - } - - @Test - public void noPackages() throws Exception { - doTest("hamcrest_core_srcs_for_test/file/hamcrest-core-1.3-sources.jar"); - } - - @Test - public void invalidCRC() throws Exception { - doTest( - "google_api_services_compute_javadoc_for_test/file/google-api-services-compute-v1-rev235-1.25.0-javadoc.jar"); - } - - private void doTest(String runfileJar, String... expectedPackages) throws IOException { - SortedSet expected = sortedSet(expectedPackages); - Path jar = Paths.get(Runfiles.create().rlocation(runfileJar)); - SortedSet packages = new ListPackages().getPackages(jar); - assertEquals(expected, packages); - } - - private SortedSet sortedSet(String... contents) { - SortedSet set = new TreeSet<>(); - for (String string : contents) { - set.add(string); - } - return set; - } -} diff --git a/tests/custom_maven_install/BUILD b/tests/custom_maven_install/BUILD index 11b067126..1c6066c93 100644 --- a/tests/custom_maven_install/BUILD +++ b/tests/custom_maven_install/BUILD @@ -5,4 +5,5 @@ exports_files([ "regression_testing_install.json", "m2local_testing_with_pinned_file_install.json", "artifact_with_plus_repin_install.json", + "service_indexing_testing.json", ]) diff --git a/tests/custom_maven_install/service_indexing_testing.json b/tests/custom_maven_install/service_indexing_testing.json new file mode 100644 index 000000000..1c25f349f --- /dev/null +++ b/tests/custom_maven_install/service_indexing_testing.json @@ -0,0 +1,177 @@ +{ + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", + "__INPUT_ARTIFACTS_HASH": -1775137956, + "__RESOLVED_ARTIFACTS_HASH": -1584028384, + "artifacts": { + "org.projectlombok:lombok": { + "shasums": { + "jar": "ecef1581411d7a82cc04281667ee0bac5d7c0a5aae74cfc38430396c91c31831" + }, + "version": "1.18.22" + } + }, + "dependencies": {}, + "packages": { + "org.projectlombok:lombok": [ + "lombok", + "lombok.delombok.ant", + "lombok.experimental", + "lombok.extern.apachecommons", + "lombok.extern.flogger", + "lombok.extern.jackson", + "lombok.extern.java", + "lombok.extern.jbosslog", + "lombok.extern.log4j", + "lombok.extern.slf4j", + "lombok.javac.apt", + "lombok.launch" + ] + }, + "services": { + "org.projectlombok:lombok": { + "javax.annotation.processing.Processor": [ + "lombok.launch.AnnotationProcessorHider$AnnotationProcessor", + "lombok.launch.AnnotationProcessorHider$ClaimingProcessor" + ], + "lombok.core.LombokApp": [ + "lombok.bytecode.PoolConstantsApp", + "lombok.bytecode.PostCompilerApp", + "lombok.core.Main$LicenseApp", + "lombok.core.Main$VersionApp", + "lombok.core.PublicApiCreatorApp", + "lombok.core.configuration.ConfigurationApp", + "lombok.core.runtimeDependencies.CreateLombokRuntimeApp", + "lombok.delombok.DelombokApp", + "lombok.installer.Installer$CommandLineInstallerApp", + "lombok.installer.Installer$CommandLineUninstallerApp", + "lombok.installer.Installer$GraphicalInstallerApp" + ], + "lombok.core.PostCompilerTransformation": [ + "lombok.bytecode.PreventNullAnalysisRemover", + "lombok.bytecode.SneakyThrowsRemover" + ], + "lombok.core.runtimeDependencies.RuntimeDependencyInfo": [ + "lombok.core.handlers.SneakyThrowsAndCleanupDependencyInfo" + ], + "lombok.eclipse.EclipseASTVisitor": [ + "lombok.eclipse.handlers.HandleFieldDefaults", + "lombok.eclipse.handlers.HandleVal" + ], + "lombok.eclipse.EclipseAnnotationHandler": [ + "lombok.eclipse.handlers.HandleAccessors", + "lombok.eclipse.handlers.HandleBuilder", + "lombok.eclipse.handlers.HandleBuilderDefault", + "lombok.eclipse.handlers.HandleCleanup", + "lombok.eclipse.handlers.HandleConstructor$HandleAllArgsConstructor", + "lombok.eclipse.handlers.HandleConstructor$HandleNoArgsConstructor", + "lombok.eclipse.handlers.HandleConstructor$HandleRequiredArgsConstructor", + "lombok.eclipse.handlers.HandleData", + "lombok.eclipse.handlers.HandleDelegate", + "lombok.eclipse.handlers.HandleEqualsAndHashCode", + "lombok.eclipse.handlers.HandleExtensionMethod", + "lombok.eclipse.handlers.HandleFieldNameConstants", + "lombok.eclipse.handlers.HandleGetter", + "lombok.eclipse.handlers.HandleHelper", + "lombok.eclipse.handlers.HandleJacksonized", + "lombok.eclipse.handlers.HandleLog$HandleCommonsLog", + "lombok.eclipse.handlers.HandleLog$HandleCustomLog", + "lombok.eclipse.handlers.HandleLog$HandleFloggerLog", + "lombok.eclipse.handlers.HandleLog$HandleJBossLog", + "lombok.eclipse.handlers.HandleLog$HandleJulLog", + "lombok.eclipse.handlers.HandleLog$HandleLog4j2Log", + "lombok.eclipse.handlers.HandleLog$HandleLog4jLog", + "lombok.eclipse.handlers.HandleLog$HandleSlf4jLog", + "lombok.eclipse.handlers.HandleLog$HandleXSlf4jLog", + "lombok.eclipse.handlers.HandleNonNull", + "lombok.eclipse.handlers.HandlePrintAST", + "lombok.eclipse.handlers.HandleSetter", + "lombok.eclipse.handlers.HandleSneakyThrows", + "lombok.eclipse.handlers.HandleStandardException", + "lombok.eclipse.handlers.HandleSuperBuilder", + "lombok.eclipse.handlers.HandleSynchronized", + "lombok.eclipse.handlers.HandleToString", + "lombok.eclipse.handlers.HandleUtilityClass", + "lombok.eclipse.handlers.HandleValue", + "lombok.eclipse.handlers.HandleWith", + "lombok.eclipse.handlers.HandleWithBy" + ], + "lombok.eclipse.handlers.EclipseSingularsRecipes$EclipseSingularizer": [ + "lombok.eclipse.handlers.singulars.EclipseGuavaMapSingularizer", + "lombok.eclipse.handlers.singulars.EclipseGuavaSetListSingularizer", + "lombok.eclipse.handlers.singulars.EclipseGuavaTableSingularizer", + "lombok.eclipse.handlers.singulars.EclipseJavaUtilListSingularizer", + "lombok.eclipse.handlers.singulars.EclipseJavaUtilMapSingularizer", + "lombok.eclipse.handlers.singulars.EclipseJavaUtilSetSingularizer" + ], + "lombok.installer.IdeLocationProvider": [ + "lombok.installer.eclipse.AngularIDELocationProvider", + "lombok.installer.eclipse.EclipseLocationProvider", + "lombok.installer.eclipse.JbdsLocationProvider", + "lombok.installer.eclipse.MyEclipseLocationProvider", + "lombok.installer.eclipse.RhcrLocationProvider", + "lombok.installer.eclipse.RhdsLocationProvider", + "lombok.installer.eclipse.STS4LocationProvider", + "lombok.installer.eclipse.STSLocationProvider" + ], + "lombok.javac.JavacASTVisitor": [ + "lombok.javac.handlers.HandleFieldDefaults", + "lombok.javac.handlers.HandleVal" + ], + "lombok.javac.JavacAnnotationHandler": [ + "lombok.javac.handlers.HandleAccessors", + "lombok.javac.handlers.HandleBuilder", + "lombok.javac.handlers.HandleBuilderDefault", + "lombok.javac.handlers.HandleBuilderDefaultRemove", + "lombok.javac.handlers.HandleBuilderRemove", + "lombok.javac.handlers.HandleCleanup", + "lombok.javac.handlers.HandleConstructor$HandleAllArgsConstructor", + "lombok.javac.handlers.HandleConstructor$HandleNoArgsConstructor", + "lombok.javac.handlers.HandleConstructor$HandleRequiredArgsConstructor", + "lombok.javac.handlers.HandleData", + "lombok.javac.handlers.HandleDelegate", + "lombok.javac.handlers.HandleEqualsAndHashCode", + "lombok.javac.handlers.HandleExtensionMethod", + "lombok.javac.handlers.HandleFieldNameConstants", + "lombok.javac.handlers.HandleGetter", + "lombok.javac.handlers.HandleHelper", + "lombok.javac.handlers.HandleJacksonized", + "lombok.javac.handlers.HandleLog$HandleCommonsLog", + "lombok.javac.handlers.HandleLog$HandleCustomLog", + "lombok.javac.handlers.HandleLog$HandleFloggerLog", + "lombok.javac.handlers.HandleLog$HandleJBossLog", + "lombok.javac.handlers.HandleLog$HandleJulLog", + "lombok.javac.handlers.HandleLog$HandleLog4j2Log", + "lombok.javac.handlers.HandleLog$HandleLog4jLog", + "lombok.javac.handlers.HandleLog$HandleSlf4jLog", + "lombok.javac.handlers.HandleLog$HandleXSlf4jLog", + "lombok.javac.handlers.HandleNonNull", + "lombok.javac.handlers.HandlePrintAST", + "lombok.javac.handlers.HandleSetter", + "lombok.javac.handlers.HandleSneakyThrows", + "lombok.javac.handlers.HandleStandardException", + "lombok.javac.handlers.HandleSuperBuilder", + "lombok.javac.handlers.HandleSuperBuilderRemove", + "lombok.javac.handlers.HandleSynchronized", + "lombok.javac.handlers.HandleToString", + "lombok.javac.handlers.HandleUtilityClass", + "lombok.javac.handlers.HandleValue", + "lombok.javac.handlers.HandleWith", + "lombok.javac.handlers.HandleWithBy" + ], + "lombok.javac.handlers.JavacSingularsRecipes$JavacSingularizer": [ + "lombok.javac.handlers.singulars.JavacGuavaMapSingularizer", + "lombok.javac.handlers.singulars.JavacGuavaSetListSingularizer", + "lombok.javac.handlers.singulars.JavacGuavaTableSingularizer", + "lombok.javac.handlers.singulars.JavacJavaUtilListSingularizer", + "lombok.javac.handlers.singulars.JavacJavaUtilMapSingularizer", + "lombok.javac.handlers.singulars.JavacJavaUtilSetSingularizer" + ] + } + }, + "repositories": { + "https://repo1.maven.org/maven2/": [ + "org.projectlombok:lombok" + ] + }, + "version": "2" +}