Skip to content

Commit 19cc8e0

Browse files
committed
Introduce new session instantiation methods
These new methods provide a consistent API for creating different types of session APIs. Sample usage: ``` var synchronousSession = driver.session(Session.class); var asynchronousSession = driver.session(AsyncSession.class); var reactiveSession1 = driver.session(org.neo4j.driver.reactive.ReactiveSession.class); var reactiveSession2 = driver.session(org.neo4j.driver.reactivestreams.ReactiveSession.class); var reactiveSession3 = driver.session(org.neo4j.driver.reactive.RxSession.class); ``` The following methods have been deprecated: - `asyncSession` - `reactiveSession`
1 parent 1fc6a41 commit 19cc8e0

29 files changed

+176
-117
lines changed

driver/clirr-ignored-differences.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,13 +400,13 @@
400400
<difference>
401401
<className>org/neo4j/driver/Driver</className>
402402
<differenceType>7012</differenceType>
403-
<method>org.neo4j.driver.BaseReactiveSession reactiveSession(java.lang.Class)</method>
403+
<method>org.neo4j.driver.BaseSession session(java.lang.Class)</method>
404404
</difference>
405405

406406
<difference>
407407
<className>org/neo4j/driver/Driver</className>
408408
<differenceType>7012</differenceType>
409-
<method>org.neo4j.driver.BaseReactiveSession reactiveSession(java.lang.Class, org.neo4j.driver.SessionConfig)</method>
409+
<method>org.neo4j.driver.BaseSession session(java.lang.Class, org.neo4j.driver.SessionConfig)</method>
410410
</difference>
411411

412412
</differences>

driver/src/main/java/org/neo4j/driver/BaseReactiveSession.java renamed to driver/src/main/java/org/neo4j/driver/BaseSession.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919
package org.neo4j.driver;
2020

2121
/**
22-
* A base interface for reactive sessions, used by {@link Driver#reactiveSession(Class)} and {@link Driver#reactiveSession(Class, SessionConfig)}.
22+
* A base interface for sessions, used by {@link Driver#session(Class)} and {@link Driver#session(Class, SessionConfig)}.
2323
*/
24-
public interface BaseReactiveSession {}
24+
public interface BaseSession {}

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

