Skip to content

Update BookmarkManagerConfig #1291

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 17, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
45 changes: 23 additions & 22 deletions driver/src/main/java/org/neo4j/driver/BookmarkManagerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;

Expand All @@ -29,13 +30,13 @@
*/
public final class BookmarkManagerConfig {
private final Map<String, Set<Bookmark>> initialBookmarks;
private final BiConsumer<String, Set<Bookmark>> bookmarkConsumer;
private final BookmarkSupplier bookmarkSupplier;
private final BiConsumer<String, Set<Bookmark>> bookmarksConsumer;
private final BookmarksSupplier bookmarksSupplier;

private BookmarkManagerConfig(BookmarkManagerConfigBuilder builder) {
this.initialBookmarks = builder.initialBookmarks;
this.bookmarkConsumer = builder.bookmarkConsumer;
this.bookmarkSupplier = builder.bookmarkSupplier;
this.bookmarksConsumer = builder.bookmarksConsumer;
this.bookmarksSupplier = builder.bookmarksSupplier;
}

/**
Expand All @@ -57,30 +58,30 @@ public Map<String, Set<Bookmark>> initialBookmarks() {
}

/**
* Returns a bookmark update listener that will be notified when database bookmarks are updated.
* Returns bookmarks consumer that will be notified when database bookmarks are updated.
*
* @return the update listener or {@code null}
* @return the bookmarks consumer
*/
public BiConsumer<String, Set<Bookmark>> updateListener() {
return bookmarkConsumer;
public Optional<BiConsumer<String, Set<Bookmark>>> bookmarksConsumer() {
return Optional.ofNullable(bookmarksConsumer);
}

/**
* Returns bookmark supplier that will be used by the bookmark manager when getting bookmarks.
* Returns bookmarks supplier that will be used by the bookmark manager when getting bookmarks.
*
* @return the bookmark supplier or {@code null}
* @return the bookmark supplier
*/
public BookmarkSupplier bookmarkSupplier() {
return bookmarkSupplier;
public Optional<BookmarksSupplier> bookmarksSupplier() {
return Optional.ofNullable(bookmarksSupplier);
}

/**
* Builder used to configure {@link BookmarkManagerConfig} which will be used to create a bookmark manager.
*/
public static class BookmarkManagerConfigBuilder {
private Map<String, Set<Bookmark>> initialBookmarks = Collections.emptyMap();
private BiConsumer<String, Set<Bookmark>> bookmarkConsumer;
private BookmarkSupplier bookmarkSupplier;
private BiConsumer<String, Set<Bookmark>> bookmarksConsumer;
private BookmarksSupplier bookmarksSupplier;

private BookmarkManagerConfigBuilder() {}

Expand All @@ -97,30 +98,30 @@ public BookmarkManagerConfigBuilder withInitialBookmarks(Map<String, Set<Bookmar
}

/**
* Provide a bookmark consumer.
* Provide bookmarks consumer.
* <p>
* The consumer will be called outside bookmark manager's synchronisation lock.
*
* @param bookmarkConsumer bookmark consumer
* @param bookmarksConsumer bookmarks consumer
* @return this builder
*/
public BookmarkManagerConfigBuilder withBookmarkConsumer(BiConsumer<String, Set<Bookmark>> bookmarkConsumer) {
this.bookmarkConsumer = bookmarkConsumer;
public BookmarkManagerConfigBuilder withBookmarksConsumer(BiConsumer<String, Set<Bookmark>> bookmarksConsumer) {
this.bookmarksConsumer = bookmarksConsumer;
return this;
}

/**
* Provide a bookmark supplier.
* Provide bookmarks supplier.
* <p>
* The supplied bookmarks will be served alongside the bookmarks served by the bookmark manager. The supplied bookmarks will not be stored nor managed by the bookmark manager.
* <p>
* The supplier will be called outside bookmark manager's synchronisation lock.
*
* @param bookmarkSupplier the bookmarks supplier
* @param bookmarksSupplier the bookmarks supplier
* @return this builder
*/
public BookmarkManagerConfigBuilder withBookmarkSupplier(BookmarkSupplier bookmarkSupplier) {
this.bookmarkSupplier = bookmarkSupplier;
public BookmarkManagerConfigBuilder withBookmarksSupplier(BookmarksSupplier bookmarksSupplier) {
this.bookmarksSupplier = bookmarksSupplier;
return this;
}

Expand Down
5 changes: 4 additions & 1 deletion driver/src/main/java/org/neo4j/driver/BookmarkManagers.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ public interface BookmarkManagers {
* @return the bookmark manager
*/
static BookmarkManager defaultManager(BookmarkManagerConfig config) {
return new Neo4jBookmarkManager(config.initialBookmarks(), config.updateListener(), config.bookmarkSupplier());
return new Neo4jBookmarkManager(
config.initialBookmarks(),
config.bookmarksConsumer().orElse(null),
config.bookmarksSupplier().orElse(null));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
* <p>
* Implementations must avoid calling driver.
*/
public interface BookmarkSupplier {
public interface BookmarksSupplier {
/**
* Supplies a set of bookmarks for a given database.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import java.util.stream.Collectors;
import org.neo4j.driver.Bookmark;
import org.neo4j.driver.BookmarkManager;
import org.neo4j.driver.BookmarkSupplier;
import org.neo4j.driver.BookmarksSupplier;

/**
* A basic {@link BookmarkManager} implementation.
Expand All @@ -47,16 +47,16 @@ public final class Neo4jBookmarkManager implements BookmarkManager {

private final Map<String, Set<Bookmark>> databaseToBookmarks = new HashMap<>();
private final BiConsumer<String, Set<Bookmark>> updateListener;
private final BookmarkSupplier bookmarkSupplier;
private final BookmarksSupplier bookmarksSupplier;

public Neo4jBookmarkManager(
Map<String, Set<Bookmark>> initialBookmarks,
BiConsumer<String, Set<Bookmark>> updateListener,
BookmarkSupplier bookmarkSupplier) {
BookmarksSupplier bookmarksSupplier) {
Objects.requireNonNull(initialBookmarks, "initialBookmarks must not be null");
this.databaseToBookmarks.putAll(initialBookmarks);
this.updateListener = updateListener;
this.bookmarkSupplier = bookmarkSupplier;
this.bookmarksSupplier = bookmarksSupplier;
}

@Override
Expand All @@ -82,9 +82,9 @@ public void updateBookmarks(String database, Set<Bookmark> previousBookmarks, Se
public Set<Bookmark> getBookmarks(String database) {
var immutableBookmarks = executeWithLock(
rwLock.readLock(), () -> databaseToBookmarks.getOrDefault(database, Collections.emptySet()));
if (bookmarkSupplier != null) {
if (bookmarksSupplier != null) {
var bookmarks = new HashSet<>(immutableBookmarks);
bookmarks.addAll(bookmarkSupplier.getBookmarks(database));
bookmarks.addAll(bookmarksSupplier.getBookmarks(database));
immutableBookmarks = Collections.unmodifiableSet(bookmarks);
}
return immutableBookmarks;
Expand All @@ -95,9 +95,9 @@ public Set<Bookmark> getAllBookmarks() {
var immutableBookmarks = executeWithLock(rwLock.readLock(), () -> databaseToBookmarks.values().stream()
.flatMap(Collection::stream))
.collect(Collectors.toUnmodifiableSet());
if (bookmarkSupplier != null) {
if (bookmarksSupplier != null) {
var bookmarks = new HashSet<>(immutableBookmarks);
bookmarks.addAll(bookmarkSupplier.getAllBookmarks());
bookmarks.addAll(bookmarksSupplier.getAllBookmarks());
immutableBookmarks = Collections.unmodifiableSet(bookmarks);
}
return immutableBookmarks;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;

Expand All @@ -40,8 +39,8 @@ void shouldReturnDefaultValues() {
// THEN
assertNotNull(config.initialBookmarks());
assertTrue(config.initialBookmarks().isEmpty());
assertNull(config.updateListener());
assertNull(config.bookmarkSupplier());
assertTrue(config.bookmarksConsumer().isEmpty());
assertTrue(config.bookmarksSupplier().isEmpty());
}

@Test
Expand All @@ -54,8 +53,8 @@ void shouldReturnInitialBookmarks() {

// WHEN & THEN
assertEquals(bookmarks, config.initialBookmarks());
assertNull(config.updateListener());
assertNull(config.bookmarkSupplier());
assertTrue(config.bookmarksConsumer().isEmpty());
assertTrue(config.bookmarksSupplier().isEmpty());
}

@Test
Expand All @@ -65,30 +64,30 @@ void shouldReturnUpdateListener() {

// WHEN
config = BookmarkManagerConfig.builder()
.withBookmarkConsumer(updateListener)
.withBookmarksConsumer(updateListener)
.build();

// WHEN & THEN
assertNotNull(config.initialBookmarks());
assertTrue(config.initialBookmarks().isEmpty());
assertEquals(updateListener, config.updateListener());
assertNull(config.bookmarkSupplier());
assertEquals(updateListener, config.bookmarksConsumer().orElse(null));
assertTrue(config.bookmarksSupplier().isEmpty());
}

@Test
void shouldReturnBookmarkSupplier() {
// GIVEN
var bookmarkSupplier = mock(BookmarkSupplier.class);
var bookmarkSupplier = mock(BookmarksSupplier.class);

// WHEN
config = BookmarkManagerConfig.builder()
.withBookmarkSupplier(bookmarkSupplier)
.withBookmarksSupplier(bookmarkSupplier)
.build();

// WHEN & THEN
assertNotNull(config.initialBookmarks());
assertTrue(config.initialBookmarks().isEmpty());
assertNull(config.updateListener());
assertEquals(bookmarkSupplier, config.bookmarkSupplier());
assertTrue(config.bookmarksConsumer().isEmpty());
assertEquals(bookmarkSupplier, config.bookmarksSupplier().orElse(null));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.neo4j.driver.Bookmark;
import org.neo4j.driver.BookmarkSupplier;
import org.neo4j.driver.BookmarksSupplier;

class Neo4jBookmarkManagerTest {
Neo4jBookmarkManager manager;
Expand Down Expand Up @@ -102,7 +102,7 @@ void shouldGetBookmarksFromBookmarkSupplier() {
// GIVEN
var initialBookmark = Bookmark.from("SY:000001");
var initialBookmarks = Map.of(DatabaseNameUtil.SYSTEM_DATABASE_NAME, Set.of(initialBookmark));
var bookmarkSupplier = mock(BookmarkSupplier.class);
var bookmarkSupplier = mock(BookmarksSupplier.class);
var supplierBookmark = Bookmark.from("SY:000002");
given(bookmarkSupplier.getBookmarks(DatabaseNameUtil.SYSTEM_DATABASE_NAME))
.willReturn(Set.of(supplierBookmark));
Expand All @@ -121,7 +121,7 @@ void shouldGetAllBookmarksFromBookmarkSupplier() {
// GIVEN
var initialBookmark = Bookmark.from("SY:000001");
var initialBookmarks = Map.of(DatabaseNameUtil.SYSTEM_DATABASE_NAME, Set.of(initialBookmark));
var bookmarkSupplier = mock(BookmarkSupplier.class);
var bookmarkSupplier = mock(BookmarksSupplier.class);
var supplierBookmark = Bookmark.from("SY:000002");
given(bookmarkSupplier.getAllBookmarks()).willReturn(Set.of(supplierBookmark));
manager = new Neo4jBookmarkManager(initialBookmarks, null, bookmarkSupplier);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,11 +128,11 @@ public TestkitResponse process(TestkitState testkitState) {
var managerConfigBuilder =
org.neo4j.driver.BookmarkManagerConfig.builder().withInitialBookmarks(initialBookmarks);
if (managerConfig.isBookmarksSupplierRegistered()) {
managerConfigBuilder = managerConfigBuilder.withBookmarkSupplier(
new TestkitBookmarkSupplier(testkitState, this::dispatchTestkitCallback));
managerConfigBuilder = managerConfigBuilder.withBookmarksSupplier(
new TestkitBookmarksSupplier(testkitState, this::dispatchTestkitCallback));
}
if (managerConfig.isBookmarksConsumerRegistered()) {
managerConfigBuilder = managerConfigBuilder.withBookmarkConsumer(
managerConfigBuilder = managerConfigBuilder.withBookmarksConsumer(
new TestkitBookmarkConsumer(testkitState, this::dispatchTestkitCallback));
}
var manager = BookmarkManagers.defaultManager(managerConfigBuilder.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@
import neo4j.org.testkit.backend.messages.responses.BookmarksSupplierRequest;
import neo4j.org.testkit.backend.messages.responses.TestkitCallback;
import org.neo4j.driver.Bookmark;
import org.neo4j.driver.BookmarkSupplier;
import org.neo4j.driver.BookmarksSupplier;

@RequiredArgsConstructor
class TestkitBookmarkSupplier implements BookmarkSupplier {
class TestkitBookmarksSupplier implements BookmarksSupplier {
private final TestkitState testkitState;
private final BiFunction<TestkitState, TestkitCallback, CompletionStage<TestkitCallbackResult>> dispatchFunction;

Expand Down