From 519e8fb2244bc070e64484d4fa74faba227faaf9 Mon Sep 17 00:00:00 2001 From: Djaytan <26904516+Djaytan@users.noreply.github.com> Date: Fri, 3 Jan 2025 14:12:13 +0100 Subject: [PATCH] feat: setup JPMS module --- .../slf4j/{ => api}/BukkitLoggerFactory.java | 17 +++++---- .../{ => internal}/BukkitLoggerAdapter.java | 6 ++-- .../BukkitLoggerServiceProvider.java | 3 +- .../{ => internal}/JulLogRecordFactory.java | 8 ++--- .../slf4j/{ => internal}/Slf4jLogRecord.java | 2 +- src/main/java/module-info.java | 35 +++++++++++++++++++ .../org.slf4j.spi.SLF4JServiceProvider | 2 +- .../slf4j/{ => api}/ArgumentsTests.java | 9 +++-- .../bukkit/slf4j/{ => api}/BasicTests.java | 12 +++---- .../bukkit/slf4j/{ => api}/TestHelper.java | 3 +- .../{ => internal}/Slf4jLogRecordTest.java | 11 ++++-- 11 files changed, 80 insertions(+), 28 deletions(-) rename src/main/java/com/djaytan/bukkit/slf4j/{ => api}/BukkitLoggerFactory.java (89%) rename src/main/java/com/djaytan/bukkit/slf4j/{ => internal}/BukkitLoggerAdapter.java (93%) rename src/main/java/com/djaytan/bukkit/slf4j/{ => internal}/BukkitLoggerServiceProvider.java (96%) rename src/main/java/com/djaytan/bukkit/slf4j/{ => internal}/JulLogRecordFactory.java (94%) rename src/main/java/com/djaytan/bukkit/slf4j/{ => internal}/Slf4jLogRecord.java (98%) create mode 100644 src/main/java/module-info.java rename src/test/java/com/djaytan/bukkit/slf4j/{ => api}/ArgumentsTests.java (91%) rename src/test/java/com/djaytan/bukkit/slf4j/{ => api}/BasicTests.java (95%) rename src/test/java/com/djaytan/bukkit/slf4j/{ => api}/TestHelper.java (97%) rename src/test/java/com/djaytan/bukkit/slf4j/{ => internal}/Slf4jLogRecordTest.java (79%) diff --git a/src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerFactory.java b/src/main/java/com/djaytan/bukkit/slf4j/api/BukkitLoggerFactory.java similarity index 89% rename from src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerFactory.java rename to src/main/java/com/djaytan/bukkit/slf4j/api/BukkitLoggerFactory.java index eb532a8..aa6ffac 100644 --- a/src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerFactory.java +++ b/src/main/java/com/djaytan/bukkit/slf4j/api/BukkitLoggerFactory.java @@ -20,11 +20,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.api; +import com.djaytan.bukkit.slf4j.internal.BukkitLoggerAdapter; +import org.jetbrains.annotations.ApiStatus.Internal; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import org.slf4j.ILoggerFactory; import org.slf4j.Logger; @@ -38,6 +41,11 @@ public final class BukkitLoggerFactory implements ILoggerFactory { private static java.util.logging.Logger staticLogger; + @Internal + public BukkitLoggerFactory() { + // Bukkit logger must be provided by the library consumer + } + /** * Provides the Bukkit logger to be returned by any subsequent call to {@link * org.slf4j.LoggerFactory#getLogger(String)}. @@ -55,11 +63,8 @@ public static void provideBukkitLogger(@NotNull java.util.logging.Logger jdk14Lo staticLogger = jdk14Logger; } - /** - * Resets the Bukkit logger. - * - *

For testing purposes only. - */ + /** Resets the Bukkit logger. */ + @TestOnly static void resetBukkitLogger() { staticLogger = null; } diff --git a/src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerAdapter.java b/src/main/java/com/djaytan/bukkit/slf4j/internal/BukkitLoggerAdapter.java similarity index 93% rename from src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerAdapter.java rename to src/main/java/com/djaytan/bukkit/slf4j/internal/BukkitLoggerAdapter.java index 6bd6c29..799167c 100644 --- a/src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerAdapter.java +++ b/src/main/java/com/djaytan/bukkit/slf4j/internal/BukkitLoggerAdapter.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.internal; import java.util.logging.Level; import java.util.logging.Logger; @@ -33,11 +33,11 @@ * This class is responsible for adapting the Bukkit logger instance against the SLF4J {@link * org.slf4j.Logger} interface. */ -final class BukkitLoggerAdapter extends LegacyAbstractLogger { +public final class BukkitLoggerAdapter extends LegacyAbstractLogger { private final transient Logger logger; - BukkitLoggerAdapter(@NotNull Logger logger, @NotNull String name) { + public BukkitLoggerAdapter(@NotNull Logger logger, @NotNull String name) { super.name = name; this.logger = logger; } diff --git a/src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerServiceProvider.java b/src/main/java/com/djaytan/bukkit/slf4j/internal/BukkitLoggerServiceProvider.java similarity index 96% rename from src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerServiceProvider.java rename to src/main/java/com/djaytan/bukkit/slf4j/internal/BukkitLoggerServiceProvider.java index d8a9498..5a6cf37 100644 --- a/src/main/java/com/djaytan/bukkit/slf4j/BukkitLoggerServiceProvider.java +++ b/src/main/java/com/djaytan/bukkit/slf4j/internal/BukkitLoggerServiceProvider.java @@ -20,8 +20,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.internal; +import com.djaytan.bukkit.slf4j.api.BukkitLoggerFactory; import org.slf4j.ILoggerFactory; import org.slf4j.IMarkerFactory; import org.slf4j.helpers.BasicMDCAdapter; diff --git a/src/main/java/com/djaytan/bukkit/slf4j/JulLogRecordFactory.java b/src/main/java/com/djaytan/bukkit/slf4j/internal/JulLogRecordFactory.java similarity index 94% rename from src/main/java/com/djaytan/bukkit/slf4j/JulLogRecordFactory.java rename to src/main/java/com/djaytan/bukkit/slf4j/internal/JulLogRecordFactory.java index cfa7ee5..f9cb136 100644 --- a/src/main/java/com/djaytan/bukkit/slf4j/JulLogRecordFactory.java +++ b/src/main/java/com/djaytan/bukkit/slf4j/internal/JulLogRecordFactory.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.internal; import java.util.ResourceBundle; import java.util.logging.LogRecord; @@ -93,8 +93,8 @@ final class JulLogRecordFactory { * instead since that's the official and supported way for answering our specific need here. If we * want to improve the implementation, it seems to be the way to go. The JUL implementation has * gone into this direction, for example, since a recent version of JDK higher than 8 (see the - * {@link LogRecord#inferCaller()} method for details). Furthermore, it will make the code more - * testable (that's not fully the case with the current implementation because of + * {@link LogRecord}{@code #inferCaller()} method for details). Furthermore, it will make the code + * more testable (that's not fully the case with the current implementation because of * new Throwable() call). * * @param adapterOrSubstituteCallerFqcn The adapter or substitute SLF4J logger fully qualified @@ -104,7 +104,7 @@ final class JulLogRecordFactory { private static @Nullable CallerLocation inferCallerLocation( @NotNull String adapterOrSubstituteCallerFqcn) { // The first element is the top-most call on the execution stack i.e. always the following line: - // com.djaytan.bukkit.slf4j/com.djaytan.bukkit.slf4j.JulLogRecordFactory.inferCallerLocation(JulLogRecordFactory.java:) + // com.djaytan.bukkit.slf4j/com.djaytan.bukkit.slf4j.internal.JulLogRecordFactory.inferCallerLocation(JulLogRecordFactory.java:) StackTraceElement[] stackTraceElements = new Throwable().getStackTrace(); // First, search for a method in a logger implementation class. diff --git a/src/main/java/com/djaytan/bukkit/slf4j/Slf4jLogRecord.java b/src/main/java/com/djaytan/bukkit/slf4j/internal/Slf4jLogRecord.java similarity index 98% rename from src/main/java/com/djaytan/bukkit/slf4j/Slf4jLogRecord.java rename to src/main/java/com/djaytan/bukkit/slf4j/internal/Slf4jLogRecord.java index a5c59ba..e98a27e 100644 --- a/src/main/java/com/djaytan/bukkit/slf4j/Slf4jLogRecord.java +++ b/src/main/java/com/djaytan/bukkit/slf4j/internal/Slf4jLogRecord.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.internal; import java.util.Arrays; import java.util.Objects; diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 0000000..12fd82b --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,35 @@ +/* + * The MIT License + * Copyright © 2023 Loïc DUBOIS-TERMOZ (alias Djaytan) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +import com.djaytan.bukkit.slf4j.internal.BukkitLoggerServiceProvider; +import org.slf4j.spi.SLF4JServiceProvider; + +module bukkit.slf4j { + requires java.logging; + requires org.jetbrains.annotations; + requires org.slf4j; + + exports com.djaytan.bukkit.slf4j.api; + + provides SLF4JServiceProvider with + BukkitLoggerServiceProvider; +} diff --git a/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider b/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider index 3c475d0..3b6848f 100644 --- a/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider +++ b/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider @@ -1 +1 @@ -com.djaytan.bukkit.slf4j.BukkitLoggerServiceProvider +com.djaytan.bukkit.slf4j.internal.BukkitLoggerServiceProvider diff --git a/src/test/java/com/djaytan/bukkit/slf4j/ArgumentsTests.java b/src/test/java/com/djaytan/bukkit/slf4j/api/ArgumentsTests.java similarity index 91% rename from src/test/java/com/djaytan/bukkit/slf4j/ArgumentsTests.java rename to src/test/java/com/djaytan/bukkit/slf4j/api/ArgumentsTests.java index d9e9bc9..d8fa5d4 100644 --- a/src/test/java/com/djaytan/bukkit/slf4j/ArgumentsTests.java +++ b/src/test/java/com/djaytan/bukkit/slf4j/api/ArgumentsTests.java @@ -20,10 +20,10 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.api; -import static com.djaytan.bukkit.slf4j.TestHelper.executeLogging; -import static com.djaytan.bukkit.slf4j.TestHelper.testLoggingExecutionOutputExpectedMessage; +import static com.djaytan.bukkit.slf4j.api.TestHelper.executeLogging; +import static com.djaytan.bukkit.slf4j.api.TestHelper.testLoggingExecutionOutputExpectedMessage; import static org.assertj.core.api.Assertions.assertThat; import java.time.LocalDateTime; @@ -89,11 +89,13 @@ void consumer_can_log_lots_of_arguments() { } @Test + @SuppressWarnings({"java:S3457", "LoggingPlaceholderCountMatchesArgumentCount"}) void exceeding_arguments_shall_be_ignored() { testLoggingExecutionOutputExpectedMessage(slf4jLogger -> slf4jLogger.info("{}", 14, 15), "14"); } @Test + @SuppressWarnings({"java:S3457", "LoggingPlaceholderCountMatchesArgumentCount"}) void templates_must_remain_for_missing_argument() { testLoggingExecutionOutputExpectedMessage( slf4jLogger -> slf4jLogger.info("{}, {}", 14), "14, {}"); @@ -118,6 +120,7 @@ void last_argument_is_treated_specially_if_it_is_a_throwable() { } @Test + @SuppressWarnings({"java:S3457", "LoggingPlaceholderCountMatchesArgumentCount"}) void last_argument_is_treated_specially_if_it_is_a_throwable_even_with_missing_argument() { // Arrange var throwable = new IllegalStateException("test invalid state"); diff --git a/src/test/java/com/djaytan/bukkit/slf4j/BasicTests.java b/src/test/java/com/djaytan/bukkit/slf4j/api/BasicTests.java similarity index 95% rename from src/test/java/com/djaytan/bukkit/slf4j/BasicTests.java rename to src/test/java/com/djaytan/bukkit/slf4j/api/BasicTests.java index e5b9072..acea9f9 100644 --- a/src/test/java/com/djaytan/bukkit/slf4j/BasicTests.java +++ b/src/test/java/com/djaytan/bukkit/slf4j/api/BasicTests.java @@ -20,13 +20,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.api; -import static com.djaytan.bukkit.slf4j.TestHelper.SAMPLE_LOGGER_NAME; -import static com.djaytan.bukkit.slf4j.TestHelper.executeLogging; -import static com.djaytan.bukkit.slf4j.TestHelper.flushHandlers; -import static com.djaytan.bukkit.slf4j.TestHelper.getJulStreamLogger; -import static com.djaytan.bukkit.slf4j.TestHelper.setJulLoggerLevel; +import static com.djaytan.bukkit.slf4j.api.TestHelper.SAMPLE_LOGGER_NAME; +import static com.djaytan.bukkit.slf4j.api.TestHelper.executeLogging; +import static com.djaytan.bukkit.slf4j.api.TestHelper.flushHandlers; +import static com.djaytan.bukkit.slf4j.api.TestHelper.getJulStreamLogger; +import static com.djaytan.bukkit.slf4j.api.TestHelper.setJulLoggerLevel; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.params.provider.Arguments.arguments; diff --git a/src/test/java/com/djaytan/bukkit/slf4j/TestHelper.java b/src/test/java/com/djaytan/bukkit/slf4j/api/TestHelper.java similarity index 97% rename from src/test/java/com/djaytan/bukkit/slf4j/TestHelper.java rename to src/test/java/com/djaytan/bukkit/slf4j/api/TestHelper.java index ee1339f..db4ecbb 100644 --- a/src/test/java/com/djaytan/bukkit/slf4j/TestHelper.java +++ b/src/test/java/com/djaytan/bukkit/slf4j/api/TestHelper.java @@ -20,10 +20,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.api; import static org.assertj.core.api.Assertions.assertThat; +import com.djaytan.bukkit.slf4j.internal.BukkitLoggerServiceProvider; import java.io.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; import java.util.function.Consumer; diff --git a/src/test/java/com/djaytan/bukkit/slf4j/Slf4jLogRecordTest.java b/src/test/java/com/djaytan/bukkit/slf4j/internal/Slf4jLogRecordTest.java similarity index 79% rename from src/test/java/com/djaytan/bukkit/slf4j/Slf4jLogRecordTest.java rename to src/test/java/com/djaytan/bukkit/slf4j/internal/Slf4jLogRecordTest.java index f8988a0..34edc80 100644 --- a/src/test/java/com/djaytan/bukkit/slf4j/Slf4jLogRecordTest.java +++ b/src/test/java/com/djaytan/bukkit/slf4j/internal/Slf4jLogRecordTest.java @@ -20,17 +20,24 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.djaytan.bukkit.slf4j; +package com.djaytan.bukkit.slf4j.internal; import com.jparams.verifier.tostring.ToStringVerifier; import nl.jqno.equalsverifier.EqualsVerifier; import org.junit.jupiter.api.Test; +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; +import org.slf4j.event.Level; final class Slf4jLogRecordTest { @Test void equalsAndHashcodeVerification() { - EqualsVerifier.forClass(Slf4jLogRecord.class).verify(); + EqualsVerifier.forClass(Slf4jLogRecord.class) + .withPrefabValues(Level.class, Level.INFO, Level.DEBUG) + .withPrefabValues( + Marker.class, MarkerFactory.getMarker("marker"), MarkerFactory.getMarker("marker2")) + .verify(); } @Test