Commit bb7b789c authored by Caleb Cushing's avatar Caleb Cushing Committed by Stephane Nicoll

Detect Neo4j bolt driver

Closes gh-6690
parent b9104c93
...@@ -45,6 +45,10 @@ public class Neo4jProperties implements ApplicationContextAware { ...@@ -45,6 +45,10 @@ public class Neo4jProperties implements ApplicationContextAware {
static final String DEFAULT_HTTP_URI = "http://localhost:7474"; 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. * URI used by the driver. Auto-detected by default.
*/ */
...@@ -151,6 +155,9 @@ public class Neo4jProperties implements ApplicationContextAware { ...@@ -151,6 +155,9 @@ public class Neo4jProperties implements ApplicationContextAware {
if ("http".equals(scheme)) { if ("http".equals(scheme)) {
return HTTP_DRIVER; return HTTP_DRIVER;
} }
if ("bolt".equals(scheme)) {
return BOLT_DRIVER;
}
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Could not deduce driver to use based on URI '" + uri + "'"); "Could not deduce driver to use based on URI '" + uri + "'");
} }
...@@ -166,6 +173,11 @@ public class Neo4jProperties implements ApplicationContextAware { ...@@ -166,6 +173,11 @@ public class Neo4jProperties implements ApplicationContextAware {
driverConfiguration.setDriverClassName(EMBEDDED_DRIVER); driverConfiguration.setDriverClassName(EMBEDDED_DRIVER);
return; return;
} }
if (ClassUtils.isPresent(BOLT_DRIVER, this.classLoader)) {
driverConfiguration.setDriverClassName(BOLT_DRIVER);
driverConfiguration.setURI( DEFAULT_BOLT_URI );
return;
}
driverConfiguration.setDriverClassName(HTTP_DRIVER); driverConfiguration.setDriverClassName(HTTP_DRIVER);
driverConfiguration.setURI(DEFAULT_HTTP_URI); driverConfiguration.setURI(DEFAULT_HTTP_URI);
} }
......
...@@ -18,6 +18,8 @@ package org.springframework.boot.autoconfigure.data.neo4j; ...@@ -18,6 +18,8 @@ package org.springframework.boot.autoconfigure.data.neo4j;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.EnumSet;
import java.util.Set;
import com.hazelcast.util.Base64; import com.hazelcast.util.Base64;
import org.junit.After; import org.junit.After;
...@@ -29,7 +31,6 @@ import org.neo4j.ogm.config.DriverConfiguration; ...@@ -29,7 +31,6 @@ import org.neo4j.ogm.config.DriverConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
...@@ -50,14 +51,21 @@ public class Neo4jPropertiesTests { ...@@ -50,14 +51,21 @@ public class Neo4jPropertiesTests {
@Test @Test
public void defaultUseEmbeddedInMemoryIfAvailable() { public void defaultUseEmbeddedInMemoryIfAvailable() {
Neo4jProperties properties = load(true); Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ));
Configuration configuration = properties.createConfiguration(); Configuration configuration = properties.createConfiguration();
assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER, null); assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER, null);
} }
@Test @Test
public void defaultUseHttpDriverIfEmbeddedDriverIsNotAvailable() { public void defaultUseBoltIfAvailableAndEmbeddedNot() {
Neo4jProperties properties = load(false); 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(); Configuration configuration = properties.createConfiguration();
assertDriver(configuration, Neo4jProperties.HTTP_DRIVER, assertDriver(configuration, Neo4jProperties.HTTP_DRIVER,
Neo4jProperties.DEFAULT_HTTP_URI); Neo4jProperties.DEFAULT_HTTP_URI);
...@@ -65,15 +73,23 @@ public class Neo4jPropertiesTests { ...@@ -65,15 +73,23 @@ public class Neo4jPropertiesTests {
@Test @Test
public void httpUriUseHttpServer() { public void httpUriUseHttpServer() {
Neo4jProperties properties = load(true, Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ),
"spring.data.neo4j.uri=http://localhost:7474"); "spring.data.neo4j.uri=http://localhost:7474");
Configuration configuration = properties.createConfiguration(); Configuration configuration = properties.createConfiguration();
assertDriver(configuration, Neo4jProperties.HTTP_DRIVER, "http://localhost:7474"); 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 @Test
public void fileUriUseEmbeddedServer() { public void fileUriUseEmbeddedServer() {
Neo4jProperties properties = load(true, Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ),
"spring.data.neo4j.uri=file://var/tmp/graph.db"); "spring.data.neo4j.uri=file://var/tmp/graph.db");
Configuration configuration = properties.createConfiguration(); Configuration configuration = properties.createConfiguration();
assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER, assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER,
...@@ -82,7 +98,7 @@ public class Neo4jPropertiesTests { ...@@ -82,7 +98,7 @@ public class Neo4jPropertiesTests {
@Test @Test
public void credentialsAreSet() { public void credentialsAreSet() {
Neo4jProperties properties = load(true, Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ),
"spring.data.neo4j.uri=http://localhost:7474", "spring.data.neo4j.uri=http://localhost:7474",
"spring.data.neo4j.username=user", "spring.data.neo4j.password=secret"); "spring.data.neo4j.username=user", "spring.data.neo4j.password=secret");
Configuration configuration = properties.createConfiguration(); Configuration configuration = properties.createConfiguration();
...@@ -92,7 +108,7 @@ public class Neo4jPropertiesTests { ...@@ -92,7 +108,7 @@ public class Neo4jPropertiesTests {
@Test @Test
public void credentialsAreSetFromUri() { public void credentialsAreSetFromUri() {
Neo4jProperties properties = load(true, Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ),
"spring.data.neo4j.uri=http://user:secret@my-server:7474"); "spring.data.neo4j.uri=http://user:secret@my-server:7474");
Configuration configuration = properties.createConfiguration(); Configuration configuration = properties.createConfiguration();
assertDriver(configuration, Neo4jProperties.HTTP_DRIVER, assertDriver(configuration, Neo4jProperties.HTTP_DRIVER,
...@@ -102,7 +118,7 @@ public class Neo4jPropertiesTests { ...@@ -102,7 +118,7 @@ public class Neo4jPropertiesTests {
@Test @Test
public void embeddedModeDisabledUseHttpUri() { public void embeddedModeDisabledUseHttpUri() {
Neo4jProperties properties = load(true, Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ),
"spring.data.neo4j.embedded.enabled=false"); "spring.data.neo4j.embedded.enabled=false");
Configuration configuration = properties.createConfiguration(); Configuration configuration = properties.createConfiguration();
assertDriver(configuration, Neo4jProperties.HTTP_DRIVER, assertDriver(configuration, Neo4jProperties.HTTP_DRIVER,
...@@ -111,7 +127,7 @@ public class Neo4jPropertiesTests { ...@@ -111,7 +127,7 @@ public class Neo4jPropertiesTests {
@Test @Test
public void embeddedModeWithRelativeLocation() { public void embeddedModeWithRelativeLocation() {
Neo4jProperties properties = load(true, Neo4jProperties properties = load(EnumSet.of( AvailableDriver.EMBEDDED ),
"spring.data.neo4j.uri=target/neo4j/my.db"); "spring.data.neo4j.uri=target/neo4j/my.db");
Configuration configuration = properties.createConfiguration(); Configuration configuration = properties.createConfiguration();
assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER, assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER,
...@@ -143,20 +159,15 @@ public class Neo4jPropertiesTests { ...@@ -143,20 +159,15 @@ public class Neo4jPropertiesTests {
} }
} }
public Neo4jProperties load(final boolean embeddedAvailable, String... environment) { public Neo4jProperties load( final Set<AvailableDriver> availableDrivers, String... environment) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.setClassLoader(new URLClassLoader(new URL[0], getClass().getClassLoader()) { ctx.setClassLoader(new URLClassLoader(new URL[0], getClass().getClassLoader()) {
@Override @Override
protected Class<?> loadClass(String name, boolean resolve) protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException { throws ClassNotFoundException {
if (name.equals(Neo4jProperties.EMBEDDED_DRIVER)) { if ( AvailableDriver.shouldLoad( availableDrivers, name )) {
if (embeddedAvailable) { return AvailableDriver.loadClass( name );
return TestEmbeddedDriver.class;
}
else {
throw new ClassNotFoundException();
}
} }
return super.loadClass(name, resolve); return super.loadClass(name, resolve);
} }
...@@ -175,8 +186,42 @@ public class Neo4jPropertiesTests { ...@@ -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<AvailableDriver> 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 TestEmbeddedDriver {
} }
private static class TestBoltDriver {
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment