feat: JSpecify 1.0.0.

Change-Id: I84cc903128d013ff7f6b6cee29353abbe0a84fc8
diff --git a/core/pom.xml b/core/pom.xml
index 97eb2ac..512d231 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -38,9 +38,15 @@
       <version>2.1.3</version>
     </dependency>
     <dependency>
-      <groupId>io.smallrye.common</groupId>
-      <artifactId>smallrye-common-constraint</artifactId>
-      <version>2.5.0</version>
+      <groupId>org.jspecify</groupId>
+      <artifactId>jspecify</artifactId>
+      <version>1.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>io.github.eisop</groupId>
+      <artifactId>checker-qual</artifactId>
+      <version>3.42.0-eisop4</version>
+      <scope>provided</scope>
     </dependency>
 
     <!-- Include Parsson for backwards-compatibility. -->
@@ -83,14 +89,55 @@
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <configuration>
+          <fork>true</fork>
           <annotationProcessorPaths>
             <path>
               <groupId>org.openjdk.jmh</groupId>
               <artifactId>jmh-generator-annprocess</artifactId>
               <version>1.37</version>
             </path>
+            <path>
+              <groupId>io.github.eisop</groupId>
+              <artifactId>checker</artifactId>
+              <version>3.42.0-eisop4</version>
+            </path>
           </annotationProcessorPaths>
+          <compilerArgs>
+            <arg>-Xmaxerrs</arg>
+            <arg>10000</arg>
+            <arg>-Xmaxwarns</arg>
+            <arg>10000</arg>
+          </compilerArgs>
         </configuration>
+        <executions>
+          <execution>
+            <id>default-compile</id>
+            <configuration>
+              <annotationProcessors>
+                <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor>
+              </annotationProcessors>
+              <compilerArgs combine.children="append">
+                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
+                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
+                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
+                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
+                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
+                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
+                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
+                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
+                <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
+              </compilerArgs>
+            </configuration>
+          </execution>
+          <execution>
+            <id>default-testCompile</id>
+            <configuration>
+              <annotationProcessors>
+                <annotationProcessor>org.openjdk.jmh.generators.BenchmarkProcessor</annotationProcessor>
+              </annotationProcessors>
+            </configuration>
+          </execution>
+        </executions>
       </plugin>
 
       <plugin>
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
index 0b2003d..9c66f82 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
@@ -6,17 +6,13 @@
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.ServiceLoader;
+import java.util.*;
 import java.util.ServiceLoader.Provider;
 import java.util.logging.Level;
 import java.util.stream.Collectors;
 import org.jboss.logmanager.ExtFormatter;
 import org.jboss.logmanager.ExtLogRecord;
