Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down Expand Up @@ -151,6 +155,9 @@ private String deduceDriverFromUri() {
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 + "'");
}
Expand All @@ -166,6 +173,11 @@ private void configureDriverWithDefaults(DriverConfiguration driverConfiguration
driverConfiguration.setDriverClassName(EMBEDDED_DRIVER);
return;
}
if (ClassUtils.isPresent(BOLT_DRIVER, this.classLoader)) {
driverConfiguration.setDriverClassName(BOLT_DRIVER);
driverConfiguration.setURI( DEFAULT_BOLT_URI );
return;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a breaking in behaviour. If you didn't specify anything and you upgrade, you're using bolt instead of http. I need to better understand the impact of this change before considering the code as is.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my assumption on this is simply that since spring boot/platform doesn't provide this driver (or the file one) that if you add it manually, you probably want to use it, I'm ok if this isn't auto behavior, that just made sense to me.

driverConfiguration.setDriverClassName(HTTP_DRIVER);
driverConfiguration.setURI(DEFAULT_HTTP_URI);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

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;
Expand All @@ -29,7 +31,6 @@
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;

/**
Expand All @@ -50,30 +51,45 @@ public void close() {

@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);
}

@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,
Expand All @@ -82,7 +98,7 @@ public void fileUriUseEmbeddedServer() {

@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();
Expand All @@ -92,7 +108,7 @@ public void credentialsAreSet() {

@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,
Expand All @@ -102,7 +118,7 @@ public void credentialsAreSetFromUri() {

@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,
Expand All @@ -111,7 +127,7 @@ public void embeddedModeDisabledUseHttpUri() {

@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,
Expand Down Expand Up @@ -143,20 +159,15 @@ private static void assertCredentials(Configuration actual, String username,
}
}

public Neo4jProperties load(final boolean embeddedAvailable, String... environment) {
public Neo4jProperties load( final Set<AvailableDriver> 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);
}
Expand All @@ -175,8 +186,42 @@ static class TestConfiguration {

}

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 TestBoltDriver {
}

}