Skip to content

Commit 6276393

Browse files
Implemented basic functionality to show list of files and to display document pages
1 parent dbc5449 commit 6276393

32 files changed

Lines changed: 664 additions & 134 deletions

Demos/Ktor/comparison-ktor/build.gradle.kts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ val logback_version: String by project
66
plugins {
77
application
88
kotlin("jvm") version "1.6.21"
9+
id("org.jetbrains.kotlin.plugin.serialization") version "1.6.21"
910
}
1011

1112
group = "com.groupdocs.ui"
12-
version = "0.0.1"
13+
version = "22.3"
1314

1415
repositories {
1516
mavenCentral()
17+
maven("https://repository.groupdocs.com/repo/")
1618
}
1719

1820
application {
@@ -25,6 +27,8 @@ application {
2527
dependencies {
2628
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version")
2729

30+
implementation("com.groupdocs:groupdocs-comparison:$version")
31+
2832
implementation("io.insert-koin:koin-ktor:$koin_version")
2933

3034
implementation("io.ktor:ktor-server-core:$ktor_version")
@@ -37,6 +41,12 @@ dependencies {
3741
implementation("io.ktor:ktor-server-content-negotiation:$ktor_version")
3842
implementation("io.ktor:ktor-serialization-gson:$ktor_version")
3943
implementation("io.ktor:ktor-server-netty:$ktor_version")
44+
45+
implementation("io.ktor:ktor-server-html-builder:$ktor_version")
46+
47+
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.3")
48+
implementation("org.jetbrains.kotlinx:kotlinx-serialization-hocon:1.3.3")
49+
4050
implementation("ch.qos.logback:logback-classic:$logback_version")
4151
testImplementation("io.ktor:ktor-server-tests:$ktor_version")
4252
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,40 @@
11
package com.groupdocs.ui
22

3-
import com.groupdocs.ui.config.Config
3+
import com.groupdocs.ui.config.ApplicationConfig
4+
import com.groupdocs.ui.config.ServerConfig
45
import com.groupdocs.ui.di.ModulesInjection
56
import com.typesafe.config.ConfigFactory
67
import io.ktor.server.application.*
78
import io.ktor.server.config.*
89
import io.ktor.server.engine.*
910
import io.ktor.server.netty.*
1011
import io.ktor.util.*
12+
import kotlinx.serialization.ExperimentalSerializationApi
13+
import kotlinx.serialization.hocon.Hocon
14+
import org.koin.core.logger.PrintLogger
1115
import org.koin.dsl.module
1216
import org.koin.ktor.plugin.Koin
1317

18+
@ExperimentalSerializationApi
1419
@KtorExperimentalAPI
1520
fun main(args: Array<String>) {
1621
val environment = System.getenv()["ENVIRONMENT"] ?: handleDefaultEnvironment()
17-
val config = extractConfig(environment, HoconApplicationConfig(ConfigFactory.load()))
22+
val applicationConfig = extractApplicationConfig(environment)
23+
val comparisonConfig by lazy { extractComparisonConfig() }
1824

19-
embeddedServer(Netty, port = config.port) {
20-
println("Starting instance in ${config.host}:${config.port}")
25+
embeddedServer(Netty, port = applicationConfig.port) {
26+
println("Starting instance in ${applicationConfig.host}:${applicationConfig.port}")
2127
module {
2228
install(Koin) {
29+
logger(PrintLogger())
2330
modules(
2431
module {
25-
single { config }
32+
single { applicationConfig }
33+
single { comparisonConfig }
2634
},
27-
ModulesInjection.koinBeans
35+
ModulesInjection.controllerBeans,
36+
ModulesInjection.usecaseBeans,
37+
ModulesInjection.managerBeans
2838
)
2939
}
3040
main()
@@ -41,10 +51,20 @@ fun Application.main() {
4151
module()
4252
}
4353

44-
fun extractConfig(environment: String, hoconConfig: HoconApplicationConfig): Config {
54+
fun extractApplicationConfig(environment: String): ServerConfig {
55+
val hoconConfig = HoconApplicationConfig(ConfigFactory.load("server.conf"))
4556
val hoconEnvironment = hoconConfig.config("ktor.deployment.$environment")
46-
return Config(
57+
58+
return ServerConfig(
4759
hoconEnvironment.property("host").getString(),
4860
Integer.parseInt(hoconEnvironment.property("port").getString())
4961
)
50-
}
62+
}
63+
64+
@OptIn(ExperimentalSerializationApi::class)
65+
fun extractComparisonConfig(): ApplicationConfig {
66+
val hocon = Hocon {
67+
useConfigNamingConvention = false
68+
}
69+
return hocon.decodeFromConfig(ApplicationConfig.serializer(), ConfigFactory.load("application.conf"))
70+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.groupdocs.ui
2+
3+
4+
interface Defaults {
5+
interface Application {
6+
companion object {
7+
const val DEFAULT_LICENSE_PATH = "Licenses"
8+
const val DEFAULT_LICENSE_EXTENSION = ".lic"
9+
}
10+
}
11+
12+
interface Comparison {
13+
enum class FilesProviderType {
14+
LOCAL, GOOGLE, DROPBOX
15+
}
16+
17+
companion object {
18+
const val DEFAULT_PRELOAD_RESULT_PAGE_COUNT = 2
19+
const val DEFAULT_PREVIEW_PAGE_WIDTH = 768
20+
const val DEFAULT_PREVIEW_PAGE_RATIO = 1.3f
21+
val DEFAULT_FILES_PROVIDER_TYPE = FilesProviderType.LOCAL
22+
val DEFAULT_CACHE_DIRECTORY = System.getProperty("java.io.tmpdir")
23+
val DEFAULT_TEMP_DIRECTORY = System.getProperty("java.io.tmpdir")
24+
}
25+
}
26+
27+
interface Local {
28+
companion object {
29+
const val DEFAULT_FILES_DIRECTORY = "DocumentSamples"
30+
const val DEFAULT_RESULT_DIRECTORY = "DocumentSamples/Temp"
31+
}
32+
}
33+
34+
interface Google {
35+
enum class AccessType {
36+
OFFLINE, ONLINE
37+
}
38+
39+
companion object {
40+
const val DEFAULT_LOCAL_SERVER_RECEIVER_PORT = 8888
41+
val DEFAULT_ACCESS_TYPE = AccessType.OFFLINE
42+
const val DEFAULT_CREDENTIALS_PATH = "credentials.json"
43+
}
44+
}
45+
}

Demos/Ktor/comparison-ktor/src/main/kotlin/com/groupdocs/ui/Module.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import org.slf4j.event.Level
2424
fun Application.module() {
2525
install(CallLogging) {
2626
level = Level.DEBUG
27-
filter { call -> call.request.path().startsWith("/") }
27+
filter { call -> call.request.path().startsWith("/comparison") }
2828
}
2929
install(ContentNegotiation) { gson { } }
3030
install(DefaultHeaders) {
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.groupdocs.ui.config
2+
3+
import com.groupdocs.ui.Defaults
4+
import java.nio.file.Path
5+
6+
@kotlinx.serialization.Serializable
7+
data class ApplicationConfig(
8+
val common: Common = Common(),
9+
val comparison: Comparison = Comparison(),
10+
val local: Local = Local(),
11+
)
12+
13+
@kotlinx.serialization.Serializable
14+
data class Common(
15+
val pageSelector: Boolean = false,
16+
val download: Boolean = false,
17+
val upload: Boolean = false,
18+
val print: Boolean = false,
19+
val browse: Boolean = false,
20+
val rewrite: Boolean = false,
21+
val enableRightClick: Boolean = false,
22+
val sessionTimeout: Int = 0
23+
)
24+
25+
@kotlinx.serialization.Serializable
26+
data class Comparison(
27+
private val filesProviderType: String = "",
28+
val preloadResultPageCount: Int = 0,
29+
val previewPageWidth: Int = 0,
30+
val previewPageRatio: Float = 0f,
31+
val cacheDirectory: String = "",
32+
val tempDirectory: String = "",
33+
) {
34+
val filesProviderTypeOrDefault: Defaults.Comparison.FilesProviderType
35+
get() =
36+
when (filesProviderType.uppercase()) {
37+
in Defaults.Comparison.FilesProviderType.values()
38+
.map { it.name.uppercase() } -> Defaults.Comparison.FilesProviderType.valueOf(filesProviderType.uppercase())
39+
else -> Defaults.Comparison.FilesProviderType.LOCAL
40+
}
41+
val tempDirectoryOrDefault: String
42+
get() = tempDirectory.ifBlank { Defaults.Comparison.DEFAULT_TEMP_DIRECTORY }
43+
val previewPageWidthOrDefault: Int
44+
get() = if (previewPageWidth == 0) Defaults.Comparison.DEFAULT_PREVIEW_PAGE_WIDTH else previewPageWidth
45+
val previewPageRatioOrDefault: Float
46+
get() = if (previewPageRatio == 0f) Defaults.Comparison.DEFAULT_PREVIEW_PAGE_RATIO else previewPageRatio
47+
}
48+
49+
@kotlinx.serialization.Serializable
50+
data class Local(
51+
val filesDirectory: String = "",
52+
val resultDirectory: String = "",
53+
) {
54+
55+
val filesDirectoryOrDefault: Path
56+
get() = Path.of(filesDirectory.ifBlank { Defaults.Local.DEFAULT_FILES_DIRECTORY })
57+
58+
val resultDirectoryOrDefault: Path
59+
get() = Path.of(resultDirectory.ifBlank { Defaults.Local.DEFAULT_RESULT_DIRECTORY })
60+
}

Demos/Ktor/comparison-ktor/src/main/kotlin/com/groupdocs/ui/config/Config.kt renamed to Demos/Ktor/comparison-ktor/src/main/kotlin/com/groupdocs/ui/config/ServerConfig.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.groupdocs.ui.config
22

3-
class Config(
3+
class ServerConfig(
44
val host: String,
55
val port: Int
6-
) {
6+
)
77

8-
companion object {
9-
}
10-
}

Demos/Ktor/comparison-ktor/src/main/kotlin/com/groupdocs/ui/di/ControllersInjection.kt

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.groupdocs.ui.di
2+
3+
import com.groupdocs.ui.manager.TempFolderManager
4+
import com.groupdocs.ui.manager.TempFolderManagerImpl
5+
import com.groupdocs.ui.modules.compare.CompareController
6+
import com.groupdocs.ui.modules.compare.CompareControllerImpl
7+
import com.groupdocs.ui.modules.config.ConfigController
8+
import com.groupdocs.ui.modules.config.ConfigControllerImpl
9+
import com.groupdocs.ui.modules.description.DescriptionController
10+
import com.groupdocs.ui.modules.description.DescriptionControllerImpl
11+
import com.groupdocs.ui.modules.download.DownloadController
12+
import com.groupdocs.ui.modules.download.DownloadControllerImpl
13+
import com.groupdocs.ui.modules.page.PageController
14+
import com.groupdocs.ui.modules.page.PageControllerImpl
15+
import com.groupdocs.ui.modules.tree.TreeController
16+
import com.groupdocs.ui.modules.tree.TreeControllerImpl
17+
import com.groupdocs.ui.modules.upload.UploadController
18+
import com.groupdocs.ui.modules.upload.UploadControllerImpl
19+
import com.groupdocs.ui.usecase.GetLocalFilesUseCase
20+
import com.groupdocs.ui.usecase.RetrieveLocalFilePagesStreamUseCase
21+
import org.koin.core.module.dsl.bind
22+
import org.koin.core.module.dsl.singleOf
23+
import org.koin.dsl.module
24+
25+
object ModulesInjection {
26+
val controllerBeans = module {
27+
singleOf(::ConfigControllerImpl) { bind<ConfigController>() }
28+
singleOf(::TreeControllerImpl) { bind<TreeController>() }
29+
singleOf(::DownloadControllerImpl) { bind<DownloadController>() }
30+
singleOf(::UploadControllerImpl) { bind<UploadController>() }
31+
singleOf(::CompareControllerImpl) { bind<CompareController>() }
32+
singleOf(::PageControllerImpl) { bind<PageController>() }
33+
singleOf(::DescriptionControllerImpl) { bind<DescriptionController>() }
34+
35+
}
36+
val usecaseBeans = module {
37+
singleOf(::GetLocalFilesUseCase)
38+
singleOf(::RetrieveLocalFilePagesStreamUseCase)
39+
}
40+
val managerBeans = module {
41+
singleOf(::TempFolderManagerImpl) { bind<TempFolderManager>() }
42+
}
43+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.groupdocs.ui.manager
2+
3+
import com.groupdocs.ui.Defaults
4+
import org.koin.core.component.KoinComponent
5+
import java.nio.file.Path
6+
import java.nio.file.Paths
7+
import java.util.*
8+
9+
/**
10+
* Manages path to temp directory according to config
11+
* Does not create or check is any directory exist
12+
*/
13+
class TempFolderManagerImpl(
14+
private val applicationConfig: com.groupdocs.ui.config.ApplicationConfig
15+
) : TempFolderManager, KoinComponent {
16+
private val tempDirectory: Path by lazy {
17+
val absoluteOrRelativeTempDirectory = Paths.get(applicationConfig.comparison.tempDirectoryOrDefault)
18+
if (absoluteOrRelativeTempDirectory.isAbsolute) {
19+
absoluteOrRelativeTempDirectory
20+
} else if (applicationConfig.comparison.filesProviderTypeOrDefault == Defaults.Comparison.FilesProviderType.LOCAL) {
21+
applicationConfig.local.filesDirectoryOrDefault.resolve(absoluteOrRelativeTempDirectory)
22+
} else {
23+
absoluteOrRelativeTempDirectory
24+
}.toAbsolutePath().normalize()
25+
}
26+
27+
override fun createPathForTempFile(): Path = tempDirectory.resolve("gd_${UUID.randomUUID()}.tmp")
28+
}
29+
30+
interface TempFolderManager {
31+
fun createPathForTempFile(): Path
32+
}
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package com.groupdocs.ui.model
22

33
data class ConfigResponse(
4-
val id: Int
5-
)
4+
val browse: Boolean = true,
5+
val download: Boolean = true,
6+
val enableRightClick: Boolean = true,
7+
val pageSelector: Boolean = true,
8+
val preloadResultPageCount: Int = 0,
9+
val print: Boolean = true,
10+
val rewrite: Boolean = true,
11+
val upload: Boolean = true
12+
)

0 commit comments

Comments
 (0)