mike_shysh
01/25/2018, 1:04 PMCzar
01/25/2018, 1:18 PMClassLoader.getSystemClassLoader().getResource("/path/to/resource/")
or
ClassLoader.getSystemResourceAsStream("/path/to/resource")
mike_shysh
01/25/2018, 1:31 PMmike_shysh
01/25/2018, 1:32 PMjava.lang.IllegalStateException: ClassLoader.getSystemCla…Loader().getResource(url) must not be null
mike_shysh
01/25/2018, 1:37 PMCzar
01/25/2018, 1:38 PMgildor
01/25/2018, 1:45 PMgildor
01/25/2018, 1:46 PMobject {}.classloader
, but to be honest always used currentThread instead, I don't have such complicated classloader casesmike_shysh
01/25/2018, 1:54 PMobject {}.classloader
Should it be called in inline func?Czar
01/25/2018, 1:55 PMobject resourceAsStream {
operator fun invoke(path: String) : InputStream = javaClass.getResourceAsStream(path)
}
fun <T> fromYamlList(resourceStream: InputStream): List<T> {
TODO("You'll have to implement this")
}
inline fun <reified T> fromTestDataYamlList(url: String): List<T> {
return fromYamlList(resourceAsStream("/path/to/resource/in/the/classpath"))
}
mike_shysh
01/25/2018, 2:07 PMobject resourceAsStream {
operator fun invoke(path: String) : InputStream = javaClass.getResourceAsStream(path)
}
mike_shysh
01/25/2018, 2:09 PMmike_shysh
01/25/2018, 2:09 PMCzar
01/25/2018, 2:10 PMjavaClass
is roughly analogous to java's this.getClass()
and operator fun invoke
to make it look good 🙂 Read about it here: https://kotlinlang.org/docs/reference/operator-overloading.html#invokemike_shysh
01/25/2018, 2:10 PMCzar
01/25/2018, 2:12 PMresourceAsStream
object does not contain state, and invoke
is a function which does it job based on input and returns its result as output, without keeping state in the instance.mike_shysh
01/25/2018, 2:16 PMgildor
01/25/2018, 2:25 PMobject
has the same problem as currentThread. You will get resource from classloader of an object who created this object (in this case who first used this object), not from classloader of your function.
But in most cases it's not a big problemmike_shysh
01/25/2018, 2:28 PMinline fun <reified T> fromTestDataYamlList
mike_shysh
01/25/2018, 2:29 PMmike_shysh
01/25/2018, 2:30 PMgildor
01/25/2018, 2:30 PMgildor
01/25/2018, 2:30 PMobject
declarationgildor
01/25/2018, 2:34 PMgildor
01/25/2018, 2:34 PMmike_shysh
01/25/2018, 2:39 PMmike_shysh
01/25/2018, 2:42 PMclass ResourcePath {
operator fun invoke(path: String): String = javaClass.getResource(path).path
}
inline fun <reified T> fromTestDataYamlList(url: String): ArrayList<T> {
return fromYamlList(ResourcePath().invoke("/testData$url"))
}
mike_shysh
01/25/2018, 2:43 PMgildor
01/25/2018, 2:43 PMgildor
01/25/2018, 2:43 PMmike_shysh
01/25/2018, 2:44 PMgildor
01/25/2018, 2:44 PMmike_shysh
01/25/2018, 2:45 PMclass Resources {
fun getPath(path: String): String = javaClass.getResource(path).path
}
inline fun <reified T> fromTestDataYamlList(url: String): ArrayList<T> {
return fromYamlList(Resources().getPath("/testData$url"))
}
mike_shysh
01/25/2018, 2:45 PMgildor
01/25/2018, 2:46 PMgildor
01/25/2018, 2:46 PMmike_shysh
01/25/2018, 2:47 PMfromYamlList
mike_shysh
01/25/2018, 2:47 PMgildor
01/25/2018, 2:47 PMmike_shysh
01/25/2018, 2:47 PMfromTestDataYamlList<UserInfo>("/user/request/addUsers.yaml")
mike_shysh
01/25/2018, 2:47 PMgildor
01/25/2018, 2:48 PMmike_shysh
01/25/2018, 2:48 PMmike_shysh
01/25/2018, 2:48 PMgildor
01/25/2018, 2:49 PMCzar
01/25/2018, 4:02 PMinline fun getPath(url: String) = object {}.javaClass.getResource("/testData$url").path
inline fun <reified T> fromTestDataYamlList(url: String): ArrayList<T> {
return fromYamlList(getPath(url))
}