diff --git a/bindings/java/build.gradle.kts b/bindings/java/build.gradle.kts index 6a20b4330..21740e35a 100644 --- a/bindings/java/build.gradle.kts +++ b/bindings/java/build.gradle.kts @@ -38,7 +38,7 @@ repositories { } dependencies { - implementation("org.slf4j:slf4j-api:1.7.32") + compileOnly("org.slf4j:slf4j-api:1.7.32") errorprone("com.uber.nullaway:nullaway:0.10.26") // maximum version which supports java 8 errorprone("com.google.errorprone:error_prone_core:2.10.0") // maximum version which supports java 8 @@ -46,9 +46,6 @@ dependencies { testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("org.assertj:assertj-core:3.27.0") - - testImplementation("ch.qos.logback:logback-classic:1.2.13") - testImplementation("ch.qos.logback:logback-core:1.2.13") } application { diff --git a/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java b/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java index 6928c32cc..ee8ae206b 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java @@ -7,8 +7,8 @@ import org.github.tursodatabase.annotations.Nullable; import org.github.tursodatabase.annotations.SkipNullableCheck; import org.github.tursodatabase.core.LimboConnection; import org.github.tursodatabase.jdbc4.JDBC4Connection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.github.tursodatabase.utils.Logger; +import org.github.tursodatabase.utils.LoggerFactory; public class JDBC implements Driver { private static final Logger logger = LoggerFactory.getLogger(JDBC.class); diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboConnection.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboConnection.java index 34e5692e3..639a2be56 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboConnection.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboConnection.java @@ -8,8 +8,8 @@ import java.sql.SQLException; import java.util.Properties; import org.github.tursodatabase.annotations.NativeInvocation; import org.github.tursodatabase.utils.LimboExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.github.tursodatabase.utils.Logger; +import org.github.tursodatabase.utils.LoggerFactory; public abstract class LimboConnection implements Connection { private static final Logger logger = LoggerFactory.getLogger(LimboConnection.class); diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java index ac3f03b5c..e1d619239 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java @@ -12,8 +12,8 @@ import org.github.tursodatabase.LimboErrorCode; import org.github.tursodatabase.annotations.NativeInvocation; import org.github.tursodatabase.annotations.VisibleForTesting; import org.github.tursodatabase.utils.LimboExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.github.tursodatabase.utils.Logger; +import org.github.tursodatabase.utils.LoggerFactory; /** This class provides a thin JNI layer over the SQLite3 C API. */ public final class LimboDB extends AbstractDB { diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java index 67bc6b8ee..ceb9c6291 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java @@ -3,8 +3,8 @@ package org.github.tursodatabase.core; import java.sql.ResultSet; import java.sql.SQLException; import org.github.tursodatabase.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.github.tursodatabase.utils.Logger; +import org.github.tursodatabase.utils.LoggerFactory; /** * A table of data representing limbo database result set, which is generated by executing a diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java index 0fdf243e0..ae33208c7 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java @@ -4,8 +4,8 @@ import java.sql.SQLException; import org.github.tursodatabase.annotations.NativeInvocation; import org.github.tursodatabase.annotations.Nullable; import org.github.tursodatabase.utils.LimboExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.github.tursodatabase.utils.Logger; +import org.github.tursodatabase.utils.LoggerFactory; /** * By default, only one resultSet object per LimboStatement can be open at diff --git a/bindings/java/src/main/java/org/github/tursodatabase/utils/Logger.java b/bindings/java/src/main/java/org/github/tursodatabase/utils/Logger.java new file mode 100644 index 000000000..930658e80 --- /dev/null +++ b/bindings/java/src/main/java/org/github/tursodatabase/utils/Logger.java @@ -0,0 +1,14 @@ +package org.github.tursodatabase.utils; + +/** A simple internal Logger interface. */ +public interface Logger { + void trace(String message, Object... params); + + void debug(String message, Object... params); + + void info(String message, Object... params); + + void warn(String message, Object... params); + + void error(String message, Object... params); +} diff --git a/bindings/java/src/main/java/org/github/tursodatabase/utils/LoggerFactory.java b/bindings/java/src/main/java/org/github/tursodatabase/utils/LoggerFactory.java new file mode 100644 index 000000000..0cc42d143 --- /dev/null +++ b/bindings/java/src/main/java/org/github/tursodatabase/utils/LoggerFactory.java @@ -0,0 +1,122 @@ +package org.github.tursodatabase.utils; + +import java.util.logging.Level; + +/** + * A factory for {@link Logger} instances that uses SLF4J if present, falling back on a + * java.util.logging implementation otherwise. + */ +public class LoggerFactory { + static final boolean USE_SLF4J; + + static { + boolean useSLF4J; + try { + Class.forName("org.slf4j.Logger"); + useSLF4J = true; + } catch (Exception e) { + useSLF4J = false; + } + USE_SLF4J = useSLF4J; + } + + /** + * Get a {@link Logger} instance for the given host class. + * + * @param hostClass the host class from which log messages will be issued + * @return a Logger + */ + public static Logger getLogger(Class hostClass) { + if (USE_SLF4J) { + return new SLF4JLogger(hostClass); + } + + return new JDKLogger(hostClass); + } + + private static class JDKLogger implements Logger { + final java.util.logging.Logger logger; + + public JDKLogger(Class hostClass) { + logger = java.util.logging.Logger.getLogger(hostClass.getCanonicalName()); + } + + @Override + public void trace(String message, Object... params) { + if (logger.isLoggable(Level.FINEST)) { + logger.log(Level.FINEST, String.format(message, params)); + } + } + + @Override + public void debug(String message, Object... params) { + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, String.format(message, params)); + } + } + + @Override + public void info(String message, Object... params) { + if (logger.isLoggable(Level.INFO)) { + logger.log(Level.INFO, String.format(message, params)); + } + } + + @Override + public void warn(String message, Object... params) { + if (logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, String.format(message, params)); + } + } + + @Override + public void error(String message, Object... params) { + if (logger.isLoggable(Level.SEVERE)) { + logger.log(Level.SEVERE, String.format(message, params)); + } + } + } + + private static class SLF4JLogger implements Logger { + final org.slf4j.Logger logger; + + SLF4JLogger(Class hostClass) { + logger = org.slf4j.LoggerFactory.getLogger(hostClass); + } + + @Override + public void trace(String message, Object... params) { + if (logger.isTraceEnabled()) { + logger.trace(message, String.format(message, params)); + } + } + + @Override + public void debug(String message, Object... params) { + if (logger.isDebugEnabled()) { + logger.debug(message, String.format(message, params)); + } + } + + @Override + public void info(String message, Object... params) { + if (logger.isInfoEnabled()) { + logger.info(message, String.format(message, params)); + } + } + + @Override + public void warn(String message, Object... params) { + if (logger.isWarnEnabled()) { + logger.warn(message, String.format(message, params)); + } + } + + @Override + public void error(String message, Object... params) { + if (logger.isErrorEnabled()) { + logger.error(message, String.format(message, params)); + } + } + } +} diff --git a/bindings/java/src/test/resources/logback.xml b/bindings/java/src/test/resources/logback.xml deleted file mode 100644 index 1496a4b64..000000000 --- a/bindings/java/src/test/resources/logback.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n - - - - - - -