diff --git a/jOOQ/src/main/java/org/jooq/Log.java b/jOOQ/src/main/java/org/jooq/Log.java index 094ac2c4ef..4dc8117e96 100644 --- a/jOOQ/src/main/java/org/jooq/Log.java +++ b/jOOQ/src/main/java/org/jooq/Log.java @@ -162,6 +162,11 @@ public interface Log { */ void info(Object message, Object details, Throwable throwable); + /** + * Check if WARN level logging is enabled. + */ + boolean isWarnEnabled(); + /** * Log a message in WARN level. * diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractQueryPart.java b/jOOQ/src/main/java/org/jooq/impl/AbstractQueryPart.java index a965a2d1e9..678355e1a7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractQueryPart.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractQueryPart.java @@ -40,7 +40,11 @@ package org.jooq.impl; import static org.jooq.impl.Tools.CTX; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.sql.SQLException; +import java.util.concurrent.atomic.AtomicInteger; import org.jooq.Attachable; import org.jooq.BindContext; @@ -55,6 +59,7 @@ import org.jooq.RenderContext; import org.jooq.conf.SettingsTools; import org.jooq.exception.DataAccessException; import org.jooq.exception.SQLDialectNotSupportedException; +import org.jooq.tools.JooqLogger; /** * @author Lukas Eder @@ -240,4 +245,23 @@ abstract class AbstractQueryPart implements QueryPartInternal { protected final DataAccessException translate(String sql, SQLException e) { return Tools.translate(sql, e); } + + private static class SerializationDeprecation {} + private static final JooqLogger log = JooqLogger.getLogger(SerializationDeprecation.class); + private static final AtomicInteger warnCount = new AtomicInteger(0); + private static final int maxWarnings = 100; + + private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { + ois.defaultReadObject(); + + if (log.isWarnEnabled() && warnCount.getAndUpdate(i -> Math.min(i + 1, maxWarnings)) < maxWarnings) + log.warn("DEPRECATION", "A QueryPart of type " + getClass() + " has been deserialised. Serialization support is deprecated in jOOQ. Please contact https://github.com/jOOQ/jOOQ/issues/11506 and state your use-case to see if it can be implemented otherwise."); + } + + private void writeObject(ObjectOutputStream oos) throws IOException { + oos.defaultWriteObject(); + + if (log.isWarnEnabled() && warnCount.getAndUpdate(i -> Math.min(i + 1, maxWarnings)) < maxWarnings) + log.warn("DEPRECATION", "A QueryPart of type " + getClass() + " has been serialised. Serialization support is deprecated in jOOQ. Please contact https://github.com/jOOQ/jOOQ/issues/11506 and state your use-case to see if it can be implemented otherwise."); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java b/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java index 32fe00dfa0..0cbcef0b07 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java @@ -1591,11 +1591,9 @@ public class DefaultConfiguration implements Configuration { private E[] cloneSerializables(E[] array) { E[] clone = array.clone(); - for (int i = 0; i < clone.length; i++) { - if (!(clone[i] instanceof Serializable)) { + for (int i = 0; i < clone.length; i++) + if (!(clone[i] instanceof Serializable)) clone[i] = null; - } - } return clone; } diff --git a/jOOQ/src/main/java/org/jooq/tools/JooqLogger.java b/jOOQ/src/main/java/org/jooq/tools/JooqLogger.java index 66f39b9562..a493877e93 100644 --- a/jOOQ/src/main/java/org/jooq/tools/JooqLogger.java +++ b/jOOQ/src/main/java/org/jooq/tools/JooqLogger.java @@ -87,6 +87,11 @@ public final class JooqLogger implements Log { */ private boolean supportsInfo = true; + /** + * Whether calls to {@link #warn(Object)} are possible. + */ + private boolean supportsWarn = true; + /** * Get a logger wrapper for a class. */ @@ -344,6 +349,21 @@ public final class JooqLogger implements Log { util.log(java.util.logging.Level.INFO, "" + getMessage(message, details), throwable); } + /** + * Check if INFO level logging is enabled. + */ + @Override + public boolean isWarnEnabled() { + if (!globalThreshold.supports(Log.Level.WARN)) + return false; + if (!supportsWarn) + return false; + else if (slf4j != null) + return slf4j.isWarnEnabled(); + else + return util.isLoggable(java.util.logging.Level.WARNING); + } + /** * Log a message in WARN level. *