diff --git a/api/shadow.api b/api/shadow.api index 5e2efff0c..81644f95e 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -385,6 +385,29 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/ManifestRes public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V } +public abstract class com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer, org/gradle/api/tasks/util/PatternFilterable { + public fun (Lorg/gradle/api/tasks/util/PatternSet;)V + public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z + public fun exclude (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun exclude (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun exclude (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun exclude ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun getExcludes ()Ljava/util/Set; + public fun getIncludes ()Ljava/util/Set; + public fun getName ()Ljava/lang/String; + public fun getObjectFactory ()Lorg/gradle/api/model/ObjectFactory; + public final fun getPatternSet ()Lorg/gradle/api/tasks/util/PatternSet; + public fun hasTransformedResource ()Z + public fun include (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun include (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun include (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun include ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun modifyOutputStream (Lorg/apache/tools/zip/ZipOutputStream;Z)V + public fun setExcludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun setIncludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V +} + public class com/github/jengelman/gradle/plugins/shadow/transformers/PreserveFirstFoundResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer { public fun (Lorg/gradle/api/model/ObjectFactory;)V public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z @@ -447,26 +470,13 @@ public final class com/github/jengelman/gradle/plugins/shadow/transformers/Resou public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V } -public class com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer, org/gradle/api/tasks/util/PatternFilterable { +public class com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer { public fun ()V public fun (Lorg/gradle/api/tasks/util/PatternSet;)V public synthetic fun (Lorg/gradle/api/tasks/util/PatternSet;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z - public fun exclude (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun exclude (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun exclude (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun exclude ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun getExcludes ()Ljava/util/Set; - public fun getIncludes ()Ljava/util/Set; public fun getPath ()Ljava/lang/String; public fun hasTransformedResource ()Z - public fun include (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun include (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun include (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun include ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun modifyOutputStream (Lorg/apache/tools/zip/ZipOutputStream;Z)V - public fun setExcludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun setIncludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun setPath (Ljava/lang/String;)V public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V } diff --git a/docs/changes/README.md b/docs/changes/README.md index a178c5b27..099b558b3 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -3,6 +3,11 @@ ## [Unreleased](https://github.com/GradleUp/shadow/compare/9.2.2...HEAD) - 2025-xx-xx +### Added + +- Add `PatternFilterableResourceTransformer` to simplify pattern based `ResourceTransformer`s. ([#1849](https://github.com/GradleUp/shadow/pull/1849)) +- Expose `patternSet` of `ServiceFileTransformer` as `public`. ([#1849](https://github.com/GradleUp/shadow/pull/1849)) + ### Changed - Change the group of `startShadowScripts` from `application` to `other`. ([#1797](https://github.com/GradleUp/shadow/pull/1797)) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt new file mode 100644 index 000000000..466b69996 --- /dev/null +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt @@ -0,0 +1,28 @@ +package com.github.jengelman.gradle.plugins.shadow.transformers + +import org.gradle.api.file.FileTreeElement +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.util.PatternFilterable +import org.gradle.api.tasks.util.PatternSet + +/** + * A base class for resource transformers that support pattern filtering. + * + * @param patternSet The [PatternSet] used for filtering resources. + */ +public abstract class PatternFilterableResourceTransformer( + @Internal public val patternSet: PatternSet, +) : ResourceTransformer by ResourceTransformer.Companion, + PatternFilterable by patternSet { + + override fun canTransformResource(element: FileTreeElement): Boolean { + return patternSet.asSpec.isSatisfiedBy(element) + } + + @Input // Trigger task executions after includes changed. + override fun getIncludes(): MutableSet = patternSet.includes + + @Input // Trigger task executions after excludes changed. + override fun getExcludes(): MutableSet = patternSet.excludes +} 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 87e888583..3b56e2a7d 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 @@ -4,10 +4,7 @@ import com.github.jengelman.gradle.plugins.shadow.internal.zipEntry import com.github.jengelman.gradle.plugins.shadow.relocation.relocateClass import com.github.jengelman.gradle.plugins.shadow.transformers.GroovyExtensionModuleTransformer.Companion.PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR import org.apache.tools.zip.ZipOutputStream -import org.gradle.api.file.FileTreeElement -import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.util.PatternFilterable import org.gradle.api.tasks.util.PatternSet /** @@ -25,11 +22,10 @@ import org.gradle.api.tasks.util.PatternSet */ @CacheableTransformer public open class ServiceFileTransformer( - private val patternSet: PatternSet = PatternSet() + patternSet: PatternSet = PatternSet() .include(SERVICES_PATTERN) .exclude(PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR), -) : ResourceTransformer, - PatternFilterable by patternSet { +) : PatternFilterableResourceTransformer(patternSet = patternSet) { @get:Internal internal val serviceEntries = mutableMapOf>() @@ -40,10 +36,6 @@ public open class ServiceFileTransformer( patternSet.setIncludes(listOf("$value/**")) } - override fun canTransformResource(element: FileTreeElement): Boolean { - return patternSet.asSpec.isSatisfiedBy(element) - } - override fun transform(context: TransformerContext) { val resource = path + "/" + context.relocators.relocateClass(context.path.substringAfter("$path/")) @@ -63,12 +55,6 @@ public open class ServiceFileTransformer( } } - @Input // Trigger task executions after includes changed. - override fun getIncludes(): MutableSet = patternSet.includes - - @Input // Trigger task executions after excludes changed. - override fun getExcludes(): MutableSet = patternSet.excludes - private companion object { private const val SERVICES_PATH = "META-INF/services" private const val SERVICES_PATTERN = "$SERVICES_PATH/**"