diff --git a/bom/application/pom.xml b/bom/application/pom.xml index 85585e5fcee54..ff3f266f4f655 100644 --- a/bom/application/pom.xml +++ b/bom/application/pom.xml @@ -115,7 +115,7 @@ 2.3.2 1.4.197 42.3.2 - 3.0.3 + 2.7.5 8.0.28 7.2.2.jre8 21.4.0.0 diff --git a/extensions/jdbc/jdbc-mariadb/deployment/src/main/java/io/quarkus/jdbc/mariadb/deployment/JDBCMariaDBProcessor.java b/extensions/jdbc/jdbc-mariadb/deployment/src/main/java/io/quarkus/jdbc/mariadb/deployment/JDBCMariaDBProcessor.java index 3f8e709f193ec..301e106f5afb2 100644 --- a/extensions/jdbc/jdbc-mariadb/deployment/src/main/java/io/quarkus/jdbc/mariadb/deployment/JDBCMariaDBProcessor.java +++ b/extensions/jdbc/jdbc-mariadb/deployment/src/main/java/io/quarkus/jdbc/mariadb/deployment/JDBCMariaDBProcessor.java @@ -12,9 +12,8 @@ import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.FeatureBuildItem; -import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; +import io.quarkus.deployment.builditem.SslNativeConfigBuildItem; import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem; -import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild; import io.quarkus.jdbc.mariadb.runtime.MariaDBAgroalConnectionConfigurer; import io.quarkus.jdbc.mariadb.runtime.MariaDBServiceBindingConverter; @@ -26,11 +25,10 @@ FeatureBuildItem feature() { } @BuildStep - void registerDriver(BuildProducer jdbcDriver, BuildProducer dbKind) { - jdbcDriver.produce( - new JdbcDriverBuildItem(DatabaseKind.MARIADB, "org.mariadb.jdbc.Driver", "org.mariadb.jdbc.MariaDbDataSource")); - - dbKind.produce(new DefaultDataSourceDbKindBuildItem(DatabaseKind.MARIADB)); + void registerDriver(BuildProducer jdbcDriver, + SslNativeConfigBuildItem sslNativeConfigBuildItem) { + jdbcDriver.produce(new JdbcDriverBuildItem(DatabaseKind.MARIADB, "org.mariadb.jdbc.Driver", + "org.mariadb.jdbc.MySQLDataSource")); } @BuildStep @@ -49,28 +47,15 @@ void configureAgroalConnection(BuildProducer additional } } - @BuildStep - void registerAuthenticationPlugins(BuildProducer serviceProvider) { - // make sure that all plugins are available - serviceProvider - .produce(ServiceProviderBuildItem.allProvidersFromClassPath("org.mariadb.jdbc.plugin.AuthenticationPlugin")); - } - - @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) - void addNativeImageResources(BuildProducer resources) { - // mariadb.properties is used by org.mariadb.jdbc.util.VersionFactory and is small enough. - // driver.properties is not added because it only provides optional descriptions for - // org.mariadb.jdbc.Driver.getPropertyInfo(), which is probably not even called. - resources.produce(new NativeImageResourceBuildItem("mariadb.properties")); - } - @BuildStep void registerServiceBinding(Capabilities capabilities, - BuildProducer serviceProvider) { + BuildProducer serviceProvider, + BuildProducer dbKind) { if (capabilities.isPresent(Capability.KUBERNETES_SERVICE_BINDING)) { serviceProvider.produce( new ServiceProviderBuildItem("io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter", MariaDBServiceBindingConverter.class.getName())); } + dbKind.produce(new DefaultDataSourceDbKindBuildItem(DatabaseKind.MARIADB)); } } diff --git a/extensions/jdbc/jdbc-mariadb/deployment/src/main/java/io/quarkus/jdbc/mariadb/deployment/MariaDBJDBCReflections.java b/extensions/jdbc/jdbc-mariadb/deployment/src/main/java/io/quarkus/jdbc/mariadb/deployment/MariaDBJDBCReflections.java index f4aeb8dfe5095..fe6934edd6c24 100644 --- a/extensions/jdbc/jdbc-mariadb/deployment/src/main/java/io/quarkus/jdbc/mariadb/deployment/MariaDBJDBCReflections.java +++ b/extensions/jdbc/jdbc-mariadb/deployment/src/main/java/io/quarkus/jdbc/mariadb/deployment/MariaDBJDBCReflections.java @@ -3,6 +3,7 @@ import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; +import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem; public final class MariaDBJDBCReflections { @@ -11,10 +12,18 @@ void build(BuildProducer reflectiveClass) { //Not strictly necessary when using Agroal, as it also registers //any JDBC driver being configured explicitly through its configuration. //We register it for the sake of people not using Agroal. - reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, "org.mariadb.jdbc.Driver")); + final String driverName = "org.mariadb.jdbc.Driver"; + reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, driverName)); - //MariaDB's connection process requires reflective read to all fields of Configuration and its Builder: - reflectiveClass.produce(new ReflectiveClassBuildItem(false, true, - "org.mariadb.jdbc.Configuration", "org.mariadb.jdbc.Configuration$Builder")); + //MariaDB's connection process requires reflective read to all fields of Options: + reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, "org.mariadb.jdbc.util.Options")); + } + + @BuildStep + void runtimeInit(BuildProducer runtimeInitialized) { + //MastersSlavesListener starts threads in DynamicSizedSchedulerImpl which is disallowed during build time in GraalVM + runtimeInitialized + .produce(new RuntimeInitializedClassBuildItem( + "org.mariadb.jdbc.internal.failover.impl.MastersReplicasListener")); } } diff --git a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/AuthenticationPluginLoader_Substitutions.java b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/AuthenticationPluginLoader_Substitutions.java new file mode 100644 index 0000000000000..8e701ccf2020a --- /dev/null +++ b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/AuthenticationPluginLoader_Substitutions.java @@ -0,0 +1,52 @@ +package io.quarkus.jdbc.mariadb.runtime.graal; + +import java.sql.SQLException; + +import org.mariadb.jdbc.authentication.AuthenticationPlugin; +import org.mariadb.jdbc.authentication.AuthenticationPluginLoader; +import org.mariadb.jdbc.internal.com.send.authentication.ClearPasswordPlugin; +import org.mariadb.jdbc.internal.com.send.authentication.Ed25519PasswordPlugin; +import org.mariadb.jdbc.internal.com.send.authentication.NativePasswordPlugin; +import org.mariadb.jdbc.internal.com.send.authentication.OldPasswordPlugin; +import org.mariadb.jdbc.internal.com.send.authentication.SendGssApiAuthPacket; + +import com.oracle.svm.core.annotate.Substitute; +import com.oracle.svm.core.annotate.TargetClass; + +@TargetClass(AuthenticationPluginLoader.class) +@Substitute +public final class AuthenticationPluginLoader_Substitutions { + + public static final String MYSQL_NATIVE_PASSWORD = "mysql_native_password"; + public static final String MYSQL_OLD_PASSWORD = "mysql_old_password"; + public static final String MYSQL_CLEAR_PASSWORD = "mysql_clear_password"; + public static final String MYSQL_ED25519_PASSWORD = "client_ed25519"; + private static final String GSSAPI_CLIENT = "auth_gssapi_client"; + private static final String DIALOG = "dialog"; + + @Substitute + public static AuthenticationPlugin get(String type) throws SQLException { + switch (type) { + case MYSQL_NATIVE_PASSWORD: + return new NativePasswordPlugin(); + case MYSQL_OLD_PASSWORD: + return new OldPasswordPlugin(); + case MYSQL_CLEAR_PASSWORD: + return new ClearPasswordPlugin(); + case DIALOG: + throw new UnsupportedOperationException("Authentication strategy 'dialog' is not supported in GraalVM"); + //return new SendPamAuthPacket(); + case GSSAPI_CLIENT: + return new SendGssApiAuthPacket(); + case MYSQL_ED25519_PASSWORD: + return new Ed25519PasswordPlugin(); + + default: + throw new SQLException( + "Client does not support authentication protocol requested by server. " + + "Consider upgrading MariaDB client. plugin was = " + type, + "08004", 1251); + } + } + +} diff --git a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/Pool_disable_JMX.java b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/Pool_disable_JMX.java index 7c15d21192fc3..f7634281cdd84 100644 --- a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/Pool_disable_JMX.java +++ b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/Pool_disable_JMX.java @@ -1,12 +1,12 @@ package io.quarkus.jdbc.mariadb.runtime.graal; -import org.mariadb.jdbc.util.log.Logger; +import org.mariadb.jdbc.internal.logging.Logger; import com.oracle.svm.core.annotate.Alias; import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; -@TargetClass(org.mariadb.jdbc.pool.Pool.class) +@TargetClass(org.mariadb.jdbc.internal.util.pool.Pool.class) public final class Pool_disable_JMX { @Alias diff --git a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SendPamAuthPacket_Removal.java b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SendPamAuthPacket_Removal.java new file mode 100644 index 0000000000000..06ec3829f6fac --- /dev/null +++ b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SendPamAuthPacket_Removal.java @@ -0,0 +1,9 @@ +package io.quarkus.jdbc.mariadb.runtime.graal; + +import com.oracle.svm.core.annotate.Delete; +import com.oracle.svm.core.annotate.TargetClass; + +@TargetClass(className = "org.mariadb.jdbc.internal.com.send.authentication.SendPamAuthPacket") +@Delete +public final class SendPamAuthPacket_Removal { +} diff --git a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SendPamAuthPacket_Substitutions.java b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SendPamAuthPacket_Substitutions.java deleted file mode 100644 index 3fbba0591916c..0000000000000 --- a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SendPamAuthPacket_Substitutions.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.quarkus.jdbc.mariadb.runtime.graal; - -import java.io.IOException; -import java.sql.SQLException; - -import org.mariadb.jdbc.Configuration; -import org.mariadb.jdbc.client.Context; -import org.mariadb.jdbc.client.ReadableByteBuf; -import org.mariadb.jdbc.client.socket.Reader; -import org.mariadb.jdbc.client.socket.Writer; - -import com.oracle.svm.core.annotate.Substitute; -import com.oracle.svm.core.annotate.TargetClass; - -@TargetClass(className = "org.mariadb.jdbc.plugin.authentication.standard.SendPamAuthPacket") -public final class SendPamAuthPacket_Substitutions { - - @Substitute - public void initialize(String authenticationData, byte[] seed, Configuration conf) { - throw new UnsupportedOperationException("Authentication strategy 'dialog' is not supported in GraalVM"); - } - - @Substitute - public ReadableByteBuf process(Writer out, Reader in, Context context) - throws SQLException, IOException { - throw new UnsupportedOperationException("Authentication strategy 'dialog' is not supported in GraalVM"); - } -} diff --git a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SharedMemorySocket_Removal.java b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SharedMemorySocket_Removal.java new file mode 100644 index 0000000000000..e03e88ff79b8c --- /dev/null +++ b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SharedMemorySocket_Removal.java @@ -0,0 +1,10 @@ +package io.quarkus.jdbc.mariadb.runtime.graal; + +import com.oracle.svm.core.annotate.Delete; +import com.oracle.svm.core.annotate.TargetClass; + +@TargetClass(className = "org.mariadb.jdbc.internal.io.socket.SharedMemorySocket") +@Delete +public final class SharedMemorySocket_Removal { + +} diff --git a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SimpleSocketHandlerFunction.java b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SimpleSocketHandlerFunction.java index 9e97bb0afb8f0..02c0136984a2a 100644 --- a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SimpleSocketHandlerFunction.java +++ b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SimpleSocketHandlerFunction.java @@ -2,23 +2,23 @@ import java.io.IOException; import java.net.Socket; -import java.sql.SQLException; -import org.mariadb.jdbc.Configuration; -import org.mariadb.jdbc.HostAddress; -import org.mariadb.jdbc.client.impl.ConnectionHelper; -import org.mariadb.jdbc.client.socket.impl.SocketHandlerFunction; +import org.mariadb.jdbc.internal.io.socket.SocketHandlerFunction; +import org.mariadb.jdbc.internal.util.Utils; +import org.mariadb.jdbc.util.Options; public class SimpleSocketHandlerFunction implements SocketHandlerFunction { @Override - public Socket apply(Configuration conf, HostAddress hostAddress) throws IOException, SQLException { - if (conf.pipe() != null) { + public Socket apply(Options options, String host) throws IOException { + if (options.pipe != null) { throw new IllegalArgumentException(getErrorMessage("pipe")); - } else if (conf.localSocket() != null) { + } else if (options.localSocket != null) { throw new IllegalArgumentException(getErrorMessage("localSocket")); + } else if (options.sharedMemory != null) { + throw new IllegalArgumentException(getErrorMessage("sharedMemory")); } - return ConnectionHelper.standardSocket(conf, hostAddress); + return Utils.standardSocket(options, host); } private String getErrorMessage(String option) { diff --git a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SocketUtility_Substitutions.java b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SocketUtility_Substitutions.java index aafaa8bb7e363..5daa3a585039f 100644 --- a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SocketUtility_Substitutions.java +++ b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/SocketUtility_Substitutions.java @@ -1,11 +1,11 @@ package io.quarkus.jdbc.mariadb.runtime.graal; -import org.mariadb.jdbc.client.socket.impl.SocketHandlerFunction; +import org.mariadb.jdbc.internal.io.socket.SocketHandlerFunction; import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; -@TargetClass(org.mariadb.jdbc.client.socket.impl.SocketUtility.class) +@TargetClass(org.mariadb.jdbc.internal.io.socket.SocketUtility.class) public final class SocketUtility_Substitutions { // Ensure that JNA is never used diff --git a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/ConnectionHelper_socketHandler.java b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/Utils_socketHandler.java similarity index 66% rename from extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/ConnectionHelper_socketHandler.java rename to extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/Utils_socketHandler.java index a3a80a3c1dca6..b368bb37ab012 100644 --- a/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/ConnectionHelper_socketHandler.java +++ b/extensions/jdbc/jdbc-mariadb/runtime/src/main/java/io/quarkus/jdbc/mariadb/runtime/graal/Utils_socketHandler.java @@ -1,13 +1,13 @@ package io.quarkus.jdbc.mariadb.runtime.graal; -import org.mariadb.jdbc.client.socket.impl.SocketHandlerFunction; +import org.mariadb.jdbc.internal.io.socket.SocketHandlerFunction; import com.oracle.svm.core.annotate.Alias; import com.oracle.svm.core.annotate.RecomputeFieldValue; import com.oracle.svm.core.annotate.TargetClass; -@TargetClass(className = "org.mariadb.jdbc.client.impl.ConnectionHelper") -public final class ConnectionHelper_socketHandler { +@TargetClass(org.mariadb.jdbc.internal.util.Utils.class) +public final class Utils_socketHandler { @Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)