From c4a5d8289ac21e5c0ba4d2bd20607a3e3951320b Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Thu, 6 Nov 2025 14:19:06 +0100 Subject: chore: use jspecify and NullAway (#183) --- .../etl/processor/consent/GicsConsentService.java | 15 +++++++++----- .../etl/processor/consent/IConsentService.java | 2 ++ .../processor/consent/MtbFileConsentService.java | 9 +++++++-- .../dnpm/etl/processor/pseudonym/Generator.java | 3 +++ .../pseudonym/GpasPseudonymGenerator.java | 23 ++++++++++++++-------- 5 files changed, 37 insertions(+), 15 deletions(-) (limited to 'src/main/java/dev/dnpm/etl') diff --git a/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java b/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java index 03348ff..7ffd3e0 100644 --- a/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java +++ b/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java @@ -11,7 +11,8 @@ import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.r4.model.*; import org.hl7.fhir.r4.model.Parameters.ParametersParameterComponent; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpEntity; @@ -135,6 +136,7 @@ public class GicsConsentService implements IConsentService { return headers; } + @Nullable protected String callGicsApi(Parameters parameter, String endpoint) { var parameterAsXml = fhirContext.newXmlParser().encodeResourceToString(parameter); HttpEntity requestEntity = @@ -172,7 +174,8 @@ public class GicsConsentService implements IConsentService { } @Override - public TtpConsentStatus getTtpBroadConsentStatus(String personIdentifierValue) { + @NonNull + public TtpConsentStatus getTtpBroadConsentStatus(@NonNull String personIdentifierValue) { var consentStatusResponse = callGicsApi( getFhirRequestParameters(personIdentifierValue), @@ -211,7 +214,7 @@ public class GicsConsentService implements IConsentService { } } - @NotNull + @NonNull private String getConsentDomainName(ConsentDomain targetConsentDomain) { return switch (targetConsentDomain) { case BROAD_CONSENT -> gIcsConfigProperties.getBroadConsentDomainName(); @@ -257,7 +260,7 @@ public class GicsConsentService implements IConsentService { return requestParameter; } - private TtpConsentStatus evaluateConsentResponse(String consentStatusResponse) { + private TtpConsentStatus evaluateConsentResponse(@Nullable String consentStatusResponse) { if (consentStatusResponse == null) { return TtpConsentStatus.FAILED_TO_ASK; } @@ -289,7 +292,9 @@ public class GicsConsentService implements IConsentService { } @Override - public Bundle getConsent(String patientId, Date requestDate, ConsentDomain consentDomain) { + @NonNull + public Bundle getConsent( + @NonNull String patientId, @NonNull Date requestDate, @NonNull ConsentDomain consentDomain) { Bundle gIcsResultBundle = currentConsentForPersonAndTemplate(patientId, consentDomain, requestDate); if (ConsentDomain.BROAD_CONSENT == consentDomain) { diff --git a/src/main/java/dev/dnpm/etl/processor/consent/IConsentService.java b/src/main/java/dev/dnpm/etl/processor/consent/IConsentService.java index 148592e..f9230ec 100644 --- a/src/main/java/dev/dnpm/etl/processor/consent/IConsentService.java +++ b/src/main/java/dev/dnpm/etl/processor/consent/IConsentService.java @@ -2,7 +2,9 @@ package dev.dnpm.etl.processor.consent; import java.util.Date; import org.hl7.fhir.r4.model.Bundle; +import org.jspecify.annotations.NullMarked; +@NullMarked public interface IConsentService { /** diff --git a/src/main/java/dev/dnpm/etl/processor/consent/MtbFileConsentService.java b/src/main/java/dev/dnpm/etl/processor/consent/MtbFileConsentService.java index a126a51..cc8107f 100644 --- a/src/main/java/dev/dnpm/etl/processor/consent/MtbFileConsentService.java +++ b/src/main/java/dev/dnpm/etl/processor/consent/MtbFileConsentService.java @@ -2,6 +2,7 @@ package dev.dnpm.etl.processor.consent; import java.util.Date; import org.hl7.fhir.r4.model.Bundle; +import org.jspecify.annotations.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +15,8 @@ public class MtbFileConsentService implements IConsentService { } @Override - public TtpConsentStatus getTtpBroadConsentStatus(String personIdentifierValue) { + @NonNull + public TtpConsentStatus getTtpBroadConsentStatus(@NonNull String personIdentifierValue) { return TtpConsentStatus.UNKNOWN_CHECK_FILE; } @@ -24,8 +26,11 @@ public class MtbFileConsentService implements IConsentService { * @return empty bundle */ @Override + @NonNull public Bundle getConsent( - String personIdentifierValue, Date requestDate, ConsentDomain consentDomain) { + @NonNull String personIdentifierValue, + @NonNull Date requestDate, + @NonNull ConsentDomain consentDomain) { return new Bundle(); } } diff --git a/src/main/java/dev/dnpm/etl/processor/pseudonym/Generator.java b/src/main/java/dev/dnpm/etl/processor/pseudonym/Generator.java index fce8146..e72a8f8 100644 --- a/src/main/java/dev/dnpm/etl/processor/pseudonym/Generator.java +++ b/src/main/java/dev/dnpm/etl/processor/pseudonym/Generator.java @@ -19,6 +19,9 @@ package dev.dnpm.etl.processor.pseudonym; +import org.jspecify.annotations.NullMarked; + +@NullMarked public interface Generator { String generate(String id); diff --git a/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java b/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java index 48cdc67..6d1e36b 100644 --- a/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java +++ b/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java @@ -32,7 +32,8 @@ import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.Parameters; import org.hl7.fhir.r4.model.Parameters.ParametersParameterComponent; import org.hl7.fhir.r4.model.StringType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.*; @@ -44,13 +45,13 @@ import org.springframework.web.client.RestTemplate; public class GpasPseudonymGenerator implements Generator { private final FhirContext r4Context; - private final String gPasUrl; + private final @Nullable String gPasUrl; private final HttpHeaders httpHeader; private final RetryTemplate retryTemplate; private final Logger log = LoggerFactory.getLogger(GpasPseudonymGenerator.class); private final RestTemplate restTemplate; - private final @NotNull String genomDeTanDomain; - private final @NotNull String pidPsnDomain; + private final @NonNull String genomDeTanDomain; + private final @NonNull String pidPsnDomain; protected static final String CREATE_OR_GET_PSN = "$pseudonymizeAllowCreate"; protected static final String CREATE_MULTI_DOMAIN_PSN = "$pseudonymize-secondary"; private static final String SINGLE_PSN_PART_NAME = "pseudonym"; @@ -73,11 +74,13 @@ public class GpasPseudonymGenerator implements Generator { } @Override + @NonNull public String generate(String id) { return generate(id, PsnDomainType.SINGLE_PSN_DOMAIN); } @Override + @NonNull public String generateGenomDeTan(String id) { return generate(id, PsnDomainType.MULTI_PSN_DOMAIN); } @@ -106,7 +109,7 @@ public class GpasPseudonymGenerator implements Generator { .formatted(domainType)); } - @NotNull + @NonNull public static String unwrapPseudonym(Parameters gPasPseudonymResult, String targetPartName) { final var parameters = gPasPseudonymResult.getParameter().stream().findFirst(); @@ -140,7 +143,7 @@ public class GpasPseudonymGenerator implements Generator { return psnValue.replaceAll(forbiddenCharsRegex, "_"); } - @NotNull + @NonNull protected ResponseEntity getGpasPseudonym(String gPasRequestBody, String apiEndpoint) { HttpEntity requestEntity = new HttpEntity<>(gPasRequestBody, this.httpHeader); @@ -175,6 +178,9 @@ public class GpasPseudonymGenerator implements Generator { } protected URI buildRequestUrl(String apiEndpoint) throws URISyntaxException { + if (null == gPasUrl) { + throw new URISyntaxException("null", "URI must not be null"); + } var gPasUrl1 = gPasUrl; if (gPasUrl.lastIndexOf("/") == gPasUrl.length() - 1) { gPasUrl1 = gPasUrl.substring(0, gPasUrl.length() - 1); @@ -211,8 +217,9 @@ public class GpasPseudonymGenerator implements Generator { return iParser.encodeResourceToString(param); } - @NotNull - protected HttpHeaders getHttpHeaders(String gPasUserName, String gPasPassword) { + @NonNull + protected HttpHeaders getHttpHeaders( + @Nullable String gPasUserName, @Nullable String gPasPassword) { var headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); -- cgit v1.2.3