From 78af3f0d502d1d47503e2173dc00a6d66e6a35e3 Mon Sep 17 00:00:00 2001 From: Timo Bryant Date: Fri, 22 Dec 2023 00:57:49 +0100 Subject: [PATCH] add resource and FileSystemResource --- .../io/implementation/FileSystemResource.kt | 19 +++++++++++++++++ .../kotlin/de/itkl/io/interfaces/Resource.kt | 21 +++++++++++++++---- .../io/interfaces/ResourceReadDecorator.kt | 15 +++++++++++++ .../io/src/main/kotlin/de/itkl/io/ioModule.kt | 8 +++++++ 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 libraries/io/src/main/kotlin/de/itkl/io/implementation/FileSystemResource.kt create mode 100644 libraries/io/src/main/kotlin/de/itkl/io/interfaces/ResourceReadDecorator.kt 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