+import org.jspecify.annotations.Nullable;
 
 /**
  * Formats log records as JSON for consumption by Google Cloud Logging.
@@ -42,7 +38,7 @@
 
   private final List<StructuredParameterProvider> parameterProviders;
   private final List<LabelProvider> labelProviders;
-  private final ThreadLocal<StringBuilder> stringBuilder;
+  private final ThreadLocal<@Nullable StringBuilder> stringBuilder;
 
   /**
    * Constructs a {@link Formatter} with custom configuration.
@@ -125,8 +121,9 @@
 
     String insertId = null;
 
-    if (logRecord.getParameters() != null) {
-      for (var parameter : logRecord.getParameters()) {
+    var logRecordParameters = logRecord.getParameters();
+    if (logRecordParameters != null) {
+      for (var parameter : logRecordParameters) {
         if (parameter instanceof StructuredParameter) {
           parameters.add((StructuredParameter) parameter);
         } else if (parameter instanceof Label) {
@@ -158,7 +155,7 @@
             logRecord.getLevel().intValue() >= 1000 ? ERROR_EVENT_TYPE : null,
             insertId);
 
-    var b = stringBuilder.get();
+    var b = Objects.requireNonNull(stringBuilder.get());
     b.delete(0, b.length());
     b.append("{");
     entry.json(b);
@@ -166,7 +163,7 @@
     return b.toString();
   }
 
-  private static LogEntry.SourceLocation sourceLocationOf(ExtLogRecord logRecord) {
+  private static LogEntry.@Nullable SourceLocation sourceLocationOf(ExtLogRecord logRecord) {
     var sourceFileName = logRecord.getSourceFileName();
     var sourceLineNumber = logRecord.getSourceLineNumber();
     var sourceClassName = logRecord.getSourceClassName();
@@ -191,9 +188,10 @@
     var messagePrintWriter = new PrintWriter(messageStringWriter);
     messagePrintWriter.append(this.formatMessage(logRecord));
 
-    if (logRecord.getThrown() != null) {
+    var logRecordThrown = logRecord.getThrown();
+    if (logRecordThrown != null) {
       messagePrintWriter.println();
-      logRecord.getThrown().printStackTrace(messagePrintWriter);
+      logRecordThrown.printStackTrace(messagePrintWriter);
     }
 
     messagePrintWriter.close();
@@ -230,9 +228,9 @@
   private static class ProviderContext
       implements LabelProvider.Context, StructuredParameterProvider.Context {
 
-    private final String loggerName;
+    private final @Nullable String loggerName;
     private final long sequenceNumber;
-    private final String threadName;
+    private final @Nullable String threadName;
 
     private ProviderContext(ExtLogRecord logRecord) {
       loggerName = logRecord.getLoggerName();
@@ -241,7 +239,7 @@
     }
 
     @Override
-    public String loggerName() {
+    public @Nullable String loggerName() {
       return loggerName;
     }
 
@@ -251,7 +249,7 @@
     }
 
     @Override
-    public String threadName() {
+    public @Nullable String threadName() {
       return threadName;
     }
   }
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/InsertId.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/InsertId.java
index b55cf78..48b376c 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/InsertId.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/InsertId.java
@@ -5,17 +5,18 @@
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
 import java.util.Objects;
+import org.jspecify.annotations.Nullable;
 
 /**
  * A unique identifier for a log entry.
  *
- * <p>Prevents the duplicate insertion of log entries.  Also serves as a discriminator to order log entries that carry
- * the same time stamp.
+ * <p>Prevents the duplicate insertion of log entries. Also serves as a discriminator to order log
+ * entries that carry the same time stamp.
  *
  * <p>Will be generated by Google Cloud Logging if not provided.
  *
- * <p>Instances of {@link InsertId} can be passed as log parameters to the {@code *f} family of logging
- * functions on {@link org.jboss.logging.Logger}.
+ * <p>Instances of {@link InsertId} can be passed as log parameters to the {@code *f} family of
+ * logging functions on {@link org.jboss.logging.Logger}.
  *
  * <p><strong>Example:</strong>
  *
@@ -63,7 +64,7 @@
   }
 
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@Nullable Object obj) {
     if (obj == this) return true;
     if (obj == null || obj.getClass() != this.getClass()) return false;
     var that = (InsertId) obj;
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.java
index a2c468b..9e16aab 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.java
@@ -10,6 +10,7 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Objects;
+import org.jspecify.annotations.Nullable;
 
 /**
  * A simple single key–value pair forming a {@link StructuredParameter}.
@@ -168,7 +169,7 @@
   }
 
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@Nullable Object obj) {
     if (obj == this) return true;
     if (obj == null || obj.getClass() != this.getClass()) return false;
     var that = (KeyValueParameter) obj;
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Label.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Label.java
index d5a9000..2696185 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Label.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Label.java
@@ -5,6 +5,7 @@
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
 import java.util.Objects;
+import org.jspecify.annotations.Nullable;
 
 /**
  * A label usable to tag a log message.
@@ -78,7 +79,7 @@
   }
 
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@Nullable Object obj) {
     if (obj == this) return true;
     if (obj == null || obj.getClass() != this.getClass()) return false;
     var that = (Label) obj;
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.java
index 0298042..2bc0349 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.java
@@ -5,6 +5,7 @@
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
 import java.util.Collection;
+import org.jspecify.annotations.Nullable;
 
 /**
  * A user-supplied provider for {@link Label}s.
@@ -52,7 +53,7 @@
    * @return a collection of {@link Label}s to add to each log entry that is logged.
    * @see #getLabels(Context)
    */
