Skip to content

Commit

Permalink
Use Optional<String> to represent usernames for query registration pu…
Browse files Browse the repository at this point in the history
…rposes
  • Loading branch information
boggle authored and systay committed Sep 14, 2016
1 parent edff48c commit 90527c6
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 31 deletions.
Expand Up @@ -20,6 +20,7 @@
package org.neo4j.kernel.api;

import java.util.Map;
import java.util.Optional;

import static java.lang.String.format;

Expand All @@ -30,21 +31,21 @@ public class ExecutingQuery
{
private final long queryId;

private final String username;
private final Optional<String> username;
private final String queryText;
private final Map<String, Object> queryParameters;
private final long startTime;

public ExecutingQuery(
long queryId,
String userNameOrNull,
Optional<String> username,
String queryText,
Map<String,Object> queryParameters,
long startTime
)
{
this.queryId = queryId;
this.username = userNameOrNull;
this.username = username;
this.queryText = queryText;
this.queryParameters = queryParameters;
this.startTime = startTime;
Expand Down Expand Up @@ -79,7 +80,7 @@ public long kernelQueryId()
return queryId;
}

public String username()
public Optional<String> username()
{
return username;
}
Expand Down
Expand Up @@ -19,6 +19,8 @@
*/
package org.neo4j.kernel.impl.api;

import java.util.Optional;

import org.neo4j.graphdb.NotInTransactionException;
import org.neo4j.graphdb.TransactionTerminatedException;
import org.neo4j.kernel.api.DataWriteOperations;
Expand Down Expand Up @@ -203,10 +205,10 @@ final void forceClose()
}
}

final String username()
final Optional<String> username()
{
AccessMode mode = transaction.mode();
return ( mode instanceof AuthSubject ) ? ((AuthSubject) mode).username() : null;
return ( mode instanceof AuthSubject ) ? Optional.of( ((AuthSubject) mode).username() ) : Optional.empty();
}

final ExecutingQueryList executingQueryList()
Expand Down
Expand Up @@ -21,6 +21,7 @@

import java.time.Clock;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;

import org.neo4j.kernel.api.ExecutingQuery;
Expand Down
Expand Up @@ -23,6 +23,7 @@

import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import org.neo4j.kernel.api.ExecutingQuery;
Expand Down Expand Up @@ -97,6 +98,6 @@ public void removingQueryInTheMiddleKeepsOrder()

private ExecutingQuery createExecutingQuery( int queryId, String query )
{
return new ExecutingQuery( queryId, "me", query, Collections.emptyMap(), 10 );
return new ExecutingQuery( queryId, Optional.of( "me" ), query, Collections.emptyMap(), 10 );
}
}
Expand Up @@ -26,6 +26,7 @@
import java.time.ZoneId;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -138,7 +139,7 @@ public Stream<QueryStatusResult> listQueries() throws InvalidArgumentsException,
.activeTransactions()
.stream()
.flatMap( KernelTransactionHandle::executingQueries )
.filter( ( query ) -> isAdminEnterpriseAuthSubject() || authSubject.hasUsername( query.username() ) )
.filter( ( query ) -> isAdminEnterpriseAuthSubject() || query.username().map( authSubject::hasUsername ).orElse( false ) )
.map( catchThrown( InvalidArgumentsException.class, this::queryStatusResult ) );
}
catch ( UncaughtCheckedException uncaught )
Expand Down Expand Up @@ -212,7 +213,7 @@ private QueryTerminationResult killQueryTransaction( Pair<KernelTransactionHandl
throws InvalidArgumentsException
{
ExecutingQuery query = pair.other();
if ( isAdminEnterpriseAuthSubject() || authSubject.hasUsername( query.username() ) )
if ( isAdminEnterpriseAuthSubject() || query.username().map( authSubject::hasUsername ).orElse( false ) )
{
pair.first().markForTermination( Status.Transaction.Terminated );
return new QueryTerminationResult( queryId( query.kernelQueryId() ), query.username() );
Expand All @@ -232,29 +233,22 @@ private KernelTransactions getKernelTransactions()

private Stream<TransactionTerminationResult> terminateTransactionsForValidUser( String username )
{
long terminatedCount = 0;
for ( KernelTransactionHandle tx : getActiveTransactions() )
{
if ( getUsernameFromAccessMode( tx.mode() ).equals( username ) && !tx.isUnderlyingTransaction( this.tx ) )
{
boolean marked = tx.markForTermination( Status.Transaction.Terminated );
if ( marked )
{
terminatedCount++;
}
}
}
long terminatedCount = getActiveTransactions()
.stream()
.filter( tx -> getUsernameFromAccessMode( tx.mode() ).equals( username ) && !tx.isUnderlyingTransaction( this.tx ) )
.map( tx -> tx.markForTermination( Status.Transaction.Terminated ) )
.filter( marked -> marked )
.count();
return Stream.of( new TransactionTerminationResult( username, terminatedCount ) );
}

private Stream<ConnectionResult> terminateConnectionsForValidUser( String username )
{
Long killCount = 0L;
for ( ManagedBoltStateMachine connection : getBoltConnectionTracker().getActiveConnections( username ) )
{
connection.terminate();
killCount += 1;
}
Long killCount = getBoltConnectionTracker()
.getActiveConnections( username )
.stream()
.map( conn -> { conn.terminate(); return true; } )
.count();
return Stream.of( new ConnectionResult( username, killCount ) );
}

Expand Down Expand Up @@ -337,6 +331,8 @@ private QueryStatusResult queryStatusResult( ExecutingQuery q ) throws InvalidAr
);
}

private static String UNAVAILABLE_USERNAME = "<unavailable>";

public static class QueryStatusResult
{
public final String queryId;
Expand All @@ -347,11 +343,11 @@ public static class QueryStatusResult
public final String startTime;
public final String elapsedTime;

QueryStatusResult( QueryId queryId, String username, String query, Map<String,Object> parameters,
QueryStatusResult( QueryId queryId, Optional<String> username, String query, Map<String,Object> parameters,
long startTime, long elapsedTime )
{
this.queryId = queryId.toString();
this.username = username;
this.username = username.orElse( UNAVAILABLE_USERNAME );
this.query = query;
this.parameters = parameters;
this.startTime = formatTime( startTime );
Expand All @@ -371,10 +367,10 @@ public static class QueryTerminationResult
public final String queryId;
public final String username;

public QueryTerminationResult( QueryId queryId, String username )
public QueryTerminationResult( QueryId queryId, Optional<String> username )
{
this.queryId = queryId.toString();
this.username = username;
this.username = username.orElse( UNAVAILABLE_USERNAME );
}
}

Expand Down

0 comments on commit 90527c6

Please sign in to comment.