Fixe SonarQube Reliability-Issues S2789, S3077 und S2184

S2789 (32 Stellen): null-Checks auf Optional-Feldern entfernt bzw. durch
Objects.requireNonNullElse(field, Optional.empty()) ersetzt. Die zuvor
defensive Behandlung von null-Optionals erfolgt jetzt ueber den
Bibliotheksaufruf, sodass das Verhalten unveraendert bleibt, aber die
direkte Null-Pruefung gegen Optional entfaellt.

S3077 (5 Stellen): volatile-Felder mit Objekt-Referenzen durch
AtomicReference ersetzt (ScheduledExecutorServiceSchedulerAdapter,
BootstrapRunner.guiApplicationRunContext, PdfPreviewPane.currentDocument/
currentRenderer/currentSourceFile, SingleInstanceGuard.socket). Die
PdfPreviewPane-Felder werden auf JavaFX- bzw. Worker-Thread genutzt;
AtomicReference bietet hier konsistente atomare Publikation ohne
Verhaltensaenderung.

S2184 (3 Stellen): Integer-Division SECONDARY_SPACING / 2 durch
SECONDARY_SPACING / 2.0 ersetzt, damit das Insets-Argument als double
ohne implizite Truncierung berechnet wird.
This commit is contained in:
2026-05-07 17:11:29 +02:00
parent 11eac074ef
commit 32e32a9b27
18 changed files with 76 additions and 80 deletions
@@ -54,7 +54,7 @@ public class ScheduledExecutorServiceSchedulerAdapter implements SchedulerPort {
*/
final AtomicReference<BatchRunTrigger> currentTrigger = new AtomicReference<>();
private volatile ScheduledExecutorService executor;
private final AtomicReference<ScheduledExecutorService> executor = new AtomicReference<>();
/**
* Erstellt einen neuen Adapter.
@@ -85,7 +85,7 @@ public class ScheduledExecutorServiceSchedulerAdapter implements SchedulerPort {
public void startScheduler(SchedulerConfig config, BatchRunTrigger trigger) {
Objects.requireNonNull(config, "config darf nicht null sein");
Objects.requireNonNull(trigger, "trigger darf nicht null sein");
if (executor != null) {
if (executor.get() != null) {
logger.debug("Scheduler ist bereits aktiv Start-Aufruf wird ignoriert.");
return;
}
@@ -105,7 +105,7 @@ public class ScheduledExecutorServiceSchedulerAdapter implements SchedulerPort {
0L,
config.intervalSeconds(),
TimeUnit.SECONDS);
executor = newExecutor;
executor.set(newExecutor);
logger.info("Scheduler gestartet. Intervall: {} Sekunden.", config.intervalSeconds());
}
@@ -118,12 +118,11 @@ public class ScheduledExecutorServiceSchedulerAdapter implements SchedulerPort {
*/
@Override
public void stopScheduler() {
ScheduledExecutorService localExecutor = executor;
ScheduledExecutorService localExecutor = executor.getAndSet(null);
if (localExecutor == null) {
logger.debug("Scheduler ist bereits gestoppt Stop-Aufruf wird ignoriert.");
return;
}
executor = null;
currentTrigger.set(null);
localExecutor.shutdown();
logger.info("Scheduler angehalten.");