From fc52f6ec8e26430c25bb1e4d1814621f1267521c Mon Sep 17 00:00:00 2001 From: Ivan Zinchenko Date: Tue, 2 Apr 2024 04:04:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=83=20execute=5Fscript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- Notes.md | 4 -- .../me/zinch/commands/CommandManager.java | 1 + .../java/me/zinch/commands/ExecuteScript.java | 58 +++++++++++++++++++ .../me/zinch/commands/UnknownCommand.java | 14 +++++ src/main/java/me/zinch/console/Console.java | 2 +- .../java/me/zinch/files/DbController.java | 2 + .../java/me/zinch/files/ScriptLoader.java | 29 ++++++++++ 8 files changed, 108 insertions(+), 6 deletions(-) delete mode 100644 Notes.md create mode 100644 src/main/java/me/zinch/commands/ExecuteScript.java create mode 100644 src/main/java/me/zinch/commands/UnknownCommand.java create mode 100644 src/main/java/me/zinch/files/ScriptLoader.java diff --git a/.gitignore b/.gitignore index 1771f2c..eef38ee 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,6 @@ bin/ .DS_Store ### Build ### -target \ No newline at end of file +target + +*.scr \ No newline at end of file diff --git a/Notes.md b/Notes.md deleted file mode 100644 index faf35ae..0000000 --- a/Notes.md +++ /dev/null @@ -1,4 +0,0 @@ -### Этапы работы программы - -1. Проверка файла с базой данных -2. Пользовательский ввод \ No newline at end of file diff --git a/src/main/java/me/zinch/commands/CommandManager.java b/src/main/java/me/zinch/commands/CommandManager.java index a10c707..90405b7 100644 --- a/src/main/java/me/zinch/commands/CommandManager.java +++ b/src/main/java/me/zinch/commands/CommandManager.java @@ -37,6 +37,7 @@ public class CommandManager { registerCommand(new AddIfMin()); registerCommand(new RemoveLower()); registerCommand(new Save()); + registerCommand(new ExecuteScript()); registerCommand(new Help()); } diff --git a/src/main/java/me/zinch/commands/ExecuteScript.java b/src/main/java/me/zinch/commands/ExecuteScript.java new file mode 100644 index 0000000..633b065 --- /dev/null +++ b/src/main/java/me/zinch/commands/ExecuteScript.java @@ -0,0 +1,58 @@ +package me.zinch.commands; + +import me.zinch.console.Console; +import me.zinch.files.ScriptLoader; +import me.zinch.wrapper.ProductCollection; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class ExecuteScript extends Command { + private static final List executeStack = new ArrayList<>(); + + private void addFileToStack(String filePath) { + executeStack.add(filePath); + } + + private void clearStack() { + executeStack.clear(); + } + + private boolean checkFileInStack(String filePath) { + return executeStack.contains(filePath); + } + + public ExecuteScript() { + super("execute_script file_name", "считать и исполнить скрипт из указанного файла. В скрипте содержатся команды в таком же виде, в котором их вводит пользователь в интерактивном режиме", Pattern.compile("^execute_script .+")); + } + + @Override + public void action(ProductCollection productCollection) { + try { + var scriptFile = Console.getLastCommand().split(" ")[1]; + addFileToStack(scriptFile); + var commandList = ScriptLoader.loadList(scriptFile); + for (var input: commandList) { + input = input.trim(); + var command = CommandManager.getCommandByInput(input); + if (command.isPresent()) { + Console.appendHistory(input); + if (command.get() instanceof ExecuteScript) { + var nextFile = input.split(" ")[0]; + if (checkFileInStack(nextFile)) continue; + addFileToStack(nextFile); + } + command.get().action(productCollection); + } else { + new UnknownCommand().action(productCollection); + } + } + clearStack(); + System.out.format("Скрипт %s завершил работу.%n", scriptFile); + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/src/main/java/me/zinch/commands/UnknownCommand.java b/src/main/java/me/zinch/commands/UnknownCommand.java new file mode 100644 index 0000000..2dfe2b5 --- /dev/null +++ b/src/main/java/me/zinch/commands/UnknownCommand.java @@ -0,0 +1,14 @@ +package me.zinch.commands; + +import me.zinch.wrapper.ProductCollection; + +public class UnknownCommand extends Command { + public UnknownCommand() { + super("", ""); + } + + @Override + public void action(ProductCollection productCollection) { + System.out.println("Команда не распознана."); + } +} diff --git a/src/main/java/me/zinch/console/Console.java b/src/main/java/me/zinch/console/Console.java index 75e2a04..6847dcd 100644 --- a/src/main/java/me/zinch/console/Console.java +++ b/src/main/java/me/zinch/console/Console.java @@ -23,7 +23,7 @@ public class Console { private static boolean isRunning = true; private static final List history = new ArrayList<>(); - private static void appendHistory(String input) { + public static void appendHistory(String input) { history.add(input); } diff --git a/src/main/java/me/zinch/files/DbController.java b/src/main/java/me/zinch/files/DbController.java index ef46f98..0c18499 100644 --- a/src/main/java/me/zinch/files/DbController.java +++ b/src/main/java/me/zinch/files/DbController.java @@ -48,6 +48,7 @@ public class DbController { try { BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path)); Products collection = xmlMapper.readValue(bufferedInputStream, Products.class); + bufferedInputStream.close(); return collection.getProducts(); } catch (FileNotFoundException e) { throw new FileNotFoundException("Не удалось найти файл " + path); @@ -62,6 +63,7 @@ public class DbController { try { OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(path)); xmlMapper.writeValue(outputStreamWriter, new Products(list)); + outputStreamWriter.close(); } catch (FileNotFoundException e) { throw new FileNotFoundException(e.getMessage()); } catch (IOException e) { diff --git a/src/main/java/me/zinch/files/ScriptLoader.java b/src/main/java/me/zinch/files/ScriptLoader.java new file mode 100644 index 0000000..8ec64d3 --- /dev/null +++ b/src/main/java/me/zinch/files/ScriptLoader.java @@ -0,0 +1,29 @@ +package me.zinch.files; + +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class ScriptLoader { + public static List loadList(String path) throws IOException { + try { + BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path)); + Scanner scanner = new Scanner(bufferedInputStream); + List list = new ArrayList<>(); + while (scanner.hasNextLine()) { + list.add(scanner.nextLine()); + } + bufferedInputStream.close(); + scanner.close(); + return list; + } catch (FileNotFoundException e) { + throw new FileNotFoundException(String.format("Файл %s не найден.", path)); + } catch (IOException e) { + throw new IOException("Произошла неожиданная ошибка во время работы с файлом!"); + } + } +}