Update to Java-Driver 2.0.0-alpha02.

This commit is contained in:
Michael Simons
2019-06-03 12:06:22 +02:00
parent 05f2b3a7a7
commit bca87cd138
12 changed files with 85 additions and 82 deletions

View File

@@ -99,7 +99,7 @@
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<mockito.version>2.23.4</mockito.version>
<neo4j-java-driver.version>2.0.0-alpha01</neo4j-java-driver.version>
<neo4j-java-driver.version>2.0.0-alpha02</neo4j-java-driver.version>
<neo4j.version>3.5.2</neo4j.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<reactive-streams.version>1.2.1</reactive-streams.version>

View File

@@ -39,7 +39,6 @@ import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import org.neo4j.driver.AccessMode;
import org.neo4j.driver.Driver;
import org.neo4j.driver.Record;
import org.neo4j.driver.Session;
@@ -67,10 +66,7 @@ class DefaultNeo4jClient implements Neo4jClient {
DefaultNeo4jClient(Driver driver) {
this.driver = driver;
// This will go away
try (Session session = this.driver.session(t -> t.withDefaultAccessMode(AccessMode.READ))) {
typeSystem = session.typeSystem();
}
this.typeSystem = driver.defaultTypeSystem();
}
AutoCloseableStatementRunner getStatementRunner(final String targetDatabase) {

View File

@@ -33,10 +33,8 @@ import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import org.neo4j.driver.AccessMode;
import org.neo4j.driver.Driver;
import org.neo4j.driver.Record;
import org.neo4j.driver.Session;
import org.neo4j.driver.exceptions.NoSuchRecordException;
import org.neo4j.driver.reactive.RxSession;
import org.neo4j.driver.reactive.RxStatementRunner;
@@ -68,10 +66,7 @@ class DefaultReactiveNeo4jClient implements ReactiveNeo4jClient {
DefaultReactiveNeo4jClient(Driver driver) {
this.driver = driver;
// This will go away
try (Session session = this.driver.session(t -> t.withDefaultAccessMode(AccessMode.READ))) {
typeSystem = session.typeSystem();
}
this.typeSystem = driver.defaultTypeSystem();
}
// Internal helper methods for managing transactional state

View File

@@ -18,11 +18,10 @@
*/
package org.springframework.data.neo4j.core.transaction;
import java.util.Optional;
import org.neo4j.driver.Session;
import org.neo4j.driver.Transaction;
import org.neo4j.driver.TransactionConfig;
import org.springframework.lang.Nullable;
import org.springframework.transaction.support.ResourceHolderSupport;
import org.springframework.util.Assert;
@@ -64,11 +63,9 @@ class Neo4jConnectionHolder extends ResourceHolderSupport {
return namesMapToTheSameDatabase(this.databaseName, inDatabase) ? transaction : null;
}
static boolean namesMapToTheSameDatabase(String name1, String name2) {
String d1 = Optional.ofNullable(name1).orElse(Neo4jTransactionUtils.DEFAULT_DATABASE_NAME);
String d2 = Optional.ofNullable(name2).orElse(Neo4jTransactionUtils.DEFAULT_DATABASE_NAME);
static boolean namesMapToTheSameDatabase(@Nullable String name1, @Nullable String name2) {
return d1.equals(d2);
return name1 == null && name2 == null || (name1 != null && name1.equals(name2));
}
void commit() {

View File

@@ -53,10 +53,22 @@ import org.springframework.util.Assert;
@Slf4j
public class Neo4jTransactionManager extends AbstractPlatformTransactionManager {
/**
* The underlying driver, which is also the synchronisation object.
*/
private final Driver driver;
/**
* The name of the target database.
*/
private final String databaseName;
public Neo4jTransactionManager(Driver driver) {
this(driver, null);
}
public Neo4jTransactionManager(Driver driver, String databaseName) {
this.driver = driver;
this.databaseName = databaseName;
}
@Override
@@ -82,15 +94,14 @@ public class Neo4jTransactionManager extends AbstractPlatformTransactionManager
boolean readOnly = definition.isReadOnly();
AccessMode accessMode = readOnly ? AccessMode.READ : AccessMode.WRITE;
List<String> bookmarks = Collections.emptyList(); // TODO Bookmarksupport
String database = ""; // TODO Database selection
TransactionSynchronizationManager.setCurrentTransactionReadOnly(readOnly);
try {
Session session = this.driver
.session(t -> t.withDefaultAccessMode(accessMode).withBookmarks(bookmarks).withDatabase(database));
.session(t -> t.withDefaultAccessMode(accessMode).withBookmarks(bookmarks).withDatabase(databaseName));
Neo4jConnectionHolder connectionHolder = new Neo4jConnectionHolder(database, session, transactionConfig);
Neo4jConnectionHolder connectionHolder = new Neo4jConnectionHolder(databaseName, session, transactionConfig);
connectionHolder.setSynchronizedWithTransaction(true);
transactionObject.setResourceHolder(connectionHolder);
TransactionSynchronizationManager.bindResource(this.driver, connectionHolder);

View File

@@ -37,8 +37,6 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
*/
public final class Neo4jTransactionUtils {
public static final String DEFAULT_DATABASE_NAME = "";
/**
* The default session uses {@link AccessMode#WRITE} and an empty list of bookmarks.
*
@@ -46,10 +44,14 @@ public final class Neo4jTransactionUtils {
* @return Session parameters to configure the default session used
*/
public static Consumer<SessionParametersTemplate> defaultSessionParameters(@Nullable String databaseName) {
return t -> t
.withDefaultAccessMode(AccessMode.WRITE)
.withBookmarks(Collections.EMPTY_LIST)
.withDatabase(Optional.ofNullable(databaseName).orElse(DEFAULT_DATABASE_NAME));
return (SessionParametersTemplate t) -> {
t.withDefaultAccessMode(AccessMode.WRITE)
.withBookmarks(Collections.EMPTY_LIST);
if (databaseName != null) {
t.withDatabase(databaseName);
}
};
}
/**

View File

@@ -21,7 +21,6 @@ package org.springframework.data.neo4j.core;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import static org.springframework.data.neo4j.core.transaction.Neo4jTransactionUtils.*;
import java.time.LocalDate;
import java.util.ArrayList;
@@ -92,13 +91,12 @@ class Neo4jClientTest {
@BeforeEach
void prepareMocks() {
when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
when(sessionParametersTemplate.withBookmarks(anyList())).thenReturn(sessionParametersTemplate);
when(sessionParametersTemplate.withDefaultAccessMode(any(AccessMode.class)))
.thenReturn(sessionParametersTemplate);
when(driver.session(any(Consumer.class))).thenReturn(session);
when(session.typeSystem()).thenReturn(typeSystem);
when(driver.defaultTypeSystem()).thenReturn(typeSystem);
}
@AfterEach
@@ -135,7 +133,7 @@ class Neo4jClientTest {
assertThat(usedBikes).hasSize(2);
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
Map<String, Object> expectedParameters = new HashMap<>();
expectedParameters.putAll(parameters);
@@ -146,12 +144,13 @@ class Neo4jClientTest {
verify(statementResult).stream();
verify(record1).asMap();
verify(record2).asMap();
verify(session, times(2)).close();
verify(session).close();
}
@Test
void databaseSelectionShouldBePossibleOnlyOnce() {
when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
when(session.run(anyString(), anyMap())).thenReturn(statementResult);
when(statementResult.stream()).thenReturn(Stream.of(record1, record2));
@@ -176,7 +175,7 @@ class Neo4jClientTest {
verify(session).run(eq(cypher), argThat(new MapAssertionMatcher(expectedParameters)));
verify(statementResult).stream();
verify(record1).asMap();
verify(session, times(2)).close();
verify(session).close();
}
@Nested
@@ -193,14 +192,16 @@ class Neo4jClientTest {
assertThat(result).isPresent().hasValue(42);
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
verify(session, times(2)).close();
verify(session).close();
}
@Test
void withDatabase() {
when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
Neo4jClient client = Neo4jClient.create(driver);
Optional<Integer> result = client
.delegateTo(runner -> Optional.of(42))
@@ -211,7 +212,7 @@ class Neo4jClientTest {
verifyDatabaseSelection("aDatabase");
verify(session, times(2)).close();
verify(session).close();
}
}
@@ -241,7 +242,7 @@ class Neo4jClientTest {
assertThat(bikeOwners).hasSize(1).first()
.hasFieldOrPropertyWithValue("name", "michael");
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
Map<String, Object> expectedParameters = new HashMap<>();
expectedParameters.put("name", "michael");
@@ -249,7 +250,7 @@ class Neo4jClientTest {
verify(session).run(eq(cypher), argThat(new MapAssertionMatcher(expectedParameters)));
verify(statementResult).stream();
verify(record1).get("name");
verify(session, times(2)).close();
verify(session).close();
}
@Test
@@ -272,12 +273,12 @@ class Neo4jClientTest {
})
.all());
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
verify(session).run(eq("MATCH (n) RETURN n"), argThat(new MapAssertionMatcher(Collections.emptyMap())));
verify(statementResult).stream();
verify(record1).get("name");
verify(session, times(2)).close();
verify(session).close();
}
@Test
@@ -298,14 +299,14 @@ class Neo4jClientTest {
.bind(michael).with(new BikeOwnerBinder())
.run();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
Map<String, Object> expectedParameters = new HashMap<>();
expectedParameters.put("name", "Michael");
verify(session).run(eq(cypher), argThat(new MapAssertionMatcher(expectedParameters)));
verify(statementResult).consume();
verify(session, times(2)).close();
verify(session).close();
}
@Test
@@ -328,12 +329,12 @@ class Neo4jClientTest {
assertThat(numberOfBikes).isPresent().hasValue(23L);
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
verify(session).run(eq(cypher), anyMap());
verify(statementResult).hasNext();
verify(statementResult).single();
verify(session, times(2)).close();
verify(session).close();
}
}
@@ -353,14 +354,14 @@ class Neo4jClientTest {
.bind("fixie").to("name")
.run();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
Map<String, Object> expectedParameters = new HashMap<>();
expectedParameters.put("name", "fixie");
verify(session).run(eq(cypher), argThat(new MapAssertionMatcher(expectedParameters)));
verify(statementResult).consume();
verify(session, times(2)).close();
verify(session).close();
}
static class BikeOwner {
@@ -417,9 +418,14 @@ class Neo4jClientTest {
}
void verifyDatabaseSelection(String targetDatabase) {
verify(driver, times(2)).session(sessionTemplateCaptor.capture());
verify(driver).session(sessionTemplateCaptor.capture());
sessionTemplateCaptor.getValue().accept(sessionParametersTemplate);
verify(sessionParametersTemplate).withDatabase(targetDatabase);
if (targetDatabase != null) {
verify(sessionParametersTemplate).withDatabase(targetDatabase);
} else {
verify(sessionParametersTemplate, never()).withDatabase(any());
}
}
static class MapAssertionMatcher extends AssertionMatcher<Map<String, Object>> {

View File

@@ -21,7 +21,6 @@ package org.springframework.data.neo4j.core;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import static org.springframework.data.neo4j.core.transaction.Neo4jTransactionUtils.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -46,11 +45,10 @@ import org.mockito.junit.jupiter.MockitoExtension;
import org.neo4j.driver.AccessMode;
import org.neo4j.driver.Driver;
import org.neo4j.driver.Record;
import org.neo4j.driver.Session;
import org.neo4j.driver.Values;
import org.neo4j.driver.internal.SessionParameters;
import org.neo4j.driver.reactive.RxResult;
import org.neo4j.driver.reactive.RxSession;
import org.neo4j.driver.reactive.RxStatementResult;
import org.neo4j.driver.reactive.RxTransaction;
import org.neo4j.driver.summary.ResultSummary;
import org.neo4j.driver.types.TypeSystem;
@@ -69,9 +67,6 @@ class ReactiveNeo4jClientTest {
@Mock
private Driver driver;
@Mock
private Session goAwaySession;
@Mock
private TypeSystem typeSystem;
@@ -84,7 +79,7 @@ class ReactiveNeo4jClientTest {
private RxSession session;
@Mock
private RxResult statementResult;
private RxStatementResult statementResult;
@Mock
private RxTransaction transaction;
@@ -101,10 +96,8 @@ class ReactiveNeo4jClientTest {
@BeforeEach
void prepareMocks() {
when(driver.session(any(Consumer.class))).thenReturn(goAwaySession);
when(goAwaySession.typeSystem()).thenReturn(typeSystem);
when(driver.defaultTypeSystem()).thenReturn(typeSystem);
when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
when(sessionParametersTemplate.withBookmarks(anyList())).thenReturn(sessionParametersTemplate);
when(sessionParametersTemplate.withDefaultAccessMode(any(AccessMode.class)))
.thenReturn(sessionParametersTemplate);
@@ -153,7 +146,7 @@ class ReactiveNeo4jClientTest {
.expectNextCount(2L)
.verifyComplete();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
Map<String, Object> expectedParameters = new HashMap<>();
expectedParameters.putAll(parameters);
@@ -171,6 +164,7 @@ class ReactiveNeo4jClientTest {
@Test
void databaseSelectionShouldBePossibleOnlyOnce() {
when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
when(transaction.run(anyString(), anyMap())).thenReturn(statementResult);
when(transaction.commit()).thenReturn(Mono.empty());
when(statementResult.records()).thenReturn(Flux.just(record1, record2));
@@ -219,7 +213,7 @@ class ReactiveNeo4jClientTest {
.expectNext(21)
.verifyComplete();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
verify(transaction).commit();
verify(session).close();
@@ -228,6 +222,7 @@ class ReactiveNeo4jClientTest {
@Test
void withDatabase() {
when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
when(transaction.commit()).thenReturn(Mono.empty());
ReactiveNeo4jClient client = ReactiveNeo4jClient.create(driver);
@@ -275,7 +270,7 @@ class ReactiveNeo4jClientTest {
.expectNextMatches(o -> o.getName().equals("michael"))
.verifyComplete();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
Map<String, Object> expectedParameters = new HashMap<>();
expectedParameters.put("name", "michael");
@@ -311,7 +306,7 @@ class ReactiveNeo4jClientTest {
.expectNextCount(1)
.verifyError();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
verify(transaction).run(eq("MATCH (n) RETURN n"), argThat(new MapAssertionMatcher(Collections.emptyMap())));
verify(statementResult).records();
@@ -344,7 +339,7 @@ class ReactiveNeo4jClientTest {
.expectNext(resultSummary)
.verifyComplete();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
Map<String, Object> expectedParameters = new HashMap<>();
expectedParameters.put("name", "Michael");
@@ -377,7 +372,7 @@ class ReactiveNeo4jClientTest {
.expectNext(23L)
.verifyComplete();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
verify(transaction).run(eq(cypher), anyMap());
verify(transaction).commit();
@@ -406,7 +401,7 @@ class ReactiveNeo4jClientTest {
.expectNext(resultSummary)
.verifyComplete();
verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
verifyDatabaseSelection(null);
Map<String, Object> expectedParameters = new HashMap<>();
expectedParameters.put("name", "fixie");
@@ -420,6 +415,10 @@ class ReactiveNeo4jClientTest {
void verifyDatabaseSelection(String targetDatabase) {
verify(driver).rxSession(sessionTemplateCaptor.capture());
sessionTemplateCaptor.getValue().accept(sessionParametersTemplate);
verify(sessionParametersTemplate).withDatabase(targetDatabase);
if (targetDatabase != null) {
verify(sessionParametersTemplate).withDatabase(targetDatabase);
} else {
verify(sessionParametersTemplate, never()).withDatabase(any());
}
}
}

View File

@@ -71,15 +71,14 @@ class TransactionHandlingTest {
@BeforeEach
void prepareMocks() {
when(driver.session(any(Consumer.class))).thenReturn(session);
when(session.typeSystem()).thenReturn(typeSystem);
when(driver.defaultTypeSystem()).thenReturn(typeSystem);
}
@AfterEach
void verifyTypeSystemOnSession() {
verify(session).typeSystem();
verify(driver).defaultTypeSystem();
}
@Nested
@@ -96,6 +95,7 @@ class TransactionHandlingTest {
ArgumentCaptor<Consumer> consumerCaptor = ArgumentCaptor.forClass(Consumer.class);
when(driver.session(any(Consumer.class))).thenReturn(session);
when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
when(sessionParametersTemplate.withBookmarks(anyList())).thenReturn(sessionParametersTemplate);
when(sessionParametersTemplate.withDefaultAccessMode(any(AccessMode.class)))
@@ -107,12 +107,12 @@ class TransactionHandlingTest {
s.run("MATCH (n) RETURN n");
}
verify(driver, times(2)).session(consumerCaptor.capture());
verify(driver).session(consumerCaptor.capture());
consumerCaptor.getValue().accept(sessionParametersTemplate);
verify(sessionParametersTemplate).withDatabase("aDatabase");
verify(session).run(any(String.class));
verify(session, times(2)).close();
verify(session).close();
verifyNoMoreInteractions(driver, sessionParametersTemplate, session, transaction);
}
@@ -122,6 +122,7 @@ class TransactionHandlingTest {
AtomicBoolean transactionIsOpen = new AtomicBoolean(true);
when(driver.session(any(Consumer.class))).thenReturn(session);
when(session.isOpen()).thenReturn(true);
when(session.beginTransaction(any(TransactionConfig.class))).thenReturn(transaction);
// Mock closing of the transaction
@@ -148,7 +149,7 @@ class TransactionHandlingTest {
verify(transaction).success();
verify(transaction).close();
verify(session).isOpen();
verify(session, times(2)).close();
verify(session).close();
verifyNoMoreInteractions(driver, session, transaction);
}
}

View File

@@ -19,7 +19,6 @@
package org.springframework.data.neo4j.core.transaction;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.neo4j.core.transaction.Neo4jTransactionUtils.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.params.ParameterizedTest;
@@ -36,9 +35,6 @@ class Neo4jConnectionHolderTest {
@ParameterizedTest
@CsvSource({
",",
"," + DEFAULT_DATABASE_NAME,
DEFAULT_DATABASE_NAME + ",",
DEFAULT_DATABASE_NAME + "," + DEFAULT_DATABASE_NAME,
"a,a"
})
void nameComparisionShouldWorkForNamesTargetingTheSame(String name1, String name2) {

View File

@@ -56,11 +56,11 @@ class Neo4jTransactionManagerTest {
@Test
public void triggerCommitCorrectly() {
when(driver.defaultTypeSystem()).thenReturn(typeSystem);
when(driver.session(any(Consumer.class))).thenReturn(session);
when(session.beginTransaction(any(TransactionConfig.class))).thenReturn(transaction);
when(transaction.run(anyString(), anyMap())).thenReturn(statementResult);
when(session.isOpen()).thenReturn(true);
when(session.typeSystem()).thenReturn(typeSystem);
when(transaction.isOpen()).thenReturn(true, false);
Neo4jTransactionManager txManager = new Neo4jTransactionManager(driver);
@@ -71,7 +71,7 @@ class Neo4jTransactionManagerTest {
txManager.commit(txStatus);
verify(driver, times(2)).session(any(Consumer.class));
verify(driver).session(any(Consumer.class));
verify(session).isOpen();
verify(session).beginTransaction(any(TransactionConfig.class));
@@ -80,6 +80,6 @@ class Neo4jTransactionManagerTest {
verify(transaction).success();
verify(transaction).close();
verify(session, times(2)).close();
verify(session).close();
}
}

View File

@@ -54,7 +54,7 @@ import org.springframework.transaction.support.TransactionTemplate;
@MockitoSettings(strictness = Strictness.LENIENT)
class Neo4jTransactionUtilsTest {
private String databaseName = Neo4jTransactionUtils.DEFAULT_DATABASE_NAME;
private String databaseName = "aDatabase";
@Mock
private Driver driver;
@@ -101,7 +101,7 @@ class Neo4jTransactionUtilsTest {
@Test
void shouldOpenNewTransaction() {
Neo4jTransactionManager txManager = new Neo4jTransactionManager(driver);
Neo4jTransactionManager txManager = new Neo4jTransactionManager(driver, databaseName);
TransactionTemplate txTemplate = new TransactionTemplate(txManager);
txTemplate.execute(new TransactionCallbackWithoutResult() {
@@ -134,7 +134,7 @@ class Neo4jTransactionUtilsTest {
@Test
void shouldParticipateInOngoingTransaction() {
Neo4jTransactionManager txManager = new Neo4jTransactionManager(driver);
Neo4jTransactionManager txManager = new Neo4jTransactionManager(driver, databaseName);
TransactionTemplate txTemplate = new TransactionTemplate(txManager);
txTemplate.execute(new TransactionCallbackWithoutResult() {