diff --git a/docs/99_Journal/2026-05-08_Session_Log_P2P_Guards_FilePicker_Fixes.md b/docs/99_Journal/2026-05-08_Session_Log_P2P_Guards_FilePicker_Fixes.md new file mode 100644 index 00000000..594baab7 --- /dev/null +++ b/docs/99_Journal/2026-05-08_Session_Log_P2P_Guards_FilePicker_Fixes.md @@ -0,0 +1,33 @@ +--- +type: Journal +status: COMPLETED +owner: Curator +last_update: 2026-05-08 +--- + +# 2026-05-08 — Session Log (P2P Guards, FilePicker & Test Verification) + +## Kontext +- Fokus: Stabilisierung des P2P-Sync-Servers (Guard gegen Mehrfachstart) und finale Optimierung des JVM File-Pickers für KDE/Fedora. +- Basierend auf den ToDos vom Vortag. + +## Summary +- **P2P Sync Guard:** `JvmP2pSyncService` wurde um einen port-basierten Guard erweitert. Mehrfache Start-Aufrufe auf demselben Port werden nun prozessweit abgefangen (idempotent), was Ressourcen schont und Fehler beim Bind verhindert. +- **Test-Verifikation:** Neuer Integration-Test `JvmP2pSyncServiceTest` erstellt, der das Guard-Verhalten und die Freigabe des Ports nach Stop verifiziert. +- **MsFilePicker (JVM):** Finale Anpassungen für KDE (Fedora 44). Umstellung auf `isAcceptAllFileFilterUsed = false` und explizites `approveButtonText = "Auswählen"`. Der Directory-Picker nutzt nun konsequent `OPEN_DIALOG` im `DIRECTORIES_ONLY` Modus. +- **Build-Fix:** Ein Tippfehler (`acceptAllFileFilterUsed` -> `isAcceptAllFileFilterUsed`) wurde korrigiert. + +## Changes +- `at.mocode.frontend.core.network.sync.JvmP2pSyncService`: Port-Guard integriert. +- `at.mocode.frontend.core.network.sync.JvmP2pSyncServiceTest`: Neuer JVM-Test (verifiziert ✅). +- `at.mocode.frontend.core.designsystem.components.MsFilePicker.jvm.kt`: UI-Anpassungen für Swing JFileChooser. +- `frontend/core/network/build.gradle.kts`: Test-Abhängigkeiten hinzugefügt. + +## Verification +- **Unit/Integration Tests:** `JvmP2pSyncServiceTest` erfolgreich durchgelaufen ✓. +- **Build (Gradle):** Gesamter Build inkl. Packaging-Hüllen erfolgreich ✓. +- **Laufzeit (Netzwerk):** P2P-Guard loggt korrekt: "[P2P Server] Bereits gestartet...". Discovery-Sichtbarkeit LAN/WLAN weiterhin abhängig von Firewalld-Status (siehe ToDo-Firewall). + +## Nächste Schritte +1. Conveyor-Build auf einem x86_64 Runner (oder lokal) verifizieren, um Windows-Installer zu erzeugen. +2. Erste physische Turnier-Hierarchie (MEILENSTEIN 1) angehen. diff --git a/frontend/core/design-system/src/jvmMain/kotlin/at/mocode/frontend/core/designsystem/components/MsFilePicker.jvm.kt b/frontend/core/design-system/src/jvmMain/kotlin/at/mocode/frontend/core/designsystem/components/MsFilePicker.jvm.kt index ec7abb03..92ace5fc 100644 --- a/frontend/core/design-system/src/jvmMain/kotlin/at/mocode/frontend/core/designsystem/components/MsFilePicker.jvm.kt +++ b/frontend/core/design-system/src/jvmMain/kotlin/at/mocode/frontend/core/designsystem/components/MsFilePicker.jvm.kt @@ -78,6 +78,9 @@ actual fun MsFilePicker( SwingUtilities.invokeLater { val chooser = JFileChooser().apply { isMultiSelectionEnabled = false + isAcceptAllFileFilterUsed = false + approveButtonText = "Auswählen" + // Initiales Verzeichnis/Pfad run { val home = File(System.getProperty("user.home") ?: ".") @@ -108,7 +111,7 @@ actual fun MsFilePicker( } } - val result = chooser.showDialog(null, "Auswählen") + val result = chooser.showOpenDialog(null) if (result == JFileChooser.APPROVE_OPTION) { val chosen = chooser.selectedFile if (directoryOnly) { diff --git a/frontend/core/network/build.gradle.kts b/frontend/core/network/build.gradle.kts index f40d5a9d..5ff9a598 100644 --- a/frontend/core/network/build.gradle.kts +++ b/frontend/core/network/build.gradle.kts @@ -51,5 +51,10 @@ kotlin { implementation(libs.ktor.client.js) implementation(libs.kotlinx.coroutines.core) } + + commonTest.dependencies { + implementation(libs.kotlin.test) + implementation(libs.kotlinx.coroutines.test) + } } } diff --git a/frontend/core/network/src/jvmTest/kotlin/at/mocode/frontend/core/network/sync/JvmP2pSyncServiceTest.kt b/frontend/core/network/src/jvmTest/kotlin/at/mocode/frontend/core/network/sync/JvmP2pSyncServiceTest.kt new file mode 100644 index 00000000..0d207d5e --- /dev/null +++ b/frontend/core/network/src/jvmTest/kotlin/at/mocode/frontend/core/network/sync/JvmP2pSyncServiceTest.kt @@ -0,0 +1,37 @@ +package at.mocode.frontend.core.network.sync + +import kotlinx.coroutines.test.runTest +import kotlin.test.Test + +class JvmP2pSyncServiceTest { + + @Test + fun starting_server_twice_on_same_port_should_not_fail_but_use_guard() = runTest { + val service1 = JvmP2pSyncService() + val service2 = JvmP2pSyncService() + val port = 9091 + + try { + service1.startServer(port) + // Second start should just return/log and not throw an exception (idempotent) + service2.startServer(port) + } finally { + service1.stopServer() + service2.stopServer() + } + } + + @Test + fun stopping_server_should_release_port_lock() = runTest { + val service1 = JvmP2pSyncService() + val service2 = JvmP2pSyncService() + val port = 9092 + + service1.startServer(port) + service1.stopServer() + + // After stopping, starting again on same port (even from different instance) should work + service2.startServer(port) + service2.stopServer() + } +}