diff --git a/src/main/kotlin/ca/gosyer/data/server/ServerService.kt b/src/main/kotlin/ca/gosyer/data/server/ServerService.kt index 96e4de1b..cdc4bf3b 100644 --- a/src/main/kotlin/ca/gosyer/data/server/ServerService.kt +++ b/src/main/kotlin/ca/gosyer/data/server/ServerService.kt @@ -7,6 +7,7 @@ package ca.gosyer.data.server import ca.gosyer.BuildConfig +import ca.gosyer.util.system.CKLogger import ca.gosyer.util.system.userDataDir import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope @@ -65,11 +66,10 @@ class ServerService @Inject constructor( return@onEach } GlobalScope.launch { - val logger = KotlinLogging.logger("Server") val jarFile = File(userDataDir, "Tachidesk.jar") if (!jarFile.exists()) { - logger.info { "Copying server to resources" } + info { "Copying server to resources" } copyJar(jarFile) } else { try { @@ -86,11 +86,11 @@ class ServerService @Inject constructor( jarVersion.specification != BuildConfig.TACHIDESK_SP_VERSION || jarVersion.implementation != BuildConfig.TACHIDESK_IM_VERSION ) { - logger.info { "Updating server file from resources" } + info { "Updating server file from resources" } copyJar(jarFile) } } catch (e: IOException) { - logger.error(e) { + error(e) { "Error accessing server jar, cannot update server, ${BuildConfig.NAME} may not work properly" } } @@ -105,12 +105,13 @@ class ServerService @Inject constructor( else -> "java" } - logger.info { "Starting server with $javaExePath" } + info { "Starting server with $javaExePath" } val reader: BufferedReader process = runtime.exec("""$javaExePath -jar "${jarFile.absolutePath}"""").also { reader = it.inputStream.bufferedReader() } - logger.info { "Server started successfully" } + info { "Server started successfully" } + val logger = KotlinLogging.logger("Server") var line: String? while (reader.readLine().also { line = it } != null) { if (initialized.value == ServerResult.STARTING) { @@ -125,9 +126,9 @@ class ServerService @Inject constructor( if (initialized.value == ServerResult.STARTING) { initialized.value = ServerResult.FAILED } - logger.info { "Server closed" } + info { "Server closed" } val exitVal = process?.waitFor() - logger.info { "Process exitValue: $exitVal" } + info { "Process exitValue: $exitVal" } process = null } }.launchIn(GlobalScope) @@ -141,4 +142,6 @@ class ServerService @Inject constructor( } data class JarVersion(val specification: String?, val implementation: String?) + + private companion object : CKLogger({}) } diff --git a/src/main/kotlin/ca/gosyer/ui/categories/CategoriesMenuViewModel.kt b/src/main/kotlin/ca/gosyer/ui/categories/CategoriesMenuViewModel.kt index 81707c1f..a7a39313 100644 --- a/src/main/kotlin/ca/gosyer/ui/categories/CategoriesMenuViewModel.kt +++ b/src/main/kotlin/ca/gosyer/ui/categories/CategoriesMenuViewModel.kt @@ -9,17 +9,16 @@ package ca.gosyer.ui.categories import ca.gosyer.data.models.Category import ca.gosyer.data.server.interactions.CategoryInteractionHandler import ca.gosyer.ui.base.vm.ViewModel +import ca.gosyer.util.system.CKLogger import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import mu.KotlinLogging import javax.inject.Inject class CategoriesMenuViewModel @Inject constructor( private val categoryHandler: CategoryInteractionHandler ) : ViewModel() { - private val logger = KotlinLogging.logger {} private var originalCategories = emptyList() private val _categories = MutableStateFlow(emptyList()) val categories = _categories.asStateFlow() @@ -66,7 +65,7 @@ class CategoriesMenuViewModel @Inject constructor( updatedCategories.forEach { updatedCategory -> val category = categories.find { it.id == updatedCategory.id || it.name == updatedCategory.name } ?: return@forEach if (category.order != updatedCategory.order) { - logger.debug { "${category.order} to ${updatedCategory.order}" } + debug { "${category.order} to ${updatedCategory.order}" } categoryHandler.reorderCategory(updatedCategory, category.order, updatedCategory.order) } } @@ -109,4 +108,6 @@ class CategoriesMenuViewModel @Inject constructor( fun Category.toMenuCategory() = MenuCategory(id, order, name, landing) data class MenuCategory(val id: Long? = null, var order: Int, val name: String, val landing: Boolean = false) + + private companion object : CKLogger({}) } diff --git a/src/main/kotlin/ca/gosyer/ui/extensions/ExtensionsMenuViewModel.kt b/src/main/kotlin/ca/gosyer/ui/extensions/ExtensionsMenuViewModel.kt index 7f269e12..f565bba5 100644 --- a/src/main/kotlin/ca/gosyer/ui/extensions/ExtensionsMenuViewModel.kt +++ b/src/main/kotlin/ca/gosyer/ui/extensions/ExtensionsMenuViewModel.kt @@ -11,11 +11,11 @@ import ca.gosyer.data.models.Extension import ca.gosyer.data.server.ServerPreferences import ca.gosyer.data.server.interactions.ExtensionInteractionHandler import ca.gosyer.ui.base.vm.ViewModel +import ca.gosyer.util.system.CKLogger import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import mu.KotlinLogging import javax.inject.Inject class ExtensionsMenuViewModel @Inject constructor( @@ -23,8 +23,6 @@ class ExtensionsMenuViewModel @Inject constructor( serverPreferences: ServerPreferences, private val extensionPreferences: ExtensionPreferences ) : ViewModel() { - private val logger = KotlinLogging.logger {} - val serverUrl = serverPreferences.server().stateIn(scope) private lateinit var extensionList: List @@ -59,7 +57,7 @@ class ExtensionsMenuViewModel @Inject constructor( } fun install(extension: Extension) { - logger.info { "Install clicked" } + info { "Install clicked" } scope.launch { try { extensionHandler.installExtension(extension) @@ -71,7 +69,7 @@ class ExtensionsMenuViewModel @Inject constructor( } fun update(extension: Extension) { - logger.info { "Update clicked" } + info { "Update clicked" } scope.launch { try { extensionHandler.updateExtension(extension) @@ -83,7 +81,7 @@ class ExtensionsMenuViewModel @Inject constructor( } fun uninstall(extension: Extension) { - logger.info { "Uninstall clicked" } + info { "Uninstall clicked" } scope.launch { try { extensionHandler.uninstallExtension(extension) @@ -107,4 +105,6 @@ class ExtensionsMenuViewModel @Inject constructor( _extensions.value = extensions.toList() } } + + private companion object : CKLogger({}) } diff --git a/src/main/kotlin/ca/gosyer/ui/reader/ChapterLoader.kt b/src/main/kotlin/ca/gosyer/ui/reader/ChapterLoader.kt index c739f5ec..f9709a30 100644 --- a/src/main/kotlin/ca/gosyer/ui/reader/ChapterLoader.kt +++ b/src/main/kotlin/ca/gosyer/ui/reader/ChapterLoader.kt @@ -11,13 +11,13 @@ import ca.gosyer.data.server.interactions.ChapterInteractionHandler import ca.gosyer.ui.reader.loader.TachideskPageLoader import ca.gosyer.ui.reader.model.ReaderChapter import ca.gosyer.ui.reader.model.ReaderPage +import ca.gosyer.util.system.CKLogger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.take -import mu.KotlinLogging import kotlin.coroutines.CoroutineContext class ChapterLoader( @@ -25,14 +25,12 @@ class ChapterLoader( private val readerPreferences: ReaderPreferences, private val chapterHandler: ChapterInteractionHandler ) { - private val logger = KotlinLogging.logger {} - fun loadChapter(chapter: ReaderChapter): StateFlow> { if (chapterIsReady(chapter)) { return (chapter.state as ReaderChapter.State.Loaded).pages } else { chapter.state = ReaderChapter.State.Loading - logger.debug { "Loading pages for ${chapter.chapter.name}" } + debug { "Loading pages for ${chapter.chapter.name}" } val loader = TachideskPageLoader(context + Dispatchers.Default, chapter, readerPreferences, chapterHandler) @@ -56,4 +54,6 @@ class ChapterLoader( private fun chapterIsReady(chapter: ReaderChapter): Boolean { return chapter.state is ReaderChapter.State.Loaded && chapter.pageLoader != null } + + private companion object : CKLogger({}) } diff --git a/src/main/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt b/src/main/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt index f99a288e..e100ad4e 100644 --- a/src/main/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt +++ b/src/main/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt @@ -10,6 +10,7 @@ import ca.gosyer.data.reader.ReaderPreferences import ca.gosyer.data.server.interactions.ChapterInteractionHandler import ca.gosyer.ui.reader.model.ReaderChapter import ca.gosyer.ui.reader.model.ReaderPage +import ca.gosyer.util.system.CKLogger import io.github.kerubistan.kroki.coroutines.priorityChannel import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope @@ -19,7 +20,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import mu.KotlinLogging import java.util.concurrent.atomic.AtomicInteger import kotlin.coroutines.CoroutineContext @@ -30,7 +30,6 @@ class TachideskPageLoader( chapterHandler: ChapterInteractionHandler ) : PageLoader() { val scope = CoroutineScope(SupervisorJob() + context) - private val logger = KotlinLogging.logger {} /** * A channel used to manage requests one by one while allowing priorities. @@ -56,7 +55,7 @@ class TachideskPageLoader( try { for (priorityPage in channel) { val page = priorityPage.page - logger.debug { "Loading page ${page.index}" } + debug { "Loading page ${page.index}" } if (page.status.value == ReaderPage.Status.QUEUE) { try { page.bitmap.value = chapterHandler.getPage(chapter.chapter, page.index) @@ -169,4 +168,6 @@ class TachideskPageLoader( scope.cancel() channel.close() } + + private companion object : CKLogger({}) } diff --git a/src/main/kotlin/ca/gosyer/ui/reader/model/ReaderChapter.kt b/src/main/kotlin/ca/gosyer/ui/reader/model/ReaderChapter.kt index 905c0e1c..c911e810 100644 --- a/src/main/kotlin/ca/gosyer/ui/reader/model/ReaderChapter.kt +++ b/src/main/kotlin/ca/gosyer/ui/reader/model/ReaderChapter.kt @@ -8,18 +8,16 @@ package ca.gosyer.ui.reader.model import ca.gosyer.data.models.Chapter import ca.gosyer.ui.reader.loader.PageLoader +import ca.gosyer.util.system.CKLogger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import mu.KotlinLogging import kotlin.coroutines.CoroutineContext data class ReaderChapter(val context: CoroutineContext, val chapter: Chapter) { - private val logger = KotlinLogging.logger {} - var scope = CoroutineScope(context + Job()) private set @@ -43,7 +41,7 @@ data class ReaderChapter(val context: CoroutineContext, val chapter: Chapter) { fun recycle() { if (pageLoader != null) { - logger.debug { "Recycling chapter ${chapter.name}" } + debug { "Recycling chapter ${chapter.name}" } } pageLoader?.recycle() pageLoader = null @@ -58,4 +56,6 @@ data class ReaderChapter(val context: CoroutineContext, val chapter: Chapter) { class Error(val error: Throwable) : State() class Loaded(val pages: StateFlow>) : State() } + + private companion object : CKLogger({}) } diff --git a/src/main/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt b/src/main/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt index e9ff1973..2f22656a 100644 --- a/src/main/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt +++ b/src/main/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt @@ -28,21 +28,19 @@ import ca.gosyer.ui.base.prefs.PreferenceRow import ca.gosyer.ui.base.vm.ViewModel import ca.gosyer.ui.base.vm.viewModel import ca.gosyer.ui.main.Route +import ca.gosyer.util.system.CKLogger import ca.gosyer.util.system.filePicker import ca.gosyer.util.system.fileSaver import com.github.zsoltk.compose.router.BackStack import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import mu.KotlinLogging import java.io.File import javax.inject.Inject class SettingsBackupViewModel @Inject constructor( private val backupHandler: BackupInteractionHandler ) : ViewModel() { - private val logger = KotlinLogging.logger {} - private val _restoring = MutableStateFlow(false) val restoring = _restoring.asStateFlow() private val _restoreError = MutableStateFlow(false) @@ -56,14 +54,14 @@ class SettingsBackupViewModel @Inject constructor( fun restoreFile(file: File?) { scope.launch { if (file == null || !file.exists()) { - logger.info { "Invalid file ${file?.absolutePath}" } + info { "Invalid file ${file?.absolutePath}" } } else { _restoreError.value = false _restoring.value = true try { backupHandler.importBackupFile(file) } catch (e: Exception) { - logger.info(e) { "Error importing backup" } + info(e) { "Error importing backup" } _restoreError.value = true } finally { _restoring.value = false @@ -75,7 +73,7 @@ class SettingsBackupViewModel @Inject constructor( fun createFile(file: File?) { scope.launch { if (file == null) { - logger.info { "Invalid file ${file?.absolutePath}" } + info { "Invalid file ${file?.absolutePath}" } } else { if (file.exists()) file.delete() _creatingError.value = false @@ -83,7 +81,7 @@ class SettingsBackupViewModel @Inject constructor( try { val backup = backupHandler.exportBackupFile() } catch (e: Exception) { - logger.info(e) { "Error importing backup" } + info(e) { "Error exporting backup" } _creatingError.value = true } finally { _creating.value = false @@ -91,6 +89,8 @@ class SettingsBackupViewModel @Inject constructor( } } } + + private companion object : CKLogger({}) } @Composable diff --git a/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenuViewModel.kt b/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenuViewModel.kt index 02d321e1..7f0f3b59 100644 --- a/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenuViewModel.kt +++ b/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenuViewModel.kt @@ -11,6 +11,7 @@ import ca.gosyer.data.models.Source import ca.gosyer.data.server.ServerPreferences import ca.gosyer.data.server.interactions.SourceInteractionHandler import ca.gosyer.ui.base.vm.ViewModel +import ca.gosyer.util.system.CKLogger import com.github.zsoltk.compose.savedinstancestate.Bundle import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.MutableStateFlow @@ -19,7 +20,6 @@ import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import mu.KotlinLogging import javax.inject.Inject class SourcesMenuViewModel @Inject constructor( @@ -28,8 +28,6 @@ class SourcesMenuViewModel @Inject constructor( serverPreferences: ServerPreferences, catalogPreferences: CatalogPreferences ) : ViewModel() { - private val logger = KotlinLogging.logger {} - val serverUrl = serverPreferences.server().stateIn(scope) private val languages = catalogPreferences.languages().stateIn(scope) @@ -70,9 +68,9 @@ class SourcesMenuViewModel @Inject constructor( scope.launch { try { val sources = sourceHandler.getSourceList() - logger.info { sources } + info { sources } _sources.value = sources.filter { it.lang in languages.value } - logger.info { _sources.value } + info { _sources.value } } catch (e: Exception) { if (e is CancellationException) throw e } finally { @@ -111,7 +109,7 @@ class SourcesMenuViewModel @Inject constructor( } } - companion object { + private companion object : CKLogger({}) { const val SOURCE_TABS_KEY = "source_tabs" const val SELECTED_SOURCE_TAB = "selected_tab" } diff --git a/src/main/kotlin/ca/gosyer/util/compose/ContextMenu.kt b/src/main/kotlin/ca/gosyer/util/compose/ContextMenu.kt index 64b19e99..3420eec9 100644 --- a/src/main/kotlin/ca/gosyer/util/compose/ContextMenu.kt +++ b/src/main/kotlin/ca/gosyer/util/compose/ContextMenu.kt @@ -7,14 +7,12 @@ package ca.gosyer.util.compose import androidx.compose.ui.unit.IntOffset -import mu.KotlinLogging import javax.swing.Icon import javax.swing.JMenuItem import javax.swing.JPopupMenu import javax.swing.JSeparator class ContextMenu internal constructor() { - val logger = KotlinLogging.logger {} internal val list = mutableListOf Unit)?>>() internal fun popupMenu() = JPopupMenu().apply { @@ -26,8 +24,6 @@ class ContextMenu internal constructor() { when (item) { is JMenuItem -> add(item).apply { addActionListener { - logger.info { it.actionCommand } - logger.info { it.modifiers } block.andClose() } } diff --git a/src/main/kotlin/ca/gosyer/util/system/Logging.kt b/src/main/kotlin/ca/gosyer/util/system/Logging.kt new file mode 100644 index 00000000..ce040519 --- /dev/null +++ b/src/main/kotlin/ca/gosyer/util/system/Logging.kt @@ -0,0 +1,16 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.util.system + +import mu.KLogger +import mu.KotlinLogging + +abstract class CKLogger(logger: KLogger) : KLogger by logger { + constructor(func: () -> Unit) : this(kLogger(func)) +} + +fun kLogger(func: () -> Unit) = KotlinLogging.logger(func)