From d72462e21a231f864c8695579e6d75c39654e01c Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Thu, 18 Jul 2024 19:34:08 +0200 Subject: feat: JSpecify 1.0.0. Change-Id: I84cc903128d013ff7f6b6cee29353abbe0a84fc8 --- core/pom.xml | 53 ++++++++++++++++++++-- .../quarkus/googlecloud/jsonlogging/Formatter.java | 32 ++++++------- .../quarkus/googlecloud/jsonlogging/InsertId.java | 11 +++-- .../googlecloud/jsonlogging/KeyValueParameter.java | 3 +- .../quarkus/googlecloud/jsonlogging/Label.java | 3 +- .../googlecloud/jsonlogging/LabelProvider.java | 5 +- .../quarkus/googlecloud/jsonlogging/LogEntry.java | 20 ++++---- .../googlecloud/jsonlogging/ProviderContext.java | 5 +- .../jsonlogging/StructuredParameterProvider.java | 6 ++- .../googlecloud/jsonlogging/package-info.java | 3 ++ 10 files changed, 98 insertions(+), 43 deletions(-) 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 @@ SPDX-License-Identifier: LGPL-3.0-or-later 2.1.3 - io.smallrye.common - smallrye-common-constraint - 2.5.0 + org.jspecify + jspecify + 1.0.0 + + + io.github.eisop + checker-qual + 3.42.0-eisop4 + provided @@ -83,14 +89,55 @@ SPDX-License-Identifier: LGPL-3.0-or-later maven-compiler-plugin + true org.openjdk.jmh jmh-generator-annprocess 1.37 + + io.github.eisop + checker + 3.42.0-eisop4 + + + -Xmaxerrs + 10000 + -Xmaxwarns + 10000 + + + + default-compile + + + org.checkerframework.checker.nullness.NullnessChecker + + + -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + + + + + default-testCompile + + + org.openjdk.jmh.generators.BenchmarkProcessor + + + + 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 @@ package eu.mulk.quarkus.googlecloud.jsonlogging; 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 @@ public class Formatter extends ExtFormatter { private final List parameterProviders; private final List labelProviders; - private final ThreadLocal stringBuilder; + private final ThreadLocal<@Nullable StringBuilder> stringBuilder; /** * Constructs a {@link Formatter} with custom configuration. @@ -125,8 +121,9 @@ public class Formatter extends ExtFormatter { 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 @@ public class Formatter extends ExtFormatter { 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 @@ public class Formatter extends ExtFormatter { 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 @@ public class Formatter extends ExtFormatter { 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 @@ public class Formatter extends ExtFormatter { 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 @@ public class Formatter extends ExtFormatter { } @Override - public String loggerName() { + public @Nullable String loggerName() { return loggerName; } @@ -251,7 +249,7 @@ public class Formatter extends ExtFormatter { } @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. * - *

Prevents the duplicate insertion of log entries. Also serves as a discriminator to order log entries that carry - * the same time stamp. + *

Prevents the duplicate insertion of log entries. Also serves as a discriminator to order log + * entries that carry the same time stamp. * *

Will be generated by Google Cloud Logging if not provided. * - *

Instances of {@link InsertId} can be passed as log parameters to the {@code *f} family of logging - * functions on {@link org.jboss.logging.Logger}. + *

Instances of {@link InsertId} can be passed as log parameters to the {@code *f} family of + * logging functions on {@link org.jboss.logging.Logger}. * *

Example: * @@ -63,7 +64,7 @@ public final class InsertId { } @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 jakarta.json.spi.JsonProvider; 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 @@ public final class KeyValueParameter implements StructuredParameter { } @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 @@ public final class Label { } @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 @@ public interface LabelProvider { * @return a collection of {@link Label}s to add to each log entry that is logged. * @see #getLabels(Context) */ - default Collection