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