Skip to content
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.github.jengelman.gradle.plugins.shadow.internal

import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator
import com.github.jengelman.gradle.plugins.shadow.relocation.relocateClass
import com.github.jengelman.gradle.plugins.shadow.relocation.relocatePath
import java.util.regex.Pattern

/**
* Modified from [org.apache.maven.plugins.shade.DefaultShader.PackageMapper.java](https://github.com/apache/maven-shade-plugin/blob/5115e41e66ac19f10b661e63f8de76ad3e5905d2/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java#L725-L735).
*/
internal interface PackageMapper {

/**
* Map an entity name according to the mapping rules known to this package mapper
*
* @param entityName entity name to be mapped
* @param mapPaths map "slashy" names like paths or internal Java class names, e.g. `com/acme/Foo`?
* @param mapPackages map "dotty" names like qualified Java class or package names, e.g. `com.acme.Foo`?
* @return mapped entity name, e.g. `org/apache/acme/Foo` or `org.apache.acme.Foo`
*/
fun map(entityName: String, mapPaths: Boolean, mapPackages: Boolean): String
}

/**
* Modified from [org.apache.maven.plugins.shade.DefaultShader.DefaultPackageMapper.java](https://github.com/apache/maven-shade-plugin/blob/5115e41e66ac19f10b661e63f8de76ad3e5905d2/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java#L740-L774).
*/
internal class DefaultPackageMapper(
private val relocators: Set<Relocator>,
) : PackageMapper {

override fun map(entityName: String, mapPaths: Boolean, mapPackages: Boolean): String {
var value = entityName
var prefix = ""
var suffix = ""

val matcher = classPattern.matcher(value)
if (matcher.matches()) {
prefix = matcher.group(1) + "L"
suffix = ";"
value = matcher.group(2)
}

for (relocator in relocators) {
if (mapPackages && relocator.canRelocateClass(value)) {
return prefix + relocator.relocateClass(value) + suffix
} else if (mapPaths && relocator.canRelocatePath(value)) {
return prefix + relocator.relocatePath(value) + suffix
}
}

return value
}
}

private val classPattern: Pattern = Pattern.compile("(\\[*)?L(.+);")

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.github.jengelman.gradle.plugins.shadow.internal

import org.objectweb.asm.ClassVisitor
import org.objectweb.asm.commons.ClassRemapper
import org.objectweb.asm.commons.Remapper

/**
* Modified from [org.apache.maven.plugins.shade.DefaultShader.ShadeClassRemapper.java](https://github.com/apache/maven-shade-plugin/blob/5115e41e66ac19f10b661e63f8de76ad3e5905d2/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java#L808-L844).
*/
internal class ShadowClassRemapper(
classVisitor: ClassVisitor,
private val packageMapper: PackageMapper,
private val pkg: String,
remapper: Remapper = object : Remapper() {
override fun mapValue(value: Any): Any {
return if (value is String) {
packageMapper.map(value, mapPaths = true, mapPackages = true)
} else {
super.mapValue(value)
}
}

override fun map(internalName: String): String {
return packageMapper.map(internalName, mapPaths = true, mapPackages = false)
}
},
) : ClassRemapper(classVisitor, remapper),
PackageMapper {
private var remapped = false

override fun visitSource(source: String?, debug: String?) {
if (source == null) return super.visitSource(null, debug)

val fqSource: String = pkg + source
val mappedSource = map(fqSource, mapPaths = true, mapPackages = false)
val filename = mappedSource.substring(mappedSource.lastIndexOf('/') + 1)
super.visitSource(filename, debug)
}

override fun map(entityName: String, mapPaths: Boolean, mapPackages: Boolean): String {
val mapped = packageMapper.map(entityName, mapPaths, mapPackages)
if (!remapped) {
remapped = mapped != entityName
}
return mapped
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.github.jengelman.gradle.plugins.shadow.tasks

import com.github.jengelman.gradle.plugins.shadow.internal.RelocatorRemapper
import com.github.jengelman.gradle.plugins.shadow.internal.DefaultPackageMapper
import com.github.jengelman.gradle.plugins.shadow.internal.ShadowClassRemapper
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
Expand All @@ -24,7 +25,6 @@ import org.gradle.api.tasks.WorkResult
import org.gradle.api.tasks.WorkResults
import org.objectweb.asm.ClassReader
import org.objectweb.asm.ClassWriter
import org.objectweb.asm.commons.ClassRemapper

/**
* Modified from [org.gradle.api.internal.file.archive.ZipCopyAction.java](https://github.com/gradle/gradle/blob/b893c2b085046677cf858fb3d5ce00e68e556c3a/platforms/core-configuration/file-operations/src/main/java/org/gradle/api/internal/file/archive/ZipCopyAction.java).
Expand Down Expand Up @@ -124,7 +124,7 @@ public open class ShadowCopyAction(
private inner class StreamAction(
private val zipOutStr: ZipOutputStream,
) : CopyActionProcessingStreamAction {
private val remapper = RelocatorRemapper(relocators)
private val packageMapper = DefaultPackageMapper(relocators)

init {
logger.info("Relocator count: ${relocators.size}.")
Expand Down Expand Up @@ -155,7 +155,7 @@ public open class ShadowCopyAction(
}
fileDetails.remapClass()
} else {
val mapped = remapper.map(path)
val mapped = packageMapper.map(path, mapPaths = true, mapPackages = true)
if (transform(fileDetails, mapped)) return
fileDetails.writeToZip(mapped)
}
Expand Down Expand Up @@ -184,7 +184,8 @@ public open class ShadowCopyAction(
// that use the constant pool to determine the dependencies of a class.
val cw = ClassWriter(0)
val cr = ClassReader(inputStream)
val cv = ClassRemapper(cw, remapper)
val pkg = name.substring(0, name.lastIndexOf('/') + 1)
val cv = ShadowClassRemapper(cw, packageMapper, pkg)

try {
cr.accept(cv, ClassReader.EXPAND_FRAMES)
Expand All @@ -195,7 +196,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 mappedName = multiReleasePrefix + packageMapper.map(newPath, mapPaths = true, mapPackages = false)
// Need to take the .class off for remapping evaluation
.substringBeforeLast('.')
try {
val entry = zipEntry("$mappedName.class", preserveFileTimestamps, lastModified) {
unixMode = UnixStat.FILE_FLAG or permissions.toUnixNumeric()
Expand Down