Skip to content

Commit

Permalink
Try out serialized KeyTransformer type
Browse files Browse the repository at this point in the history
  • Loading branch information
Goooler committed Jan 28, 2025
1 parent e22ce01 commit d71e879
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 14 deletions.
7 changes: 5 additions & 2 deletions api/shadow.api
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,10 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/IncludeReso
public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V
}

public abstract interface class com/github/jengelman/gradle/plugins/shadow/transformers/KeyTransformer : java/io/Serializable {
public abstract fun transform (Ljava/lang/String;)Ljava/lang/String;
}

public class com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/Transformer {
public fun <init> ()V
public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z
Expand Down Expand Up @@ -516,15 +520,14 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesF
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z
public fun getCharsetName ()Lorg/gradle/api/provider/Property;
public fun getKeyTransformer ()Lkotlin/jvm/functions/Function1;
public fun getKeyTransformer ()Lorg/gradle/api/provider/Property;
public fun getMappings ()Lorg/gradle/api/provider/MapProperty;
public fun getMergeSeparator ()Lorg/gradle/api/provider/Property;
public fun getMergeStrategy ()Lorg/gradle/api/provider/Property;
public final fun getObjectFactory ()Lorg/gradle/api/model/ObjectFactory;
public fun getPaths ()Lorg/gradle/api/provider/SetProperty;
public fun hasTransformedResource ()Z
public fun modifyOutputStream (Lorg/apache/tools/zip/ZipOutputStream;Z)V
public fun setKeyTransformer (Lkotlin/jvm/functions/Function1;)V
public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.github.jengelman.gradle.plugins.shadow.transformers.ComponentsXmlReso
import com.github.jengelman.gradle.plugins.shadow.transformers.DontIncludeResourceTransformer
import com.github.jengelman.gradle.plugins.shadow.transformers.GroovyExtensionModuleTransformer
import com.github.jengelman.gradle.plugins.shadow.transformers.IncludeResourceTransformer
import com.github.jengelman.gradle.plugins.shadow.transformers.KeyTransformer
import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer
import com.github.jengelman.gradle.plugins.shadow.transformers.ManifestAppenderTransformer
import com.github.jengelman.gradle.plugins.shadow.transformers.ManifestResourceTransformer
Expand Down Expand Up @@ -147,10 +148,11 @@ class TransformerCachingTest : BaseCachingTest() {

@Test
fun shadowJarIsCachedCorrectlyWhenUsingPropertiesFileTransformer() {
val uppercaseTrans = keyTransformer("key.toUpperCase()")
projectScriptPath.appendText(
transform<PropertiesFileTransformer>(
transformerBlock = """
keyTransformer = { it.toUpperCase() }
keyTransformer = $uppercaseTrans
""".trimIndent(),
),
)
Expand All @@ -167,10 +169,9 @@ class TransformerCachingTest : BaseCachingTest() {
assertExecutionsAreCachedAndUpToDate()
assertions("FOO")

val replaced = projectScriptPath.readText().replace(
"keyTransformer = { it.toUpperCase() }",
"keyTransformer = { 'prefix.' + it }",
)
val prefixTrans = keyTransformer("'prefix.' + key")

val replaced = projectScriptPath.readText().replace(uppercaseTrans, prefixTrans)
projectScriptPath.writeText(replaced)

assertFirstExecutionSuccess()
Expand Down Expand Up @@ -222,5 +223,16 @@ class TransformerCachingTest : BaseCachingTest() {
"" to ManifestAppenderTransformer::class,
"" to ManifestResourceTransformer::class,
)

fun keyTransformer(trans: String): String {
return """
new ${KeyTransformer::class.java.name}() {
@Override
public String transform(String key) {
return $trans
}
}
""".trimIndent()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.github.jengelman.gradle.plugins.shadow.internal.property
import com.github.jengelman.gradle.plugins.shadow.internal.setProperty
import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy
import java.io.InputStream
import java.io.Serializable
import java.nio.charset.Charset
import java.util.Properties
import javax.inject.Inject
Expand Down Expand Up @@ -123,10 +124,9 @@ public open class PropertiesFileTransformer @Inject constructor(
@get:Input
public open val charsetName: Property<String> = objectFactory.property(Charsets.ISO_8859_1.name())

@Transient // Input property should be Serializable, but we don't want to serialize the lambda.
@get:Optional
@get:Input
public open var keyTransformer: ((String) -> String)? = null
public open val keyTransformer: Property<KeyTransformer> = objectFactory.property()

override fun canTransformResource(element: FileTreeElement): Boolean {
val mappings = mappings.get()
Expand Down Expand Up @@ -176,12 +176,10 @@ public open class PropertiesFileTransformer @Inject constructor(
}

private fun transformKeys(properties: Properties): CleanProperties {
if (keyTransformer == null) {
return properties as CleanProperties
}
val keyTransformer = keyTransformer.orNull ?: return properties as CleanProperties
val result = CleanProperties()
properties.forEach { (key, value) ->
result[keyTransformer!!(key as String)] = value
result[keyTransformer.transform(key as String)] = value
}
return result
}
Expand Down Expand Up @@ -255,3 +253,7 @@ public open class PropertiesFileTransformer @Inject constructor(
private const val PROPERTIES_SUFFIX = ".properties"
}
}

public fun interface KeyTransformer : Serializable {
public fun transform(key: String): String
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ class PropertiesFileTransformerTest : BaseTransformerTest<PropertiesFileTransfor
expectedOutput: Map<String, String>,
) {
transformer.mergeStrategy.set(MergeStrategy.Append)
transformer.keyTransformer = keyTransformer
transformer.keyTransformer.set(KeyTransformer { keyTransformer(it) })

if (transformer.canTransformResource(path)) {
transformer.transform(context(path, input1))
Expand Down

0 comments on commit d71e879

Please sign in to comment.