Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add explicit caching test for PropertiesFileTransformer #1208

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -145,6 +146,40 @@ class TransformerCachingTest : BaseCachingTest() {
assertions("baz")
}

@Test
fun shadowJarIsCachedCorrectlyWhenUsingPropertiesFileTransformer() {
val uppercaseTrans = keyTransformer("key.toUpperCase()")
projectScriptPath.appendText(
transform<PropertiesFileTransformer>(
transformerBlock = """
keyTransformer = $uppercaseTrans
""".trimIndent(),
),
)
path("src/main/resources/foo/bar.properties").writeText("foo=bar")
val assertions = { key: String ->
assertThat(outputShadowJar).useAll {
containsEntries("shadow/Main.class", "foo/bar.properties")
getContent("foo/bar.properties").contains("$key=bar")
}
}

assertFirstExecutionSuccess()
assertions("FOO")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

expected to contain:<"FOO=bar"> but was:<"#

foo=bar
"> (com.github.jengelman.gradle.plugins.shadow.util.JarPath@5827af16)
org.opentest4j.AssertionFailedError: expected to contain:<"FOO=bar"> but was:<"#

foo=bar

This failure looks due to keyTransformer being @Transient, can't be serialized back, it's null in

if (keyTransformer == null) {
return properties as CleanProperties
}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried a serializable type in d71e879, but with a new error


* What went wrong: |  
-- | --
  | com/github/jengelman/gradle/plugins/shadow/transformers/KeyTransformer |  
  | > com.github.jengelman.gradle.plugins.shadow.transformers.KeyTransformer |  
  |   |  
  | * Try: |  
  | > Run with --info or --debug option to get more log output. |  
  | > Run with --scan to get full insights. |  
  | > Get more help at https://help.gradle.org. |  
  |   |  
  | * Exception is: |  
  | java.lang.NoClassDefFoundError: com/github/jengelman/gradle/plugins/shadow/transformers/KeyTransformer

No idea how to fix them now...

assertExecutionsAreCachedAndUpToDate()
assertions("FOO")

val prefixTrans = keyTransformer("'prefix.' + key")

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

assertFirstExecutionSuccess()
Goooler marked this conversation as resolved.
Show resolved Hide resolved
assertions("prefix.foo")
assertExecutionsAreCachedAndUpToDate()
assertions("prefix.foo")
}

@ParameterizedTest
@MethodSource("transformerConfigProvider")
fun shadowJarIsCachedCorrectlyWhenUsingOtherTransformers(pair: Pair<String, KClass<*>>) {
Expand Down Expand Up @@ -187,7 +222,17 @@ class TransformerCachingTest : BaseCachingTest() {
"" to Log4j2PluginsCacheFileTransformer::class,
"" to ManifestAppenderTransformer::class,
"" to ManifestResourceTransformer::class,
"{ keyTransformer = { it.toLowerCase() } }" to PropertiesFileTransformer::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
Loading