diff --git a/libraries/io/src/main/kotlin/de/itkl/io/implementation/FileSystemResource.kt b/libraries/io/src/main/kotlin/de/itkl/io/implementation/FileSystemResource.kt new file mode 100644 index 0000000..969e76d --- /dev/null +++ b/libraries/io/src/main/kotlin/de/itkl/io/implementation/FileSystemResource.kt @@ -0,0 +1,19 @@ +package de.itkl.io.implementation + +import de.itkl.io.interfaces.Resource +import io.ktor.http.* +import java.io.File +import java.io.InputStream + +class FileSystemResource(private val file: File) : Resource() { + override val filename: String + get() = file.name + override val contentType: ContentType + get() = ContentType.fromFilePath(file.path).first() + override val length: Long + get() = file.length() + + override fun doRead(): InputStream { + return file.inputStream() + } +} \ No newline at end of file diff --git a/libraries/io/src/main/kotlin/de/itkl/io/interfaces/Resource.kt b/libraries/io/src/main/kotlin/de/itkl/io/interfaces/Resource.kt index 333318c..7aee589 100644 --- a/libraries/io/src/main/kotlin/de/itkl/io/interfaces/Resource.kt +++ b/libraries/io/src/main/kotlin/de/itkl/io/interfaces/Resource.kt @@ -1,11 +1,24 @@ package de.itkl.io.interfaces import io.ktor.http.* +import org.koin.core.component.KoinComponent +import org.koin.core.component.get +import org.koin.core.qualifier.named import java.io.InputStream import java.io.InputStreamReader -interface Resource { - val filename: String - val contentType: ContentType - fun read(): InputStream +abstract class Resource : KoinComponent { + abstract val filename: String + abstract val contentType: ContentType + abstract val length: Long? + + protected abstract fun doRead(): InputStream + fun read(): InputStream { + return length?.let { length -> + get().decorate( + length = length, + read() + ) + } ?: read() + } } \ No newline at end of file diff --git a/libraries/io/src/main/kotlin/de/itkl/io/interfaces/ResourceReadDecorator.kt b/libraries/io/src/main/kotlin/de/itkl/io/interfaces/ResourceReadDecorator.kt new file mode 100644 index 0000000..87ef9c7 --- /dev/null +++ b/libraries/io/src/main/kotlin/de/itkl/io/interfaces/ResourceReadDecorator.kt @@ -0,0 +1,15 @@ +package de.itkl.io.interfaces + +import java.io.InputStream + +interface ResourceReadDecorator { + fun decorate( + length: Long, + inputStream: InputStream): InputStream +} + +class NoopResourceReadDecorator : ResourceReadDecorator { + override fun decorate(length: Long, inputStream: InputStream): InputStream { + return inputStream + } +} \ No newline at end of file diff --git a/libraries/io/src/main/kotlin/de/itkl/io/ioModule.kt b/libraries/io/src/main/kotlin/de/itkl/io/ioModule.kt index d5471a6..0619bc0 100644 --- a/libraries/io/src/main/kotlin/de/itkl/io/ioModule.kt +++ b/libraries/io/src/main/kotlin/de/itkl/io/ioModule.kt @@ -1 +1,9 @@ package de.itkl.io + +import de.itkl.io.interfaces.NoopResourceReadDecorator +import de.itkl.io.interfaces.ResourceReadDecorator +import org.koin.dsl.module + +val ioModule = module { + single { NoopResourceReadDecorator() } +} \ No newline at end of file