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
@@ -1,6 +1,7 @@
package de.gecheckt.pdf.umbenenner.application.port.in;
import java.time.Instant;
import java.util.Objects;
import java.util.Optional;
/**
@@ -37,9 +38,9 @@ public record HistoricalDocumentContext(
* {@code lastFailureInstant} {@code null} sind
*/
public HistoricalDocumentContext {
lastTargetFileName = lastTargetFileName == null ? Optional.empty() : lastTargetFileName;
lastSuccessInstant = lastSuccessInstant == null ? Optional.empty() : lastSuccessInstant;
lastFailureInstant = lastFailureInstant == null ? Optional.empty() : lastFailureInstant;
lastTargetFileName = Objects.requireNonNullElse(lastTargetFileName, Optional.empty());
lastSuccessInstant = Objects.requireNonNullElse(lastSuccessInstant, Optional.empty());
lastFailureInstant = Objects.requireNonNullElse(lastFailureInstant, Optional.empty());
}
/**
@@ -1,6 +1,7 @@
package de.gecheckt.pdf.umbenenner.application.port.in;
import java.time.Instant;
import java.util.Objects;
import java.util.Optional;
import de.gecheckt.pdf.umbenenner.application.port.out.RunSummary;
@@ -48,18 +49,10 @@ public record SchedulerStatus(
if (state == null) {
throw new IllegalArgumentException("state darf nicht null sein");
}
if (lastRunEndedAt == null) {
throw new IllegalArgumentException("lastRunEndedAt darf nicht null sein");
}
if (lastRunSummary == null) {
throw new IllegalArgumentException("lastRunSummary darf nicht null sein");
}
if (nextTickAt == null) {
throw new IllegalArgumentException("nextTickAt darf nicht null sein");
}
if (lastError == null) {
throw new IllegalArgumentException("lastError darf nicht null sein");
}
Objects.requireNonNull(lastRunEndedAt, "lastRunEndedAt darf nicht null sein");
Objects.requireNonNull(lastRunSummary, "lastRunSummary darf nicht null sein");
Objects.requireNonNull(nextTickAt, "nextTickAt darf nicht null sein");
Objects.requireNonNull(lastError, "lastError darf nicht null sein");
}
/**
@@ -32,7 +32,7 @@ public record EffectiveApiKeyDescriptor(
*/
public EffectiveApiKeyDescriptor {
Objects.requireNonNull(origin, "origin must not be null");
envVarName = envVarName == null ? Optional.empty() : envVarName;
envVarName = Objects.requireNonNullElse(envVarName, Optional.empty());
}
/**
@@ -45,7 +45,7 @@ public record ModelCatalogRequest(
if (timeoutSeconds <= 0) {
throw new IllegalArgumentException("timeoutSeconds must be positive, was: " + timeoutSeconds);
}
baseUrl = baseUrl == null ? Optional.empty() : baseUrl;
apiKey = apiKey == null ? Optional.empty() : apiKey;
baseUrl = Objects.requireNonNullElse(baseUrl, Optional.empty());
apiKey = Objects.requireNonNullElse(apiKey, Optional.empty());
}
}
@@ -38,7 +38,7 @@ public record EditorValidationFinding(
public EditorValidationFinding {
Objects.requireNonNull(severity, "severity must not be null");
Objects.requireNonNull(message, "message must not be null");
fieldKey = fieldKey == null ? Optional.empty() : fieldKey;
fieldKey = Objects.requireNonNullElse(fieldKey, Optional.empty());
}
/**
@@ -89,9 +89,7 @@ public sealed interface CheckpointResult
Objects.requireNonNull(checkpointId, "checkpointId must not be null");
Objects.requireNonNull(severity, "severity must not be null");
Objects.requireNonNull(message, "message must not be null");
correctionSuggestion = correctionSuggestion == null
? Optional.empty()
: correctionSuggestion;
correctionSuggestion = Objects.requireNonNullElse(correctionSuggestion, Optional.empty());
}
/**