didi / didi/booster

ZipFile.transform catch all transform exception

Open
#428 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Kotlin
Stars
5.1k
Forks
591
PR merge metrics
No merged PRs in 30d

Description

```java
fun ZipFile.transform(
output: OutputStream,
entryFactory: (ZipEntry) -> ZipArchiveEntry = ::ZipArchiveEntry,
transformer: (ByteArray) -> ByteArray = { it -> it }
) {
val entries = mutableSetOf()
val creator = ParallelScatterZipCreator(ThreadPoolExecutor(NCPU, NCPU, 0L, TimeUnit.MILLISECONDS, LinkedBlockingQueue(), 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阶段的所有异常,导致transform问题不会中断构建过程,只是在控制台输出 Broken class;
无法暴露编译期的存在的问题,以及无法看到原始异常堆栈(未打印错误堆栈),是否考虑取消catch 或者 仅catch部分异常,将原始异常 throw 出去

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.