-  default Collection<Label> getLabels() {
+  default @Nullable Collection<Label> getLabels() {
     return null;
   }
 
@@ -63,7 +64,7 @@
    *
    * @return a collection of {@link Label}s to add to each log entry that is logged.
    */
-  default Collection<Label> getLabels(Context context) {
+  default @Nullable Collection<Label> getLabels(Context context) {
     return getLabels();
   }
 
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
index 2d08c29..d335ee4 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
@@ -4,12 +4,12 @@
 
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
-import io.smallrye.common.constraint.Nullable;
 import jakarta.json.JsonString;
 import jakarta.json.JsonValue;
 import java.time.Instant;
 import java.util.List;
 import java.util.Map;
+import org.jspecify.annotations.Nullable;
 
 /**
  * A JSON log entry compatible with Google Cloud Logging.
@@ -27,15 +27,15 @@
   private final String message;
   private final String severity;
   private final Timestamp timestamp;
-  @Nullable private final String trace;
-  @Nullable private final String spanId;
-  @Nullable private final SourceLocation sourceLocation;
+  private final @Nullable String trace;
+  private final @Nullable String spanId;
+  private final @Nullable SourceLocation sourceLocation;
   private final Map<String, String> labels;
   private final List<StructuredParameter> parameters;
   private final Map<String, String> mappedDiagnosticContext;
-  @Nullable private final String nestedDiagnosticContext;
-  @Nullable private final String type;
-  @Nullable private final String insertId;
+  private final @Nullable String nestedDiagnosticContext;
+  private final @Nullable String type;
+  private final @Nullable String insertId;
 
   LogEntry(
       String message,
@@ -66,9 +66,9 @@
 
   static final class SourceLocation {
 
-    @Nullable private final String file;
-    @Nullable private final String line;
-    @Nullable private final String function;
+    private final @Nullable String file;
+    private final @Nullable String line;
+    private final @Nullable String function;
 
     SourceLocation(@Nullable String file, @Nullable String line, @Nullable String function) {
       this.file = file;
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/ProviderContext.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/ProviderContext.java
index 08b399a..93f7a7a 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/ProviderContext.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/ProviderContext.java
@@ -5,6 +5,7 @@
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
 import org.jboss.logmanager.ExtLogRecord;
+import org.jspecify.annotations.Nullable;
 
 /**
  * Contextual data available to {@link StructuredParameterProvider} and {@link LabelProvider}.
@@ -19,7 +20,7 @@
    *
    * @return {@link ExtLogRecord#getLoggerName()}.
    */
-  String loggerName();
+  @Nullable String loggerName();
 
   /**
    * The {@link ExtLogRecord#getSequenceNumber()} property of the log record that is being
@@ -34,5 +35,5 @@
    *
    * @return {@link ExtLogRecord#getThreadName()}.
    */
-  String threadName();
+  @Nullable String threadName();
 }
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.java
index d78f0d8..c02516c 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.java
@@ -4,6 +4,8 @@
 
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
+import org.jspecify.annotations.Nullable;
+
 /**
  * A user-supplied provider for {@link StructuredParameter}s.
  *
@@ -58,7 +60,7 @@
    * @return a {@link StructuredParameter} to add to each log entry that is logged.
    * @see #getParameter(Context)
    */
-  default StructuredParameter getParameter() {
+  default @Nullable StructuredParameter getParameter() {
     return null;
   }
 
@@ -73,7 +75,7 @@
    *
    * @return a {@link StructuredParameter} to add to each log entry that is logged.
    */
-  default StructuredParameter getParameter(Context context) {
+  default @Nullable StructuredParameter getParameter(Context context) {
     return getParameter();
   }
 
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/package-info.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/package-info.java
index a84f1fc..0ffe13c 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/package-info.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/package-info.java
@@ -198,4 +198,7 @@
  * }
  * }
  */
+@NullMarked
 package eu.mulk.quarkus.googlecloud.jsonlogging;
+
+import org.jspecify.annotations.NullMarked;