Lines changed: 86 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,80 @@ public interface Driver extends AutoCloseable {
7878
* @return a new {@link Session} object.
7979
*/
8080
default Session session() {
81-
return session(SessionConfig.defaultConfig());
81+
return session(Session.class);
8282
}
8383

8484
/**
85-
* Create a new {@link Session} with a specified {@link SessionConfig session configuration}.
85+
* Instantiate a new {@link Session} with a specified {@link SessionConfig session configuration}.
8686
* Use {@link SessionConfig#forDatabase(String)} to obtain a general purpose session configuration for the specified database.
8787
* @param sessionConfig specifies session configurations for this session.
8888
* @return a new {@link Session} object.
8989
* @see SessionConfig
9090
*/
91-
Session session(SessionConfig sessionConfig);
91+
default Session session(SessionConfig sessionConfig) {
92+
return session(Session.class, sessionConfig);
93+
}
94+
95+
/**
96+
* Instantiate a new session of supported type with default {@link SessionConfig session configuration}.
97+
* <p>
98+
* Supported types are:
99+
* <ul>
100+
* <li>{@link org.neo4j.driver.Session} - synchronous session</li>
101+
* <li>{@link org.neo4j.driver.async.AsyncSession} - asynchronous session</li>
102+
* <li>{@link org.neo4j.driver.reactive.ReactiveSession} - reactive session using Flow API</li>
103+
* <li>{@link org.neo4j.driver.reactivestreams.ReactiveSession} - reactive session using Reactive Streams
104+
* API</li>
105+
* <li>{@link org.neo4j.driver.reactive.RxSession} - deprecated reactive session using Reactive Streams
106+
* API, superseded by {@link org.neo4j.driver.reactivestreams.ReactiveSession}</li>
107+
* </ul>
108+
* <p>
109+
* Sample usage:
110+
* <pre>
111+
* {@code
112+
* var session = driver.session(AsyncSession.class);
113+
* }
114+
* </pre>
115+
*
116+
* @param sessionClass session type class, must not be null
117+
* @return session instance
118+
* @param <T> session type
119+
* @throws IllegalArgumentException for unsupported session types
120+
* @since 5.2
121+
*/
122+
default <T extends BaseSession> T session(Class<T> sessionClass) {
123+
return session(sessionClass, SessionConfig.defaultConfig());
124+
}
125+
126+
/**
127+
* Create a new session of supported type with a specified {@link SessionConfig session configuration}.
128+
* <p>
129+
* Supported types are:
130+
* <ul>
131+
* <li>{@link org.neo4j.driver.Session} - synchronous session</li>
132+
* <li>{@link org.neo4j.driver.async.AsyncSession} - asynchronous session</li>
133+
* <li>{@link org.neo4j.driver.reactive.ReactiveSession} - reactive session using Flow API</li>
134+
* <li>{@link org.neo4j.driver.reactivestreams.ReactiveSession} - reactive session using Reactive Streams
135+
* API</li>
136+
* <li>{@link org.neo4j.driver.reactive.RxSession} - deprecated reactive session using Reactive Streams
137+
* API, superseded by {@link org.neo4j.driver.reactivestreams.ReactiveSession}</li>
138+
* </ul>
139+
* <p>
140+
* Sample usage:
141+
* <pre>
142+
* {@code
143+
* var session = driver.session(AsyncSession.class);
144+
* }
145+
* </pre>
146+
*
147+
* @param sessionClass session type class, must not be null
148+
* @param sessionConfig session config, must not be null
149+
* @return session instance
150+
* @param <T> session type
151+
* @throws IllegalArgumentException for unsupported session types
152+
* @since 5.2
153+
*/
154+
<T extends BaseSession> T session(Class<T> sessionClass, SessionConfig sessionConfig);
92155

93156
/**
94157
* Create a new general purpose {@link RxSession} with default {@link SessionConfig session configuration}. The {@link RxSession} provides a reactive way to
@@ -97,11 +160,11 @@ default Session session() {
97160
* Alias to {@link #rxSession(SessionConfig)}}.
98161
*
99162
* @return a new {@link RxSession} object.
100-
* @deprecated superseded by {@link #reactiveSession()}.
163+
* @deprecated superseded by {@link #session(Class)}
101164
*/
102165
@Deprecated
103166
default RxSession rxSession() {
104-
return rxSession(SessionConfig.defaultConfig());
167+
return session(RxSession.class);
105168
}
106169

107170
/**
@@ -110,10 +173,12 @@ default RxSession rxSession() {
110173
*
111174
* @param sessionConfig used to customize the session.
112175
* @return a new {@link RxSession} object.
113-
* @deprecated superseded by {@link #reactiveSession(SessionConfig)}.
176+
* @deprecated superseded by {@link #session(Class, SessionConfig)}
114177
*/
115178
@Deprecated
116-
RxSession rxSession(SessionConfig sessionConfig);
179+
default RxSession rxSession(SessionConfig sessionConfig) {
180+
return session(RxSession.class, sessionConfig);
181+
}
117182

118183
/**
119184
* Create a new general purpose {@link ReactiveSession} with default {@link SessionConfig session configuration}. The {@link ReactiveSession} provides a
@@ -122,9 +187,11 @@ default RxSession rxSession() {
122187
* Alias to {@link #rxSession(SessionConfig)}}.
123188
*
124189
* @return a new {@link ReactiveSession} object.
190+
* @deprecated superseded by {@link #session(Class)}
125191
*/
192+
@Deprecated
126193
default ReactiveSession reactiveSession() {
127-
return reactiveSession(SessionConfig.defaultConfig());
194+
return session(ReactiveSession.class);
128195
}
129196

130197
/**
@@ -134,53 +201,25 @@ default ReactiveSession reactiveSession() {
134201
*
135202
* @param sessionConfig used to customize the session.
136203
* @return a new {@link ReactiveSession} object.
204+
* @deprecated superseded by {@link #session(Class, SessionConfig)}
137205
*/
206+
@Deprecated
138207
default ReactiveSession reactiveSession(SessionConfig sessionConfig) {
139-
return reactiveSession(ReactiveSession.class, sessionConfig);
140-
}
141-
142-
/**
143-
* Create a new reactive session of supported type with default {@link SessionConfig session configuration}.
144-
* <p>
145-
* Supported types are:
146-
* <ul>
147-
* <li>{@link org.neo4j.driver.reactive.ReactiveSession} - reactive session using Flow API</li>
148-
* <li>{@link org.neo4j.driver.reactivestreams.ReactiveSession} - reactive session using Reactive Streams API</li>
149-
* </ul>
150-
*
151-
* @param sessionClass session type class
152-
* @return session instance
153-
* @param <T> session type
154-
*/
155-
default <T extends BaseReactiveSession> T reactiveSession(Class<T> sessionClass) {
156-
return reactiveSession(sessionClass, SessionConfig.defaultConfig());
208+
return session(ReactiveSession.class, sessionConfig);
157209
}
158210

159-
/**
160-
* Create a new reactive session of supported type with a specified {@link SessionConfig session configuration}.
161-
* <p>
162-
* Supported types are:
163-
* <ul>
164-
* <li>{@link org.neo4j.driver.reactive.ReactiveSession} - reactive session using Flow API</li>
165-
* <li>{@link org.neo4j.driver.reactivestreams.ReactiveSession} - reactive session using Reactive Streams API</li>
166-
* </ul>
167-
*
168-
* @param sessionClass session type class
169-
* @return session instance
170-
* @param <T> session type
171-
*/
172-
<T extends BaseReactiveSession> T reactiveSession(Class<T> sessionClass, SessionConfig sessionConfig);
173-
174211
/**
175212
* Create a new general purpose {@link AsyncSession} with default {@link SessionConfig session configuration}. The {@link AsyncSession} provides an
176213
* asynchronous way to run queries and process results.
177214
* <p>
178215
* Alias to {@link #asyncSession(SessionConfig)}}.
179216
*
180217
* @return a new {@link AsyncSession} object.
218+
* @deprecated superseded by {@link #session(Class)}
181219
*/
220+
@Deprecated
182221
default AsyncSession asyncSession() {
183-
return asyncSession(SessionConfig.defaultConfig());
222+
return session(AsyncSession.class);
184223
}
185224

186225
/**
@@ -190,8 +229,12 @@ default AsyncSession asyncSession() {
190229
*
191230
* @param sessionConfig used to customize the session.
192231
* @return a new {@link AsyncSession} object.
232+
* @deprecated superseded by {@link #session(Class, SessionConfig)}
193233
*/
194-
AsyncSession asyncSession(SessionConfig sessionConfig);
234+
@Deprecated
235+
default AsyncSession asyncSession(SessionConfig sessionConfig) {
236+
return session(AsyncSession.class, sessionConfig);
237+
}
195238

196239
/**
197240
* Close all the resources assigned to this driver, including open connections and IO threads.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
*
5454
* @since 1.0 (Removed async API to {@link AsyncSession} in 4.0)
5555
*/
56-
public interface Session extends Resource, QueryRunner {
56+
public interface Session extends BaseSession, Resource, QueryRunner {
5757
/**
5858
* Begin a new <em>unmanaged {@linkplain Transaction transaction}</em>. At
5959
* most one transaction may exist in a session at any point in time. To

driver/src/main/java/org/neo4j/driver/async/AsyncSession.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.concurrent.Executor;
2626
import java.util.function.Function;
2727
import org.neo4j.driver.AccessMode;
28+
import org.neo4j.driver.BaseSession;
2829
import org.neo4j.driver.Bookmark;
2930
import org.neo4j.driver.Query;
3031
import org.neo4j.driver.Result;
@@ -70,7 +71,7 @@
7071
*
7172
* @since 4.0
7273
*/
73-
public interface AsyncSession extends AsyncQueryRunner {
74+
public interface AsyncSession extends BaseSession, AsyncQueryRunner {
7475
/**
7576
* Begin a new <em>unmanaged {@linkplain Transaction transaction}</em>. At
7677
* most one transaction may exist in a session at any point in time. To

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

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
import java.util.concurrent.CompletionStage;
2525
import java.util.concurrent.atomic.AtomicBoolean;
26-
import org.neo4j.driver.BaseReactiveSession;
26+
import org.neo4j.driver.BaseSession;
2727
import org.neo4j.driver.Driver;
2828
import org.neo4j.driver.Logger;
2929
import org.neo4j.driver.Logging;
@@ -61,35 +61,28 @@ public class InternalDriver implements Driver {
6161
this.log = logging.getLog(getClass());
6262
}
6363

64+
@SuppressWarnings({"unchecked", "deprecation"})
6465
@Override
65-
public Session session(SessionConfig sessionConfig) {
66-
return new InternalSession(newSession(sessionConfig));
67-
}
68-
69-
@Override
70-
@Deprecated
71-
public RxSession rxSession(SessionConfig sessionConfig) {
72-
return new InternalRxSession(newSession(sessionConfig));
73-
}
74-
75-
@SuppressWarnings({"deprecation", "unchecked"})
76-
@Override
77-
public <T extends BaseReactiveSession> T reactiveSession(Class<T> sessionClass, SessionConfig sessionConfig) {
66+
public <T extends BaseSession> T session(Class<T> sessionClass, SessionConfig sessionConfig) {
7867
requireNonNull(sessionClass, "sessionClass must not be null");
7968
requireNonNull(sessionClass, "sessionConfig must not be null");
80-
if (org.neo4j.driver.reactive.ReactiveSession.class.isAssignableFrom(sessionClass)) {
81-
return (T) new org.neo4j.driver.internal.reactive.InternalReactiveSession(newSession(sessionConfig));
69+
T session;
70+
if (Session.class.isAssignableFrom(sessionClass)) {
71+
session = (T) new InternalSession(newSession(sessionConfig));
72+
} else if (AsyncSession.class.isAssignableFrom(sessionClass)) {
73+
session = (T) new InternalAsyncSession(newSession(sessionConfig));
74+
} else if (org.neo4j.driver.reactive.ReactiveSession.class.isAssignableFrom(sessionClass)) {
75+
session = (T) new org.neo4j.driver.internal.reactive.InternalReactiveSession(newSession(sessionConfig));
8276
} else if (org.neo4j.driver.reactivestreams.ReactiveSession.class.isAssignableFrom(sessionClass)) {
83-
return (T) new org.neo4j.driver.internal.reactivestreams.InternalReactiveSession(newSession(sessionConfig));
77+
session = (T)
78+
new org.neo4j.driver.internal.reactivestreams.InternalReactiveSession(newSession(sessionConfig));
79+
} else if (RxSession.class.isAssignableFrom(sessionClass)) {
80+
session = (T) new InternalRxSession(newSession(sessionConfig));
8481
} else {
8582
throw new IllegalArgumentException(
8683
String.format("Unsupported session type '%s'", sessionClass.getCanonicalName()));
8784
}
88-
}
89-
90-
@Override
91-
public AsyncSession asyncSession(SessionConfig sessionConfig) {
92-
return new InternalAsyncSession(newSession(sessionConfig));
85+
return session;
9386
}
9487

9588
@Override

driver/src/main/java/org/neo4j/driver/reactive/ReactiveSession.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import java.util.concurrent.CompletionStage;
2424
import java.util.concurrent.Flow.Publisher;
2525
import org.neo4j.driver.AccessMode;
26-
import org.neo4j.driver.BaseReactiveSession;
26+
import org.neo4j.driver.BaseSession;
2727
import org.neo4j.driver.Bookmark;
2828
import org.neo4j.driver.Query;
2929
import org.neo4j.driver.Result;
@@ -40,7 +40,7 @@
4040
* @see Publisher
4141
* @since 5.0
4242
*/
43-
public interface ReactiveSession extends BaseReactiveSession, ReactiveQueryRunner {
43+
public interface ReactiveSession extends BaseSession, ReactiveQueryRunner {
4444
/**
4545
* Begin a new <em>unmanaged {@linkplain ReactiveTransaction transaction}</em>. At most one transaction may exist in a session at any point in time. To
4646
* maintain multiple concurrent transactions, use multiple concurrent sessions.

driver/src/main/java/org/neo4j/driver/reactive/RxSession.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map;
2222
import java.util.concurrent.CompletableFuture;
2323
import org.neo4j.driver.AccessMode;
24+
import org.neo4j.driver.BaseSession;
2425
import org.neo4j.driver.Bookmark;
2526
import org.neo4j.driver.Query;
2627
import org.neo4j.driver.Session;
@@ -38,7 +39,7 @@
3839
* @deprecated superseded by {@link org.neo4j.driver.reactive.ReactiveSession} and {@link org.neo4j.driver.reactivestreams.ReactiveSession}
3940
*/
4041
@Deprecated
41-
public interface RxSession extends RxQueryRunner {
42+
public interface RxSession extends BaseSession, RxQueryRunner {
4243
/**
4344
* Begin a new <em>unmanaged {@linkplain RxTransaction transaction}</em>. At most one transaction may exist in a session at any point in time. To maintain
4445
* multiple concurrent transactions, use multiple concurrent sessions.

driver/src/main/java/org/neo4j/driver/reactivestreams/ReactiveSession.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import java.util.Set;
2323
import java.util.concurrent.CompletionStage;
2424
import org.neo4j.driver.AccessMode;
25-
import org.neo4j.driver.BaseReactiveSession;
25+
import org.neo4j.driver.BaseSession;
2626
import org.neo4j.driver.Bookmark;
2727
import org.neo4j.driver.Query;
2828
import org.neo4j.driver.Result;
@@ -40,7 +40,7 @@
4040
* @see Publisher
4141
* @since 5.2
4242
*/
43-
public interface ReactiveSession extends BaseReactiveSession, ReactiveQueryRunner {
43+
public interface ReactiveSession extends BaseSession, ReactiveQueryRunner {
4444
/**
4545
* Begin a new <em>unmanaged {@linkplain ReactiveTransaction transaction}</em>. At most one transaction may exist in a session at any point in time. To
4646
* maintain multiple concurrent transactions, use multiple concurrent sessions.

driver/src/test/java/org/neo4j/driver/integration/QueryRunnerCloseIT.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void shouldAllowSummaryAndKeysAfterClose() {
133133
@Test
134134
void shouldErrorToAccessRecordsAfterConsumeAsync() {
135135
// Given
136-
AsyncSession session = neo4j.driver().asyncSession();
136+
AsyncSession session = neo4j.driver().session(AsyncSession.class);
137137
ResultCursor result = await(session.runAsync("UNWIND [1,2] AS a RETURN a"));
138138

139139
// When
@@ -151,7 +151,7 @@ void shouldErrorToAccessRecordsAfterConsumeAsync() {
151151
@Test
152152
void shouldErrorToAccessRecordsAfterCloseAsync() {
153153
// Given
154-
AsyncSession session = neo4j.driver().asyncSession();
154+
AsyncSession session = neo4j.driver().session(AsyncSession.class);
155155
ResultCursor result = await(session.runAsync("UNWIND [1,2] AS a RETURN a"));
156156

157157
// When
@@ -169,7 +169,7 @@ void shouldErrorToAccessRecordsAfterCloseAsync() {
169169
@Test
170170
void shouldAllowConsumeAndKeysAfterConsumeAsync() {
171171
// Given
172-
AsyncSession session = neo4j.driver().asyncSession();
172+
AsyncSession session = neo4j.driver().session(AsyncSession.class);
173173
ResultCursor result = await(session.runAsync("UNWIND [1,2] AS a RETURN a"));
174174

175175
List<String> keys = result.keys();
@@ -188,7 +188,7 @@ void shouldAllowConsumeAndKeysAfterConsumeAsync() {
188188
@Test
189189
void shouldAllowConsumeAndKeysAfterCloseAsync() {
190190
// Given
191-
AsyncSession session = neo4j.driver().asyncSession();
191+
AsyncSession session = neo4j.driver().session(AsyncSession.class);
192192
ResultCursor result = await(session.runAsync("UNWIND [1,2] AS a RETURN a"));
193193
List<String> keys = result.keys();
194194
ResultSummary summary = await(result.consumeAsync());

0 commit comments

Comments
 (0)