From bb7b789cd95f44bdeff91633edfe5a4eb6928ed8 Mon Sep 17 00:00:00 2001 From: Caleb Cushing Date: Wed, 24 Aug 2016 18:29:01 -0500 Subject: [PATCH] Detect Neo4j bolt driver Closes gh-6690 --- .../data/neo4j/Neo4jProperties.java | 12 +++ .../data/neo4j/Neo4jPropertiesTests.java | 81 ++++++++++++++----- 2 files changed, 75 insertions(+), 18 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jProperties.java index f85b56b83a..7bb97ecd35 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jProperties.java @@ -45,6 +45,10 @@ public class Neo4jProperties implements ApplicationContextAware { static final String DEFAULT_HTTP_URI = "http://localhost:7474"; + static final String BOLT_DRIVER = "org.neo4j.ogm.drivers.bolt.driver.BoltDriver"; + + static final String DEFAULT_BOLT_URI = "bolt://localhost:7687"; + /** * URI used by the driver. Auto-detected by default. */ @@ -151,6 +155,9 @@ public class Neo4jProperties implements ApplicationContextAware { if ("http".equals(scheme)) { return HTTP_DRIVER; } + if ("bolt".equals(scheme)) { + return BOLT_DRIVER; + } throw new IllegalArgumentException( "Could not deduce driver to use based on URI '" + uri + "'"); } @@ -166,6 +173,11 @@ public class Neo4jProperties implements ApplicationContextAware { driverConfiguration.setDriverClassName(EMBEDDED_DRIVER); return; } + if (ClassUtils.isPresent(BOLT_DRIVER, this.classLoader)) { + driverConfiguration.setDriverClassName(BOLT_DRIVER); + driverConfiguration.setURI( DEFAULT_BOLT_URI ); + return; + } driverConfiguration.setDriverClassName(HTTP_DRIVER); driverConfiguration.setURI(DEFAULT_HTTP_URI); } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jPropertiesTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jPropertiesTests.java index 5e87643512..1c27d972af 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jPropertiesTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jPropertiesTests.java @@ -18,6 +18,8 @@ package org.springframework.boot.autoconfigure.data.neo4j; import java.net.URL; import java.net.URLClassLoader; +import java.util.EnumSet; +import java.util.Set; import com.hazelcast.util.Base64; import org.junit.After; @@ -29,7 +31,6 @@ import org.neo4j.ogm.config.DriverConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.context.annotation.AnnotationConfigApplicationContext; - import static org.assertj.core.api.Assertions.assertThat; /** @@ -50,14 +51,21 @@ public class Neo4jPropertiesTests { @Test public void defaultUseEmbeddedInMemoryIfAvailable() { - Neo4jProperties properties = load(true); + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED )); Configuration configuration = properties.createConfiguration(); assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER, null); } @Test - public void defaultUseHttpDriverIfEmbeddedDriverIsNotAvailable() { - Neo4jProperties properties = load(false); + public void defaultUseBoltIfAvailableAndEmbeddedNot() { + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.BOLT )); + Configuration configuration = properties.createConfiguration(); + assertDriver(configuration, Neo4jProperties.BOLT_DRIVER, "bolt://localhost:7687"); + } + + @Test + public void defaultUseHttpIfEmbeddedAndBoltIsNotAvailable() { + Neo4jProperties properties = load(EnumSet.noneOf( AvailableDriver.class )); Configuration configuration = properties.createConfiguration(); assertDriver(configuration, Neo4jProperties.HTTP_DRIVER, Neo4jProperties.DEFAULT_HTTP_URI); @@ -65,15 +73,23 @@ public class Neo4jPropertiesTests { @Test public void httpUriUseHttpServer() { - Neo4jProperties properties = load(true, + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ), "spring.data.neo4j.uri=http://localhost:7474"); Configuration configuration = properties.createConfiguration(); assertDriver(configuration, Neo4jProperties.HTTP_DRIVER, "http://localhost:7474"); } + @Test + public void boltUriUseBolt() { + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED, AvailableDriver.BOLT ), + "spring.data.neo4j.uri=bolt://localhost:7687"); + Configuration configuration = properties.createConfiguration(); + assertDriver(configuration, Neo4jProperties.BOLT_DRIVER, "bolt://localhost:7687"); + } + @Test public void fileUriUseEmbeddedServer() { - Neo4jProperties properties = load(true, + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ), "spring.data.neo4j.uri=file://var/tmp/graph.db"); Configuration configuration = properties.createConfiguration(); assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER, @@ -82,7 +98,7 @@ public class Neo4jPropertiesTests { @Test public void credentialsAreSet() { - Neo4jProperties properties = load(true, + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ), "spring.data.neo4j.uri=http://localhost:7474", "spring.data.neo4j.username=user", "spring.data.neo4j.password=secret"); Configuration configuration = properties.createConfiguration(); @@ -92,7 +108,7 @@ public class Neo4jPropertiesTests { @Test public void credentialsAreSetFromUri() { - Neo4jProperties properties = load(true, + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ), "spring.data.neo4j.uri=http://user:secret@my-server:7474"); Configuration configuration = properties.createConfiguration(); assertDriver(configuration, Neo4jProperties.HTTP_DRIVER, @@ -102,7 +118,7 @@ public class Neo4jPropertiesTests { @Test public void embeddedModeDisabledUseHttpUri() { - Neo4jProperties properties = load(true, + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ), "spring.data.neo4j.embedded.enabled=false"); Configuration configuration = properties.createConfiguration(); assertDriver(configuration, Neo4jProperties.HTTP_DRIVER, @@ -111,7 +127,7 @@ public class Neo4jPropertiesTests { @Test public void embeddedModeWithRelativeLocation() { - Neo4jProperties properties = load(true, + Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ), "spring.data.neo4j.uri=target/neo4j/my.db"); Configuration configuration = properties.createConfiguration(); assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER, @@ -143,20 +159,15 @@ public class Neo4jPropertiesTests { } } - public Neo4jProperties load(final boolean embeddedAvailable, String... environment) { + public Neo4jProperties load( final Set availableDrivers, String... environment) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.setClassLoader(new URLClassLoader(new URL[0], getClass().getClassLoader()) { @Override protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - if (name.equals(Neo4jProperties.EMBEDDED_DRIVER)) { - if (embeddedAvailable) { - return TestEmbeddedDriver.class; - } - else { - throw new ClassNotFoundException(); - } + if ( AvailableDriver.shouldLoad( availableDrivers, name )) { + return AvailableDriver.loadClass( name ); } return super.loadClass(name, resolve); } @@ -175,8 +186,42 @@ public class Neo4jPropertiesTests { } + private enum AvailableDriver { + EMBEDDED( Neo4jProperties.EMBEDDED_DRIVER, TestEmbeddedDriver.class ), + BOLT( Neo4jProperties.BOLT_DRIVER, TestBoltDriver.class ); + + private final String driverName; + private final Class driverStub; + + AvailableDriver( final String driverName, final Class driverStub ) { + this.driverName = driverName; + this.driverStub = driverStub; + } + + public static boolean shouldLoad( Set availableDrivers, String name ) { + for ( AvailableDriver driver : availableDrivers ) { + if ( driver.driverName.equals( name ) ) { + return true; + } + } + return false; + } + + public static Class loadClass( String className ) throws ClassNotFoundException { + for ( AvailableDriver driver : AvailableDriver.values() ) { + if ( driver.driverName.equals( className ) ) { + return driver.driverStub; + } + } + throw new ClassNotFoundException(); + } + } + private static class TestEmbeddedDriver { } + private static class TestBoltDriver { + } + }