From 8f546f426fdccd095cacfe745ac40a9a1eb1be77 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Sun, 29 Oct 2023 12:57:24 +0200 Subject: [PATCH] Add the CLI and entry point. --- .../kklochko/jdbc_hospital_example/Main.java | 19 +++ .../jdbc_hospital_example/cli/CLI.java | 133 ++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 src/main/java/space/kklochko/jdbc_hospital_example/Main.java create mode 100644 src/main/java/space/kklochko/jdbc_hospital_example/cli/CLI.java diff --git a/src/main/java/space/kklochko/jdbc_hospital_example/Main.java b/src/main/java/space/kklochko/jdbc_hospital_example/Main.java new file mode 100644 index 0000000..595a41d --- /dev/null +++ b/src/main/java/space/kklochko/jdbc_hospital_example/Main.java @@ -0,0 +1,19 @@ +package space.kklochko.jdbc_hospital_example; + +import space.kklochko.jdbc_hospital_example.cli.CLI; +import space.kklochko.jdbc_hospital_example.config.factories.LoadDataBaseConfigFromEnvFile; +import space.kklochko.jdbc_hospital_example.config.models.DataBaseConfig; +import space.kklochko.jdbc_hospital_example.db.factories.DataBaseConnection; + +import java.sql.*; + +public class Main { + public static void main(String[] args) throws SQLException { + DataBaseConfig db = (new LoadDataBaseConfigFromEnvFile()).load(); + DataBaseConnection dbc = new DataBaseConnection(db); + + CLI cli = new CLI(dbc); + cli.run(); + } +} + diff --git a/src/main/java/space/kklochko/jdbc_hospital_example/cli/CLI.java b/src/main/java/space/kklochko/jdbc_hospital_example/cli/CLI.java new file mode 100644 index 0000000..b2d0128 --- /dev/null +++ b/src/main/java/space/kklochko/jdbc_hospital_example/cli/CLI.java @@ -0,0 +1,133 @@ +package space.kklochko.jdbc_hospital_example.cli; + +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; +import space.kklochko.jdbc_hospital_example.cli.commands.CommandData; +import space.kklochko.jdbc_hospital_example.cli.commands.CommandEntities; +import space.kklochko.jdbc_hospital_example.cli.commands.CommandEntity; +import space.kklochko.jdbc_hospital_example.cli.commands.factories.CommandFactory; +import space.kklochko.jdbc_hospital_example.cli.commands.factories.ReadAllFactory; +import space.kklochko.jdbc_hospital_example.cli.parsers.CommandParser; +import space.kklochko.jdbc_hospital_example.cli.validators.InputStringFormatValidator; +import space.kklochko.jdbc_hospital_example.cli.validators.Validator; +import space.kklochko.jdbc_hospital_example.db.factories.DataBaseConnection; +import space.kklochko.jdbc_hospital_example.db.repositories.AbstractRepository; +import space.kklochko.jdbc_hospital_example.db.repositories.DepartmentRepository; +import space.kklochko.jdbc_hospital_example.db.repositories.IndicatorRepository; +import space.kklochko.jdbc_hospital_example.db.repositories.PatientRepository; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Scanner; +@Setter +@Getter +public class CLI { + private final String prompt = "> "; + private String state = "prompt"; + private final String help = "Help (help or h)\n" + + "Command format: `command {item}(arg1=value1, ...`\n\n" + + + "Commands: \n" + + "insert {item}({args}): \n" + + "update {item}({args}): \n" + + "readAll {item}: \n" + + "delete {item}(uuid='07c6e39e-727a-11ee-8e7b-c0e4349366ab'}).\n" + + + "Examples:\n" + + + "\nDepartment:\n" + + "\tinsert department(id='bcbbcdb4-702c-11ee-9113-c0e4349366cb', name='First department', location='Stepan Bandera Street', phone='380123451244')\n" + + "\tinsert department(name='First department', location='Stepan Bandera Street', phone='380123451244')\n" + + "\tupdate department(id='bcbbcdb4-702c-11ee-9113-c0e4349366cb', name='First department', location='Stepan Bandera Street', phone='380123451244')\n" + + "\treadAll department()\n" + + "\tremove department(id='bcbbcdb4-702c-11ee-9113-c0e4349366cb')\n" + + + "\nPatient:\n" + + "\tinsert patient(id='bcbbcdb4-702c-11ee-9113-c0e4349366bb', name='Oleh', age='21', phone='380123451234')\n" + + "\tinsert patient(name='Oleh', age='21', phone='380123451234')\n" + + "\tupdate patient(id='bcbbcdb4-702c-11ee-9113-c0e4349366bb', name='Oleh', age='21', phone='380123451234')\n" + + "\treadAll patient()\n" + + "\tremove patient(id='bcbbcdb4-702c-11ee-9113-c0e4349366bb')\n" + + + "\nIndicators:\n" + + "\tinsert indicator(id='07c6e39e-727a-11ee-8e7b-c0e4349366ab', type='blood245', values='well maybe', timestamp='2023-10-17 14:30:00')\n" + + "\tinsert indicator(type='blood246', values='well maybe', timestamp='2023-10-17 14:30:00')\n" + + "\tupdate indicator(id='07c6e39e-727a-11ee-8e7b-c0e4349366ab', type='blood247', values='well maybe', timestamp='2023-10-17 14:30:00')\n" + + "\treadAll indicator()\n" + + "\tremove indicator(id='07c6e39e-727a-11ee-8e7b-c0e4349366ab')\n"; + + DataBaseConnection dbc; + + public CLI(DataBaseConnection dbc) { + this.dbc = dbc; + } + + public void run() { + Scanner reader = new Scanner(System.in); + String line = ""; + CommandData commandData; + + while(true) { + if(getState() == "prompt") { + System.out.print(prompt); + setState("waitInput"); + }else if(getState() == "waitInput") { + line = reader.nextLine(); + setState("isHelp?"); + }else if(getState() == "isHelp?") { + if(line.equals("h") || line.equals("help")) { + System.out.println(help); + setState("prompt"); + }else { + setState("validate"); + } + } else if(getState() == "validate") { + ArrayList validators = new ArrayList<>(); + validators.add(new InputStringFormatValidator(line)); + + setState("run"); + + for (Validator validator : validators) { + if(!validator.isValid()) { + System.err.println(validator.getMessage()); + System.out.println(); + setState("prompt"); + } + } + } else if(getState() == "run") { + CommandParser commandParser = new CommandParser(); + commandData = commandParser.parse(line); + + runCommand(commandData); + setState("prompt"); + } + } + } + + public void runCommand(CommandData commandData) { + if(commandData.getName().equals("readAll")) { + ReadAllFactory factory = new ReadAllFactory(); + CommandEntities command = factory.create(commandData, getRepository(commandData)); + ArrayList items = command.run(); + + for(Iterator iter = command.run().iterator(); iter.hasNext(); ) { + System.out.println(iter.next()); + } + } else { + CommandFactory factory = new CommandFactory(); + CommandEntity command = factory.create(commandData, getRepository(commandData)); + command.run(); + } + } + + public AbstractRepository getRepository(@NonNull CommandData commandData) { + if(commandData.getDatatype().equals("indicator")) { + return new IndicatorRepository(dbc); + }else if(commandData.getDatatype().equals("patient")) { + return new PatientRepository(dbc); + }else { + return new DepartmentRepository(dbc); + } + } +}