-
Notifications
You must be signed in to change notification settings - Fork 594
Open
Description
fun ZipFile.transform(
output: OutputStream,
entryFactory: (ZipEntry) -> ZipArchiveEntry = ::ZipArchiveEntry,
transformer: (ByteArray) -> ByteArray = { it -> it }
) {
val entries = mutableSetOf<String>()
val creator = ParallelScatterZipCreator(ThreadPoolExecutor(NCPU, NCPU, 0L, TimeUnit.MILLISECONDS, LinkedBlockingQueue<Runnable>(), Executors.defaultThreadFactory(), RejectedExecutionHandler { runnable, _ ->
runnable.run()
}))
entries().asSequence().filterNot {
isJarSignatureRelatedFiles(it.name)
}.forEach { entry ->
if (!entries.contains(entry.name)) {
val zae = entryFactory(entry)
val stream = InputStreamSupplier {
when (entry.name.substringAfterLast('.', "")) {
"class" -> getInputStream(entry).use { src ->
try {
src.transform(transformer).inputStream()
} catch (e: Throwable) {
System.err.println("Broken class: ${this.name}!/${entry.name}")
getInputStream(entry)
}
}
else -> getInputStream(entry)
}
}
creator.addArchiveEntry(zae, stream)
entries.add(entry.name)
} else {
System.err.println("Duplicated jar entry: ${this.name}!/${entry.name}")
}
}
ZipArchiveOutputStream(output).use(creator::writeTo)
}
这里把 transform catch 住了,只是打印了一下 Broken class,不利于排查 transform 失败的原因。这里能否不 catch 异常,而是让异常抛出来呢?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels