diff --git a/api/shadow.api b/api/shadow.api index cf28c3d2c..c983f9eaf 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -106,7 +106,9 @@ public final class com/github/jengelman/gradle/plugins/shadow/relocation/Relocat public final class com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContextKt { public static final fun relocateClass (Lcom/github/jengelman/gradle/plugins/shadow/relocation/Relocator;Ljava/lang/String;)Ljava/lang/String; + public static final fun relocateClass (Ljava/lang/Iterable;Ljava/lang/String;)Ljava/lang/String; public static final fun relocatePath (Lcom/github/jengelman/gradle/plugins/shadow/relocation/Relocator;Ljava/lang/String;)Ljava/lang/String; + public static final fun relocatePath (Ljava/lang/Iterable;Ljava/lang/String;)Ljava/lang/String; } public abstract interface class com/github/jengelman/gradle/plugins/shadow/relocation/Relocator { diff --git a/docs/changes/README.md b/docs/changes/README.md index 9fbe75076..7f4ace798 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -3,6 +3,10 @@ ## [Unreleased](https://github.com/GradleUp/shadow/compare/9.1.0...HEAD) - 2025-xx-xx +### Added + +- Add extensions for `Iterable`. ([#1710](https://github.com/GradleUp/shadow/pull/1710)) + ### Changed - Merge Gradle Module descriptors into the modern `META-INF` path. ([#1706](https://github.com/GradleUp/shadow/pull/1706)) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt index 95f850bc9..61f824852 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt @@ -28,11 +28,6 @@ internal class RelocatorRemapper( override fun map(internalName: String): String = mapName(internalName) - fun mapPath(path: String): String { - val dotIndex = path.indexOf('.') - return if (dotIndex == -1) path else map(path.take(dotIndex)) - } - private fun mapName(name: String, mapLiterals: Boolean = false): String { val newName = mapNameImpl(name, mapLiterals) if (newName != name) { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt index b3c5c628a..00fcc90ac 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt @@ -15,3 +15,21 @@ public fun Relocator.relocateClass(className: String): String { public fun Relocator.relocatePath(path: String): String { return relocatePath(RelocatePathContext(path)) } + +public fun Iterable.relocateClass(className: String): String { + forEach { relocator -> + if (relocator.canRelocateClass(className)) { + return relocator.relocateClass(className) + } + } + return className +} + +public fun Iterable.relocatePath(path: String): String { + forEach { relocator -> + if (relocator.canRelocatePath(path)) { + return relocator.relocatePath(path) + } + } + return path +} diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt index d28a37fc3..5587f1df3 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt @@ -4,6 +4,7 @@ import com.github.jengelman.gradle.plugins.shadow.internal.RelocatorRemapper import com.github.jengelman.gradle.plugins.shadow.internal.cast import com.github.jengelman.gradle.plugins.shadow.internal.zipEntry import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator +import com.github.jengelman.gradle.plugins.shadow.relocation.relocatePath import com.github.jengelman.gradle.plugins.shadow.transformers.ResourceTransformer import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext import java.io.File @@ -166,9 +167,9 @@ public open class ShadowCopyAction( } } else -> { - val mapped = RelocatorRemapper(relocators).map(path) - if (transform(fileDetails, mapped)) return - fileDetails.writeToZip(mapped) + val relocated = relocators.relocatePath(path) + if (transform(fileDetails, relocated)) return + fileDetails.writeToZip(relocated) } } } @@ -215,9 +216,9 @@ public open class ShadowCopyAction( // Temporarily remove the multi-release prefix. val multiReleasePrefix = "^META-INF/versions/\\d+/".toRegex().find(path)?.value.orEmpty() val newPath = path.replace(multiReleasePrefix, "") - val mappedName = multiReleasePrefix + remapper.mapPath(newPath) + val relocatedPath = multiReleasePrefix + relocators.relocatePath(newPath) try { - val entry = zipEntry("$mappedName.class", preserveFileTimestamps, lastModified) { + val entry = zipEntry(relocatedPath, preserveFileTimestamps, lastModified) { unixMode = UnixStat.FILE_FLAG or permissions.toUnixNumeric() } // Now we put it back on so the class file is written out with the right extension. @@ -225,16 +226,16 @@ public open class ShadowCopyAction( zipOutStr.write(newBytes) zipOutStr.closeEntry() } catch (_: ZipException) { - logger.warn("We have a duplicate $mappedName in source project") + logger.warn("We have a duplicate $relocatedPath in source project") } } - private fun transform(fileDetails: FileCopyDetails, mapped: String): Boolean { + private fun transform(fileDetails: FileCopyDetails, path: String): Boolean { val transformer = transformers.find { it.canTransformResource(fileDetails) } ?: return false fileDetails.file.inputStream().use { inputStream -> transformer.transform( TransformerContext( - path = mapped, + path = path, inputStream = inputStream, relocators = relocators, ), diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt index 9a4b731d3..a28e0e68e 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt @@ -63,14 +63,16 @@ public open class ComponentsXmlResourceTransformer : ResourceTransformer { val children = newDom.getChild("components").getChildren("component") for (component in children) { - var role: String? = getValue(component, "role") - role = getRelocatedClass(role, context) + val role = getValue(component, "role").let { + context.relocators.relocateClass(it) + } setValue(component, "role", role) val roleHint = getValue(component, "role-hint") - var impl: String? = getValue(component, "implementation") - impl = getRelocatedClass(impl, context) + val impl = getValue(component, "implementation").let { + context.relocators.relocateClass(it) + } setValue(component, "implementation", impl) val key = "$role:$roleHint" @@ -84,8 +86,9 @@ public open class ComponentsXmlResourceTransformer : ResourceTransformer { if (requirements != null && requirements.childCount > 0) { for (r in requirements.childCount - 1 downTo 0) { val requirement = requirements.getChild(r) - var requiredRole: String? = getValue(requirement, "role") - requiredRole = getRelocatedClass(requiredRole, context) + val requiredRole = getValue(requirement, "role").let { + context.relocators.relocateClass(it) + } setValue(requirement, "role", requiredRole) } } @@ -105,17 +108,6 @@ public open class ComponentsXmlResourceTransformer : ResourceTransformer { public companion object { public const val COMPONENTS_XML_PATH: String = "META-INF/plexus/components.xml" - private fun getRelocatedClass(className: String?, context: TransformerContext): String? { - if (!className.isNullOrEmpty()) { - for (relocator in context.relocators) { - if (relocator.canRelocateClass(className)) { - return relocator.relocateClass(className) - } - } - } - return className - } - private fun getValue(dom: Xpp3Dom, element: String): String { return dom.getChild(element).value.orEmpty() } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer.kt index 551ffd7a9..e3ec52983 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer.kt @@ -67,11 +67,7 @@ public open class Log4j2PluginsCacheFileTransformer : ResourceTransformer { internal fun relocatePlugins(pluginCache: PluginCache) { pluginCache.allCategories.values.forEach { currentMap -> currentMap.values.forEach { currentPluginEntry -> - val className = currentPluginEntry.className - tempRelocators.firstOrNull { it.canRelocateClass(className) }?.let { relocator -> - // Then we perform that relocation and update the plugin entry to reflect the new value. - currentPluginEntry.className = relocator.relocateClass(className) - } + currentPluginEntry.className = tempRelocators.relocateClass(currentPluginEntry.className) } } } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt index dbd7627e6..87e888583 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt @@ -45,24 +45,11 @@ public open class ServiceFileTransformer( } override fun transform(context: TransformerContext) { - var resource = context.path.substringAfter("$path/") - context.relocators.forEach { relocator -> - if (relocator.canRelocateClass(resource)) { - resource = relocator.relocateClass(resource) - return@forEach - } - } - resource = "$path/$resource" + val resource = path + "/" + + context.relocators.relocateClass(context.path.substringAfter("$path/")) val out = serviceEntries.getOrPut(resource) { mutableSetOf() } - - context.inputStream.bufferedReader().use { it.readLines() }.forEach { - var line = it - context.relocators.forEach { relocator -> - if (relocator.canRelocateClass(line)) { - line = relocator.relocateClass(line) - } - } - out.add(line) + context.inputStream.bufferedReader().use { it.readLines() }.forEach { line -> + out.add(context.relocators.relocateClass(line)) } }