Skip to content
This repository was archived by the owner on Jul 6, 2023. It is now read-only.

Commit f127eb6

Browse files
authored
Merge pull request #73 from praveenag/master
interactive shell now uses UserMessageHandler to display welcome and exit message
2 parents 6a4377c + 0f42b55 commit f127eb6

16 files changed

+150
-99
lines changed

cypher-shell/src/main/java/org/neo4j/shell/CypherShell.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import org.neo4j.shell.commands.CommandHelper;
66
import org.neo4j.shell.exception.CommandException;
77
import org.neo4j.shell.exception.ExitException;
8-
import org.neo4j.shell.log.AnsiFormattedText;
98
import org.neo4j.shell.log.Logger;
109
import org.neo4j.shell.prettyprint.CypherVariablesFormatter;
1110
import org.neo4j.shell.prettyprint.PrettyPrinter;
@@ -188,9 +187,9 @@ protected void addRuntimeHookToResetShell() {
188187
Runtime.getRuntime().addShutdownHook(new Thread() {
189188
@Override
190189
public void run() {
191-
logger.printIfVerbose(AnsiFormattedText.s().append("\nBye!").formattedString());
192190
reset();
193191
}
194192
});
195193
}
194+
196195
}

cypher-shell/src/main/java/org/neo4j/shell/Main.java

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
import org.neo4j.shell.cli.CliArgHelper;
77
import org.neo4j.shell.cli.CliArgs;
88
import org.neo4j.shell.commands.CommandHelper;
9-
import org.neo4j.shell.commands.Exit;
10-
import org.neo4j.shell.commands.Help;
119
import org.neo4j.shell.exception.CommandException;
12-
import org.neo4j.shell.log.AnsiFormattedText;
1310
import org.neo4j.shell.log.AnsiLogger;
1411
import org.neo4j.shell.log.Logger;
1512

@@ -48,33 +45,6 @@ public static void main(String[] args) {
4845
this.out = out;
4946
}
5047

