diff --git a/driver/src/main/java/org/neo4j/driver/Bookmark.java b/driver/src/main/java/org/neo4j/driver/Bookmark.java index 6c5fbb7d64..134c759eb7 100644 --- a/driver/src/main/java/org/neo4j/driver/Bookmark.java +++ b/driver/src/main/java/org/neo4j/driver/Bookmark.java @@ -18,7 +18,9 @@ */ package org.neo4j.driver; -import java.io.Serializable; +import java.util.Set; + +import org.neo4j.driver.internal.InternalBookmark; /** * Causal chaining is carried out by passing bookmarks between transactions. @@ -31,6 +33,27 @@ * * To opt out of this mechanism for unrelated units of work, applications can use multiple sessions. */ -public interface Bookmark extends Serializable +public interface Bookmark { + /** + * Returns a read-only set of bookmark strings that this bookmark instance identifies. + * @return a read-only set of bookmark strings that this bookmark instance identifies. + */ + Set values(); + + /** + * Reconstruct bookmark from \bookmarks string values. + * @param values values obtained from a previous bookmark. + * @return A bookmark. + */ + static Bookmark from( Set values ) + { + return InternalBookmark.parse( values ); + } + + /** + * Return true if the bookmark is empty. + * @return true if the bookmark is empty. + */ + boolean isEmpty(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/BookmarkHolder.java b/driver/src/main/java/org/neo4j/driver/internal/BookmarkHolder.java index bc8f827118..a96a1a610f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/BookmarkHolder.java +++ b/driver/src/main/java/org/neo4j/driver/internal/BookmarkHolder.java @@ -18,22 +18,24 @@ */ package org.neo4j.driver.internal; +import org.neo4j.driver.Bookmark; + public interface BookmarkHolder { - InternalBookmark getBookmark(); + Bookmark getBookmark(); - void setBookmark( InternalBookmark bookmark ); + void setBookmark( Bookmark bookmark ); BookmarkHolder NO_OP = new BookmarkHolder() { @Override - public InternalBookmark getBookmark() + public Bookmark getBookmark() { return InternalBookmark.empty(); } @Override - public void setBookmark( InternalBookmark bookmark ) + public void setBookmark( Bookmark bookmark ) { } }; diff --git a/driver/src/main/java/org/neo4j/driver/internal/DefaultBookmarkHolder.java b/driver/src/main/java/org/neo4j/driver/internal/DefaultBookmarkHolder.java index 2563729e1c..97bb3991ec 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/DefaultBookmarkHolder.java +++ b/driver/src/main/java/org/neo4j/driver/internal/DefaultBookmarkHolder.java @@ -18,31 +18,33 @@ */ package org.neo4j.driver.internal; +import org.neo4j.driver.Bookmark; + /** * @since 2.0 */ public class DefaultBookmarkHolder implements BookmarkHolder { - private volatile InternalBookmark bookmark; + private volatile Bookmark bookmark; public DefaultBookmarkHolder() { this( InternalBookmark.empty() ); } - public DefaultBookmarkHolder( InternalBookmark bookmark ) + public DefaultBookmarkHolder( Bookmark bookmark ) { this.bookmark = bookmark; } @Override - public InternalBookmark getBookmark() + public Bookmark getBookmark() { return bookmark; } @Override - public void setBookmark( InternalBookmark bookmark ) + public void setBookmark( Bookmark bookmark ) { if ( bookmark != null && !bookmark.isEmpty() ) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalBookmark.java b/driver/src/main/java/org/neo4j/driver/internal/InternalBookmark.java index c44530da92..2d3abfb448 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalBookmark.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalBookmark.java @@ -18,14 +18,13 @@ */ package org.neo4j.driver.internal; -import java.io.Serializable; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Objects; import java.util.Set; import org.neo4j.driver.Bookmark; +import org.neo4j.driver.internal.util.Iterables; import static java.util.Objects.requireNonNull; @@ -33,43 +32,34 @@ public final class InternalBookmark implements Bookmark { private static final InternalBookmark EMPTY = new InternalBookmark( Collections.emptySet() ); - private final Collection values; + private final Set values; - private InternalBookmark( Collection values ) + private InternalBookmark( Set values ) { requireNonNull( values ); - if ( !(values instanceof Serializable) ) - { - // The Collection interface does not enforce Serializable, but all built-in Collection implementations actually are Serializable. - // This check ensures that we always provide values using these java built-in Collection objects. - throw new IllegalArgumentException( "The bookmark value should only be of Java built-in types such as ArrayList, HashSet which are serializable." ); - } this.values = values; } - public static InternalBookmark empty() + public static Bookmark empty() { return EMPTY; } - public static InternalBookmark from( Iterable bookmarks ) + public static Bookmark from( Iterable bookmarks ) { if ( bookmarks == null ) { return empty(); } - if ( bookmarks instanceof Collection ) + int size = Iterables.count( bookmarks ); + if ( size == 0 ) { - int size = ((Collection) bookmarks).size(); - if ( size == 0 ) - { - return empty(); - } - else if ( size == 1 ) - { - return from( bookmarks.iterator().next() ); - } + return empty(); + } + else if ( size == 1 ) + { + return from( bookmarks.iterator().next() ); } Set newValues = new HashSet<>(); @@ -79,43 +69,37 @@ else if ( size == 1 ) { continue; // skip any null bookmark value } - assertInternalBookmark( value ); - newValues.addAll( ((InternalBookmark) value).values ); + newValues.addAll( value.values() ); } return new InternalBookmark( newValues ); } - private static InternalBookmark from( Bookmark bookmark ) + private static Bookmark from( Bookmark bookmark ) { if ( bookmark == null ) { return empty(); } - assertInternalBookmark( bookmark ); - return (InternalBookmark) bookmark; // we directly return the same bookmark back + // it is safe to return the given bookmark as bookmarks values can not be modified once it is created. + return bookmark; } - private static void assertInternalBookmark( Bookmark bookmark ) - { - if ( !(bookmark instanceof InternalBookmark) ) - { - throw new IllegalArgumentException( String.format( "Received bookmark '%s' is not generated by a driver session.", bookmark ) ); - } - } - - public static InternalBookmark parse( String value ) + /** + * Used to extract bookmark from metadata from server. + */ + public static Bookmark parse( String value ) { if ( value == null ) { return empty(); } - return parse( Collections.singletonList( value ) ); + return new InternalBookmark( Collections.singleton( value ) ); } /** - * Used for test only + * Used to reconstruct bookmark from values. */ - public static InternalBookmark parse( Collection values ) + public static Bookmark parse( Set values ) { if ( values == null ) { @@ -124,14 +108,16 @@ public static InternalBookmark parse( Collection values ) return new InternalBookmark( values ); } + @Override public boolean isEmpty() { return values.isEmpty(); } - public Iterable values() + @Override + public Set values() { - return values; + return Collections.unmodifiableSet( values ); } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/ReadOnlyBookmarkHolder.java b/driver/src/main/java/org/neo4j/driver/internal/ReadOnlyBookmarkHolder.java index 10be0ad662..97bc535cb3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/ReadOnlyBookmarkHolder.java +++ b/driver/src/main/java/org/neo4j/driver/internal/ReadOnlyBookmarkHolder.java @@ -18,26 +18,28 @@ */ package org.neo4j.driver.internal; +import org.neo4j.driver.Bookmark; + /** * @since 2.0 */ public class ReadOnlyBookmarkHolder implements BookmarkHolder { - private final InternalBookmark bookmark; + private final Bookmark bookmark; - public ReadOnlyBookmarkHolder( InternalBookmark bookmark ) + public ReadOnlyBookmarkHolder( Bookmark bookmark ) { this.bookmark = bookmark; } @Override - public InternalBookmark getBookmark() + public Bookmark getBookmark() { return bookmark; } @Override - public void setBookmark( InternalBookmark bookmark ) + public void setBookmark( Bookmark bookmark ) { // NO_OP } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/ConnectionContext.java b/driver/src/main/java/org/neo4j/driver/internal/async/ConnectionContext.java index 7ff750699b..f38fb85203 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/ConnectionContext.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/ConnectionContext.java @@ -19,8 +19,8 @@ package org.neo4j.driver.internal.async; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; public interface ConnectionContext { @@ -28,5 +28,5 @@ public interface ConnectionContext AccessMode mode(); - InternalBookmark rediscoveryBookmark(); + Bookmark rediscoveryBookmark(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/ExplicitTransaction.java b/driver/src/main/java/org/neo4j/driver/internal/async/ExplicitTransaction.java index a5c9e3d6e6..db75352bcf 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/ExplicitTransaction.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/ExplicitTransaction.java @@ -22,13 +22,13 @@ import java.util.concurrent.CompletionStage; import java.util.function.BiFunction; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Session; import org.neo4j.driver.Statement; import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.async.StatementResultCursor; import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.internal.BookmarkHolder; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.cursor.AsyncStatementResultCursor; import org.neo4j.driver.internal.cursor.RxStatementResultCursor; import org.neo4j.driver.internal.messaging.BoltProtocol; @@ -75,7 +75,7 @@ public ExplicitTransaction( Connection connection, BookmarkHolder bookmarkHolder this.fetchSize = fetchSize; } - public CompletionStage beginAsync( InternalBookmark initialBookmark, TransactionConfig config ) + public CompletionStage beginAsync( Bookmark initialBookmark, TransactionConfig config ) { return protocol.beginTransaction( connection, initialBookmark, config ) .handle( ( ignore, beginError ) -> diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/ImmutableConnectionContext.java b/driver/src/main/java/org/neo4j/driver/internal/async/ImmutableConnectionContext.java index 021b6748de..e031fdb3bd 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/ImmutableConnectionContext.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/ImmutableConnectionContext.java @@ -19,8 +19,8 @@ package org.neo4j.driver.internal.async; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.spi.Connection; import static org.neo4j.driver.internal.DatabaseNameUtil.defaultDatabase; @@ -35,9 +35,9 @@ public class ImmutableConnectionContext implements ConnectionContext private final DatabaseName databaseName; private final AccessMode mode; - private final InternalBookmark rediscoveryBookmark; + private final Bookmark rediscoveryBookmark; - public ImmutableConnectionContext( DatabaseName databaseName, InternalBookmark bookmark, AccessMode mode ) + public ImmutableConnectionContext( DatabaseName databaseName, Bookmark bookmark, AccessMode mode ) { this.databaseName = databaseName; this.rediscoveryBookmark = bookmark; @@ -57,7 +57,7 @@ public AccessMode mode() } @Override - public InternalBookmark rediscoveryBookmark() + public Bookmark rediscoveryBookmark() { return rediscoveryBookmark; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/NetworkSession.java b/driver/src/main/java/org/neo4j/driver/internal/async/NetworkSession.java index 02f9eb4190..fb3b48658f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/NetworkSession.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/NetworkSession.java @@ -30,15 +30,14 @@ import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.async.StatementResultCursor; import org.neo4j.driver.exceptions.ClientException; +import org.neo4j.driver.exceptions.TransactionNestingException; import org.neo4j.driver.internal.BookmarkHolder; import org.neo4j.driver.internal.DatabaseName; import org.neo4j.driver.internal.FailableCursor; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.cursor.AsyncStatementResultCursor; import org.neo4j.driver.internal.cursor.RxStatementResultCursor; import org.neo4j.driver.internal.cursor.StatementResultCursorFactory; import org.neo4j.driver.internal.logging.PrefixedLogger; -import org.neo4j.driver.exceptions.TransactionNestingException; import org.neo4j.driver.internal.retry.RetryLogic; import org.neo4j.driver.internal.spi.Connection; import org.neo4j.driver.internal.spi.ConnectionProvider; @@ -356,9 +355,9 @@ private static class NetworkSessionConnectionContext implements ConnectionContex // This bookmark is only used for rediscovery. // It has to be the initial bookmark given at the creation of the session. // As only that bookmark could carry extra system bookmarks - private final InternalBookmark rediscoveryBookmark; + private final Bookmark rediscoveryBookmark; - private NetworkSessionConnectionContext( DatabaseName databaseName, InternalBookmark bookmark ) + private NetworkSessionConnectionContext( DatabaseName databaseName, Bookmark bookmark ) { this.databaseName = databaseName; this.rediscoveryBookmark = bookmark; @@ -383,7 +382,7 @@ public AccessMode mode() } @Override - public InternalBookmark rediscoveryBookmark() + public Bookmark rediscoveryBookmark() { return rediscoveryBookmark; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/ClusterCompositionProvider.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/ClusterCompositionProvider.java index d067dc4a31..b49757b977 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/ClusterCompositionProvider.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/ClusterCompositionProvider.java @@ -20,11 +20,11 @@ import java.util.concurrent.CompletionStage; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.spi.Connection; public interface ClusterCompositionProvider { - CompletionStage getClusterComposition( Connection connection, DatabaseName databaseName, InternalBookmark bookmark ); + CompletionStage getClusterComposition( Connection connection, DatabaseName databaseName, Bookmark bookmark ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/MultiDatabasesRoutingProcedureRunner.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/MultiDatabasesRoutingProcedureRunner.java index c65f243351..bf5644915c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/MultiDatabasesRoutingProcedureRunner.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/MultiDatabasesRoutingProcedureRunner.java @@ -21,11 +21,11 @@ import java.util.HashMap; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Statement; import org.neo4j.driver.Value; import org.neo4j.driver.internal.BookmarkHolder; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.ReadOnlyBookmarkHolder; import org.neo4j.driver.internal.async.connection.DirectConnection; import org.neo4j.driver.internal.spi.Connection; @@ -45,7 +45,7 @@ public MultiDatabasesRoutingProcedureRunner( RoutingContext context ) } @Override - BookmarkHolder bookmarkHolder( InternalBookmark bookmark ) + BookmarkHolder bookmarkHolder( Bookmark bookmark ) { return new ReadOnlyBookmarkHolder( bookmark ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/Rediscovery.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/Rediscovery.java index e558edd867..c3c39ff5b0 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/Rediscovery.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/Rediscovery.java @@ -20,10 +20,10 @@ import java.util.concurrent.CompletionStage; -import org.neo4j.driver.internal.InternalBookmark; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.internal.spi.ConnectionPool; public interface Rediscovery { - CompletionStage lookupClusterComposition( RoutingTable routingTable, ConnectionPool connectionPool, InternalBookmark bookmark ); + CompletionStage lookupClusterComposition( RoutingTable routingTable, ConnectionPool connectionPool, Bookmark bookmark ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java index 1d0cde02c7..0c294de926 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java @@ -30,12 +30,12 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Stream; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Logger; import org.neo4j.driver.exceptions.FatalDiscoveryException; import org.neo4j.driver.exceptions.SecurityException; import org.neo4j.driver.exceptions.ServiceUnavailableException; import org.neo4j.driver.internal.BoltServerAddress; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.spi.Connection; import org.neo4j.driver.internal.spi.ConnectionPool; import org.neo4j.driver.internal.util.Futures; @@ -83,7 +83,7 @@ public RediscoveryImpl( BoltServerAddress initialRouter, RoutingSettings setting * @return new cluster composition. */ @Override - public CompletionStage lookupClusterComposition( RoutingTable routingTable, ConnectionPool connectionPool, InternalBookmark bookmark ) + public CompletionStage lookupClusterComposition( RoutingTable routingTable, ConnectionPool connectionPool, Bookmark bookmark ) { CompletableFuture result = new CompletableFuture<>(); lookupClusterComposition( routingTable, connectionPool, 0, 0, result, bookmark ); @@ -91,7 +91,7 @@ public CompletionStage lookupClusterComposition( RoutingTabl } private void lookupClusterComposition( RoutingTable routingTable, ConnectionPool pool, - int failures, long previousDelay, CompletableFuture result, InternalBookmark bookmark ) + int failures, long previousDelay, CompletableFuture result, Bookmark bookmark ) { lookup( routingTable, pool, bookmark ).whenComplete( ( composition, completionError ) -> { @@ -124,7 +124,7 @@ else if ( composition != null ) } ); } - private CompletionStage lookup( RoutingTable routingTable, ConnectionPool connectionPool, InternalBookmark bookmark ) + private CompletionStage lookup( RoutingTable routingTable, ConnectionPool connectionPool, Bookmark bookmark ) { CompletionStage compositionStage; @@ -141,7 +141,7 @@ private CompletionStage lookup( RoutingTable routingTable, C } private CompletionStage lookupOnKnownRoutersThenOnInitialRouter( RoutingTable routingTable, - ConnectionPool connectionPool, InternalBookmark bookmark ) + ConnectionPool connectionPool, Bookmark bookmark ) { Set seenServers = new HashSet<>(); return lookupOnKnownRouters( routingTable, connectionPool, seenServers, bookmark ).thenCompose( composition -> @@ -155,7 +155,7 @@ private CompletionStage lookupOnKnownRoutersThenOnInitialRou } private CompletionStage lookupOnInitialRouterThenOnKnownRouters( RoutingTable routingTable, - ConnectionPool connectionPool, InternalBookmark bookmark ) + ConnectionPool connectionPool, Bookmark bookmark ) { Set seenServers = emptySet(); return lookupOnInitialRouter( routingTable, connectionPool, seenServers, bookmark ).thenCompose( composition -> @@ -169,7 +169,7 @@ private CompletionStage lookupOnInitialRouterThenOnKnownRout } private CompletionStage lookupOnKnownRouters( RoutingTable routingTable, - ConnectionPool connectionPool, Set seenServers, InternalBookmark bookmark ) + ConnectionPool connectionPool, Set seenServers, Bookmark bookmark ) { BoltServerAddress[] addresses = routingTable.routers().toArray(); @@ -193,7 +193,7 @@ private CompletionStage lookupOnKnownRouters( RoutingTable r } private CompletionStage lookupOnInitialRouter( RoutingTable routingTable, - ConnectionPool connectionPool, Set seenServers, InternalBookmark bookmark ) + ConnectionPool connectionPool, Set seenServers, Bookmark bookmark ) { List addresses; try @@ -222,7 +222,7 @@ private CompletionStage lookupOnInitialRouter( RoutingTable } private CompletionStage lookupOnRouter( BoltServerAddress routerAddress, - RoutingTable routingTable, ConnectionPool connectionPool, InternalBookmark bookmark ) + RoutingTable routingTable, ConnectionPool connectionPool, Bookmark bookmark ) { CompletionStage connectionStage = connectionPool.acquire( routerAddress ); diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingProcedureClusterCompositionProvider.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingProcedureClusterCompositionProvider.java index 60d7805787..e34a5d50de 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingProcedureClusterCompositionProvider.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingProcedureClusterCompositionProvider.java @@ -22,12 +22,12 @@ import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Record; import org.neo4j.driver.Statement; import org.neo4j.driver.exceptions.ProtocolException; import org.neo4j.driver.exceptions.value.ValueException; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.spi.Connection; import org.neo4j.driver.internal.util.Clock; import org.neo4j.driver.internal.util.ServerVersion; @@ -56,7 +56,7 @@ public RoutingProcedureClusterCompositionProvider( Clock clock, RoutingContext r } @Override - public CompletionStage getClusterComposition( Connection connection, DatabaseName databaseName, InternalBookmark bookmark ) + public CompletionStage getClusterComposition( Connection connection, DatabaseName databaseName, Bookmark bookmark ) { RoutingProcedureRunner runner; if ( connection.serverVersion().greaterThanOrEqual( ServerVersion.v4_0_0 ) ) diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingProcedureRunner.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingProcedureRunner.java index 5746fabe3b..181fc5acff 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingProcedureRunner.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingProcedureRunner.java @@ -23,6 +23,7 @@ import java.util.concurrent.CompletionStage; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Record; import org.neo4j.driver.Statement; import org.neo4j.driver.TransactionConfig; @@ -31,7 +32,6 @@ import org.neo4j.driver.exceptions.FatalDiscoveryException; import org.neo4j.driver.internal.BookmarkHolder; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.async.connection.DirectConnection; import org.neo4j.driver.internal.spi.Connection; import org.neo4j.driver.internal.util.Futures; @@ -53,7 +53,7 @@ public RoutingProcedureRunner( RoutingContext context ) this.context = context; } - public CompletionStage run( Connection connection, DatabaseName databaseName, InternalBookmark bookmark ) + public CompletionStage run( Connection connection, DatabaseName databaseName, Bookmark bookmark ) { DirectConnection delegate = connection( connection ); Statement procedure = procedureStatement( connection.serverVersion(), databaseName ); @@ -79,7 +79,7 @@ Statement procedureStatement( ServerVersion serverVersion, DatabaseName database return new Statement( GET_ROUTING_TABLE, parameters( ROUTING_CONTEXT, context.asMap() ) ); } - BookmarkHolder bookmarkHolder( InternalBookmark ignored ) + BookmarkHolder bookmarkHolder( Bookmark ignored ) { return BookmarkHolder.NO_OP; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/handlers/CommitTxResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/handlers/CommitTxResponseHandler.java index 132790220a..fc77502497 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/handlers/CommitTxResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/handlers/CommitTxResponseHandler.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Value; import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.spi.ResponseHandler; @@ -30,9 +31,9 @@ public class CommitTxResponseHandler implements ResponseHandler { - private final CompletableFuture commitFuture; + private final CompletableFuture commitFuture; - public CommitTxResponseHandler( CompletableFuture commitFuture ) + public CommitTxResponseHandler( CompletableFuture commitFuture ) { this.commitFuture = requireNonNull( commitFuture ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocol.java b/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocol.java index 13363fafd5..f3ea75c6cf 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocol.java +++ b/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocol.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.concurrent.CompletionStage; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Session; import org.neo4j.driver.Statement; import org.neo4j.driver.Transaction; @@ -74,7 +75,7 @@ public interface BoltProtocol * @param config the transaction configuration. Never null, should be {@link TransactionConfig#empty()} when absent. * @return a completion stage completed when transaction is started or completed exceptionally when there was a failure. */ - CompletionStage beginTransaction( Connection connection, InternalBookmark bookmark, TransactionConfig config ); + CompletionStage beginTransaction( Connection connection, Bookmark bookmark, TransactionConfig config ); /** * Commit the explicit transaction. @@ -82,7 +83,7 @@ public interface BoltProtocol * @param connection the connection to use. * @return a completion stage completed with a bookmark when transaction is committed or completed exceptionally when there was a failure. */ - CompletionStage commitTransaction( Connection connection ); + CompletionStage commitTransaction( Connection connection ); /** * Rollback the explicit transaction. diff --git a/driver/src/main/java/org/neo4j/driver/internal/messaging/request/BeginMessage.java b/driver/src/main/java/org/neo4j/driver/internal/messaging/request/BeginMessage.java index a837b2323e..81abae5e60 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/messaging/request/BeginMessage.java +++ b/driver/src/main/java/org/neo4j/driver/internal/messaging/request/BeginMessage.java @@ -23,10 +23,10 @@ import java.util.Objects; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.Value; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import static org.neo4j.driver.internal.messaging.request.TransactionMetadataBuilder.buildMetadata; @@ -34,12 +34,12 @@ public class BeginMessage extends MessageWithMetadata { public static final byte SIGNATURE = 0x11; - public BeginMessage( InternalBookmark bookmark, TransactionConfig config, DatabaseName databaseName, AccessMode mode ) + public BeginMessage( Bookmark bookmark, TransactionConfig config, DatabaseName databaseName, AccessMode mode ) { this( bookmark, config.timeout(), config.metadata(), mode, databaseName ); } - public BeginMessage( InternalBookmark bookmark, Duration txTimeout, Map txMetadata, AccessMode mode, DatabaseName databaseName ) + public BeginMessage( Bookmark bookmark, Duration txTimeout, Map txMetadata, AccessMode mode, DatabaseName databaseName ) { super( buildMetadata( txTimeout, txMetadata, databaseName, mode, bookmark ) ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/messaging/request/RunWithMetadataMessage.java b/driver/src/main/java/org/neo4j/driver/internal/messaging/request/RunWithMetadataMessage.java index 217a5a2fa0..1542bd9fe2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/messaging/request/RunWithMetadataMessage.java +++ b/driver/src/main/java/org/neo4j/driver/internal/messaging/request/RunWithMetadataMessage.java @@ -23,11 +23,11 @@ import java.util.Objects; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Statement; import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.Value; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import static java.util.Collections.emptyMap; import static org.neo4j.driver.Values.ofValue; @@ -41,13 +41,13 @@ public class RunWithMetadataMessage extends MessageWithMetadata private final Map parameters; public static RunWithMetadataMessage autoCommitTxRunMessage( Statement statement, TransactionConfig config, DatabaseName databaseName, AccessMode mode, - InternalBookmark bookmark ) + Bookmark bookmark ) { return autoCommitTxRunMessage( statement, config.timeout(), config.metadata(), databaseName, mode, bookmark ); } public static RunWithMetadataMessage autoCommitTxRunMessage( Statement statement, Duration txTimeout, Map txMetadata, DatabaseName databaseName, - AccessMode mode, InternalBookmark bookmark ) + AccessMode mode, Bookmark bookmark ) { Map metadata = buildMetadata( txTimeout, txMetadata, databaseName, mode, bookmark ); return new RunWithMetadataMessage( statement.text(), statement.parameters().asMap( ofValue() ), metadata ); diff --git a/driver/src/main/java/org/neo4j/driver/internal/messaging/request/TransactionMetadataBuilder.java b/driver/src/main/java/org/neo4j/driver/internal/messaging/request/TransactionMetadataBuilder.java index 75c2acba7f..c2770d3296 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/messaging/request/TransactionMetadataBuilder.java +++ b/driver/src/main/java/org/neo4j/driver/internal/messaging/request/TransactionMetadataBuilder.java @@ -22,9 +22,9 @@ import java.util.Map; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Value; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.util.Iterables; import static java.util.Collections.emptyMap; @@ -40,12 +40,12 @@ public class TransactionMetadataBuilder private static final String MODE_KEY = "mode"; private static final String MODE_READ_VALUE = "r"; - public static Map buildMetadata( Duration txTimeout, Map txMetadata, AccessMode mode, InternalBookmark bookmark ) + public static Map buildMetadata( Duration txTimeout, Map txMetadata, AccessMode mode, Bookmark bookmark ) { return buildMetadata( txTimeout, txMetadata, defaultDatabase(), mode, bookmark ); } - public static Map buildMetadata( Duration txTimeout, Map txMetadata, DatabaseName databaseName, AccessMode mode, InternalBookmark bookmark ) + public static Map buildMetadata( Duration txTimeout, Map txMetadata, DatabaseName databaseName, AccessMode mode, Bookmark bookmark ) { boolean bookmarksPresent = bookmark != null && !bookmark.isEmpty(); boolean txTimeoutPresent = txTimeout != null; diff --git a/driver/src/main/java/org/neo4j/driver/internal/messaging/v1/BoltProtocolV1.java b/driver/src/main/java/org/neo4j/driver/internal/messaging/v1/BoltProtocolV1.java index 8fedd49812..25ea82ce57 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/messaging/v1/BoltProtocolV1.java +++ b/driver/src/main/java/org/neo4j/driver/internal/messaging/v1/BoltProtocolV1.java @@ -26,13 +26,13 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Statement; import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.Value; import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.internal.BookmarkHolder; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.async.ExplicitTransaction; import org.neo4j.driver.internal.cursor.AsyncStatementResultCursorOnlyFactory; import org.neo4j.driver.internal.cursor.StatementResultCursorFactory; @@ -100,7 +100,7 @@ public void prepareToCloseChannel( Channel channel ) } @Override - public CompletionStage beginTransaction( Connection connection, InternalBookmark bookmark, TransactionConfig config ) + public CompletionStage beginTransaction( Connection connection, Bookmark bookmark, TransactionConfig config ) { try { @@ -133,9 +133,9 @@ public CompletionStage beginTransaction( Connection connection, InternalBo @Override - public CompletionStage commitTransaction( Connection connection ) + public CompletionStage commitTransaction( Connection connection ) { - CompletableFuture commitFuture = new CompletableFuture<>(); + CompletableFuture commitFuture = new CompletableFuture<>(); ResponseHandler pullAllHandler = new CommitTxResponseHandler( commitFuture ); connection.writeAndFlush( @@ -213,7 +213,7 @@ static class SingleBookmarkHelper private static final String BOOKMARK_PREFIX = "neo4j:bookmark:v1:tx"; private static final long UNKNOWN_BOOKMARK_VALUE = -1; - static Map asBeginTransactionParameters( InternalBookmark bookmark ) + static Map asBeginTransactionParameters( Bookmark bookmark ) { if ( bookmark.isEmpty() ) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/messaging/v3/BoltProtocolV3.java b/driver/src/main/java/org/neo4j/driver/internal/messaging/v3/BoltProtocolV3.java index d663bbbb4c..56833c2493 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/messaging/v3/BoltProtocolV3.java +++ b/driver/src/main/java/org/neo4j/driver/internal/messaging/v3/BoltProtocolV3.java @@ -25,12 +25,12 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Statement; import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.Value; import org.neo4j.driver.internal.BookmarkHolder; import org.neo4j.driver.internal.DatabaseName; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.async.ExplicitTransaction; import org.neo4j.driver.internal.cursor.AsyncStatementResultCursorOnlyFactory; import org.neo4j.driver.internal.cursor.StatementResultCursorFactory; @@ -94,7 +94,7 @@ public void prepareToCloseChannel( Channel channel ) } @Override - public CompletionStage beginTransaction( Connection connection, InternalBookmark bookmark, TransactionConfig config ) + public CompletionStage beginTransaction( Connection connection, Bookmark bookmark, TransactionConfig config ) { try { @@ -121,9 +121,9 @@ public CompletionStage beginTransaction( Connection connection, InternalBo } @Override - public CompletionStage commitTransaction( Connection connection ) + public CompletionStage commitTransaction( Connection connection ) { - CompletableFuture commitFuture = new CompletableFuture<>(); + CompletableFuture commitFuture = new CompletableFuture<>(); connection.writeAndFlush( COMMIT, new CommitTxResponseHandler( commitFuture ) ); return commitFuture; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/util/MetadataExtractor.java b/driver/src/main/java/org/neo4j/driver/internal/util/MetadataExtractor.java index c7d4ce29d6..ab5db795c3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/util/MetadataExtractor.java +++ b/driver/src/main/java/org/neo4j/driver/internal/util/MetadataExtractor.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Statement; import org.neo4j.driver.Value; import org.neo4j.driver.exceptions.UntrustedServerException; @@ -121,7 +122,7 @@ public static DatabaseInfo extractDatabaseInfo( Map metadata ) } } - public static InternalBookmark extractBookmarks( Map metadata ) + public static Bookmark extractBookmarks( Map metadata ) { Value bookmarkValue = metadata.get( "bookmark" ); if ( bookmarkValue != null && !bookmarkValue.isNull() && bookmarkValue.hasType( TYPE_SYSTEM.STRING() ) ) diff --git a/driver/src/main/java/org/neo4j/driver/util/BookmarkUtil.java b/driver/src/main/java/org/neo4j/driver/util/BookmarkUtil.java deleted file mode 100644 index ea7787e863..0000000000 --- a/driver/src/main/java/org/neo4j/driver/util/BookmarkUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2002-2019 "Neo4j," - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.driver.util; - -import java.io.Serializable; -import java.util.Collection; - -import org.neo4j.driver.Bookmark; -import org.neo4j.driver.internal.InternalBookmark; - -/** - * Utils for {@link Bookmark}. This class is deprecated and will be removed from public API in future versions. - */ -@Deprecated -public final class BookmarkUtil -{ - /** - * Parse {@link Bookmark} from a string value. The bookmark string has to be a single bookmark string such as "aBookmarkString". - * Use {@link BookmarkUtil#parse(Collection)} instead to parse multiple bookmark strings into one {@link Bookmark}. - * @param value a bookmark string. - * @return A {@link Bookmark bookmark} - * @deprecated This method is deprecated and will be removed in future versions. - * This method provides back-compatibility to convert string bookmarks used in previous driver versions to {@link Bookmark} which is used in this new driver version. - * This method shall not be used to convert a bookmark string from {@link Bookmark} back to {@link Bookmark}. - * A bookmark shall only be obtained via the driver and passed directly to the driver. - * The content of the bookmark shall not be inspected or altered by any client application. - */ - @Deprecated - public static Bookmark parse( String value ) - { - return InternalBookmark.parse( value ); - } - - /** - * Parse {@link Bookmark} from a collection of bookmark strings. Each bookmark string in the collection has to be a single bookmark string such as "aBookmarkString". - * Use {@link BookmarkUtil#parse(String)} instead to parse a single bookmark string into one {@link Bookmark}. - * @param values a collections of bookmark string. The collection has to implement {@link Serializable}. - * @return A {@link Bookmark bookmark} - * @throws IllegalArgumentException if the collection of bookmark strings does not implement {@link Serializable}. - * @deprecated This method is deprecated and will be removed in future versions. - * This method provides back-compatibility to convert string bookmarks used in previous driver versions to {@link Bookmark} which is used in this new driver version. - * This method shall not be used to convert a bookmark string from {@link Bookmark} back to {@link Bookmark}. - * A bookmark shall only be obtained via the driver and passed directly to the driver. - * The content of the bookmark shall not be inspected or altered by any client application. - */ - @Deprecated - public static Bookmark parse( Collection values ) - { - return InternalBookmark.parse( values ); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/integration/RoutingDriverBoltKitTest.java b/driver/src/test/java/org/neo4j/driver/integration/RoutingDriverBoltKitTest.java index 274360438d..6405ac0662 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/RoutingDriverBoltKitTest.java +++ b/driver/src/test/java/org/neo4j/driver/integration/RoutingDriverBoltKitTest.java @@ -46,8 +46,8 @@ import org.neo4j.driver.exceptions.ServiceUnavailableException; import org.neo4j.driver.exceptions.SessionExpiredException; import org.neo4j.driver.exceptions.TransientException; -import org.neo4j.driver.Bookmark; import org.neo4j.driver.internal.DriverFactory; +import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.cluster.RoutingSettings; import org.neo4j.driver.internal.retry.RetrySettings; import org.neo4j.driver.internal.util.DriverFactoryWithClock; @@ -77,6 +77,7 @@ import static org.neo4j.driver.internal.InternalBookmark.parse; import static org.neo4j.driver.util.StubServer.INSECURE_CONFIG; import static org.neo4j.driver.util.StubServer.insecureBuilder; +import static org.neo4j.driver.util.TestUtil.asOrderedSet; class RoutingDriverBoltKitTest { @@ -981,11 +982,10 @@ void shouldSendMultipleBookmarks() throws Exception StubServer router = StubServer.start( "acquire_endpoints_v3.script", 9001 ); StubServer writer = StubServer.start( "multiple_bookmarks.script", 9007 ); - Bookmark bookmark = parse( - asList( "neo4j:bookmark:v1:tx5", "neo4j:bookmark:v1:tx29", "neo4j:bookmark:v1:tx94", "neo4j:bookmark:v1:tx56", "neo4j:bookmark:v1:tx16", - "neo4j:bookmark:v1:tx68" ) ); - - try ( Driver driver = GraphDatabase.driver( "neo4j://localhost:9001", INSECURE_CONFIG ); Session session = driver.session( builder().withBookmarks( bookmark ).build() ) ) + try ( Driver driver = GraphDatabase.driver( "neo4j://localhost:9001", INSECURE_CONFIG ); + Session session = driver.session( builder().withBookmarks( InternalBookmark.parse( + asOrderedSet( "neo4j:bookmark:v1:tx5", "neo4j:bookmark:v1:tx29", "neo4j:bookmark:v1:tx94", "neo4j:bookmark:v1:tx56", + "neo4j:bookmark:v1:tx16", "neo4j:bookmark:v1:tx68" ) ) ).build() ) ) { try ( Transaction tx = session.beginTransaction() ) { diff --git a/driver/src/test/java/org/neo4j/driver/integration/async/AsyncSessionIT.java b/driver/src/test/java/org/neo4j/driver/integration/async/AsyncSessionIT.java index e5b16e57f8..4c1ee8e33e 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/async/AsyncSessionIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/async/AsyncSessionIT.java @@ -35,6 +35,7 @@ import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicInteger; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Record; import org.neo4j.driver.Statement; import org.neo4j.driver.Value; @@ -45,11 +46,11 @@ import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.exceptions.DatabaseException; import org.neo4j.driver.exceptions.NoSuchRecordException; +import org.neo4j.driver.exceptions.ResultConsumedException; import org.neo4j.driver.exceptions.ServiceUnavailableException; import org.neo4j.driver.exceptions.SessionExpiredException; import org.neo4j.driver.exceptions.TransientException; import org.neo4j.driver.internal.InternalBookmark; -import org.neo4j.driver.exceptions.ResultConsumedException; import org.neo4j.driver.internal.util.DisabledOnNeo4jWith; import org.neo4j.driver.internal.util.EnabledOnNeo4jWith; import org.neo4j.driver.internal.util.Futures; @@ -601,7 +602,7 @@ void shouldRunAfterRunFailureToAcquireConnection() @DisabledOnNeo4jWith( BOLT_V3 ) void shouldRunAfterBeginTxFailureOnBookmark() { - InternalBookmark illegalBookmark = InternalBookmark.parse( "Illegal Bookmark" ); + Bookmark illegalBookmark = InternalBookmark.parse( "Illegal Bookmark" ); session = neo4j.driver().asyncSession( builder().withBookmarks( illegalBookmark ).build() ); assertThrows( ClientException.class, () -> await( session.beginTransactionAsync() ) ); @@ -614,7 +615,7 @@ void shouldRunAfterBeginTxFailureOnBookmark() @Test void shouldNotBeginTxAfterBeginTxFailureOnBookmark() { - InternalBookmark illegalBookmark = InternalBookmark.parse( "Illegal Bookmark" ); + Bookmark illegalBookmark = InternalBookmark.parse( "Illegal Bookmark" ); session = neo4j.driver().asyncSession( builder().withBookmarks( illegalBookmark ).build() ); assertThrows( ClientException.class, () -> await( session.beginTransactionAsync() ) ); assertThrows( ClientException.class, () -> await( session.beginTransactionAsync() ) ); @@ -624,7 +625,7 @@ void shouldNotBeginTxAfterBeginTxFailureOnBookmark() @EnabledOnNeo4jWith( BOLT_V3 ) void shouldNotRunAfterBeginTxFailureOnBookmark() { - InternalBookmark illegalBookmark = InternalBookmark.parse( "Illegal Bookmark" ); + Bookmark illegalBookmark = InternalBookmark.parse( "Illegal Bookmark" ); session = neo4j.driver().asyncSession( builder().withBookmarks( illegalBookmark ).build() ); assertThrows( ClientException.class, () -> await( session.beginTransactionAsync() ) ); StatementResultCursor cursor = await( session.runAsync( "RETURN 'Hello!'" ) ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/DefaultBookmarkHolderTest.java b/driver/src/test/java/org/neo4j/driver/internal/DefaultBookmarkHolderTest.java index be4915457e..9a784485c0 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/DefaultBookmarkHolderTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/DefaultBookmarkHolderTest.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; +import org.neo4j.driver.Bookmark; + import static org.junit.jupiter.api.Assertions.assertEquals; class DefaultBookmarkHolderTest @@ -36,7 +38,7 @@ void shouldAllowToGetAndSetBookmarks() bookmarkHolder.setBookmark( InternalBookmark.empty() ); assertEquals( InternalBookmark.empty(), bookmarkHolder.getBookmark() ); - InternalBookmark bookmark1 = InternalBookmark.parse( "neo4j:bookmark:v1:tx1" ); + Bookmark bookmark1 = InternalBookmark.parse( "neo4j:bookmark:v1:tx1" ); bookmarkHolder.setBookmark( bookmark1 ); assertEquals( bookmark1, bookmarkHolder.getBookmark() ); @@ -46,11 +48,11 @@ void shouldAllowToGetAndSetBookmarks() bookmarkHolder.setBookmark( InternalBookmark.empty() ); assertEquals( bookmark1, bookmarkHolder.getBookmark() ); - InternalBookmark bookmark2 = InternalBookmark.parse( "neo4j:bookmark:v1:tx2" ); + Bookmark bookmark2 = InternalBookmark.parse( "neo4j:bookmark:v1:tx2" ); bookmarkHolder.setBookmark( bookmark2 ); assertEquals( bookmark2, bookmarkHolder.getBookmark() ); - InternalBookmark bookmark3 = InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ); + Bookmark bookmark3 = InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ); bookmarkHolder.setBookmark( bookmark3 ); assertEquals( bookmark3, bookmarkHolder.getBookmark() ); } @@ -59,7 +61,7 @@ void shouldAllowToGetAndSetBookmarks() void bookmarkCanBeSet() { BookmarkHolder bookmarkHolder = new DefaultBookmarkHolder(); - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx100" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx100" ); bookmarkHolder.setBookmark( bookmark ); @@ -69,7 +71,7 @@ void bookmarkCanBeSet() @Test void shouldNotOverwriteBookmarkWithNull() { - InternalBookmark initBookmark = InternalBookmark.parse( "Cat" ); + Bookmark initBookmark = InternalBookmark.parse( "Cat" ); BookmarkHolder bookmarkHolder = new DefaultBookmarkHolder( initBookmark ); assertEquals( initBookmark, bookmarkHolder.getBookmark() ); bookmarkHolder.setBookmark( null ); @@ -79,7 +81,7 @@ void shouldNotOverwriteBookmarkWithNull() @Test void shouldNotOverwriteBookmarkWithEmptyBookmark() { - InternalBookmark initBookmark = InternalBookmark.parse( "Cat" ); + Bookmark initBookmark = InternalBookmark.parse( "Cat" ); BookmarkHolder bookmarkHolder = new DefaultBookmarkHolder( initBookmark ); assertEquals( initBookmark, bookmarkHolder.getBookmark() ); bookmarkHolder.setBookmark( InternalBookmark.empty() ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/DirectDriverBoltKitTest.java b/driver/src/test/java/org/neo4j/driver/internal/DirectDriverBoltKitTest.java index aa7ed4d9d0..91d90f1867 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/DirectDriverBoltKitTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/DirectDriverBoltKitTest.java @@ -70,6 +70,7 @@ import static org.neo4j.driver.internal.logging.DevNullLogging.DEV_NULL_LOGGING; import static org.neo4j.driver.util.StubServer.INSECURE_CONFIG; import static org.neo4j.driver.util.StubServer.insecureBuilder; +import static org.neo4j.driver.util.TestUtil.asOrderedSet; class DirectDriverBoltKitTest { @@ -98,9 +99,8 @@ void shouldSendMultipleBookmarks() throws Exception { StubServer server = StubServer.start( "multiple_bookmarks.script", 9001 ); - Bookmark bookmarks = InternalBookmark.parse( asList( "neo4j:bookmark:v1:tx5", "neo4j:bookmark:v1:tx29", - "neo4j:bookmark:v1:tx94", "neo4j:bookmark:v1:tx56", "neo4j:bookmark:v1:tx16", - "neo4j:bookmark:v1:tx68" ) ); + Bookmark bookmarks = InternalBookmark.parse( asOrderedSet( "neo4j:bookmark:v1:tx5", "neo4j:bookmark:v1:tx29", + "neo4j:bookmark:v1:tx94", "neo4j:bookmark:v1:tx56", "neo4j:bookmark:v1:tx16", "neo4j:bookmark:v1:tx68" ) ); try ( Driver driver = GraphDatabase.driver( "bolt://localhost:9001", INSECURE_CONFIG ); Session session = driver.session( builder().withBookmarks( bookmarks ).build() ) ) @@ -349,7 +349,7 @@ void shouldThrowCorrectErrorOnRunFailure() throws Throwable { StubServer server = StubServer.start( "database_shutdown.script", 9001 ); - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx0" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx0" ); try ( Driver driver = GraphDatabase.driver( "bolt://localhost:9001", INSECURE_CONFIG ); Session session = driver.session( builder().withBookmarks( bookmark ).build() ); // has to enforce to flush BEGIN to have tx started. diff --git a/driver/src/test/java/org/neo4j/driver/internal/InternalBookmarkTest.java b/driver/src/test/java/org/neo4j/driver/internal/InternalBookmarkTest.java index eec85628a9..03dd72eeb9 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/InternalBookmarkTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/InternalBookmarkTest.java @@ -20,34 +20,32 @@ import org.junit.jupiter.api.Test; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; import java.util.Arrays; -import java.util.List; +import java.util.Set; import org.neo4j.driver.Bookmark; -import org.neo4j.driver.internal.util.Iterables; -import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; +import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.hasItems; import static org.junit.Assert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertIterableEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.neo4j.driver.internal.InternalBookmark.parse; +import static org.neo4j.driver.util.TestUtil.asSet; class InternalBookmarkTest { @Test void isEmptyForEmptyBookmark() { - InternalBookmark bookmark = InternalBookmark.empty(); + Bookmark bookmark = InternalBookmark.empty(); assertTrue( bookmark.isEmpty() ); assertEquals( emptySet(), bookmark.values() ); } @@ -55,28 +53,28 @@ void isEmptyForEmptyBookmark() @Test void shouldSetToEmptyForNullBookmark() throws Throwable { - InternalBookmark bookmark = InternalBookmark.from( null ); + Bookmark bookmark = InternalBookmark.from( null ); assertEquals( InternalBookmark.empty(), bookmark ); } @Test void shouldSetToEmptyForEmptyBookmarkIterator() throws Throwable { - InternalBookmark bookmark = InternalBookmark.from( emptyList() ); + Bookmark bookmark = InternalBookmark.from( emptyList() ); assertEquals( InternalBookmark.empty(), bookmark ); } @Test void shouldSetToEmptyForNullBookmarkList() throws Throwable { - InternalBookmark bookmark = InternalBookmark.from( singletonList( null ) ); + Bookmark bookmark = InternalBookmark.from( singletonList( null ) ); assertEquals( InternalBookmark.empty(), bookmark ); } @Test void shouldIgnoreNullAndEmptyInBookmarkList() throws Throwable { - InternalBookmark bookmark = InternalBookmark.from( Arrays.asList( InternalBookmark.empty(), null, null ) ); + Bookmark bookmark = InternalBookmark.from( Arrays.asList( InternalBookmark.empty(), null, null ) ); assertEquals( InternalBookmark.empty(), bookmark ); } @@ -86,119 +84,89 @@ void shouldReserveBookmarkValuesCorrectly() throws Throwable Bookmark one = parse( "one" ); Bookmark two = parse( "two" ); Bookmark empty = InternalBookmark.empty(); - InternalBookmark bookmark = InternalBookmark.from( Arrays.asList( one, two, null, empty ) ); - assertThat( Iterables.asList( bookmark.values() ), equalTo( Arrays.asList( "one", "two" ) ) ); + Bookmark bookmark = InternalBookmark.from( Arrays.asList( one, two, null, empty ) ); + verifyValues( bookmark, "one", "two" ); } @Test - void isEmptyForNonEmptyBookmark() + void isNotEmptyForNonEmptyBookmark() { - InternalBookmark bookmark = InternalBookmark.parse( "SomeBookmark" ); + Bookmark bookmark = InternalBookmark.parse( "SomeBookmark" ); assertFalse( bookmark.isEmpty() ); } @Test void asBeginTransactionParametersForNonEmptyBookmark() { - InternalBookmark bookmark = InternalBookmark.parse( "SomeBookmark" ); + Bookmark bookmark = InternalBookmark.parse( "SomeBookmark" ); verifyValues( bookmark, "SomeBookmark" ); } @Test void bookmarkFromString() { - InternalBookmark bookmark = InternalBookmark.parse( "Cat" ); - assertEquals( singletonList( "Cat" ), bookmark.values() ); + Bookmark bookmark = InternalBookmark.parse( "Cat" ); + assertEquals( singleton( "Cat" ), bookmark.values() ); verifyValues( bookmark, "Cat" ); } @Test void bookmarkFromNullString() { - InternalBookmark bookmark = InternalBookmark.parse( (String) null ); + Bookmark bookmark = InternalBookmark.parse( (String) null ); assertTrue( bookmark.isEmpty() ); } @Test - void bookmarkFromIterable() + void bookmarkFromSet() { - InternalBookmark bookmark = InternalBookmark.parse( asList( - "neo4j:bookmark:v1:tx42", "neo4j:bookmark:v1:tx10", "neo4j:bookmark:v1:tx12" ) ); + Set input = asSet( "neo4j:bookmark:v1:tx42", "neo4j:bookmark:v1:tx10", "neo4j:bookmark:v1:tx12" ); + Bookmark bookmark = InternalBookmark.parse( input ); verifyValues( bookmark, "neo4j:bookmark:v1:tx42", "neo4j:bookmark:v1:tx10", "neo4j:bookmark:v1:tx12" ); } @Test void bookmarkFromNullIterable() { - InternalBookmark bookmark = InternalBookmark.parse( (List) null ); + Bookmark bookmark = InternalBookmark.parse( (Set) null ); assertTrue( bookmark.isEmpty() ); } @Test void bookmarkFromEmptyIterable() { - InternalBookmark bookmark = InternalBookmark.parse( emptyList() ); + Bookmark bookmark = InternalBookmark.parse( emptySet() ); assertTrue( bookmark.isEmpty() ); } @Test void asBeginTransactionParametersForBookmarkWithInvalidValue() { - InternalBookmark bookmark = InternalBookmark.parse( asList( - "neo4j:bookmark:v1:tx1", "neo4j:bookmark:v1:txcat", "neo4j:bookmark:v1:tx3" ) ); + Bookmark bookmark = InternalBookmark.parse( asSet( "neo4j:bookmark:v1:tx1", "neo4j:bookmark:v1:txcat", "neo4j:bookmark:v1:tx3" ) ); verifyValues( bookmark, "neo4j:bookmark:v1:tx1", "neo4j:bookmark:v1:txcat", "neo4j:bookmark:v1:tx3" ); } - @Test - void asBeginTransactionParametersForBookmarkWithEmptyStringValue() - { - InternalBookmark bookmark = InternalBookmark.parse( asList( "neo4j:bookmark:v1:tx9", "", "neo4j:bookmark:v1:tx3" ) ); - verifyValues( bookmark, "neo4j:bookmark:v1:tx9", "", "neo4j:bookmark:v1:tx3" ); - } - - @Test - void asBeginTransactionParametersForBookmarkWithNullValue() - { - InternalBookmark bookmark = InternalBookmark.parse( asList( "neo4j:bookmark:v1:tx41", null, "neo4j:bookmark:v1:tx42" ) ); - verifyValues( bookmark, asList( "neo4j:bookmark:v1:tx41", null, "neo4j:bookmark:v1:tx42" ) ); - } - @Test void shouldReturnAllBookmarks() { assertIterableEquals( emptyList(), InternalBookmark.empty().values() ); - assertIterableEquals( singletonList( "neo4j:bookmark:v1:tx42" ), InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ).values() ); + assertIterableEquals( singleton( "neo4j:bookmark:v1:tx42" ), InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ).values() ); - List bookmarks = asList( "neo4j:bookmark:v1:tx1", "neo4j:bookmark:v1:tx2", "neo4j:bookmark:v1:tx3" ); + Set bookmarks = asSet( "neo4j:bookmark:v1:tx1", "neo4j:bookmark:v1:tx2", "neo4j:bookmark:v1:tx3" ); assertIterableEquals( bookmarks, InternalBookmark.parse( bookmarks ).values() ); } @Test - void objectShouldBeTheSameWhenSerializingAndDeserializing() throws Throwable - { - Bookmark bookmark = InternalBookmark.parse( Arrays.asList( "neo4j:1000", "neo4j:2000" ) ); - - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ObjectOutputStream objectOutputStream = new ObjectOutputStream( outputStream ); - objectOutputStream.writeObject( bookmark ); - objectOutputStream.flush(); - objectOutputStream.close(); - - ByteArrayInputStream inputStream = new ByteArrayInputStream( outputStream.toByteArray() ); - ObjectInputStream objectInputStream = new ObjectInputStream( inputStream ); - Bookmark readBookmark = (InternalBookmark) objectInputStream.readObject(); - objectInputStream.close(); - - assertEquals( bookmark, readBookmark ); - } - - private static void verifyValues( InternalBookmark bookmark, String... expectedValues ) + void valueShouldBeReadOnly() throws Throwable { - verifyValues( bookmark, asList( expectedValues ) ); + Bookmark bookmark = InternalBookmark.parse( asSet( "first", "second" ) ); + Set values = bookmark.values(); + assertThrows( UnsupportedOperationException.class, () -> values.add( "third" ) ); } - private static void verifyValues( InternalBookmark bookmark, List expectedValues ) + private static void verifyValues( Bookmark bookmark, String... expectedValues ) { - assertIterableEquals( expectedValues, bookmark.values() ); + assertThat( bookmark.values().size(), equalTo( expectedValues.length ) ); + assertThat( bookmark.values(), hasItems( expectedValues ) ); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/ExplicitTransactionTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/ExplicitTransactionTest.java index fe94f207fc..3eb1f79333 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/ExplicitTransactionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/ExplicitTransactionTest.java @@ -25,6 +25,7 @@ import java.util.function.Consumer; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Statement; import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.exceptions.ClientException; @@ -52,10 +53,10 @@ import static org.neo4j.driver.util.TestUtil.await; import static org.neo4j.driver.util.TestUtil.connectionMock; import static org.neo4j.driver.util.TestUtil.runMessageWithStatementMatcher; -import static org.neo4j.driver.util.TestUtil.setupSuccessfulRunRx; import static org.neo4j.driver.util.TestUtil.setupSuccessfulRunAndPull; -import static org.neo4j.driver.util.TestUtil.verifyRunRx; +import static org.neo4j.driver.util.TestUtil.setupSuccessfulRunRx; import static org.neo4j.driver.util.TestUtil.verifyRunAndPull; +import static org.neo4j.driver.util.TestUtil.verifyRunRx; class ExplicitTransactionTest { @@ -121,7 +122,7 @@ void shouldOnlyQueueMessagesWhenNoBookmarkGiven() @Test void shouldFlushWhenBookmarkGiven() { - InternalBookmark bookmark = InternalBookmark.parse( "hi, I'm bookmark" ); + Bookmark bookmark = InternalBookmark.parse( "hi, I'm bookmark" ); Connection connection = connectionMock(); beginTx( connection, bookmark ); @@ -166,7 +167,7 @@ void shouldReleaseConnectionWhenBeginFails() Connection connection = connectionWithBegin( handler -> handler.onFailure( error ) ); ExplicitTransaction tx = new ExplicitTransaction( connection, new DefaultBookmarkHolder(), UNLIMITED_FETCH_SIZE ); - InternalBookmark bookmark = InternalBookmark.parse( "SomeBookmark" ); + Bookmark bookmark = InternalBookmark.parse( "SomeBookmark" ); TransactionConfig txConfig = TransactionConfig.empty(); RuntimeException e = assertThrows( RuntimeException.class, () -> await( tx.beginAsync( bookmark, txConfig ) ) ); @@ -181,7 +182,7 @@ void shouldNotReleaseConnectionWhenBeginSucceeds() Connection connection = connectionWithBegin( handler -> handler.onSuccess( emptyMap() ) ); ExplicitTransaction tx = new ExplicitTransaction( connection, new DefaultBookmarkHolder(), UNLIMITED_FETCH_SIZE ); - InternalBookmark bookmark = InternalBookmark.parse( "SomeBookmark" ); + Bookmark bookmark = InternalBookmark.parse( "SomeBookmark" ); TransactionConfig txConfig = TransactionConfig.empty(); await( tx.beginAsync( bookmark, txConfig ) ); @@ -231,7 +232,7 @@ private static ExplicitTransaction beginTx( Connection connection ) return beginTx( connection, InternalBookmark.empty() ); } - private static ExplicitTransaction beginTx( Connection connection, InternalBookmark initialBookmark ) + private static ExplicitTransaction beginTx( Connection connection, Bookmark initialBookmark ) { ExplicitTransaction tx = new ExplicitTransaction( connection, new DefaultBookmarkHolder(), UNLIMITED_FETCH_SIZE ); return await( tx.beginAsync( initialBookmark, TransactionConfig.empty() ) ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/NetworkSessionTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/NetworkSessionTest.java index 9fc32c3aae..15d039b01d 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/NetworkSessionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/NetworkSessionTest.java @@ -240,7 +240,7 @@ void updatesBookmarkWhenTxIsClosed() ExplicitTransaction tx = beginTransaction( session ); assertThat( session.lastBookmark(), instanceOf( InternalBookmark.class ) ); - InternalBookmark bookmark = (InternalBookmark) session.lastBookmark(); + Bookmark bookmark = (InternalBookmark) session.lastBookmark(); assertTrue( bookmark.isEmpty() ); await( tx.commitAsync() ); @@ -266,7 +266,7 @@ void releasesConnectionWhenTxIsClosed() @Test void bookmarkIsPropagatedFromSession() { - InternalBookmark bookmark = InternalBookmark.parse( "Bookmarks" ); + Bookmark bookmark = InternalBookmark.parse( "Bookmarks" ); NetworkSession session = newSession( connectionProvider, bookmark ); ExplicitTransaction tx = beginTransaction( session ); @@ -277,7 +277,7 @@ void bookmarkIsPropagatedFromSession() @Test void bookmarkIsPropagatedBetweenTransactions() { - InternalBookmark bookmark1 = InternalBookmark.parse( "Bookmark1" ); + Bookmark bookmark1 = InternalBookmark.parse( "Bookmark1" ); Bookmark bookmark2 = InternalBookmark.parse( "Bookmark2" ); NetworkSession session = newSession( connectionProvider ); @@ -344,7 +344,7 @@ void connectionShouldBeResetAfterSessionReset() void shouldHaveEmptyLastBookmarkInitially() { assertThat( session.lastBookmark(), instanceOf( InternalBookmark.class ) ); - InternalBookmark bookmark = (InternalBookmark) session.lastBookmark(); + Bookmark bookmark = (InternalBookmark) session.lastBookmark(); assertTrue( bookmark.isEmpty() ); } @@ -387,7 +387,7 @@ void shouldRunAfterBeginTxFailureOnBookmark() when( connectionProvider.acquireConnection( any( ConnectionContext.class ) ) ) .thenReturn( completedFuture( connection1 ) ).thenReturn( completedFuture( connection2 ) ); - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ); NetworkSession session = newSession( connectionProvider, bookmark ); Exception e = assertThrows( Exception.class, () -> beginTransaction( session ) ); @@ -411,7 +411,7 @@ void shouldBeginTxAfterBeginTxFailureOnBookmark() when( connectionProvider.acquireConnection( any( ConnectionContext.class ) ) ) .thenReturn( completedFuture( connection1 ) ).thenReturn( completedFuture( connection2 ) ); - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ); NetworkSession session = newSession( connectionProvider, bookmark ); Exception e = assertThrows( Exception.class, () -> beginTransaction( session ) ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/cluster/loadbalancing/RoutingTableAndConnectionPoolTest.java b/driver/src/test/java/org/neo4j/driver/internal/cluster/loadbalancing/RoutingTableAndConnectionPoolTest.java index ade0765a9f..3cf9e434ac 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/cluster/loadbalancing/RoutingTableAndConnectionPoolTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/cluster/loadbalancing/RoutingTableAndConnectionPoolTest.java @@ -38,11 +38,11 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Logging; import org.neo4j.driver.exceptions.FatalDiscoveryException; import org.neo4j.driver.exceptions.ProtocolException; import org.neo4j.driver.internal.BoltServerAddress; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.async.connection.BootstrapFactory; import org.neo4j.driver.internal.async.pool.NettyChannelTracker; import org.neo4j.driver.internal.async.pool.PoolSettings; @@ -348,7 +348,7 @@ private CompletableFuture clusterComposition( long expireAft private class RandomizedRediscovery implements Rediscovery { @Override - public CompletionStage lookupClusterComposition( RoutingTable routingTable, ConnectionPool connectionPool, InternalBookmark bookmark ) + public CompletionStage lookupClusterComposition( RoutingTable routingTable, ConnectionPool connectionPool, Bookmark bookmark ) { // when looking up a new routing table, we return a valid random routing table back Set servers = new HashSet<>(); diff --git a/driver/src/test/java/org/neo4j/driver/internal/handlers/CommitTxResponseHandlerTest.java b/driver/src/test/java/org/neo4j/driver/internal/handlers/CommitTxResponseHandlerTest.java index ff051c875c..caaa9c73d5 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/handlers/CommitTxResponseHandlerTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/handlers/CommitTxResponseHandlerTest.java @@ -22,6 +22,7 @@ import java.util.concurrent.CompletableFuture; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Value; import org.neo4j.driver.internal.InternalBookmark; @@ -35,7 +36,7 @@ class CommitTxResponseHandlerTest { - private final CompletableFuture future = new CompletableFuture<>(); + private final CompletableFuture future = new CompletableFuture<>(); private final CommitTxResponseHandler handler = new CommitTxResponseHandler( future ); @Test diff --git a/driver/src/test/java/org/neo4j/driver/internal/messaging/encode/BeginMessageEncoderTest.java b/driver/src/test/java/org/neo4j/driver/internal/messaging/encode/BeginMessageEncoderTest.java index d0c705394e..903e5b105a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/messaging/encode/BeginMessageEncoderTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/messaging/encode/BeginMessageEncoderTest.java @@ -28,6 +28,7 @@ import java.util.Map; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Value; import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.messaging.ValuePacker; @@ -50,7 +51,7 @@ class BeginMessageEncoderTest @EnumSource( AccessMode.class ) void shouldEncodeBeginMessage( AccessMode mode ) throws Exception { - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx42" ); Map txMetadata = new HashMap<>(); txMetadata.put( "hello", value( "world" ) ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/messaging/encode/RunWithMetadataMessageEncoderTest.java b/driver/src/test/java/org/neo4j/driver/internal/messaging/encode/RunWithMetadataMessageEncoderTest.java index 2fd0316935..0226030abf 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/messaging/encode/RunWithMetadataMessageEncoderTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/messaging/encode/RunWithMetadataMessageEncoderTest.java @@ -28,6 +28,7 @@ import java.util.Map; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Statement; import org.neo4j.driver.Value; import org.neo4j.driver.internal.InternalBookmark; @@ -55,7 +56,7 @@ void shouldEncodeRunWithMetadataMessage( AccessMode mode ) throws Exception { Map params = singletonMap( "answer", value( 42 ) ); - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx999" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx999" ); Map txMetadata = new HashMap<>(); txMetadata.put( "key1", value( "value1" ) ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/messaging/request/TransactionMetadataBuilderTest.java b/driver/src/test/java/org/neo4j/driver/internal/messaging/request/TransactionMetadataBuilderTest.java index fa8dc8d961..9a0c0efef1 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/messaging/request/TransactionMetadataBuilderTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/messaging/request/TransactionMetadataBuilderTest.java @@ -26,9 +26,11 @@ import java.time.Duration; import java.time.LocalDateTime; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Value; import org.neo4j.driver.internal.InternalBookmark; @@ -48,7 +50,7 @@ public class TransactionMetadataBuilderTest @EnumSource( AccessMode.class ) void shouldHaveCorrectMetadata( AccessMode mode ) { - InternalBookmark bookmark = InternalBookmark.parse( asList( "neo4j:bookmark:v1:tx11", "neo4j:bookmark:v1:tx52" ) ); + Bookmark bookmark = InternalBookmark.parse( new HashSet<>( asList( "neo4j:bookmark:v1:tx11", "neo4j:bookmark:v1:tx52" ) ) ); Map txMetadata = new HashMap<>(); txMetadata.put( "foo", value( "bar" ) ); @@ -75,7 +77,7 @@ void shouldHaveCorrectMetadata( AccessMode mode ) @ValueSource( strings = {"", "foo", "data"} ) void shouldHaveCorrectMetadataForDatabaseName( String databaseName ) { - InternalBookmark bookmark = InternalBookmark.parse( asList( "neo4j:bookmark:v1:tx11", "neo4j:bookmark:v1:tx52" ) ); + Bookmark bookmark = InternalBookmark.parse( new HashSet<>( asList( "neo4j:bookmark:v1:tx11", "neo4j:bookmark:v1:tx52" ) ) ); Map txMetadata = new HashMap<>(); txMetadata.put( "foo", value( "bar" ) ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/messaging/v1/BoltProtocolV1Test.java b/driver/src/test/java/org/neo4j/driver/internal/messaging/v1/BoltProtocolV1Test.java index 345cc1b5b2..49aecbe505 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/messaging/v1/BoltProtocolV1Test.java +++ b/driver/src/test/java/org/neo4j/driver/internal/messaging/v1/BoltProtocolV1Test.java @@ -31,6 +31,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Logging; import org.neo4j.driver.Statement; import org.neo4j.driver.TransactionConfig; @@ -165,7 +166,7 @@ void shouldBeginTransactionWithoutBookmark() void shouldBeginTransactionWithBookmarks() { Connection connection = connectionMock( protocol ); - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx100" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx100" ); CompletionStage stage = protocol.beginTransaction( connection, bookmark, TransactionConfig.empty() ); @@ -190,7 +191,7 @@ void shouldCommitTransaction() return null; } ).when( connection ).writeAndFlush( eq( new RunMessage( "COMMIT" ) ), any(), any(), any() ); - CompletionStage stage = protocol.commitTransaction( connection ); + CompletionStage stage = protocol.commitTransaction( connection ); verify( connection ).writeAndFlush( eq( new RunMessage( "COMMIT" ) ), eq( NoOpResponseHandler.INSTANCE ), diff --git a/driver/src/test/java/org/neo4j/driver/internal/messaging/v3/BoltProtocolV3Test.java b/driver/src/test/java/org/neo4j/driver/internal/messaging/v3/BoltProtocolV3Test.java index 121639ed7b..4b33f0c8ad 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/messaging/v3/BoltProtocolV3Test.java +++ b/driver/src/test/java/org/neo4j/driver/internal/messaging/v3/BoltProtocolV3Test.java @@ -33,6 +33,7 @@ import java.util.concurrent.CompletionStage; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.Logging; import org.neo4j.driver.Statement; import org.neo4j.driver.TransactionConfig; @@ -198,7 +199,7 @@ void shouldBeginTransactionWithoutBookmark() void shouldBeginTransactionWithBookmarks() { Connection connection = connectionMock( protocol ); - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx100" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx100" ); CompletionStage stage = protocol.beginTransaction( connection, bookmark, TransactionConfig.empty() ); @@ -221,7 +222,7 @@ void shouldBeginTransactionWithConfig() void shouldBeginTransactionWithBookmarksAndConfig() { Connection connection = connectionMock( protocol ); - InternalBookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx4242" ); + Bookmark bookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx4242" ); CompletionStage stage = protocol.beginTransaction( connection, bookmark, txConfig ); @@ -243,7 +244,7 @@ void shouldCommitTransaction() return null; } ).when( connection ).writeAndFlush( eq( CommitMessage.COMMIT ), any() ); - CompletionStage stage = protocol.commitTransaction( connection ); + CompletionStage stage = protocol.commitTransaction( connection ); verify( connection ).writeAndFlush( eq( CommitMessage.COMMIT ), any( CommitTxResponseHandler.class ) ); assertEquals( InternalBookmark.parse( bookmarkString ), await( stage ) ); @@ -382,7 +383,7 @@ protected void testRunInExplicitTransactionAndWaitForRunResponse( boolean succes protected void testRunWithoutWaitingForRunResponse( boolean autoCommitTx, TransactionConfig config, AccessMode mode ) throws Exception { Connection connection = connectionMock( mode, protocol ); - InternalBookmark initialBookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx987" ); + Bookmark initialBookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx987" ); CompletionStage cursorStage; if ( autoCommitTx ) @@ -409,7 +410,7 @@ protected void testRunWithoutWaitingForRunResponse( boolean autoCommitTx, Transa } } - protected void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( InternalBookmark bookmark, TransactionConfig config, AccessMode mode ) throws Exception + protected void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( Bookmark bookmark, TransactionConfig config, AccessMode mode ) throws Exception { Connection connection = connectionMock( mode, protocol ); BookmarkHolder bookmarkHolder = new DefaultBookmarkHolder( bookmark ); @@ -431,7 +432,7 @@ protected void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( InternalBo assertNotNull( cursorFuture.get() ); } - protected void testFailedRunInAutoCommitTxWithWaitingForResponse( InternalBookmark bookmark, TransactionConfig config, AccessMode mode ) throws Exception + protected void testFailedRunInAutoCommitTxWithWaitingForResponse( Bookmark bookmark, TransactionConfig config, AccessMode mode ) throws Exception { Connection connection = connectionMock( mode, protocol ); BookmarkHolder bookmarkHolder = new DefaultBookmarkHolder( bookmark ); @@ -458,7 +459,7 @@ private static Map dummyAuthToken() return authToken; } - private static ResponseHandlers verifyRunInvoked( Connection connection, boolean session, InternalBookmark bookmark, TransactionConfig config, AccessMode mode ) + private static ResponseHandlers verifyRunInvoked( Connection connection, boolean session, Bookmark bookmark, TransactionConfig config, AccessMode mode ) { ArgumentCaptor runHandlerCaptor = ArgumentCaptor.forClass( ResponseHandler.class ); ArgumentCaptor pullAllHandlerCaptor = ArgumentCaptor.forClass( ResponseHandler.class ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/messaging/v4/BoltProtocolV4Test.java b/driver/src/test/java/org/neo4j/driver/internal/messaging/v4/BoltProtocolV4Test.java index fd6f511102..88ab8b734a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/messaging/v4/BoltProtocolV4Test.java +++ b/driver/src/test/java/org/neo4j/driver/internal/messaging/v4/BoltProtocolV4Test.java @@ -24,6 +24,7 @@ import java.util.concurrent.CompletionStage; import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Bookmark; import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.internal.BookmarkHolder; import org.neo4j.driver.internal.DatabaseName; @@ -77,7 +78,7 @@ protected Class expectedMessageFormatType() } @Override - protected void testFailedRunInAutoCommitTxWithWaitingForResponse( InternalBookmark bookmark, TransactionConfig config, AccessMode mode ) throws Exception + protected void testFailedRunInAutoCommitTxWithWaitingForResponse( Bookmark bookmark, TransactionConfig config, AccessMode mode ) throws Exception { // Given Connection connection = connectionMock( mode, protocol ); @@ -101,7 +102,7 @@ protected void testFailedRunInAutoCommitTxWithWaitingForResponse( InternalBookma } @Override - protected void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( InternalBookmark bookmark, TransactionConfig config, AccessMode mode ) throws Exception + protected void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( Bookmark bookmark, TransactionConfig config, AccessMode mode ) throws Exception { // Given Connection connection = connectionMock( mode, protocol ); @@ -158,7 +159,7 @@ protected void testRunWithoutWaitingForRunResponse( boolean autoCommitTx, Transa { // Given Connection connection = connectionMock( mode, protocol ); - InternalBookmark initialBookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx987" ); + Bookmark initialBookmark = InternalBookmark.parse( "neo4j:bookmark:v1:tx987" ); CompletionStage cursorStage; if ( autoCommitTx ) @@ -213,7 +214,7 @@ private ResponseHandler verifyTxRunInvoked( Connection connection ) return verifyRunInvoked( connection, RunWithMetadataMessage.explicitTxRunMessage( STATEMENT ) ); } - private ResponseHandler verifySessionRunInvoked( Connection connection, InternalBookmark bookmark, TransactionConfig config, AccessMode mode, DatabaseName databaseName ) + private ResponseHandler verifySessionRunInvoked( Connection connection, Bookmark bookmark, TransactionConfig config, AccessMode mode, DatabaseName databaseName ) { RunWithMetadataMessage runMessage = RunWithMetadataMessage.autoCommitTxRunMessage( STATEMENT, config, databaseName, mode, bookmark ); return verifyRunInvoked( connection, runMessage ); @@ -233,7 +234,7 @@ private ResponseHandler verifyRunInvoked( Connection connection, RunWithMetadata return runHandlerCaptor.getValue(); } - private void verifyBeginInvoked( Connection connection, InternalBookmark bookmark, TransactionConfig config, AccessMode mode, DatabaseName databaseName ) + private void verifyBeginInvoked( Connection connection, Bookmark bookmark, TransactionConfig config, AccessMode mode, DatabaseName databaseName ) { ArgumentCaptor beginHandlerCaptor = ArgumentCaptor.forClass( ResponseHandler.class ); BeginMessage beginMessage = new BeginMessage( bookmark, config, databaseName, mode ); diff --git a/driver/src/test/java/org/neo4j/driver/util/BookmarkUtilTest.java b/driver/src/test/java/org/neo4j/driver/util/BookmarkUtilTest.java deleted file mode 100644 index c87e0f011d..0000000000 --- a/driver/src/test/java/org/neo4j/driver/util/BookmarkUtilTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2002-2019 "Neo4j," - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.driver.util; - -import org.junit.jupiter.api.Test; - -import java.util.Arrays; - -import org.neo4j.driver.Bookmark; -import org.neo4j.driver.internal.InternalBookmark; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.hasItems; -import static org.hamcrest.CoreMatchers.instanceOf; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.neo4j.driver.internal.util.BookmarkUtil.*; - -class BookmarkUtilTest -{ - @Test - void shouldParseSingleBookmarkString() throws Throwable - { - Bookmark bookmark = BookmarkUtil.parse( "a bookmark, another bookmark" ); - - assertBookmarkContainsSingleValue( bookmark, equalTo( "a bookmark, another bookmark" ) ); - } - - @Test - void shouldParseBookmarkStringCollections() throws Throwable - { - Bookmark bookmark = BookmarkUtil.parse( Arrays.asList( "a bookmark", "another bookmark" ) ); - - assertBookmarkContainsValues( bookmark, hasItems( "a bookmark", "another bookmark" ) ); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/util/TestUtil.java b/driver/src/test/java/org/neo4j/driver/util/TestUtil.java index be451c2053..d08c12e207 100644 --- a/driver/src/test/java/org/neo4j/driver/util/TestUtil.java +++ b/driver/src/test/java/org/neo4j/driver/util/TestUtil.java @@ -30,6 +30,7 @@ import java.time.Duration; import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -51,7 +52,6 @@ import org.neo4j.driver.exceptions.ServiceUnavailableException; import org.neo4j.driver.internal.BoltServerAddress; import org.neo4j.driver.internal.DefaultBookmarkHolder; -import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.async.NetworkSession; import org.neo4j.driver.internal.async.connection.EventLoopGroupFactory; import org.neo4j.driver.internal.handlers.BeginTxResponseHandler; @@ -223,6 +223,12 @@ public static Set asOrderedSet( T... elements ) return new LinkedHashSet<>( Arrays.asList( elements ) ); } + @SafeVarargs + public static Set asSet( T... elements ) + { + return new HashSet<>( Arrays.asList( elements ) ); + } + public static long countNodes( Driver driver, Bookmark bookmark ) { try ( Session session = driver.session( builder().withBookmarks( bookmark ).build() ) ) @@ -240,12 +246,12 @@ public static Bookmark cleanDb( Driver driver ) } } - public static NetworkSession newSession( ConnectionProvider connectionProvider, InternalBookmark x ) + public static NetworkSession newSession( ConnectionProvider connectionProvider, Bookmark x ) { return newSession( connectionProvider, WRITE, x ); } - private static NetworkSession newSession( ConnectionProvider connectionProvider, AccessMode mode, InternalBookmark x ) + private static NetworkSession newSession( ConnectionProvider connectionProvider, AccessMode mode, Bookmark x ) { return newSession( connectionProvider, mode, new FixedRetryLogic( 0 ), x ); } @@ -266,7 +272,7 @@ public static NetworkSession newSession( ConnectionProvider connectionProvider ) } public static NetworkSession newSession( ConnectionProvider connectionProvider, AccessMode mode, - RetryLogic retryLogic, InternalBookmark bookmark ) + RetryLogic retryLogic, Bookmark bookmark ) { return new NetworkSession( connectionProvider, retryLogic, defaultDatabase(), mode, new DefaultBookmarkHolder( bookmark ), UNLIMITED_FETCH_SIZE, DEV_NULL_LOGGING ); @@ -308,7 +314,7 @@ public static void verifyBeginTx( Connection connectionMock ) verifyBeginTx( connectionMock, empty() ); } - public static void verifyBeginTx( Connection connectionMock, InternalBookmark bookmark ) + public static void verifyBeginTx( Connection connectionMock, Bookmark bookmark ) { if ( bookmark.isEmpty() ) {