From 06b1ef8e2af95f507d6db4ac5e5a71d77e41cc19 Mon Sep 17 00:00:00 2001
From: Magnus Reftel
Date: Thu, 27 Feb 2025 14:42:23 +0100
Subject: [PATCH] Add nullability annotations
So make it clearer to client code that some of the collections can be null
Signed-off-by: Magnus Reftel
---
logback-classic/pom.xml | 5 +++
.../qos/logback/classic/spi/LoggingEvent.java | 37 ++++++++++---------
.../src/main/java/module-info.java | 3 +-
3 files changed, 27 insertions(+), 18 deletions(-)
diff --git a/logback-classic/pom.xml b/logback-classic/pom.xml
index 65f5b7c85b..19cd6f6185 100755
--- a/logback-classic/pom.xml
+++ b/logback-classic/pom.xml
@@ -137,6 +137,11 @@
test
+
+ org.jspecify
+ jspecify
+ 1.0.0
+
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
index be4cd2ecee..024c5b53fc 100755
--- a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
@@ -25,6 +25,9 @@
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.util.EnvUtil;
import ch.qos.logback.core.util.StringUtil;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Marker;
import org.slf4j.event.KeyValuePair;
import org.slf4j.helpers.MessageFormatter;
@@ -150,7 +153,7 @@ public LoggingEvent(String fqcn, Logger logger, Level level, String message, Thr
}
}
- void initTmestampFields(Instant instant) {
+ void initTmestampFields(@NonNull Instant instant) {
this.instant = instant;
long epochSecond = instant.getEpochSecond();
this.nanoseconds = instant.getNano();
@@ -158,7 +161,7 @@ void initTmestampFields(Instant instant) {
this.timeStamp = (epochSecond * 1000) + (milliseconds);
}
- private Throwable extractThrowableAnRearrangeArguments(Object[] argArray) {
+ private @Nullable Throwable extractThrowableAnRearrangeArguments(@Nullable Object[] argArray) {
Throwable extractedThrowable = EventArgUtil.extractThrowable(argArray);
if (EventArgUtil.successfulExtraction(extractedThrowable)) {
this.argumentArray = EventArgUtil.trimmedCopy(argArray);
@@ -166,30 +169,30 @@ private Throwable extractThrowableAnRearrangeArguments(Object[] argArray) {
return extractedThrowable;
}
- public void setArgumentArray(Object[] argArray) {
+ public void setArgumentArray(@Nullable Object[] argArray) {
if (this.argumentArray != null) {
throw new IllegalStateException("argArray has been already set");
}
this.argumentArray = argArray;
}
- public Object[] getArgumentArray() {
+ public @Nullable Object[] getArgumentArray() {
return this.argumentArray;
}
- public void addKeyValuePair(KeyValuePair kvp) {
+ public void addKeyValuePair(@NonNull KeyValuePair kvp) {
if (keyValuePairs == null) {
keyValuePairs = new ArrayList<>(4);
}
keyValuePairs.add(kvp);
}
- public void setKeyValuePairs(List kvpList) {
+ public void setKeyValuePairs(@Nullable List kvpList) {
this.keyValuePairs = kvpList;
}
@Override
- public List getKeyValuePairs() {
+ public @Nullable List getKeyValuePairs() {
return this.keyValuePairs;
}
@@ -205,7 +208,7 @@ public void setLoggerName(String loggerName) {
this.loggerName = loggerName;
}
- public String getThreadName() {
+ public @NonNull String getThreadName() {
if (threadName == null) {
threadName = extractThreadName(Thread.currentThread());
}
@@ -221,7 +224,7 @@ public String getThreadName() {
* @return
* @since 1.5.0
*/
- private String extractThreadName(Thread aThread) {
+ private @NonNull String extractThreadName(@Nullable Thread aThread) {
if (aThread == null) {
return CoreConstants.NA;
}
@@ -243,7 +246,7 @@ private String extractThreadName(Thread aThread) {
* @param aThread
* @return Return the threadId if the thread is a virtual thread, return null otherwise.
*/
- Long getVirtualThreadId(Thread aThread) {
+ Long getVirtualThreadId(@NonNull Thread aThread) {
if (EnvUtil.isJDK21OrHigher()) {
try {
Method isVirtualMethod = Thread.class.getMethod("isVirtual");
@@ -396,7 +399,7 @@ public void setLevel(Level level) {
* Note that after serialization it is impossible to correctly extract caller information.
*
*/
- public StackTraceElement[] getCallerData() {
+ public @NonNull StackTraceElement[] getCallerData() {
if (callerDataArray == null) {
callerDataArray = CallerData.extract(new Throwable(), fqnOfLoggerClass,
loggerContext.getMaxCallerDataDepth(), loggerContext.getFrameworkPackages());
@@ -408,15 +411,15 @@ public boolean hasCallerData() {
return (callerDataArray != null);
}
- public void setCallerData(StackTraceElement[] callerDataArray) {
+ public void setCallerData(@Nullable StackTraceElement[] callerDataArray) {
this.callerDataArray = callerDataArray;
}
- public List getMarkerList() {
+ public @Nullable List getMarkerList() {
return markerList;
}
- public void addMarker(Marker marker) {
+ public void addMarker(@Nullable Marker marker) {
if (marker == null) {
return;
}
@@ -450,7 +453,7 @@ public String getFormattedMessage() {
return formattedMessage;
}
- public Map getMDCPropertyMap() {
+ public @NonNull Map getMDCPropertyMap() {
// populate mdcPropertyMap if null
if (mdcPropertyMap == null) {
MDCAdapter mdcAdapter = loggerContext.getMDCAdapter();
@@ -472,7 +475,7 @@ public Map getMDCPropertyMap() {
* @param map
* @since 1.0.8
*/
- public void setMDCPropertyMap(Map map) {
+ public void setMDCPropertyMap(@Nullable Map map) {
if (mdcPropertyMap != null) {
throw new IllegalStateException("The MDCPropertyMap has been already set for this event.");
}
@@ -485,7 +488,7 @@ public void setMDCPropertyMap(Map map) {
*
* @deprecated Replaced by [@link #getMDCPropertyMap}
*/
- public Map getMdc() {
+ public @NonNull Map getMdc() {
return getMDCPropertyMap();
}
diff --git a/logback-classic/src/main/java/module-info.java b/logback-classic/src/main/java/module-info.java
index c0f962469e..878979f038 100644
--- a/logback-classic/src/main/java/module-info.java
+++ b/logback-classic/src/main/java/module-info.java
@@ -18,7 +18,8 @@
requires org.slf4j;
requires ch.qos.logback.core;
- provides org.slf4j.spi.SLF4JServiceProvider with ch.qos.logback.classic.spi.LogbackServiceProvider;
+ requires org.jspecify;
+ provides org.slf4j.spi.SLF4JServiceProvider with ch.qos.logback.classic.spi.LogbackServiceProvider;
uses ch.qos.logback.classic.spi.Configurator;
exports ch.qos.logback.classic;