@ -21,12 +21,9 @@ import java.net.URI;
import java.time.Duration ;
import java.time.Duration ;
import java.util.List ;
import java.util.List ;
import java.util.Locale ;
import java.util.Locale ;
import java.util.ServiceLoader ;
import java.util.concurrent.TimeUnit ;
import java.util.concurrent.TimeUnit ;
import io.micrometer.observation.ObservationRegistry ;
import org.jspecify.annotations.Nullable ;
import org.jspecify.annotations.Nullable ;
import org.neo4j.bolt.connection.BoltConnectionProviderFactory ;
import org.neo4j.driver.AuthToken ;
import org.neo4j.driver.AuthToken ;
import org.neo4j.driver.AuthTokenManager ;
import org.neo4j.driver.AuthTokenManager ;
import org.neo4j.driver.AuthTokens ;
import org.neo4j.driver.AuthTokens ;
@ -35,7 +32,6 @@ import org.neo4j.driver.Config.TrustStrategy;
import org.neo4j.driver.Driver ;
import org.neo4j.driver.Driver ;
import org.neo4j.driver.GraphDatabase ;
import org.neo4j.driver.GraphDatabase ;
import org.neo4j.driver.internal.Scheme ;
import org.neo4j.driver.internal.Scheme ;
import org.neo4j.driver.observation.micrometer.MicrometerObservationProvider ;
import org.springframework.beans.factory.ObjectProvider ;
import org.springframework.beans.factory.ObjectProvider ;
import org.springframework.boot.autoconfigure.AutoConfiguration ;
import org.springframework.boot.autoconfigure.AutoConfiguration ;
@ -48,7 +44,6 @@ import org.springframework.boot.neo4j.autoconfigure.Neo4jProperties.Authenticati
import org.springframework.boot.neo4j.autoconfigure.Neo4jProperties.Pool ;
import org.springframework.boot.neo4j.autoconfigure.Neo4jProperties.Pool ;
import org.springframework.boot.neo4j.autoconfigure.Neo4jProperties.Security ;
import org.springframework.boot.neo4j.autoconfigure.Neo4jProperties.Security ;
import org.springframework.context.annotation.Bean ;
import org.springframework.context.annotation.Bean ;
import org.springframework.core.env.Environment ;
import org.springframework.util.Assert ;
import org.springframework.util.Assert ;
import org.springframework.util.StringUtils ;
import org.springframework.util.StringUtils ;
@ -67,20 +62,6 @@ import org.springframework.util.StringUtils;
@EnableConfigurationProperties ( Neo4jProperties . class )
@EnableConfigurationProperties ( Neo4jProperties . class )
public final class Neo4jAutoConfiguration {
public final class Neo4jAutoConfiguration {
private static final boolean HAS_DRIVER_METRICS ;
static {
boolean metricsObservationProviderFound = true ;
try {
Class . forName ( "org.neo4j.driver.observation.micrometer.MicrometerObservationProvider" , false ,
Neo4jAutoConfiguration . class . getClassLoader ( ) ) ;
}
catch ( ClassNotFoundException ex ) {
metricsObservationProviderFound = false ;
}
HAS_DRIVER_METRICS = metricsObservationProviderFound ;
}
@Bean
@Bean
@ConditionalOnMissingBean ( Neo4jConnectionDetails . class )
@ConditionalOnMissingBean ( Neo4jConnectionDetails . class )
PropertiesNeo4jConnectionDetails neo4jConnectionDetails ( Neo4jProperties properties ,
PropertiesNeo4jConnectionDetails neo4jConnectionDetails ( Neo4jProperties properties ,
@ -90,12 +71,10 @@ public final class Neo4jAutoConfiguration {
@Bean
@Bean
@ConditionalOnMissingBean
@ConditionalOnMissingBean
Driver neo4jDriver ( Neo4jProperties properties , Environment environment , Neo4jConnectionDetails connectionDetails ,
Driver neo4jDriver ( Neo4jProperties properties , Neo4jConnectionDetails connectionDetails ,
ObjectProvider < ConfigBuilderCustomizer > configBuilderCustomizers ,
ObjectProvider < ConfigBuilderCustomizer > configBuilderCustomizers ) {
ObjectProvider < ObservationRegistry > observationRegistryProvider ) {
Config config = mapDriverConfig ( properties , connectionDetails ,
Config config = mapDriverConfig ( properties , connectionDetails ,
configBuilderCustomizers . orderedStream ( ) . toList ( ) , observationRegistryProvider ) ;
configBuilderCustomizers . orderedStream ( ) . toList ( ) ) ;
AuthTokenManager authTokenManager = connectionDetails . getAuthTokenManager ( ) ;
AuthTokenManager authTokenManager = connectionDetails . getAuthTokenManager ( ) ;
if ( authTokenManager ! = null ) {
if ( authTokenManager ! = null ) {
return GraphDatabase . driver ( connectionDetails . getUri ( ) , authTokenManager , config ) ;
return GraphDatabase . driver ( connectionDetails . getUri ( ) , authTokenManager , config ) ;
@ -105,10 +84,9 @@ public final class Neo4jAutoConfiguration {
}
}
Config mapDriverConfig ( Neo4jProperties properties , Neo4jConnectionDetails connectionDetails ,
Config mapDriverConfig ( Neo4jProperties properties , Neo4jConnectionDetails connectionDetails ,
List < ConfigBuilderCustomizer > customizers ,
List < ConfigBuilderCustomizer > customizers ) {
ObjectProvider < ObservationRegistry > observationRegistryProvider ) {
Config . ConfigBuilder builder = Config . builder ( ) ;
Config . ConfigBuilder builder = Config . builder ( ) ;
configurePoolSettings ( builder , properties . getPool ( ) , observationRegistryProvider ) ;
configurePoolSettings ( builder , properties . getPool ( ) ) ;
URI uri = connectionDetails . getUri ( ) ;
URI uri = connectionDetails . getUri ( ) ;
String scheme = ( uri ! = null ) ? uri . getScheme ( ) : "bolt" ;
String scheme = ( uri ! = null ) ? uri . getScheme ( ) : "bolt" ;
configureDriverSettings ( builder , properties , isSimpleScheme ( scheme ) ) ;
configureDriverSettings ( builder , properties , isSimpleScheme ( scheme ) ) ;
@ -118,16 +96,10 @@ public final class Neo4jAutoConfiguration {
private boolean isSimpleScheme ( String scheme ) {
private boolean isSimpleScheme ( String scheme ) {
String lowerCaseScheme = scheme . toLowerCase ( Locale . ENGLISH ) ;
String lowerCaseScheme = scheme . toLowerCase ( Locale . ENGLISH ) ;
if ( ! ServiceLoader . load ( BoltConnectionProviderFactory . class )
. stream ( )
. anyMatch ( ( p ) - > p . get ( ) . supports ( lowerCaseScheme ) ) ) {
throw new IllegalArgumentException ( String . format ( "'%s' is not a supported scheme." , scheme ) ) ;
}
return ! Scheme . isSecurityScheme ( lowerCaseScheme ) ;
return ! Scheme . isSecurityScheme ( lowerCaseScheme ) ;
}
}
private void configurePoolSettings ( Config . ConfigBuilder builder , Pool pool ,
private void configurePoolSettings ( Config . ConfigBuilder builder , Pool pool ) {
ObjectProvider < ObservationRegistry > observationRegistryProvider ) {
if ( pool . isLogLeakedSessions ( ) ) {
if ( pool . isLogLeakedSessions ( ) ) {
builder . withLeakedSessionsLogging ( ) ;
builder . withLeakedSessionsLogging ( ) ;
}
}
@ -139,11 +111,6 @@ public final class Neo4jAutoConfiguration {
builder . withMaxConnectionLifetime ( pool . getMaxConnectionLifetime ( ) . toMillis ( ) , TimeUnit . MILLISECONDS ) ;
builder . withMaxConnectionLifetime ( pool . getMaxConnectionLifetime ( ) . toMillis ( ) , TimeUnit . MILLISECONDS ) ;
builder . withConnectionAcquisitionTimeout ( pool . getConnectionAcquisitionTimeout ( ) . toMillis ( ) ,
builder . withConnectionAcquisitionTimeout ( pool . getConnectionAcquisitionTimeout ( ) . toMillis ( ) ,
TimeUnit . MILLISECONDS ) ;
TimeUnit . MILLISECONDS ) ;
observationRegistryProvider . ifAvailable ( ( orp ) - > {
if ( pool . isMetricsEnabled ( ) & & HAS_DRIVER_METRICS ) {
builder . withObservationProvider ( MicrometerObservationProvider . builder ( orp ) . build ( ) ) ;
}
} ) ;
}
}
private void configureDriverSettings ( Config . ConfigBuilder builder , Neo4jProperties properties ,
private void configureDriverSettings ( Config . ConfigBuilder builder , Neo4jProperties properties ,