From 3fc401d06998479a507155eed18f5e224f98aa31 Mon Sep 17 00:00:00 2001 From: Lorenzo Dematte Date: Fri, 7 Feb 2025 16:10:04 +0100 Subject: [PATCH 01/12] Use hadoop patcher for hdfs-fixture too --- .../plugins/cli/InstallPluginAction.java | 11 +++++++---- .../hadoop-client-api/build.gradle | 12 +++--------- .../hadoop-common-patcher/build.gradle | 9 +++++++++ .../hdfs/patch/HdfsClassPatcher.java | 19 +++++++++---------- .../hdfs/patch/MethodReplacement.java | 0 .../hdfs/patch/ShellPatcher.java | 0 .../patch/ShutdownHookManagerPatcher.java | 0 .../hdfs/patch/SubjectGetSubjectPatcher.java | 0 test/fixtures/hdfs-fixture/build.gradle | 17 +++++++++++++++++ 9 files changed, 45 insertions(+), 23 deletions(-) create mode 100644 plugins/repository-hdfs/hadoop-common-patcher/build.gradle rename plugins/repository-hdfs/{hadoop-client-api/src/patcher => hadoop-common-patcher/src/main}/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java (72%) rename plugins/repository-hdfs/{hadoop-client-api/src/patcher => hadoop-common-patcher/src/main}/java/org/elasticsearch/hdfs/patch/MethodReplacement.java (100%) rename plugins/repository-hdfs/{hadoop-client-api/src/patcher => hadoop-common-patcher/src/main}/java/org/elasticsearch/hdfs/patch/ShellPatcher.java (100%) rename plugins/repository-hdfs/{hadoop-client-api/src/patcher => hadoop-common-patcher/src/main}/java/org/elasticsearch/hdfs/patch/ShutdownHookManagerPatcher.java (100%) rename plugins/repository-hdfs/{hadoop-client-api/src/patcher => hadoop-common-patcher/src/main}/java/org/elasticsearch/hdfs/patch/SubjectGetSubjectPatcher.java (100%) diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java index f4601d70a7f0a..0803d24c3914f 100644 --- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java +++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java @@ -38,6 +38,7 @@ import org.elasticsearch.core.Tuple; import org.elasticsearch.env.Environment; import org.elasticsearch.jdk.JarHell; +import org.elasticsearch.jdk.RuntimeVersionFeature; import org.elasticsearch.plugin.scanner.ClassReaders; import org.elasticsearch.plugin.scanner.NamedComponentScanner; import org.elasticsearch.plugins.Platforms; @@ -922,10 +923,12 @@ void jarHellCheck(PluginDescriptor candidateInfo, Path candidateDir, Path plugin */ private PluginDescriptor installPlugin(InstallablePlugin descriptor, Path tmpRoot, List deleteOnFailure) throws Exception { final PluginDescriptor info = loadPluginInfo(tmpRoot); - PluginPolicyInfo pluginPolicy = PolicyUtil.getPluginPolicyInfo(tmpRoot, env.tmpDir()); - if (pluginPolicy != null) { - Set permissions = PluginSecurity.getPermissionDescriptions(pluginPolicy, env.tmpDir()); - PluginSecurity.confirmPolicyExceptions(terminal, permissions, batch); + if (RuntimeVersionFeature.isSecurityManagerAvailable()) { + PluginPolicyInfo pluginPolicy = PolicyUtil.getPluginPolicyInfo(tmpRoot, env.tmpDir()); + if (pluginPolicy != null) { + Set permissions = PluginSecurity.getPermissionDescriptions(pluginPolicy, env.tmpDir()); + PluginSecurity.confirmPolicyExceptions(terminal, permissions, batch); + } } // Validate that the downloaded plugin's ID matches what we expect from the descriptor. The diff --git a/plugins/repository-hdfs/hadoop-client-api/build.gradle b/plugins/repository-hdfs/hadoop-client-api/build.gradle index 46b0d949cdee2..6d2257833f339 100644 --- a/plugins/repository-hdfs/hadoop-client-api/build.gradle +++ b/plugins/repository-hdfs/hadoop-client-api/build.gradle @@ -2,32 +2,26 @@ import org.gradle.api.file.ArchiveOperations apply plugin: 'elasticsearch.java' -sourceSets { - patcher -} - configurations { thejar { canBeResolved = true } + patcher } dependencies { thejar("org.apache.hadoop:hadoop-client-api:${project.parent.versions.hadoop}") { transitive = false } - - patcherImplementation 'org.ow2.asm:asm:9.7.1' - patcherImplementation 'org.ow2.asm:asm-tree:9.7.1' + patcher(project(':plugins:repository-hdfs:hadoop-common-patcher')) } def outputDir = layout.buildDirectory.dir("patched-classes") def patchTask = tasks.register("patchClasses", JavaExec) { inputs.files(configurations.thejar).withPathSensitivity(PathSensitivity.RELATIVE) - inputs.files(sourceSets.patcher.output).withPathSensitivity(PathSensitivity.RELATIVE) outputs.dir(outputDir) - classpath = sourceSets.patcher.runtimeClasspath + classpath = configurations.patcher mainClass = 'org.elasticsearch.hdfs.patch.HdfsClassPatcher' def thejar = configurations.thejar doFirst { diff --git a/plugins/repository-hdfs/hadoop-common-patcher/build.gradle b/plugins/repository-hdfs/hadoop-common-patcher/build.gradle new file mode 100644 index 0000000000000..28398618b2ad7 --- /dev/null +++ b/plugins/repository-hdfs/hadoop-common-patcher/build.gradle @@ -0,0 +1,9 @@ +import org.gradle.api.file.ArchiveOperations + +apply plugin: 'elasticsearch.java' + +dependencies { + implementation 'org.ow2.asm:asm:9.7.1' + implementation 'org.ow2.asm:asm-tree:9.7.1' +} + diff --git a/plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java b/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java similarity index 72% rename from plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java rename to plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java index 732c55929454e..58a50d1cebd29 100644 --- a/plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java +++ b/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java @@ -41,18 +41,17 @@ public static void main(String[] args) throws Exception { try (JarFile jarFile = new JarFile(new File(jarPath))) { for (var patcher : patchers.entrySet()) { JarEntry jarEntry = jarFile.getJarEntry(patcher.getKey()); - if (jarEntry == null) { - throw new IllegalArgumentException("path [" + patcher.getKey() + "] not found in [" + jarPath + "]"); - } - byte[] classToPatch = jarFile.getInputStream(jarEntry).readAllBytes(); + if (jarEntry != null) { + byte[] classToPatch = jarFile.getInputStream(jarEntry).readAllBytes(); - ClassReader classReader = new ClassReader(classToPatch); - ClassWriter classWriter = new ClassWriter(classReader, 0); - classReader.accept(patcher.getValue().apply(classWriter), 0); + ClassReader classReader = new ClassReader(classToPatch); + ClassWriter classWriter = new ClassWriter(classReader, 0); + classReader.accept(patcher.getValue().apply(classWriter), 0); - Path outputFile = outputDir.resolve(patcher.getKey()); - Files.createDirectories(outputFile.getParent()); - Files.write(outputFile, classWriter.toByteArray()); + Path outputFile = outputDir.resolve(patcher.getKey()); + Files.createDirectories(outputFile.getParent()); + Files.write(outputFile, classWriter.toByteArray()); + } } } } diff --git a/plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/MethodReplacement.java b/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/MethodReplacement.java similarity index 100% rename from plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/MethodReplacement.java rename to plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/MethodReplacement.java diff --git a/plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/ShellPatcher.java b/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShellPatcher.java similarity index 100% rename from plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/ShellPatcher.java rename to plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShellPatcher.java diff --git a/plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/ShutdownHookManagerPatcher.java b/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShutdownHookManagerPatcher.java similarity index 100% rename from plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/ShutdownHookManagerPatcher.java rename to plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShutdownHookManagerPatcher.java diff --git a/plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/SubjectGetSubjectPatcher.java b/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/SubjectGetSubjectPatcher.java similarity index 100% rename from plugins/repository-hdfs/hadoop-client-api/src/patcher/java/org/elasticsearch/hdfs/patch/SubjectGetSubjectPatcher.java rename to plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/SubjectGetSubjectPatcher.java diff --git a/test/fixtures/hdfs-fixture/build.gradle b/test/fixtures/hdfs-fixture/build.gradle index 857f497b29084..8de1a3e9a83b0 100644 --- a/test/fixtures/hdfs-fixture/build.gradle +++ b/test/fixtures/hdfs-fixture/build.gradle @@ -16,6 +16,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar configurations { hdfs2 hdfs3 + patcher consumable("shadowedHdfs2") } @@ -85,6 +86,21 @@ dependencies { exclude group: "org.apache.geronimo.specs", module: "geronimo-jcache_1.0_spec" exclude group: "org.xerial.snappy", module: "snappy-java" } + + patcher(project(':plugins:repository-hdfs:hadoop-common-patcher')) +} + +def outputDir = layout.buildDirectory.dir("patched-classes") + +def patchTask = tasks.register("patchClasses", JavaExec) { + inputs.files(configurations.hdfs2).withPathSensitivity(PathSensitivity.RELATIVE) + outputs.dir(outputDir) + classpath = configurations.patcher + mainClass = 'org.elasticsearch.hdfs.patch.HdfsClassPatcher' + def jarToPatch = configurations.hdfs2.getFiles().find { f -> f.getName().endsWith("hadoop-common-2.8.5.jar")} + doFirst { + args(jarToPatch, outputDir.get().asFile) + } } tasks.named("shadowJar").configure { @@ -104,6 +120,7 @@ def hdfs2Jar = tasks.register("hdfs2jar", ShadowJar) { } archiveClassifier.set("hdfs2") from sourceSets.main.output + from patchTask configurations.add(project.configurations.hdfs2) } From 6de0f88d19e92142349ba60e79705df34683461c Mon Sep 17 00:00:00 2001 From: Lorenzo Dematte Date: Mon, 17 Feb 2025 13:06:40 +0100 Subject: [PATCH 02/12] Try to use gradle transformer, not working --- .../patches/hdfs/HdfsClassPatcher.java | 147 ++++++++++++++++++ .../patches/hdfs}/MethodReplacement.java | 2 +- .../patches/hdfs}/ShellPatcher.java | 2 +- .../hdfs}/ShutdownHookManagerPatcher.java | 2 +- .../hdfs}/SubjectGetSubjectPatcher.java | 2 +- plugins/repository-hdfs/build.gradle | 22 +++ .../hadoop-client-api/build.gradle | 45 ++---- .../hdfs/patch/HdfsClassPatcher.java | 58 ------- test/fixtures/hdfs-fixture/build.gradle | 40 ++--- 9 files changed, 210 insertions(+), 110 deletions(-) create mode 100644 build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java rename {plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch => build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs}/MethodReplacement.java (94%) rename {plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch => build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs}/ShellPatcher.java (94%) rename {plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch => build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs}/ShutdownHookManagerPatcher.java (97%) rename {plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch => build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs}/SubjectGetSubjectPatcher.java (97%) delete mode 100644 plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java new file mode 100644 index 0000000000000..d797cdb14b91e --- /dev/null +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java @@ -0,0 +1,147 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.gradle.internal.dependencies.patches.hdfs; + +import org.gradle.api.artifacts.transform.CacheableTransform; +import org.gradle.api.artifacts.transform.InputArtifact; +import org.gradle.api.artifacts.transform.TransformAction; +import org.gradle.api.artifacts.transform.TransformOutputs; +import org.gradle.api.artifacts.transform.TransformParameters; +import org.gradle.api.file.FileSystemLocation; +import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.Classpath; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Optional; +import org.jetbrains.annotations.NotNull; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.function.Function; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; +import java.util.stream.Stream; + +import static java.util.Map.entry; + + +@CacheableTransform +public abstract class HdfsClassPatcher implements TransformAction { + + record JarPatchers(String artifactName, Map> jarPatchers) {} + + static final List allPatchers = List.of( + new JarPatchers( + "hadoop-common", + Map.ofEntries( + entry("org/apache/hadoop/util/ShutdownHookManager.class", ShutdownHookManagerPatcher::new), + entry("org/apache/hadoop/util/Shell.class", ShellPatcher::new), + entry("org/apache/hadoop/security/UserGroupInformation.class", SubjectGetSubjectPatcher::new) + ) + ), + new JarPatchers( + "hadoop-auth", + Map.of( + "org/apache/hadoop/security/authentication/client/KerberosAuthenticator.class", + SubjectGetSubjectPatcher::new + ) + ) + ); + + interface Parameters extends TransformParameters { + @Input + @Optional + List getMatchingArtifacts(); + + void setMatchingArtifacts(List matchingArtifacts); + } + + @Classpath + @InputArtifact + public abstract Provider getInputArtifact(); + + @Override + public void transform(@NotNull TransformOutputs outputs) { + File inputFile = getInputArtifact().get().getAsFile(); + + List matchingArtifacts = getParameters().getMatchingArtifacts(); + if (matchingArtifacts.isEmpty() == false && + matchingArtifacts.stream().noneMatch(supported -> inputFile.getName().contains(supported)) + ) { + outputs.file(getInputArtifact()); + } else { + Stream patchersToApply = allPatchers.stream().filter(jp -> matchingArtifacts.contains(jp.artifactName())); + patchersToApply.forEach(patchers -> { + Map> jarPatchers = new HashMap<>(patchers.jarPatchers()); + File outputFile = outputs.file(inputFile.getName().replace(".jar", "-patched.jar")); + + patchJar(inputFile, outputFile, jarPatchers); + + if (jarPatchers.isEmpty() == false) { + throw new IllegalArgumentException( + String.format( + Locale.ROOT, + "error patching [%s] with [%s]: the jar does not contain [%s]", + inputFile.getName(), + patchers.artifactName(), + String.join(", ", jarPatchers.keySet()) + ) + ); + } + }); + } + } + + private static void patchJar(File inputFile, File outputFile, Map> jarPatchers) { + try (JarFile jarFile = new JarFile(inputFile); JarOutputStream jos = new JarOutputStream(new FileOutputStream(outputFile))) { + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + String entryName = entry.getName(); + // Add the entry to the new JAR file + jos.putNextEntry(new JarEntry(entryName)); + System.out.println("EntryName = " + entryName); + + Function classPatcher = jarPatchers.remove(entryName); + if (classPatcher != null) { + System.out.println("Patching " + entryName); + byte[] classToPatch = jarFile.getInputStream(entry).readAllBytes(); + + ClassReader classReader = new ClassReader(classToPatch); + ClassWriter classWriter = new ClassWriter(classReader, 0); + classReader.accept(classPatcher.apply(classWriter), 0); + + jos.write(classWriter.toByteArray()); + } else { + // Read the entry's data and write it to the new JAR + try (InputStream is = jarFile.getInputStream(entry)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = is.read(buffer)) != -1) { + jos.write(buffer, 0, bytesRead); + } + } + } + jos.closeEntry(); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } +} diff --git a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/MethodReplacement.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/MethodReplacement.java similarity index 94% rename from plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/MethodReplacement.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/MethodReplacement.java index e07a32cc294a5..7bc6a6c0d530f 100644 --- a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/MethodReplacement.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/MethodReplacement.java @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -package org.elasticsearch.hdfs.patch; +package org.elasticsearch.gradle.internal.dependencies.patches.hdfs; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; diff --git a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShellPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/ShellPatcher.java similarity index 94% rename from plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShellPatcher.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/ShellPatcher.java index 397b63e434ba2..ab63249f5c8e8 100644 --- a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShellPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/ShellPatcher.java @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -package org.elasticsearch.hdfs.patch; +package org.elasticsearch.gradle.internal.dependencies.patches.hdfs; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; diff --git a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShutdownHookManagerPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/ShutdownHookManagerPatcher.java similarity index 97% rename from plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShutdownHookManagerPatcher.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/ShutdownHookManagerPatcher.java index 1235b5af9002f..4efe48a3bf72d 100644 --- a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/ShutdownHookManagerPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/ShutdownHookManagerPatcher.java @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -package org.elasticsearch.hdfs.patch; +package org.elasticsearch.gradle.internal.dependencies.patches.hdfs; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; diff --git a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/SubjectGetSubjectPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/SubjectGetSubjectPatcher.java similarity index 97% rename from plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/SubjectGetSubjectPatcher.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/SubjectGetSubjectPatcher.java index 3fb8a23be794d..3b241f7001fb4 100644 --- a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/SubjectGetSubjectPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/SubjectGetSubjectPatcher.java @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -package org.elasticsearch.hdfs.patch; +package org.elasticsearch.gradle.internal.dependencies.patches.hdfs; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; diff --git a/plugins/repository-hdfs/build.gradle b/plugins/repository-hdfs/build.gradle index 7df46699b79e2..097fdb75ee7a9 100644 --- a/plugins/repository-hdfs/build.gradle +++ b/plugins/repository-hdfs/build.gradle @@ -22,12 +22,20 @@ versions << [ 'hadoop': '3.4.1' ] +def patched = Attribute.of('patched', Boolean) + configurations { hdfsFixture2 hdfsFixture3 + hdfsClientApi { + attributes { + attribute(patched, true) + } + } } dependencies { + hdfsClientApi "org.apache.hadoop:hadoop-client-api:${versions.hadoop}" api project(path: 'hadoop-client-api', configuration: 'default') if (isEclipse) { /* @@ -69,6 +77,20 @@ dependencies { hdfsFixture2 project(path: ':test:fixtures:hdfs-fixture', configuration: 'shadowedHdfs2') hdfsFixture3 project(path: ':test:fixtures:hdfs-fixture', configuration: 'shadow') + + attributesSchema { + attribute(patched) + } + artifactTypes.getByName("jar") { + attributes.attribute(patched, false) + } + registerTransform(org.elasticsearch.gradle.internal.dependencies.patches.hdfs.HdfsClassPatcher) { + from.attribute(patched, false) + to.attribute(patched, true) + parameters { + matchingArtifacts = ["hadoop-common", "hadoop-auth"] + } + } } restResources { diff --git a/plugins/repository-hdfs/hadoop-client-api/build.gradle b/plugins/repository-hdfs/hadoop-client-api/build.gradle index 6d2257833f339..2245097a167b2 100644 --- a/plugins/repository-hdfs/hadoop-client-api/build.gradle +++ b/plugins/repository-hdfs/hadoop-client-api/build.gradle @@ -2,47 +2,32 @@ import org.gradle.api.file.ArchiveOperations apply plugin: 'elasticsearch.java' +def patched = Attribute.of('patched', Boolean) + configurations { thejar { canBeResolved = true + attributes { + attribute(patched, true) + } } - patcher } dependencies { thejar("org.apache.hadoop:hadoop-client-api:${project.parent.versions.hadoop}") { transitive = false } - patcher(project(':plugins:repository-hdfs:hadoop-common-patcher')) -} - -def outputDir = layout.buildDirectory.dir("patched-classes") - -def patchTask = tasks.register("patchClasses", JavaExec) { - inputs.files(configurations.thejar).withPathSensitivity(PathSensitivity.RELATIVE) - outputs.dir(outputDir) - classpath = configurations.patcher - mainClass = 'org.elasticsearch.hdfs.patch.HdfsClassPatcher' - def thejar = configurations.thejar - doFirst { - args(thejar.singleFile, outputDir.get().asFile) + attributesSchema { + attribute(patched) } -} - -interface InjectedArchiveOps { - @Inject ArchiveOperations getArchiveOperations() -} - -tasks.named('jar').configure { - dependsOn(configurations.thejar) - def injected = project.objects.newInstance(InjectedArchiveOps) - def thejar = configurations.thejar - from(patchTask) - from({ injected.getArchiveOperations().zipTree(thejar.singleFile) }) { - eachFile { - if (outputDir.get().file(it.relativePath.pathString).asFile.exists()) { - it.exclude() - } + artifactTypes.getByName("jar") { + attributes.attribute(patched, false) + } + registerTransform(org.elasticsearch.gradle.internal.dependencies.patches.hdfs.HdfsClassPatcher) { + from.attribute(patched, false) + to.attribute(patched, true) + parameters { + matchingArtifacts = ["hadoop-common", "hadoop-auth"] } } } diff --git a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java b/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java deleted file mode 100644 index 58a50d1cebd29..0000000000000 --- a/plugins/repository-hdfs/hadoop-common-patcher/src/main/java/org/elasticsearch/hdfs/patch/HdfsClassPatcher.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -package org.elasticsearch.hdfs.patch; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; - -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Map; -import java.util.function.Function; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -public class HdfsClassPatcher { - static final Map> patchers = Map.of( - "org/apache/hadoop/util/ShutdownHookManager.class", - ShutdownHookManagerPatcher::new, - "org/apache/hadoop/util/Shell.class", - ShellPatcher::new, - "org/apache/hadoop/security/UserGroupInformation.class", - SubjectGetSubjectPatcher::new, - "org/apache/hadoop/security/authentication/client/KerberosAuthenticator.class", - SubjectGetSubjectPatcher::new - ); - - public static void main(String[] args) throws Exception { - String jarPath = args[0]; - Path outputDir = Paths.get(args[1]); - - try (JarFile jarFile = new JarFile(new File(jarPath))) { - for (var patcher : patchers.entrySet()) { - JarEntry jarEntry = jarFile.getJarEntry(patcher.getKey()); - if (jarEntry != null) { - byte[] classToPatch = jarFile.getInputStream(jarEntry).readAllBytes(); - - ClassReader classReader = new ClassReader(classToPatch); - ClassWriter classWriter = new ClassWriter(classReader, 0); - classReader.accept(patcher.getValue().apply(classWriter), 0); - - Path outputFile = outputDir.resolve(patcher.getKey()); - Files.createDirectories(outputFile.getParent()); - Files.write(outputFile, classWriter.toByteArray()); - } - } - } - } -} diff --git a/test/fixtures/hdfs-fixture/build.gradle b/test/fixtures/hdfs-fixture/build.gradle index 8de1a3e9a83b0..174169d08b783 100644 --- a/test/fixtures/hdfs-fixture/build.gradle +++ b/test/fixtures/hdfs-fixture/build.gradle @@ -13,10 +13,30 @@ apply plugin: 'com.gradleup.shadow' import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +def patched = Attribute.of('patched', Boolean) +dependencies { + attributesSchema { + attribute(patched) + } + artifactTypes.getByName("jar") { + attributes.attribute(patched, false) + } + registerTransform(org.elasticsearch.gradle.internal.dependencies.patches.hdfs.HdfsClassPatcher) { + from.attribute(patched, false) + to.attribute(patched, true) + parameters { + matchingArtifacts = ["hadoop-common"] + } + } +} + configurations { - hdfs2 + hdfs2 { + attributes { + attribute(patched, true) + } + } hdfs3 - patcher consumable("shadowedHdfs2") } @@ -86,21 +106,6 @@ dependencies { exclude group: "org.apache.geronimo.specs", module: "geronimo-jcache_1.0_spec" exclude group: "org.xerial.snappy", module: "snappy-java" } - - patcher(project(':plugins:repository-hdfs:hadoop-common-patcher')) -} - -def outputDir = layout.buildDirectory.dir("patched-classes") - -def patchTask = tasks.register("patchClasses", JavaExec) { - inputs.files(configurations.hdfs2).withPathSensitivity(PathSensitivity.RELATIVE) - outputs.dir(outputDir) - classpath = configurations.patcher - mainClass = 'org.elasticsearch.hdfs.patch.HdfsClassPatcher' - def jarToPatch = configurations.hdfs2.getFiles().find { f -> f.getName().endsWith("hadoop-common-2.8.5.jar")} - doFirst { - args(jarToPatch, outputDir.get().asFile) - } } tasks.named("shadowJar").configure { @@ -120,7 +125,6 @@ def hdfs2Jar = tasks.register("hdfs2jar", ShadowJar) { } archiveClassifier.set("hdfs2") from sourceSets.main.output - from patchTask configurations.add(project.configurations.hdfs2) } From 537cdd7ae6ff37207bb0a71a683a06afbb4a691a Mon Sep 17 00:00:00 2001 From: Lorenzo Dematte Date: Mon, 17 Feb 2025 13:08:53 +0100 Subject: [PATCH 03/12] Removing patcher project --- .../repository-hdfs/hadoop-common-patcher/build.gradle | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 plugins/repository-hdfs/hadoop-common-patcher/build.gradle diff --git a/plugins/repository-hdfs/hadoop-common-patcher/build.gradle b/plugins/repository-hdfs/hadoop-common-patcher/build.gradle deleted file mode 100644 index 28398618b2ad7..0000000000000 --- a/plugins/repository-hdfs/hadoop-common-patcher/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -import org.gradle.api.file.ArchiveOperations - -apply plugin: 'elasticsearch.java' - -dependencies { - implementation 'org.ow2.asm:asm:9.7.1' - implementation 'org.ow2.asm:asm-tree:9.7.1' -} - From 1d389bf6faf18791a2f559969641eae8177eb0c1 Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Mon, 17 Feb 2025 12:18:12 +0000 Subject: [PATCH 04/12] [CI] Auto commit changes from spotless --- .../dependencies/patches/hdfs/HdfsClassPatcher.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java index d797cdb14b91e..1f3aa687e9ebd 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java @@ -23,6 +23,7 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -40,7 +41,6 @@ import static java.util.Map.entry; - @CacheableTransform public abstract class HdfsClassPatcher implements TransformAction { @@ -57,10 +57,7 @@ record JarPatchers(String artifactName, Map matchingArtifacts = getParameters().getMatchingArtifacts(); - if (matchingArtifacts.isEmpty() == false && - matchingArtifacts.stream().noneMatch(supported -> inputFile.getName().contains(supported)) - ) { + if (matchingArtifacts.isEmpty() == false + && matchingArtifacts.stream().noneMatch(supported -> inputFile.getName().contains(supported))) { outputs.file(getInputArtifact()); } else { Stream patchersToApply = allPatchers.stream().filter(jp -> matchingArtifacts.contains(jp.artifactName())); From bb497df3e224f5e6a47488eebd7d677591d57817 Mon Sep 17 00:00:00 2001 From: Lorenzo Dematte Date: Mon, 17 Feb 2025 14:54:32 +0100 Subject: [PATCH 05/12] Patcher fix --- .../patches/hdfs/HdfsClassPatcher.java | 38 ++++--------------- 1 file changed, 7 insertions(+), 31 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java index d797cdb14b91e..413a367b523a4 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java @@ -23,14 +23,13 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; -import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.function.Function; import java.util.jar.JarEntry; @@ -40,7 +39,6 @@ import static java.util.Map.entry; - @CacheableTransform public abstract class HdfsClassPatcher implements TransformAction { @@ -57,10 +55,7 @@ record JarPatchers(String artifactName, Map matchingArtifacts = getParameters().getMatchingArtifacts(); - if (matchingArtifacts.isEmpty() == false && - matchingArtifacts.stream().noneMatch(supported -> inputFile.getName().contains(supported)) - ) { + if (matchingArtifacts.isEmpty() == false + && matchingArtifacts.stream().noneMatch(supported -> inputFile.getName().contains(supported))) { outputs.file(getInputArtifact()); } else { Stream patchersToApply = allPatchers.stream().filter(jp -> matchingArtifacts.contains(jp.artifactName())); patchersToApply.forEach(patchers -> { - Map> jarPatchers = new HashMap<>(patchers.jarPatchers()); File outputFile = outputs.file(inputFile.getName().replace(".jar", "-patched.jar")); - - patchJar(inputFile, outputFile, jarPatchers); - - if (jarPatchers.isEmpty() == false) { - throw new IllegalArgumentException( - String.format( - Locale.ROOT, - "error patching [%s] with [%s]: the jar does not contain [%s]", - inputFile.getName(), - patchers.artifactName(), - String.join(", ", jarPatchers.keySet()) - ) - ); - } + patchJar(inputFile, outputFile, patchers.jarPatchers()); }); } } @@ -118,7 +98,7 @@ private static void patchJar(File inputFile, File outputFile, Map Date: Tue, 18 Feb 2025 13:39:00 +0100 Subject: [PATCH 06/12] Fix repository-hdfs gradle to perform transformation directly --- .../patches/hdfs/HdfsClassPatcher.java | 9 +- plugins/repository-hdfs/build.gradle | 30 +-- .../hadoop-client-api/build.gradle | 33 --- .../licenses/hadoop-client-api-LICENSE.txt | 202 ------------------ .../licenses/hadoop-client-api-NOTICE.txt | 2 - 5 files changed, 25 insertions(+), 251 deletions(-) delete mode 100644 plugins/repository-hdfs/hadoop-client-api/build.gradle delete mode 100644 plugins/repository-hdfs/hadoop-client-api/licenses/hadoop-client-api-LICENSE.txt delete mode 100644 plugins/repository-hdfs/hadoop-client-api/licenses/hadoop-client-api-NOTICE.txt diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java index 413a367b523a4..0ecd32b1cc374 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java @@ -54,8 +54,13 @@ record JarPatchers(String artifactName, Map Date: Tue, 18 Feb 2025 17:48:34 +0100 Subject: [PATCH 07/12] Add test classpaths --- plugins/repository-hdfs/build.gradle | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/repository-hdfs/build.gradle b/plugins/repository-hdfs/build.gradle index 925a06b82ada1..eac0109bc499d 100644 --- a/plugins/repository-hdfs/build.gradle +++ b/plugins/repository-hdfs/build.gradle @@ -37,6 +37,16 @@ configurations { attribute(patched, true) } } + testCompileClasspath { + attributes { + attribute(patched, true) + } + } + testRuntimeClasspath { + attributes { + attribute(patched, true) + } + } } dependencies { From c86d491f73f3355729da389bb84f109bb696c607 Mon Sep 17 00:00:00 2001 From: Lorenzo Dematte Date: Wed, 19 Feb 2025 11:23:57 +0100 Subject: [PATCH 08/12] Unmuting --- .../dependencies/patches/hdfs/HdfsClassPatcher.java | 2 -- muted-tests.yml | 6 ------ 2 files changed, 8 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java index 0ecd32b1cc374..17c0b080f9f0e 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java @@ -101,11 +101,9 @@ private static void patchJar(File inputFile, File outputFile, Map Date: Wed, 19 Feb 2025 14:53:43 +0100 Subject: [PATCH 09/12] Reorder gradle file --- test/fixtures/hdfs-fixture/build.gradle | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/test/fixtures/hdfs-fixture/build.gradle b/test/fixtures/hdfs-fixture/build.gradle index 174169d08b783..47187f90fa296 100644 --- a/test/fixtures/hdfs-fixture/build.gradle +++ b/test/fixtures/hdfs-fixture/build.gradle @@ -14,6 +14,16 @@ apply plugin: 'com.gradleup.shadow' import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar def patched = Attribute.of('patched', Boolean) +configurations { + hdfs2 { + attributes { + attribute(patched, true) + } + } + hdfs3 + consumable("shadowedHdfs2") +} + dependencies { attributesSchema { attribute(patched) @@ -28,19 +38,7 @@ dependencies { matchingArtifacts = ["hadoop-common"] } } -} - -configurations { - hdfs2 { - attributes { - attribute(patched, true) - } - } - hdfs3 - consumable("shadowedHdfs2") -} -dependencies { compileOnly("org.apache.hadoop:hadoop-minicluster:2.8.5") api("com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}") { transitive = false From affaf730802c2688812281b122ebd5999d13ebec Mon Sep 17 00:00:00 2001 From: Lorenzo Dematte Date: Wed, 19 Feb 2025 16:30:49 +0100 Subject: [PATCH 10/12] Regex? --- .../patches/hdfs/HdfsClassPatcher.java | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java index 17c0b080f9f0e..a0135687af650 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java @@ -29,12 +29,16 @@ import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; +import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.function.Function; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; +import java.util.regex.Pattern; import java.util.stream.Stream; import static java.util.Map.entry; @@ -42,11 +46,12 @@ @CacheableTransform public abstract class HdfsClassPatcher implements TransformAction { - record JarPatchers(String artifactName, Map> jarPatchers) {} + record JarPatchers(String artifactTag, Pattern artifactPattern, Map> jarPatchers) {} static final List allPatchers = List.of( new JarPatchers( "hadoop-common", + Pattern.compile("hadoop-common-(?!.*tests)"), Map.ofEntries( entry("org/apache/hadoop/util/ShutdownHookManager.class", ShutdownHookManagerPatcher::new), entry("org/apache/hadoop/util/Shell.class", ShellPatcher::new), @@ -55,6 +60,7 @@ record JarPatchers(String artifactName, Map matchingArtifacts = getParameters().getMatchingArtifacts(); - if (matchingArtifacts.isEmpty() == false - && matchingArtifacts.stream().noneMatch(supported -> inputFile.getName().contains(supported))) { + List patchersToApply = allPatchers.stream().filter(jp -> matchingArtifacts.contains(jp.artifactTag()) && + jp.artifactPattern().asMatchPredicate().test(inputFile.getName())).toList(); + if (patchersToApply.isEmpty()) { outputs.file(getInputArtifact()); } else { - Stream patchersToApply = allPatchers.stream().filter(jp -> matchingArtifacts.contains(jp.artifactName())); patchersToApply.forEach(patchers -> { + System.out.println("Patching " + inputFile.getName()); + + Map> jarPatchers = new HashMap<>(patchers.jarPatchers()); File outputFile = outputs.file(inputFile.getName().replace(".jar", "-patched.jar")); - patchJar(inputFile, outputFile, patchers.jarPatchers()); + + patchJar(inputFile, outputFile, jarPatchers); + + if (jarPatchers.isEmpty() == false) { + throw new IllegalArgumentException( + String.format( + Locale.ROOT, + "error patching [%s] with [%s]: the jar does not contain [%s]", + inputFile.getName(), + patchers.artifactPattern().toString(), + String.join(", ", jarPatchers.keySet()) + ) + ); + } }); } } @@ -102,7 +124,7 @@ private static void patchJar(File inputFile, File outputFile, Map classPatcher = jarPatchers.get(entryName); + Function classPatcher = jarPatchers.remove(entryName); if (classPatcher != null) { byte[] classToPatch = jarFile.getInputStream(entry).readAllBytes(); From 791c56b6815accfc22048eeff43491cd19abf581 Mon Sep 17 00:00:00 2001 From: Lorenzo Dematte Date: Wed, 19 Feb 2025 17:10:29 +0100 Subject: [PATCH 11/12] Add hdfs3 fixture too --- test/fixtures/hdfs-fixture/build.gradle | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/fixtures/hdfs-fixture/build.gradle b/test/fixtures/hdfs-fixture/build.gradle index 47187f90fa296..6360ead8126fa 100644 --- a/test/fixtures/hdfs-fixture/build.gradle +++ b/test/fixtures/hdfs-fixture/build.gradle @@ -20,7 +20,11 @@ configurations { attribute(patched, true) } } - hdfs3 + hdfs3 { + attributes { + attribute(patched, true) + } + } consumable("shadowedHdfs2") } From cecb60ba1408b1e415ed4dec9ece827db1543955 Mon Sep 17 00:00:00 2001 From: Lorenzo Dematte Date: Wed, 19 Feb 2025 17:11:29 +0100 Subject: [PATCH 12/12] Use regex to match artifact; add check that we patch all classes in the matched artifacts --- .../dependencies/patches/hdfs/HdfsClassPatcher.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java index a0135687af650..079ecab783ac2 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/hdfs/HdfsClassPatcher.java @@ -33,13 +33,11 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Set; import java.util.function.Function; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.regex.Pattern; -import java.util.stream.Stream; import static java.util.Map.entry; @@ -87,8 +85,9 @@ public void transform(@NotNull TransformOutputs outputs) { File inputFile = getInputArtifact().get().getAsFile(); List matchingArtifacts = getParameters().getMatchingArtifacts(); - List patchersToApply = allPatchers.stream().filter(jp -> matchingArtifacts.contains(jp.artifactTag()) && - jp.artifactPattern().asMatchPredicate().test(inputFile.getName())).toList(); + List patchersToApply = allPatchers.stream() + .filter(jp -> matchingArtifacts.contains(jp.artifactTag()) && jp.artifactPattern().matcher(inputFile.getName()).find()) + .toList(); if (patchersToApply.isEmpty()) { outputs.file(getInputArtifact()); } else {