From b4a1aa2d6c8ec8e09a2f40abfeca5c5d7553b901 Mon Sep 17 00:00:00 2001 From: shtramak Date: Wed, 4 Apr 2018 17:32:44 +0300 Subject: [PATCH] use pattern to handle a commands --- .../java/juja/sqlcmd/DatabaseManager.java | 2 + .../juja/sqlcmd/InMemoryDatabaseManager.java | 5 ++ .../java/juja/sqlcmd/JdbcDatabaseManager.java | 5 ++ src/main/java/juja/sqlcmd/Main.java | 2 +- .../sqlcmd/controller/CommandHandler.java | 50 +++++++++++++++++++ .../sqlcmd/controller/MainController.java | 17 ++++++- .../sqlcmd/controller/command/Command.java | 5 ++ .../controller/command/CommandType.java | 28 +++++++++++ .../sqlcmd/controller/command/Connect.java | 41 +++++++++++++++ .../juja/sqlcmd/controller/command/Exit.java | 30 +++++++++++ .../command/UnsupportedCommand.java | 16 ++++++ src/main/java/juja/sqlcmd/view/Console.java | 1 + 12 files changed, 199 insertions(+), 3 deletions(-) create mode 100644 src/main/java/juja/sqlcmd/controller/CommandHandler.java create mode 100644 src/main/java/juja/sqlcmd/controller/command/Command.java create mode 100644 src/main/java/juja/sqlcmd/controller/command/CommandType.java create mode 100644 src/main/java/juja/sqlcmd/controller/command/Connect.java create mode 100644 src/main/java/juja/sqlcmd/controller/command/Exit.java create mode 100644 src/main/java/juja/sqlcmd/controller/command/UnsupportedCommand.java diff --git a/src/main/java/juja/sqlcmd/DatabaseManager.java b/src/main/java/juja/sqlcmd/DatabaseManager.java index 3565792..867895c 100644 --- a/src/main/java/juja/sqlcmd/DatabaseManager.java +++ b/src/main/java/juja/sqlcmd/DatabaseManager.java @@ -16,4 +16,6 @@ public interface DatabaseManager { boolean update(String tableName, int id); void close() throws SQLException; + + boolean hasConnection(); } diff --git a/src/main/java/juja/sqlcmd/InMemoryDatabaseManager.java b/src/main/java/juja/sqlcmd/InMemoryDatabaseManager.java index 91a4526..88bcad9 100644 --- a/src/main/java/juja/sqlcmd/InMemoryDatabaseManager.java +++ b/src/main/java/juja/sqlcmd/InMemoryDatabaseManager.java @@ -65,6 +65,11 @@ public void close() throws SQLException { //NOP } + @Override + public boolean hasConnection() { + return true; + } + private Table tableByName(String tableName) { for (Table currentTable : tables) { if (currentTable.getTableName().equals(tableName)) { diff --git a/src/main/java/juja/sqlcmd/JdbcDatabaseManager.java b/src/main/java/juja/sqlcmd/JdbcDatabaseManager.java index 196fe2d..0b1e6ac 100644 --- a/src/main/java/juja/sqlcmd/JdbcDatabaseManager.java +++ b/src/main/java/juja/sqlcmd/JdbcDatabaseManager.java @@ -112,6 +112,11 @@ private DataSet[] tableRows(ResultSet resultSet, int rowSize, int tableSize) thr return tableData; } + @Override + public boolean hasConnection() { + return connection != null; + } + private int numberOfEntries(String tableName) throws SQLException { String sqlQuery = String.format("SELECT COUNT(*) as RECORDS FROM %s", tableName); try (Statement statement = connection.createStatement(); diff --git a/src/main/java/juja/sqlcmd/Main.java b/src/main/java/juja/sqlcmd/Main.java index 4c7f1cf..8d6fb37 100644 --- a/src/main/java/juja/sqlcmd/Main.java +++ b/src/main/java/juja/sqlcmd/Main.java @@ -11,4 +11,4 @@ public static void main(String[] args) { MainController controller = new MainController(view, databaseManager); controller.run(); } -} +} \ No newline at end of file diff --git a/src/main/java/juja/sqlcmd/controller/CommandHandler.java b/src/main/java/juja/sqlcmd/controller/CommandHandler.java new file mode 100644 index 0000000..76c5d8b --- /dev/null +++ b/src/main/java/juja/sqlcmd/controller/CommandHandler.java @@ -0,0 +1,50 @@ +package juja.sqlcmd.controller; + +import java.util.HashMap; +import java.util.Map; + +import juja.sqlcmd.DatabaseManager; +import juja.sqlcmd.controller.command.Command; +import juja.sqlcmd.controller.command.CommandType; +import juja.sqlcmd.controller.command.Connect; +import juja.sqlcmd.controller.command.Exit; +import juja.sqlcmd.controller.command.UnsupportedCommand; +import juja.sqlcmd.view.View; + +public class CommandHandler { + private View view; + private Map registeredCommands = new HashMap<>(); + private CommandType[] allCommandTypes; + + public CommandHandler(DatabaseManager databaseManager, View view) { + this.view = view; + register(CommandType.CONNECT, new Connect(databaseManager, view)); + register(CommandType.EXIT, new Exit(databaseManager, view)); + allCommandTypes = CommandType.values(); + } + + public void handleCommand(String strCommand) { + if (strCommand.toLowerCase().equals("help")) { + view.write("List of available commands to execute:"); + for (CommandType commandType : allCommandTypes) { + view.write(commandType.getDescription()); + } + } else { + Command command = getCommandByName(strCommand); + command.execute(); + } + } + + private Command getCommandByName(String commandName) { + for (CommandType commandType : allCommandTypes) { + if (commandName.toLowerCase().equals(commandType.getName())) { + return registeredCommands.get(commandType); + } + } + return new UnsupportedCommand(view); + } + + private void register(CommandType commandType, Command command) { + registeredCommands.put(commandType, command); + } +} \ No newline at end of file diff --git a/src/main/java/juja/sqlcmd/controller/MainController.java b/src/main/java/juja/sqlcmd/controller/MainController.java index e95e497..b4dd03e 100644 --- a/src/main/java/juja/sqlcmd/controller/MainController.java +++ b/src/main/java/juja/sqlcmd/controller/MainController.java @@ -12,7 +12,20 @@ public MainController(View view, DatabaseManager databaseManager) { this.databaseManager = databaseManager; } - public void run(){ - + public void run() { + CommandHandler handler = new CommandHandler(databaseManager, view); + view.write("Welcome to SqlCmd application!\n" + + "Please enter help to see a list of commands"); + view.write("-----"); + while (true) { + String command = view.read(); + handler.handleCommand(command); + if (command.toLowerCase().equals("exit")) { + view.write("Bye!"); + break; + } + view.write("-----"); + view.write("Please enter next command"); + } } } diff --git a/src/main/java/juja/sqlcmd/controller/command/Command.java b/src/main/java/juja/sqlcmd/controller/command/Command.java new file mode 100644 index 0000000..69759e0 --- /dev/null +++ b/src/main/java/juja/sqlcmd/controller/command/Command.java @@ -0,0 +1,5 @@ +package juja.sqlcmd.controller.command; + +public interface Command { + void execute(); +} \ No newline at end of file diff --git a/src/main/java/juja/sqlcmd/controller/command/CommandType.java b/src/main/java/juja/sqlcmd/controller/command/CommandType.java new file mode 100644 index 0000000..517000c --- /dev/null +++ b/src/main/java/juja/sqlcmd/controller/command/CommandType.java @@ -0,0 +1,28 @@ +package juja.sqlcmd.controller.command; + +public enum CommandType { + + CONNECT("connect", "\tconnect" + + System.lineSeparator() + + "\t\tconnection with database. Require to enter credentials"), + + EXIT("exit", "\texit" + + System.lineSeparator() + + "\t\tto exit from this session"); + + private String name; + private String description; + + CommandType(String name, String description) { + this.name = name; + this.description = description; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } +} \ No newline at end of file diff --git a/src/main/java/juja/sqlcmd/controller/command/Connect.java b/src/main/java/juja/sqlcmd/controller/command/Connect.java new file mode 100644 index 0000000..b9a8459 --- /dev/null +++ b/src/main/java/juja/sqlcmd/controller/command/Connect.java @@ -0,0 +1,41 @@ +package juja.sqlcmd.controller.command; + +import juja.sqlcmd.DatabaseManager; +import juja.sqlcmd.view.View; + +public class Connect implements Command { + private DatabaseManager databaseManager; + private View view; + + public Connect(DatabaseManager databaseManager, View view) { + this.databaseManager = databaseManager; + this.view = view; + } + + @Override + public void execute() { + if (databaseManager.hasConnection()) { + view.write("Connection already exists. To close current connection use Disconnect or Exit command"); + } else { + view.write("Please enter required data in format:\n" + + "databaseName|login|password|"); + String command = view.read(); + if (isCommandValid(command)) { + String[] splittedCommand = command.split("\\|"); + String dbName = splittedCommand[0]; + String login = splittedCommand[1]; + String password = splittedCommand[2]; + if (databaseManager.connect(dbName, login, password)) { + view.write("Successful connection to database " + dbName); + return; + } + } + view.write("Unsuccessful connection to database. Check if entered data is correct"); + } + } + + private boolean isCommandValid(String command) { + String[] splittedCommand = command.split("\\|"); + return splittedCommand.length == 3; + } +} diff --git a/src/main/java/juja/sqlcmd/controller/command/Exit.java b/src/main/java/juja/sqlcmd/controller/command/Exit.java new file mode 100644 index 0000000..a0860d9 --- /dev/null +++ b/src/main/java/juja/sqlcmd/controller/command/Exit.java @@ -0,0 +1,30 @@ +package juja.sqlcmd.controller.command; + +import java.sql.SQLException; + +import juja.sqlcmd.DatabaseManager; +import juja.sqlcmd.view.View; + +public final class Exit implements Command { + private DatabaseManager databaseManager; + private View view; + + public Exit(DatabaseManager databaseManager, View view) { + this.databaseManager = databaseManager; + this.view = view; + } + + @Override + public void execute() { + if (databaseManager.hasConnection()) { + try { + databaseManager.close(); + view.write("Connection is closed."); + } catch (SQLException e) { + view.write("Cannot close current connection! Reason: " + e.getMessage()); + } + } else { + view.write("There's no connection to close."); + } + } +} diff --git a/src/main/java/juja/sqlcmd/controller/command/UnsupportedCommand.java b/src/main/java/juja/sqlcmd/controller/command/UnsupportedCommand.java new file mode 100644 index 0000000..99f27f7 --- /dev/null +++ b/src/main/java/juja/sqlcmd/controller/command/UnsupportedCommand.java @@ -0,0 +1,16 @@ +package juja.sqlcmd.controller.command; + +import juja.sqlcmd.view.View; + +public class UnsupportedCommand implements Command { + private View view; + + public UnsupportedCommand(View view) { + this.view = view; + } + + @Override + public void execute() { + view.write("Entered command is not supported. Enter 'help' to see a list of available commands"); + } +} diff --git a/src/main/java/juja/sqlcmd/view/Console.java b/src/main/java/juja/sqlcmd/view/Console.java index cf6727a..0d59676 100644 --- a/src/main/java/juja/sqlcmd/view/Console.java +++ b/src/main/java/juja/sqlcmd/view/Console.java @@ -22,6 +22,7 @@ public Console(InputStream inputStream, OutputStream outputStream) { @Override public void write(String message) { try { + message += "\n"; outputStream.write(message.getBytes()); } catch (IOException e) { throw new RuntimeException("Something goes wrong with write method... Reason:" + e.getMessage());