/
ClassLoaderMigrationDataScanner.kt
44 lines (40 loc) · 1.42 KB
/
ClassLoaderMigrationDataScanner.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package app.ubie.spannerkase
import java.io.File
import java.net.JarURLConnection
import java.net.URL
import java.util.jar.JarFile
class ClassLoaderMigrationDataScanner(private val classLoader: ClassLoader, private val path: String) :
MigrationDataScanner {
override fun scan(): List<MigrationData> {
return classLoader.getResources(path).toList().flatMap { url ->
when (url.protocol) {
"file" -> {
fileScan(url)
}
"jar" -> {
val connection = url.openConnection()
jarScan((connection as JarURLConnection).jarFile, path, classLoader)
}
else -> {
emptyList()
}
}
}.sortedBy(MigrationData::version)
}
private fun fileScan(url: URL): List<MigrationData> {
val file = File(url.file)
return file.listFiles()?.toList()?.map { MigrationDataFile(it) } ?: emptyList()
}
private fun jarScan(jarFile: JarFile, path: String, classLoader: ClassLoader): List<MigrationData> {
val prefix = "$path/"
return jarFile.entries().toList().filter {
it.name.startsWith(prefix) && prefix.length < it.name.length
}.map {
MigrationDataResource(
path,
it.name.drop(prefix.length),
classLoader
)
}
}
}