Skip to content

Commit 7d1d2bd

Browse files
committed
Move bookmark manager configuration to session
1 parent 7fb6ef3 commit 7d1d2bd

21 files changed

+214
-116
lines changed

driver/src/main/java/org/neo4j/driver/BookmarkManager.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.io.Serializable;
2222
import java.util.Set;
23+
import org.neo4j.driver.util.Experimental;
2324

2425
/**
2526
* Keeps track of database bookmarks and is used by the driver to ensure causal consistency between sessions and query executions.
@@ -28,8 +29,9 @@
2829
* <p>
2930
* Implementations must avoid calling driver.
3031
*
31-
* @see org.neo4j.driver.Config.ConfigBuilder#withBookmarkManager(BookmarkManager)
32+
* @see org.neo4j.driver.SessionConfig.Builder#withBookmarkManager(BookmarkManager)
3233
*/
34+
@Experimental
3335
public interface BookmarkManager extends Serializable {
3436
/**
3537
* Updates database bookmarks by deleting the given previous bookmarks and adding the new bookmarks.

driver/src/main/java/org/neo4j/driver/BookmarkManagers.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@
1919
package org.neo4j.driver;
2020

2121
import org.neo4j.driver.internal.Neo4jBookmarkManager;
22+
import org.neo4j.driver.util.Experimental;
2223

2324
/**
2425
* Setups new instances of {@link BookmarkManager}.
2526
*/
27+
@Experimental
2628
public final class BookmarkManagers {
2729
private BookmarkManagers() {}
2830
/**
29-
* Setups a new instance of bookmark manager that can be used in {@link org.neo4j.driver.Config.ConfigBuilder#withBookmarkManager(BookmarkManager)}.
31+
* Setups a new instance of bookmark manager that can be used in {@link org.neo4j.driver.SessionConfig.Builder#withBookmarkManager(BookmarkManager)}.
3032
*
3133
* @param config the bookmark manager configuration
3234
* @return the bookmark manager

driver/src/main/java/org/neo4j/driver/Config.java

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import java.util.Collections;
3131
import java.util.List;
3232
import java.util.Objects;
33-
import java.util.Optional;
3433
import java.util.concurrent.TimeUnit;
3534
import java.util.logging.Level;
3635
import org.neo4j.driver.internal.SecuritySettings;
@@ -99,7 +98,6 @@ public final class Config implements Serializable {
9998
private final int eventLoopThreads;
10099
private final String userAgent;
101100
private final MetricsAdapter metricsAdapter;
102-
private final BookmarkManager bookmarkManager;
103101

104102
private Config(ConfigBuilder builder) {
105103
this.logging = builder.logging;
@@ -121,8 +119,6 @@ private Config(ConfigBuilder builder) {
121119

122120
this.eventLoopThreads = builder.eventLoopThreads;
123121
this.metricsAdapter = builder.metricsAdapter;
124-
125-
this.bookmarkManager = builder.bookmarkManager;
126122
}
127123

128124
/**
@@ -256,15 +252,6 @@ public String userAgent() {
256252
return userAgent;
257253
}
258254

259-
/**
260-
* A {@link BookmarkManager} implementation for the driver to use.
261-
*
262-
* @return bookmark implementation
263-
*/
264-
public Optional<BookmarkManager> bookmarkManager() {
265-
return Optional.ofNullable(bookmarkManager);
266-
}
267-
268255
/**
269256
* Used to build new config instances
270257
*/
@@ -285,7 +272,6 @@ public static final class ConfigBuilder {
285272
private MetricsAdapter metricsAdapter = MetricsAdapter.DEV_NULL;
286273
private long fetchSize = FetchSizeUtil.DEFAULT_FETCH_SIZE;
287274
private int eventLoopThreads = 0;
288-
private BookmarkManager bookmarkManager;
289275

290276
private ConfigBuilder() {}
291277

@@ -659,19 +645,6 @@ public ConfigBuilder withUserAgent(String userAgent) {
659645
return this;
660646
}
661647

662-
/**
663-
* Sets a {@link BookmarkManager} implementation for the driver to use.
664-
* <p>
665-
* By default, bookmark manager is effectively disabled.
666-
*
667-
* @param bookmarkManager bookmark manager implementation. Providing {@code null} effectively disables bookmark manager.
668-
* @return this builder.
669-
*/
670-
public ConfigBuilder withBookmarkManager(BookmarkManager bookmarkManager) {
671-
this.bookmarkManager = bookmarkManager;
672-
return this;
673-
}
674-
675648
/**
676649
* Extracts the driver version from the driver jar MANIFEST.MF file.
677650
*/

driver/src/main/java/org/neo4j/driver/SessionConfig.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.neo4j.driver.async.AsyncSession;
3030
import org.neo4j.driver.reactive.ReactiveSession;
3131
import org.neo4j.driver.reactive.RxSession;
32+
import org.neo4j.driver.util.Experimental;
3233
import org.reactivestreams.Subscription;
3334

3435
/**
@@ -45,15 +46,15 @@ public final class SessionConfig implements Serializable {
4546
private final String database;
4647
private final Long fetchSize;
4748
private final String impersonatedUser;
48-
private final boolean ignoreBookmarkManager;
49+
private final BookmarkManager bookmarkManager;
4950

5051
private SessionConfig(Builder builder) {
5152
this.bookmarks = builder.bookmarks;
5253
this.defaultAccessMode = builder.defaultAccessMode;
5354
this.database = builder.database;
5455
this.fetchSize = builder.fetchSize;
5556
this.impersonatedUser = builder.impersonatedUser;
56-
this.ignoreBookmarkManager = builder.ignoreBookmarkManager;
57+
this.bookmarkManager = builder.bookmarkManager;
5758
}
5859

5960
/**
@@ -133,12 +134,13 @@ public Optional<String> impersonatedUser() {
133134
}
134135

135136
/**
136-
* Determines if {@link BookmarkManager} configured at driver level should be ignored.
137+
* A {@link BookmarkManager} implementation for the session to use.
137138
*
138-
* @return {@code true} if bookmark manager should be ignored and not otherwise.
139+
* @return bookmark implementation
139140
*/
140-
public boolean ignoreBookmarkManager() {
141-
return ignoreBookmarkManager;
141+
@Experimental
142+
public Optional<BookmarkManager> bookmarkManager() {
143+
return Optional.ofNullable(bookmarkManager);
142144
}
143145

144146
@Override
@@ -155,19 +157,22 @@ public boolean equals(Object o) {
155157
&& Objects.equals(database, that.database)
156158
&& Objects.equals(fetchSize, that.fetchSize)
157159
&& Objects.equals(impersonatedUser, that.impersonatedUser)
158-
&& Objects.equals(ignoreBookmarkManager, that.ignoreBookmarkManager);
160+
&& Objects.equals(bookmarkManager, that.bookmarkManager);
159161
}
160162

161163
@Override
162164
public int hashCode() {
163-
return Objects.hash(bookmarks, defaultAccessMode, database, impersonatedUser, ignoreBookmarkManager);
165+
return Objects.hash(bookmarks, defaultAccessMode, database, impersonatedUser, bookmarkManager);
164166
}
165167

166168
@Override
167169
public String toString() {
168-
return "SessionParameters{" + "bookmarks=" + bookmarks + ", defaultAccessMode=" + defaultAccessMode
169-
+ ", database='" + database + '\'' + ", fetchSize=" + fetchSize + "impersonatedUser=" + impersonatedUser
170-
+ '}';
170+
return String.format(
171+
"""
172+
SessionParameters{bookmarks=%s, defaultAccessMode=%s, database='%s', fetchSize=%d, impersonatedUser=%s, \
173+
bookmarkManager=%s}\
174+
""",
175+
bookmarks, defaultAccessMode, database, fetchSize, impersonatedUser, bookmarkManager);
171176
}
172177

173178
/**
@@ -179,7 +184,7 @@ public static final class Builder {
179184
private AccessMode defaultAccessMode = AccessMode.WRITE;
180185
private String database = null;
181186
private String impersonatedUser = null;
182-
private boolean ignoreBookmarkManager = false;
187+
private BookmarkManager bookmarkManager;
183188

184189
private Builder() {}
185190

@@ -306,13 +311,16 @@ public Builder withImpersonatedUser(String impersonatedUser) {
306311
}
307312

308313
/**
309-
* Ignore {@link BookmarkManager} configured at driver level using {@link org.neo4j.driver.Config.ConfigBuilder#withBookmarkManager(BookmarkManager)}.
314+
* Sets a {@link BookmarkManager} implementation for the session to use.
315+
* <p>
316+
* By default, bookmark manager is effectively disabled.
310317
*
311-
* @param ignore ignore if {@code true}, use otherwise.
318+
* @param bookmarkManager bookmark manager implementation. Providing {@code null} effectively disables bookmark manager.
312319
* @return this builder.
313320
*/
314-
public Builder withIgnoredBookmarkManager(boolean ignore) {
315-
this.ignoreBookmarkManager = ignore;
321+
@Experimental
322+
public Builder withBookmarkManager(BookmarkManager bookmarkManager) {
323+
this.bookmarkManager = bookmarkManager;
316324
return this;
317325
}
318326

driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,12 +260,7 @@ protected InternalDriver createRoutingDriver(
260260
*/
261261
protected InternalDriver createDriver(
262262
SecurityPlan securityPlan, SessionFactory sessionFactory, MetricsProvider metricsProvider, Config config) {
263-
return new InternalDriver(
264-
securityPlan,
265-
sessionFactory,
266-
metricsProvider,
267-
config.logging(),
268-
config.bookmarkManager().orElse(null));
263+
return new InternalDriver(securityPlan, sessionFactory, metricsProvider, config.logging());
269264
}
270265

271266
/**

driver/src/main/java/org/neo4j/driver/internal/InternalDriver.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import java.util.concurrent.CompletionStage;
2424
import java.util.concurrent.atomic.AtomicBoolean;
25-
import org.neo4j.driver.BookmarkManager;
2625
import org.neo4j.driver.Driver;
2726
import org.neo4j.driver.Logger;
2827
import org.neo4j.driver.Logging;
@@ -48,22 +47,18 @@ public class InternalDriver implements Driver {
4847
private final SessionFactory sessionFactory;
4948
private final Logger log;
5049

51-
private AtomicBoolean closed = new AtomicBoolean(false);
50+
private final AtomicBoolean closed = new AtomicBoolean(false);
5251
private final MetricsProvider metricsProvider;
5352

54-
private final BookmarkManager bookmarkManager;
55-
5653
InternalDriver(
5754
SecurityPlan securityPlan,
5855
SessionFactory sessionFactory,
5956
MetricsProvider metricsProvider,
60-
Logging logging,
61-
BookmarkManager bookmarkManager) {
57+
Logging logging) {
6258
this.securityPlan = securityPlan;
6359
this.sessionFactory = sessionFactory;
6460
this.metricsProvider = metricsProvider;
6561
this.log = logging.getLog(getClass());
66-
this.bookmarkManager = bookmarkManager != null ? bookmarkManager : new NoOpBookmarkManager();
6762
}
6863

6964
@Override
@@ -169,8 +164,7 @@ private static RuntimeException driverCloseException() {
169164

170165
public NetworkSession newSession(SessionConfig config) {
171166
assertOpen();
172-
var bookmarkManager = config.ignoreBookmarkManager() ? new NoOpBookmarkManager() : this.bookmarkManager;
173-
NetworkSession session = sessionFactory.newInstance(config, bookmarkManager);
167+
NetworkSession session = sessionFactory.newInstance(config);
174168
if (closed.get()) {
175169
// session does not immediately acquire connection, it is fine to just throw
176170
throw driverCloseException();

driver/src/main/java/org/neo4j/driver/internal/SessionFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@
1919
package org.neo4j.driver.internal;
2020

2121
import java.util.concurrent.CompletionStage;
22-
import org.neo4j.driver.BookmarkManager;
2322
import org.neo4j.driver.SessionConfig;
2423
import org.neo4j.driver.internal.async.NetworkSession;
2524

2625
public interface SessionFactory {
27-
NetworkSession newInstance(SessionConfig sessionConfig, BookmarkManager bookmarkManager);
26+
NetworkSession newInstance(SessionConfig sessionConfig);
2827

2928
CompletionStage<Void> verifyConnectivity();
3029

driver/src/main/java/org/neo4j/driver/internal/SessionFactoryImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ public class SessionFactoryImpl implements SessionFactory {
5151
}
5252

5353
@Override
54-
public NetworkSession newInstance(SessionConfig sessionConfig, BookmarkManager bookmarkManager) {
55-
Objects.requireNonNull(bookmarkManager, "bookmarkManager may not be null");
54+
public NetworkSession newInstance(SessionConfig sessionConfig) {
5655
return createSession(
5756
connectionProvider,
5857
retryLogic,
@@ -62,7 +61,7 @@ public NetworkSession newInstance(SessionConfig sessionConfig, BookmarkManager b
6261
parseFetchSize(sessionConfig),
6362
sessionConfig.impersonatedUser().orElse(null),
6463
logging,
65-
bookmarkManager);
64+
sessionConfig.bookmarkManager().orElse(new NoOpBookmarkManager()));
6665
}
6766

6867
private Set<Bookmark> toDistinctSet(Iterable<Bookmark> bookmarks) {

driver/src/test/java/org/neo4j/driver/internal/DriverFactoryTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,7 @@ void usesStandardSessionFactoryWhenNothingConfigured(String uri) {
110110
createDriver(uri, factory, config);
111111

112112
SessionFactory capturedFactory = factory.capturedSessionFactory;
113-
assertThat(
114-
capturedFactory.newInstance(SessionConfig.defaultConfig(), new NoOpBookmarkManager()),
115-
instanceOf(NetworkSession.class));
113+
assertThat(capturedFactory.newInstance(SessionConfig.defaultConfig()), instanceOf(NetworkSession.class));
116114
}
117115

118116
@ParameterizedTest
@@ -125,7 +123,7 @@ void usesLeakLoggingSessionFactoryWhenConfigured(String uri) {
125123

126124
SessionFactory capturedFactory = factory.capturedSessionFactory;
127125
assertThat(
128-
capturedFactory.newInstance(SessionConfig.defaultConfig(), new NoOpBookmarkManager()),
126+
capturedFactory.newInstance(SessionConfig.defaultConfig()),
129127
instanceOf(LeakLoggingNetworkSession.class));
130128
}
131129

driver/src/test/java/org/neo4j/driver/internal/InternalDriverTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ void shouldReturnMetricsIfMetricsEnabled() {
113113

114114
private static InternalDriver newDriver(SessionFactory sessionFactory) {
115115
return new InternalDriver(
116-
SecurityPlanImpl.insecure(), sessionFactory, DevNullMetricsProvider.INSTANCE, DEV_NULL_LOGGING, null);
116+
SecurityPlanImpl.insecure(), sessionFactory, DevNullMetricsProvider.INSTANCE, DEV_NULL_LOGGING);
117117
}
118118

119119
private static SessionFactory sessionFactoryMock() {
@@ -130,6 +130,6 @@ private static InternalDriver newDriver(boolean isMetricsEnabled) {
130130
}
131131

132132
MetricsProvider metricsProvider = DriverFactory.getOrCreateMetricsProvider(config, Clock.SYSTEM);
133-
return new InternalDriver(SecurityPlanImpl.insecure(), sessionFactory, metricsProvider, DEV_NULL_LOGGING, null);
133+
return new InternalDriver(SecurityPlanImpl.insecure(), sessionFactory, metricsProvider, DEV_NULL_LOGGING);
134134
}
135135
}

driver/src/test/java/org/neo4j/driver/internal/SessionFactoryImplTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
import org.junit.jupiter.api.Test;
2828
import org.neo4j.driver.AccessMode;
29-
import org.neo4j.driver.BookmarkManager;
3029
import org.neo4j.driver.Config;
3130
import org.neo4j.driver.internal.async.LeakLoggingNetworkSession;
3231
import org.neo4j.driver.internal.async.NetworkSession;
@@ -40,11 +39,11 @@ void createsNetworkSessions() {
4039
SessionFactory factory = newSessionFactory(config);
4140

4241
NetworkSession readSession = factory.newInstance(
43-
builder().withDefaultAccessMode(AccessMode.READ).build(), mock(BookmarkManager.class));
42+
builder().withDefaultAccessMode(AccessMode.READ).build());
4443
assertThat(readSession, instanceOf(NetworkSession.class));
4544

4645
NetworkSession writeSession = factory.newInstance(
47-
builder().withDefaultAccessMode(AccessMode.WRITE).build(), mock(BookmarkManager.class));
46+
builder().withDefaultAccessMode(AccessMode.WRITE).build());
4847
assertThat(writeSession, instanceOf(NetworkSession.class));
4948
}
5049

@@ -57,11 +56,11 @@ void createsLeakLoggingNetworkSessions() {
5756
SessionFactory factory = newSessionFactory(config);
5857

5958
NetworkSession readSession = factory.newInstance(
60-
builder().withDefaultAccessMode(AccessMode.READ).build(), mock(BookmarkManager.class));
59+
builder().withDefaultAccessMode(AccessMode.READ).build());
6160
assertThat(readSession, instanceOf(LeakLoggingNetworkSession.class));
6261

6362
NetworkSession writeSession = factory.newInstance(
64-
builder().withDefaultAccessMode(AccessMode.WRITE).build(), mock(BookmarkManager.class));
63+
builder().withDefaultAccessMode(AccessMode.WRITE).build());
6564
assertThat(writeSession, instanceOf(LeakLoggingNetworkSession.class));
6665
}
6766

0 commit comments

Comments
 (0)