51-
static String getWelcomeMessage(@Nonnull ConnectionConfig connectionConfig,
52-
@Nonnull String serverVersion) {
53-
String neo4j = "Neo4j";
54-
if (!serverVersion.isEmpty()) {
55-
neo4j += " " + serverVersion;
56-
}
57-
AnsiFormattedText welcomeMessage = AnsiFormattedText.from("Connected to ")
58-
.append(neo4j)
59-
.append(" at ")
60-
.bold().append(connectionConfig.driverUrl()).boldOff();
61-
62-
if (!connectionConfig.username().isEmpty()) {
63-
welcomeMessage = welcomeMessage
64-
.append(" as user ")
65-
.bold().append(connectionConfig.username()).boldOff();
66-
}
67-
68-
return welcomeMessage
69-
.append(".\nType ")
70-
.bold().append(Help.COMMAND_NAME).boldOff()
71-
.append(" for a list of available commands or ")
72-
.bold().append(Exit.COMMAND_NAME).boldOff()
73-
.append(" to exit the shell.")
74-
.append("\nNote that Cypher queries must end with a ")
75-
.bold().append("semicolon.").boldOff().formattedString();
76-
}
77-
7848
void startShell(@Nonnull CliArgs cliArgs) {
7949
if (cliArgs.getVersion()) {
8050
out.println("Cypher-Shell " + Build.version());
@@ -97,13 +67,13 @@ void startShell(@Nonnull CliArgs cliArgs) {
9767
connectInteractively(shell, connectionConfig);
9868

9969
// Construct shellrunner after connecting, due to interrupt handling
100-
ShellRunner shellRunner = ShellRunner.getShellRunner(cliArgs, shell, logger);
70+
ShellRunner shellRunner = ShellRunner.getShellRunner(cliArgs, shell, logger, connectionConfig);
10171

10272
CommandHelper commandHelper = new CommandHelper(logger, shellRunner.getHistorian(), shell);
10373

10474
shell.setCommandHelper(commandHelper);
10575

106-
int code = shellRunner.runUntilEnd(getWelcomeMessage(connectionConfig, shell.getServerVersion()));
76+
int code = shellRunner.runUntilEnd();
10777
System.exit(code);
10878
} catch (Throwable e) {
10979
logger.printError(e);

cypher-shell/src/main/java/org/neo4j/shell/ShellRunner.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@
1717
import static org.fusesource.jansi.internal.CLibrary.isatty;
1818

1919
public interface ShellRunner {
20+
2021
/**
2122
* Run and handle user input until end of file
2223
*
23-
* @param welcomeMessage
24-
* a formatted welcome message which may be printed, if suitable
2524
* @return error code to exit with
2625
*/
27-
int runUntilEnd(@Nonnull String welcomeMessage);
26+
int runUntilEnd();
2827

2928
/**
3029
* @return an object which can provide the history of commands executed
@@ -38,18 +37,22 @@ public interface ShellRunner {
3837
* @param cliArgs
3938
* @param cypherShell
4039
* @param logger
40+
* @param connectionConfig
4141
* @return a ShellRunner
4242
* @throws IOException
4343
*/
4444
@Nonnull
4545
static ShellRunner getShellRunner(@Nonnull CliArgs cliArgs,
4646
@Nonnull CypherShell cypherShell,
47-
@Nonnull Logger logger) throws IOException {
47+
@Nonnull Logger logger,
48+
@Nonnull ConnectionConfig connectionConfig) throws IOException {
4849
if (cliArgs.getCypher().isPresent()) {
4950
return new StringShellRunner(cliArgs, cypherShell, logger);
5051
} else if (shouldBeInteractive(cliArgs)) {
52+
UserMessagesHandler userMessagesHandler =
53+
new UserMessagesHandler(connectionConfig, cypherShell.getServerVersion());
5154
return new InteractiveShellRunner(cypherShell, cypherShell, logger, new ShellStatementParser(),
52-
System.in, FileHistorian.getDefaultHistoryFile());
55+
System.in, FileHistorian.getDefaultHistoryFile(), userMessagesHandler);
5356
} else {
5457
return new NonInteractiveShellRunner(cliArgs.getFailBehavior(), cypherShell, logger,
5558
new ShellStatementParser(), System.in);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.neo4j.shell;
2+
3+
import org.neo4j.shell.commands.Exit;
4+
import org.neo4j.shell.commands.Help;
5+
import org.neo4j.shell.log.AnsiFormattedText;
6+
7+
import javax.annotation.Nonnull;
8+
9+
public class UserMessagesHandler {
10+
private ConnectionConfig connectionConfig;
11+
private String serverVersion;
12+
13+
public UserMessagesHandler(@Nonnull ConnectionConfig connectionConfig, @Nonnull String serverVersion) {
14+
this.connectionConfig = connectionConfig;
15+
this.serverVersion = serverVersion;
16+
}
17+
18+
@Nonnull
19+
public String getWelcomeMessage() {
20+
String neo4j = "Neo4j";
21+
if (!serverVersion.isEmpty()) {
22+
neo4j += " " + serverVersion;
23+
}
24+
AnsiFormattedText welcomeMessage = AnsiFormattedText.from("Connected to ")
25+
.append(neo4j)
26+
.append(" at ")
27+
.bold().append(connectionConfig.driverUrl()).boldOff();
28+
29+
if (!connectionConfig.username().isEmpty()) {
30+
welcomeMessage = welcomeMessage
31+
.append(" as user ")
32+
.bold().append(connectionConfig.username()).boldOff();
33+
}
34+
35+
return welcomeMessage
36+
.append(".\nType ")
37+
.bold().append(Help.COMMAND_NAME).boldOff()
38+
.append(" for a list of available commands or ")
39+
.bold().append(Exit.COMMAND_NAME).boldOff()
40+
.append(" to exit the shell.")
41+
.append("\nNote that Cypher queries must end with a ")
42+
.bold().append("semicolon.").boldOff().formattedString();
43+
}
44+
45+
@Nonnull
46+
public String getExitMessage() {
47+
return AnsiFormattedText.s().append("\nBye!").formattedString();
48+
}
49+
}

cypher-shell/src/main/java/org/neo4j/shell/cli/InteractiveShellRunner.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.neo4j.shell.ShellRunner;
66
import org.neo4j.shell.StatementExecuter;
77
import org.neo4j.shell.TransactionHandler;
8+
import org.neo4j.shell.UserMessagesHandler;
89
import org.neo4j.shell.commands.Exit;
910
import org.neo4j.shell.exception.ExitException;
1011
import org.neo4j.shell.exception.NoMoreInputException;
@@ -40,13 +41,16 @@ public class InteractiveShellRunner implements ShellRunner, SignalHandler {
4041
private final StatementParser statementParser;
4142
private final TransactionHandler txHandler;
4243
private final StatementExecuter executer;
44+
private final UserMessagesHandler userMessagesHandler;
4345

4446
public InteractiveShellRunner(@Nonnull StatementExecuter executer,
4547
@Nonnull TransactionHandler txHandler,
4648
@Nonnull Logger logger,
4749
@Nonnull StatementParser statementParser,
4850
@Nonnull InputStream inputStream,
49-
@Nonnull File historyFile) throws IOException {
51+
@Nonnull File historyFile,
52+
@Nonnull UserMessagesHandler userMessagesHandler) throws IOException {
53+
this.userMessagesHandler = userMessagesHandler;
5054
this.currentyExecuting = new AtomicBoolean(false);
5155
this.executer = executer;
5256
this.txHandler = txHandler;
@@ -70,11 +74,11 @@ private ConsoleReader setupConsoleReader(@Nonnull Logger logger,
7074
}
7175

7276
@Override
73-
public int runUntilEnd(@Nonnull String welcomeMessage) {
77+
public int runUntilEnd() {
7478
int exitCode = 0;
7579
boolean running = true;
7680

77-
logger.printIfVerbose(welcomeMessage);
81+
logger.printIfVerbose(userMessagesHandler.getWelcomeMessage());
7882

7983
while (running) {
8084
try {
@@ -95,6 +99,7 @@ public int runUntilEnd(@Nonnull String welcomeMessage) {
9599
currentyExecuting.set(false);
96100
}
97101
}
102+
logger.printIfVerbose(userMessagesHandler.getExitMessage());
98103
return exitCode;
99104
}
100105

cypher-shell/src/main/java/org/neo4j/shell/cli/NonInteractiveShellRunner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public NonInteractiveShellRunner(@Nonnull FailBehavior failBehavior,
4040
}
4141

4242
@Override
43-
public int runUntilEnd(@Nonnull String welcomeMessage) {
43+
public int runUntilEnd() {
4444
List<String> statements;
4545
try {
4646
new BufferedReader(new InputStreamReader(inputStream))

cypher-shell/src/main/java/org/neo4j/shell/cli/StringShellRunner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public StringShellRunner(@Nonnull CliArgs cliArgs,
3030
}
3131

3232
@Override
33-
public int runUntilEnd(@Nonnull String welcomeMessage) {
33+
public int runUntilEnd() {
3434
int exitCode = 0;
3535
try {
3636
executer.execute(cypher.trim());

cypher-shell/src/main/java/org/neo4j/shell/commands/Exit.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ public List<String> getAliases() {
5757
public void execute(@Nonnull final String argString) throws ExitException, CommandException {
5858
simpleArgParse(argString, 0, COMMAND_NAME, getUsage());
5959

60-
logger.printOut("Exiting. Bye bye.");
61-
6260
throw new ExitException(0);
6361
}
64-
6562
}

cypher-shell/src/test/java/org/neo4j/shell/CypherShellTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,9 @@ public void shouldReturnNothingOnStrangeCommand() {
242242
public void specifyingACypherStringShouldGiveAStringRunner() throws IOException {
243243
CliArgs cliArgs = CliArgHelper.parse("MATCH (n) RETURN n");
244244

245-
ShellRunner shellRunner = ShellRunner.getShellRunner(cliArgs, offlineTestShell, logger);
245+
ConnectionConfig connectionConfig = mock(ConnectionConfig.class);
246+
247+
ShellRunner shellRunner = ShellRunner.getShellRunner(cliArgs, offlineTestShell, logger, connectionConfig);
246248

247249
if (!(shellRunner instanceof StringShellRunner)) {
248250
fail("Expected a different runner than: " + shellRunner.getClass().getSimpleName());

cypher-shell/src/test/java/org/neo4j/shell/MainTest.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import static org.mockito.Mockito.mock;
2323
import static org.mockito.Mockito.times;
2424
import static org.mockito.Mockito.verify;
25-
import static org.mockito.Mockito.when;
26-
import static org.neo4j.shell.Main.getWelcomeMessage;
2725

2826
public class MainTest {
2927

@@ -228,15 +226,4 @@ public void printsVersionAndExits() throws Exception {
228226
verify(printStream).println(argument.capture());
229227
assertTrue(argument.getValue().matches("Cypher-Shell \\d+\\.\\d+\\.\\d+.*"));
230228
}
231-
232-
@Test
233-
public void welcomeMessageTest() {
234-
when(connectionConfig.username()).thenReturn("bob");
235-
when(connectionConfig.driverUrl()).thenReturn("bolt://some.place.com:99");
236-
237-
assertEquals("Connected to Neo4j 3.1.0-Beta99 at @|BOLD bolt://some.place.com:99|@ as user @|BOLD bob|@.\n" +
238-
"Type @|BOLD :help|@ for a list of available commands or @|BOLD :exit|@ to exit the shell.\n" +
239-
"Note that Cypher queries must end with a @|BOLD semicolon.|@",
240-
getWelcomeMessage(connectionConfig, "3.1.0-Beta99"));
241-
}
242229
}

0 commit comments

Comments
 (0)