fix: Codex-Review-Befunde zu Verlauf-Detailanzeige und Log-Umstellung

- RuntimeLogDirectoryReconfigurer: Bei fehlgeschlagenem Log4j2-Reconfigure wird die
  System-Property log.directory auf den vorherigen Wert zurückgesetzt, damit ein
  späterer Versuch nicht faelschlich als "bereits aktiv" uebersprungen wird. Test ergaenzt.
- GuiHistoryTab: Beim Detailwechsel wird die KI-Rohantwort zurückgesetzt; verspätet
  eintreffende Detail-Ergebnisse einer inzwischen gewechselten/abgewählten Selektion
  werden über einen Fingerprint-Abgleich verworfen (kein "A unter B", keine dauerhaft
  sichtbare fremde Rohantwort bei Ladefehler).
- GuiHistoryTab: Der technische Fehler-Tooltip wird bei nicht-fehlerhaften Datensätzen
  auf den Standardtext zurückgesetzt (keine fremde Fehlermeldung mehr sichtbar).
- AiFailureMessageTranslator: praezisere Meldung ("kein gueltiges JSON oder ein
  Pflichtfeld fehlt").

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 18:53:46 +02:00
parent a3ed5329af
commit c7a40298df
4 changed files with 64 additions and 3 deletions
@@ -92,12 +92,17 @@ public class RuntimeLogDirectoryReconfigurer {
return LogDirectoryChange.unchanged();
}
String previous = System.getProperty(SYSTEM_PROPERTY_KEY);
System.setProperty(SYSTEM_PROPERTY_KEY, target);
try {
reconfigure();
} catch (RuntimeException e) {
LOG.warn("Log4j2 konnte nicht auf Log-Verzeichnis '{}' umgestellt werden: {}",
target, e.getMessage());
// Property auf den vorherigen Wert zurücksetzen: Bleibt sie auf dem neuen (nicht
// aktivierten) Ziel stehen, würde die Idempotenz-Prüfung oben jeden weiteren
// Umstellungsversuch fälschlich als „bereits aktiv" überspringen.
restoreProperty(previous);
LOG.warn("Log4j2 konnte nicht auf Log-Verzeichnis '{}' umgestellt werden: {} "
+ "bisheriges Log-Verzeichnis bleibt aktiv.", target, e.getMessage());
return LogDirectoryChange.unchanged();
}
@@ -105,6 +110,14 @@ public class RuntimeLogDirectoryReconfigurer {
return LogDirectoryChange.changedTo(target);
}
private static void restoreProperty(String previous) {
if (previous == null) {
System.clearProperty(SYSTEM_PROPERTY_KEY);
} else {
System.setProperty(SYSTEM_PROPERTY_KEY, previous);
}
}
/**
* Konfiguriert den laufenden Log4j2-{@link LoggerContext} neu, sodass
* {@code ${sys:log.directory}} erneut aufgelöst wird.
@@ -96,6 +96,24 @@ class RuntimeLogDirectoryReconfigurerTest {
assertEquals(0, reconf.reconfigureCalls);
}
@Test
void apply_reconfigureFails_restoresPreviousProperty() {
System.setProperty(KEY, "C:/vorher/logs");
RuntimeLogDirectoryReconfigurer failing = new RuntimeLogDirectoryReconfigurer() {
@Override
protected void reconfigure() {
throw new IllegalStateException("reconfigure kaputt");
}
};
Path target = tempDir.resolve("neu");
LogDirectoryChange change = failing.apply(target);
assertFalse(change.changed());
assertEquals("C:/vorher/logs", System.getProperty(KEY),
"Nach fehlgeschlagener Neukonfiguration muss der vorherige Property-Wert wiederhergestellt sein");
}
@Test
void apply_nonCreatableDirectory_leavesPropertyUnchanged() throws IOException {
RecordingReconfigurer reconf = new RecordingReconfigurer();