diff --git a/driver/src/main/java/org/neo4j/driver/internal/svm/NettySubstitutions.java b/driver/src/main/java/org/neo4j/driver/internal/svm/NettySubstitutions.java index 3fc7b35eac..342c362652 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/svm/NettySubstitutions.java +++ b/driver/src/main/java/org/neo4j/driver/internal/svm/NettySubstitutions.java @@ -22,12 +22,11 @@ import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; import com.oracle.svm.core.jdk.JDK11OrLater; +import com.oracle.svm.core.jdk.JDK8OrEarlier; import java.security.PrivateKey; import java.security.Provider; import java.security.cert.X509Certificate; -import java.util.Queue; -import java.util.concurrent.LinkedBlockingDeque; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLException; @@ -113,20 +112,58 @@ final class Target_io_netty_handler_ssl_SslHandler$SslEngineType { @TargetClass(className = "io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator$AlpnWrapper", onlyWith = JDK11OrLater.class) final class Target_io_netty_handler_ssl_JdkAlpnApplicationProtocolNegotiator_AlpnWrapper { @Substitute - @SuppressWarnings( "deprecation" ) - public SSLEngine wrapSslEngine( SSLEngine engine, ByteBufAllocator alloc, + public SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc, + JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) { + return (SSLEngine) (Object) new Target_io_netty_handler_ssl_JdkAlpnSslEngine(engine, applicationNegotiator, isServer); + } + +} + +@TargetClass(className = "io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator$AlpnWrapper", onlyWith = JDK8OrEarlier.class) +final class Target_io_netty_handler_ssl_JdkAlpnApplicationProtocolNegotiator_AlpnWrapperJava8 { + @Substitute + public SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc, JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) { - return (SSLEngine) (Object) new Target_io_netty_handler_ssl_Java9SslEngine( - engine, applicationNegotiator, isServer); + if (Target_io_netty_handler_ssl_JettyAlpnSslEngine.isAvailable()) { + return isServer + ? (SSLEngine) (Object) Target_io_netty_handler_ssl_JettyAlpnSslEngine.newServerEngine(engine, + applicationNegotiator) + : (SSLEngine) (Object) Target_io_netty_handler_ssl_JettyAlpnSslEngine.newClientEngine(engine, + applicationNegotiator); + } + throw new RuntimeException("Unable to wrap SSLEngine of type " + engine.getClass().getName()); } } -@TargetClass(className = "io.netty.handler.ssl.Java9SslEngine", onlyWith = JDK11OrLater.class) -final class Target_io_netty_handler_ssl_Java9SslEngine { +@TargetClass(className = "io.netty.handler.ssl.JettyAlpnSslEngine", onlyWith = JDK8OrEarlier.class) +final class Target_io_netty_handler_ssl_JettyAlpnSslEngine { + @Substitute + static boolean isAvailable() { + return false; + } + + @Substitute + @SuppressWarnings( "deprecation" ) + static Target_io_netty_handler_ssl_JettyAlpnSslEngine newClientEngine(SSLEngine engine, + JdkApplicationProtocolNegotiator applicationNegotiator) { + return null; + } + + @Substitute + @SuppressWarnings( "deprecation" ) + static Target_io_netty_handler_ssl_JettyAlpnSslEngine newServerEngine(SSLEngine engine, + JdkApplicationProtocolNegotiator applicationNegotiator) { + return null; + } +} + +@TargetClass(className = "io.netty.handler.ssl.JdkAlpnSslEngine", onlyWith = JDK11OrLater.class) +final class Target_io_netty_handler_ssl_JdkAlpnSslEngine { + @Alias @SuppressWarnings( "deprecation" ) - Target_io_netty_handler_ssl_Java9SslEngine(final SSLEngine engine, + Target_io_netty_handler_ssl_JdkAlpnSslEngine(final SSLEngine engine, final JdkApplicationProtocolNegotiator applicationNegotiator, final boolean isServer) { } @@ -298,15 +335,5 @@ final ChannelFuture initAndRegister() { } } -@TargetClass(className = "io.netty.channel.nio.NioEventLoop") -final class Target_io_netty_channel_nio_NioEventLoop { - - @Substitute - private static Queue newTaskQueue0(int maxPendingTasks) { - return new LinkedBlockingDeque<>(); - } -} - class NettySubstitutions { - } diff --git a/driver/src/main/resources/META-INF/native-image/org.neo4j.driver/neo4j-java-driver/reflection-config.json b/driver/src/main/resources/META-INF/native-image/org.neo4j.driver/neo4j-java-driver/reflection-config.json index 869951c69f..68572f10fb 100644 --- a/driver/src/main/resources/META-INF/native-image/org.neo4j.driver/neo4j-java-driver/reflection-config.json +++ b/driver/src/main/resources/META-INF/native-image/org.neo4j.driver/neo4j-java-driver/reflection-config.json @@ -18,5 +18,41 @@ { "name" : "org.neo4j.driver.internal.shaded.io.netty.util.ReferenceCountUtil", "allDeclaredMethods" : true + }, + { + "name" : "org.neo4j.driver.internal.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField", + "fields": [ + {"name": "producerIndex", "allowUnsafeAccess": true} + ] + }, + { + "name" : "org.neo4j.driver.internal.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField", + "fields": [ + {"name": "producerLimit", "allowUnsafeAccess": true} + ] + }, + { + "name" : "org.neo4j.driver.internal.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField", + "fields": [ + {"name": "consumerIndex", "allowUnsafeAccess": true} + ] + }, + { + "name" : "org.neo4j.driver.internal.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", + "fields": [ + {"name": "producerIndex", "allowUnsafeAccess": true} + ] + }, + { + "name" : "org.neo4j.driver.internal.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", + "fields": [ + {"name": "producerLimit", "allowUnsafeAccess": true} + ] + }, + { + "name" : "org.neo4j.driver.internal.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", + "fields": [ + {"name": "consumerIndex", "allowUnsafeAccess": true} + ] } ]