From fc52f6ec8e26430c25bb1e4d1814621f1267521c Mon Sep 17 00:00:00 2001 From: Ivan Zinchenko Date: Tue, 2 Apr 2024 04:04:37 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=83=20execute=5Fscrip?= =?UTF-8?q?t?= 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("Произошла неожиданная ошибка во время работы с файлом!"); + } + } +} From 396c3d0a689d59d64f964778634bf481af22858e Mon Sep 17 00:00:00 2001 From: Ivan Zinchenko Date: Wed, 3 Apr 2024 10:43:58 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 +++++ src/main/java/me/zinch/App.java | 3 +++ src/main/java/me/zinch/commands/Add.java | 4 ++++ src/main/java/me/zinch/commands/AddIfMax.java | 4 ++++ src/main/java/me/zinch/commands/AddIfMin.java | 4 ++++ src/main/java/me/zinch/commands/Clear.java | 4 ++++ src/main/java/me/zinch/commands/Command.java | 3 +++ src/main/java/me/zinch/commands/CommandManager.java | 3 +++ src/main/java/me/zinch/commands/ExecuteScript.java | 3 +++ src/main/java/me/zinch/commands/Exit.java | 3 +++ src/main/java/me/zinch/commands/FilterContainsName.java | 3 +++ src/main/java/me/zinch/commands/Help.java | 3 +++ src/main/java/me/zinch/commands/Info.java | 3 +++ src/main/java/me/zinch/commands/PrintAscending.java | 3 +++ .../java/me/zinch/commands/PrintUniqueManufactureCost.java | 3 +++ src/main/java/me/zinch/commands/Remove.java | 3 +++ src/main/java/me/zinch/commands/RemoveLower.java | 3 +++ src/main/java/me/zinch/commands/Save.java | 3 +++ src/main/java/me/zinch/commands/Show.java | 3 +++ src/main/java/me/zinch/commands/UnknownCommand.java | 3 +++ src/main/java/me/zinch/commands/Update.java | 3 +++ src/main/java/me/zinch/console/Console.java | 4 ++++ src/main/java/me/zinch/console/ShutdownHook.java | 3 +++ .../java/me/zinch/exceptions/CommandActionException.java | 3 +++ .../java/me/zinch/exceptions/DbInitializationException.java | 3 +++ .../me/zinch/exceptions/IllegalProductDtoException.java | 3 +++ src/main/java/me/zinch/exceptions/ValidationException.java | 3 +++ src/main/java/me/zinch/files/DbController.java | 6 ++++++ src/main/java/me/zinch/files/ScriptLoader.java | 3 +++ src/main/java/me/zinch/models/Color.java | 3 +++ src/main/java/me/zinch/models/Coordinates.java | 3 +++ src/main/java/me/zinch/models/Location.java | 3 +++ src/main/java/me/zinch/models/Person.java | 3 +++ src/main/java/me/zinch/models/Product.java | 3 +++ src/main/java/me/zinch/models/ProductDTO.java | 3 +++ src/main/java/me/zinch/models/UnitOfMeasure.java | 3 +++ src/main/java/me/zinch/validator/NotEmpty.java | 3 +++ src/main/java/me/zinch/validator/NotEmptyValidator.java | 3 +++ src/main/java/me/zinch/validator/ValidateResult.java | 4 ++++ src/main/java/me/zinch/validator/Validators.java | 3 +++ src/main/java/me/zinch/wrapper/ProductCollection.java | 3 +++ 41 files changed, 134 insertions(+) diff --git a/pom.xml b/pom.xml index 31ccdfb..73f1f6f 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,11 @@ + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + diff --git a/src/main/java/me/zinch/App.java b/src/main/java/me/zinch/App.java index 473bff5..80dfc13 100644 --- a/src/main/java/me/zinch/App.java +++ b/src/main/java/me/zinch/App.java @@ -6,6 +6,9 @@ import me.zinch.exceptions.ValidationException; import java.io.IOException; +/** + * Main class for running the application. + */ public class App { public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new ShutdownHook()); diff --git a/src/main/java/me/zinch/commands/Add.java b/src/main/java/me/zinch/commands/Add.java index 2a866bf..96b68e8 100644 --- a/src/main/java/me/zinch/commands/Add.java +++ b/src/main/java/me/zinch/commands/Add.java @@ -6,6 +6,10 @@ import me.zinch.wrapper.ProductCollection; import java.util.regex.Pattern; +/** + * The Add class represents a command to add a new element to a collection. + * It extends the Command class. + */ public class Add extends Command { public Add() { super("add {element}", "добавить новый элемент в коллекцию", Pattern.compile("^add")); diff --git a/src/main/java/me/zinch/commands/AddIfMax.java b/src/main/java/me/zinch/commands/AddIfMax.java index 40e3c65..e9976a8 100644 --- a/src/main/java/me/zinch/commands/AddIfMax.java +++ b/src/main/java/me/zinch/commands/AddIfMax.java @@ -5,6 +5,10 @@ import me.zinch.wrapper.ProductCollection; import java.util.regex.Pattern; +/** + * The AddIfMax class represents a command to add a new element to a collection if its price value exceeds the maximum price value in the collection. + * It extends the Command class. + */ public class AddIfMax extends Command { public AddIfMax() { super("add_if_max {element}", "добавить новый элемент в коллекцию, если его значение цены превышает значение наибольшей цены этой коллекции", Pattern.compile("^add_if_max \\d+")); diff --git a/src/main/java/me/zinch/commands/AddIfMin.java b/src/main/java/me/zinch/commands/AddIfMin.java index 6613c79..bd771ad 100644 --- a/src/main/java/me/zinch/commands/AddIfMin.java +++ b/src/main/java/me/zinch/commands/AddIfMin.java @@ -5,6 +5,10 @@ import me.zinch.wrapper.ProductCollection; import java.util.regex.Pattern; +/** + * The AddIfMin class represents a command to add a new element to a collection if its price is lower than the lowest price in the collection. + * It extends the Command class. + */ public class AddIfMin extends Command { public AddIfMin() { super("add_if_min {element}", "добавить новый элемент в коллекцию, если его значение цены меньше, чем у наименьшей цены этой коллекции", Pattern.compile("^add_if_min \\d+")); diff --git a/src/main/java/me/zinch/commands/Clear.java b/src/main/java/me/zinch/commands/Clear.java index 72f5cd0..a37d261 100644 --- a/src/main/java/me/zinch/commands/Clear.java +++ b/src/main/java/me/zinch/commands/Clear.java @@ -2,6 +2,10 @@ package me.zinch.commands; import me.zinch.wrapper.ProductCollection; +/** + * The Clear class represents a command to clear a collection. + * It extends the Command class. + */ public class Clear extends Command { public Clear() { super("clear", "очистить коллекцию"); diff --git a/src/main/java/me/zinch/commands/Command.java b/src/main/java/me/zinch/commands/Command.java index b73b95d..7be2002 100644 --- a/src/main/java/me/zinch/commands/Command.java +++ b/src/main/java/me/zinch/commands/Command.java @@ -5,6 +5,9 @@ import me.zinch.wrapper.ProductCollection; import java.util.regex.Pattern; +/** + * Represents a command that can be executed. + */ public abstract class Command { private final String name; private final String description; diff --git a/src/main/java/me/zinch/commands/CommandManager.java b/src/main/java/me/zinch/commands/CommandManager.java index 90405b7..162591a 100644 --- a/src/main/java/me/zinch/commands/CommandManager.java +++ b/src/main/java/me/zinch/commands/CommandManager.java @@ -4,6 +4,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +/** + * Manages the registration and retrieval of commands. + */ public class CommandManager { private static final List commandList = new ArrayList<>(); diff --git a/src/main/java/me/zinch/commands/ExecuteScript.java b/src/main/java/me/zinch/commands/ExecuteScript.java index 633b065..da2dca6 100644 --- a/src/main/java/me/zinch/commands/ExecuteScript.java +++ b/src/main/java/me/zinch/commands/ExecuteScript.java @@ -9,6 +9,9 @@ import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; +/** + * A command to execute a script from a specified file. + */ public class ExecuteScript extends Command { private static final List executeStack = new ArrayList<>(); diff --git a/src/main/java/me/zinch/commands/Exit.java b/src/main/java/me/zinch/commands/Exit.java index 0dca810..eed702a 100644 --- a/src/main/java/me/zinch/commands/Exit.java +++ b/src/main/java/me/zinch/commands/Exit.java @@ -3,6 +3,9 @@ package me.zinch.commands; import me.zinch.console.Console; import me.zinch.wrapper.ProductCollection; +/** + * A command to exit the program without saving to a file. + */ public class Exit extends Command { public Exit() { super("exit", "завершить программу (без сохранения в файл)"); diff --git a/src/main/java/me/zinch/commands/FilterContainsName.java b/src/main/java/me/zinch/commands/FilterContainsName.java index 8176005..6a19abb 100644 --- a/src/main/java/me/zinch/commands/FilterContainsName.java +++ b/src/main/java/me/zinch/commands/FilterContainsName.java @@ -5,6 +5,9 @@ import me.zinch.wrapper.ProductCollection; import java.util.regex.Pattern; +/** + * A command to filter elements whose 'name' field contains the specified substring. + */ public class FilterContainsName extends Command { public FilterContainsName() { super("filter_contains_name name", "вывести элементы, значение поля name которых содержит заданную подстроку", Pattern.compile("^filter_contains_name \\w+")); diff --git a/src/main/java/me/zinch/commands/Help.java b/src/main/java/me/zinch/commands/Help.java index de5e820..1764564 100644 --- a/src/main/java/me/zinch/commands/Help.java +++ b/src/main/java/me/zinch/commands/Help.java @@ -2,6 +2,9 @@ package me.zinch.commands; import me.zinch.wrapper.ProductCollection; +/** + * A command to display help for available commands. + */ public class Help extends Command { public Help() { super("help", "вывести справку по доступным командам"); diff --git a/src/main/java/me/zinch/commands/Info.java b/src/main/java/me/zinch/commands/Info.java index f8fda66..fee7d01 100644 --- a/src/main/java/me/zinch/commands/Info.java +++ b/src/main/java/me/zinch/commands/Info.java @@ -2,6 +2,9 @@ package me.zinch.commands; import me.zinch.wrapper.ProductCollection; +/** + * A command to display information about the collection (type, initialization date, number of elements, etc.) to the standard output stream. + */ public class Info extends Command { public Info() { super("info", "вывести в стандартный поток вывода информацию о коллекции (тип, дата инициализации, количество элементов и т.д.)"); diff --git a/src/main/java/me/zinch/commands/PrintAscending.java b/src/main/java/me/zinch/commands/PrintAscending.java index b8db3ed..9f5c0f9 100644 --- a/src/main/java/me/zinch/commands/PrintAscending.java +++ b/src/main/java/me/zinch/commands/PrintAscending.java @@ -2,6 +2,9 @@ package me.zinch.commands; import me.zinch.wrapper.ProductCollection; +/** + * A command to print the elements of the collection in ascending order. + */ public class PrintAscending extends Command { public PrintAscending() { super("print_ascending", "вывести элементы коллекции в порядке возрастания"); diff --git a/src/main/java/me/zinch/commands/PrintUniqueManufactureCost.java b/src/main/java/me/zinch/commands/PrintUniqueManufactureCost.java index 966606c..0156e5b 100644 --- a/src/main/java/me/zinch/commands/PrintUniqueManufactureCost.java +++ b/src/main/java/me/zinch/commands/PrintUniqueManufactureCost.java @@ -2,6 +2,9 @@ package me.zinch.commands; import me.zinch.wrapper.ProductCollection; +/** + * A command to print the unique values of the 'manufactureCost' field of all elements in the collection. + */ public class PrintUniqueManufactureCost extends Command { public PrintUniqueManufactureCost() { super("print_unique_manufacture_cost", "вывести уникальные значения поля manufactureCost всех элементов в коллекции"); diff --git a/src/main/java/me/zinch/commands/Remove.java b/src/main/java/me/zinch/commands/Remove.java index 376da1a..c8ed072 100644 --- a/src/main/java/me/zinch/commands/Remove.java +++ b/src/main/java/me/zinch/commands/Remove.java @@ -5,6 +5,9 @@ import me.zinch.wrapper.ProductCollection; import java.util.regex.Pattern; +/** + * A command to remove an element from the collection by its id. + */ public class Remove extends Command { public Remove() { super("remove_by_id id", "удалить элемент из коллекции по его id", Pattern.compile("^remove_by_id \\d+")); diff --git a/src/main/java/me/zinch/commands/RemoveLower.java b/src/main/java/me/zinch/commands/RemoveLower.java index 9a7a2a6..bf06cc2 100644 --- a/src/main/java/me/zinch/commands/RemoveLower.java +++ b/src/main/java/me/zinch/commands/RemoveLower.java @@ -5,6 +5,9 @@ import me.zinch.wrapper.ProductCollection; import java.util.regex.Pattern; +/** + * A command to remove all elements from the collection that have ids lower than the specified id. + */ public class RemoveLower extends Command { public RemoveLower() { super("remove_lower id", "удалить из коллекции все элементы, меньшие, чем заданный по id", Pattern.compile("^remove_lower \\d+")); diff --git a/src/main/java/me/zinch/commands/Save.java b/src/main/java/me/zinch/commands/Save.java index 0ec205b..14c3c7f 100644 --- a/src/main/java/me/zinch/commands/Save.java +++ b/src/main/java/me/zinch/commands/Save.java @@ -6,6 +6,9 @@ import me.zinch.wrapper.ProductCollection; import java.io.IOException; +/** + * A command to save the collection to a file. + */ public class Save extends Command { public Save() { super("save", "сохранить коллекцию в файл"); diff --git a/src/main/java/me/zinch/commands/Show.java b/src/main/java/me/zinch/commands/Show.java index 3460ccb..6223901 100644 --- a/src/main/java/me/zinch/commands/Show.java +++ b/src/main/java/me/zinch/commands/Show.java @@ -2,6 +2,9 @@ package me.zinch.commands; import me.zinch.wrapper.ProductCollection; +/** + * A command to display all elements of the collection in string representation to the standard output stream. + */ public class Show extends Command { public Show() { super("show", "вывести в стандартный поток вывода все элементы коллекции в строковом представлении"); diff --git a/src/main/java/me/zinch/commands/UnknownCommand.java b/src/main/java/me/zinch/commands/UnknownCommand.java index 2dfe2b5..290e9be 100644 --- a/src/main/java/me/zinch/commands/UnknownCommand.java +++ b/src/main/java/me/zinch/commands/UnknownCommand.java @@ -2,6 +2,9 @@ package me.zinch.commands; import me.zinch.wrapper.ProductCollection; +/** + * Represents an unknown command. + */ public class UnknownCommand extends Command { public UnknownCommand() { super("", ""); diff --git a/src/main/java/me/zinch/commands/Update.java b/src/main/java/me/zinch/commands/Update.java index 8a4869c..3301089 100644 --- a/src/main/java/me/zinch/commands/Update.java +++ b/src/main/java/me/zinch/commands/Update.java @@ -5,6 +5,9 @@ import me.zinch.wrapper.ProductCollection; import java.util.regex.Pattern; +/** + * A command to update the value of an element in the collection, whose id is specified. + */ public class Update extends Command { public Update() { super("update id {element}", "обновить значение элемента коллекции, id которого равен заданному", Pattern.compile("^update \\d+")); diff --git a/src/main/java/me/zinch/console/Console.java b/src/main/java/me/zinch/console/Console.java index 6847dcd..a81fef0 100644 --- a/src/main/java/me/zinch/console/Console.java +++ b/src/main/java/me/zinch/console/Console.java @@ -18,6 +18,10 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.Scanner; +/** + Console class provides methods for interacting with the console, reading user input, and managing application flow. + This class includes methods for appending input history, stopping the application, reading product DTO from the console, and running the application loop. + */ public class Console { private static final Scanner scanner = new Scanner(System.in); private static boolean isRunning = true; diff --git a/src/main/java/me/zinch/console/ShutdownHook.java b/src/main/java/me/zinch/console/ShutdownHook.java index 91ca1fd..4f86ad0 100644 --- a/src/main/java/me/zinch/console/ShutdownHook.java +++ b/src/main/java/me/zinch/console/ShutdownHook.java @@ -1,5 +1,8 @@ package me.zinch.console; +/** + * Represents a shutdown hook that is executed when the application is stopped. + */ public class ShutdownHook extends Thread { public ShutdownHook() { super(new Thread(Console::stopApp)); diff --git a/src/main/java/me/zinch/exceptions/CommandActionException.java b/src/main/java/me/zinch/exceptions/CommandActionException.java index 9b780fb..35b98fa 100644 --- a/src/main/java/me/zinch/exceptions/CommandActionException.java +++ b/src/main/java/me/zinch/exceptions/CommandActionException.java @@ -1,5 +1,8 @@ package me.zinch.exceptions; +/** + * Represents an exception that occurs during the execution of a command action. + */ public class CommandActionException extends RuntimeException { public CommandActionException() { super("Ошибка во время выполнения команды"); diff --git a/src/main/java/me/zinch/exceptions/DbInitializationException.java b/src/main/java/me/zinch/exceptions/DbInitializationException.java index 1351143..2908270 100644 --- a/src/main/java/me/zinch/exceptions/DbInitializationException.java +++ b/src/main/java/me/zinch/exceptions/DbInitializationException.java @@ -2,6 +2,9 @@ package me.zinch.exceptions; import java.io.IOException; +/** + * Represents an exception that occurs when the database initialization fails. + */ public class DbInitializationException extends IOException { public DbInitializationException() { super("Ошибка! Не удалось инициализировать БД. Проверьте, что структура БД верна."); diff --git a/src/main/java/me/zinch/exceptions/IllegalProductDtoException.java b/src/main/java/me/zinch/exceptions/IllegalProductDtoException.java index e1c780a..e176b20 100644 --- a/src/main/java/me/zinch/exceptions/IllegalProductDtoException.java +++ b/src/main/java/me/zinch/exceptions/IllegalProductDtoException.java @@ -1,5 +1,8 @@ package me.zinch.exceptions; +/** + * Represents an exception that occurs when an illegal product DTO is encountered during the creation or modification of a product. + */ public class IllegalProductDtoException extends CommandActionException { public IllegalProductDtoException() { super("Ошибка при создании или изменении продукта. Были введены некорректные значения."); diff --git a/src/main/java/me/zinch/exceptions/ValidationException.java b/src/main/java/me/zinch/exceptions/ValidationException.java index 00b6ab9..adddd6a 100644 --- a/src/main/java/me/zinch/exceptions/ValidationException.java +++ b/src/main/java/me/zinch/exceptions/ValidationException.java @@ -1,5 +1,8 @@ package me.zinch.exceptions; +/** + * Represents an exception related to validation errors. + */ public class ValidationException extends jakarta.validation.ValidationException { public ValidationException() {} diff --git a/src/main/java/me/zinch/files/DbController.java b/src/main/java/me/zinch/files/DbController.java index 0c18499..c739e07 100644 --- a/src/main/java/me/zinch/files/DbController.java +++ b/src/main/java/me/zinch/files/DbController.java @@ -18,6 +18,9 @@ import java.io.OutputStreamWriter; import java.util.List; import java.util.Map; +/** + * The DbController class provides methods for loading and saving product data to a database file. + */ public class DbController { private static final XmlMapper xmlMapper = XmlMapper.builder().addModule(new JavaTimeModule()).build(); private static final String path; @@ -28,6 +31,9 @@ public class DbController { xmlMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL); } + /** + * Represents a collection of products. + */ private static class Products { @JacksonXmlElementWrapper(useWrapping = false) @JacksonXmlProperty(localName = "Product") diff --git a/src/main/java/me/zinch/files/ScriptLoader.java b/src/main/java/me/zinch/files/ScriptLoader.java index 8ec64d3..6de5445 100644 --- a/src/main/java/me/zinch/files/ScriptLoader.java +++ b/src/main/java/me/zinch/files/ScriptLoader.java @@ -8,6 +8,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +/** + * The ScriptLoader class provides methods to load scripts from files. + */ public class ScriptLoader { public static List loadList(String path) throws IOException { try { diff --git a/src/main/java/me/zinch/models/Color.java b/src/main/java/me/zinch/models/Color.java index c742d73..7c160e1 100644 --- a/src/main/java/me/zinch/models/Color.java +++ b/src/main/java/me/zinch/models/Color.java @@ -2,6 +2,9 @@ package me.zinch.models; import java.util.List; +/** + * Represents a color enumeration. + */ public enum Color { GREEN("Зелёный"), BLACK("Чёрный"), diff --git a/src/main/java/me/zinch/models/Coordinates.java b/src/main/java/me/zinch/models/Coordinates.java index 16c3b6c..4cd2a61 100644 --- a/src/main/java/me/zinch/models/Coordinates.java +++ b/src/main/java/me/zinch/models/Coordinates.java @@ -7,6 +7,9 @@ import jakarta.validation.constraints.NotNull; import java.util.Objects; +/** + * Represents coordinates with x and y values. + */ public class Coordinates { @Max(value = 883, message = "Coordinates: Максимальное значение координаты x: 883") @JsonProperty("x") diff --git a/src/main/java/me/zinch/models/Location.java b/src/main/java/me/zinch/models/Location.java index d2f2ae4..27a78c9 100644 --- a/src/main/java/me/zinch/models/Location.java +++ b/src/main/java/me/zinch/models/Location.java @@ -6,6 +6,9 @@ import me.zinch.validator.NotEmpty; import java.util.Objects; +/** + * Represents a location with x and y coordinates and a name. + */ public class Location { @JsonProperty("x") private float x; diff --git a/src/main/java/me/zinch/models/Person.java b/src/main/java/me/zinch/models/Person.java index 8e55e34..78eb8f3 100644 --- a/src/main/java/me/zinch/models/Person.java +++ b/src/main/java/me/zinch/models/Person.java @@ -7,6 +7,9 @@ import jakarta.validation.constraints.Size; import java.util.Objects; +/** + * Represents a person with a name, passport ID, hair color, and location. + */ public class Person { @NotBlank(message = "Person: Имя персоны не может быть пустым или null") @JsonProperty("name") diff --git a/src/main/java/me/zinch/models/Product.java b/src/main/java/me/zinch/models/Product.java index 48d6fa0..7718e7a 100644 --- a/src/main/java/me/zinch/models/Product.java +++ b/src/main/java/me/zinch/models/Product.java @@ -10,6 +10,9 @@ import me.zinch.validator.NotEmpty; import java.time.ZonedDateTime; import java.util.Objects; +/** + * Represents a product with various attributes such as ID, name, coordinates, creation date, price, part number, manufacture cost, unit of measure, and owner. + */ public class Product { @NotNull(message = "Product: Поле id не может быть null") @Min(value = 1, message = "Product: Значение поля id должно быть больше 0") diff --git a/src/main/java/me/zinch/models/ProductDTO.java b/src/main/java/me/zinch/models/ProductDTO.java index cbe9b1c..afd68b7 100644 --- a/src/main/java/me/zinch/models/ProductDTO.java +++ b/src/main/java/me/zinch/models/ProductDTO.java @@ -11,6 +11,9 @@ import me.zinch.validator.NotEmpty; import java.time.ZonedDateTime; +/** + * Represents a Data Transfer Object (DTO) for a product with attributes such as name, coordinates, price, part number, manufacture cost, unit of measure, and owner. + */ public class ProductDTO { @NotBlank(message = "Строка name не может быть пустой или null") @JsonProperty("name") diff --git a/src/main/java/me/zinch/models/UnitOfMeasure.java b/src/main/java/me/zinch/models/UnitOfMeasure.java index 43c6fb1..a5b734e 100644 --- a/src/main/java/me/zinch/models/UnitOfMeasure.java +++ b/src/main/java/me/zinch/models/UnitOfMeasure.java @@ -2,6 +2,9 @@ package me.zinch.models; import java.util.List; +/** + * Represents a unit of measure enumeration. + */ public enum UnitOfMeasure { KILOGRAMS("Килограммы"), CENTIMETERS("Сантиметры"), diff --git a/src/main/java/me/zinch/validator/NotEmpty.java b/src/main/java/me/zinch/validator/NotEmpty.java index 04bbb2a..24025ad 100644 --- a/src/main/java/me/zinch/validator/NotEmpty.java +++ b/src/main/java/me/zinch/validator/NotEmpty.java @@ -8,6 +8,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Annotation indicating that the annotated element must not be empty. + */ @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = NotEmptyValidator.class) diff --git a/src/main/java/me/zinch/validator/NotEmptyValidator.java b/src/main/java/me/zinch/validator/NotEmptyValidator.java index 21d22b2..b654006 100644 --- a/src/main/java/me/zinch/validator/NotEmptyValidator.java +++ b/src/main/java/me/zinch/validator/NotEmptyValidator.java @@ -3,6 +3,9 @@ package me.zinch.validator; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; +/** + * Validator implementation for the {@link NotEmpty} annotation, ensuring that the value is not empty. + */ public class NotEmptyValidator implements ConstraintValidator { @Override public boolean isValid(String value, ConstraintValidatorContext context) { diff --git a/src/main/java/me/zinch/validator/ValidateResult.java b/src/main/java/me/zinch/validator/ValidateResult.java index b103d98..c508b11 100644 --- a/src/main/java/me/zinch/validator/ValidateResult.java +++ b/src/main/java/me/zinch/validator/ValidateResult.java @@ -5,6 +5,10 @@ import jakarta.validation.ValidationException; import java.util.Set; +/** + * Represents the result of a validation process. + * @param the type of object being validated + */ public class ValidateResult { private final Set> violations; private final boolean isValid; diff --git a/src/main/java/me/zinch/validator/Validators.java b/src/main/java/me/zinch/validator/Validators.java index 29e719a..cba1d7a 100644 --- a/src/main/java/me/zinch/validator/Validators.java +++ b/src/main/java/me/zinch/validator/Validators.java @@ -8,6 +8,9 @@ import org.hibernate.validator.HibernateValidator; import java.util.List; +/** + * Utility class for performing validation operations on products. + */ public class Validators { private static final Validator validator; diff --git a/src/main/java/me/zinch/wrapper/ProductCollection.java b/src/main/java/me/zinch/wrapper/ProductCollection.java index 36da985..57d62ff 100644 --- a/src/main/java/me/zinch/wrapper/ProductCollection.java +++ b/src/main/java/me/zinch/wrapper/ProductCollection.java @@ -16,6 +16,9 @@ import java.util.Optional; import java.util.Set; import java.util.TreeSet; +/** + * Represents a collection of products. + */ public class ProductCollection { private final TreeSet productList; private Long idIncrementor; From 6d02493bc5198859a35ea25c22d8c914b8e339a9 Mon Sep 17 00:00:00 2001 From: Ivan Zinchenko Date: Wed, 3 Apr 2024 19:19:00 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/me/zinch/console/Console.java | 104 +++++++++++++----- .../exceptions/ColorFormatException.java | 11 ++ .../UnitOfMeasureFormatException.java | 11 ++ src/main/java/me/zinch/models/Color.java | 19 +++- .../java/me/zinch/models/UnitOfMeasure.java | 17 ++- 5 files changed, 123 insertions(+), 39 deletions(-) create mode 100644 src/main/java/me/zinch/exceptions/ColorFormatException.java create mode 100644 src/main/java/me/zinch/exceptions/UnitOfMeasureFormatException.java diff --git a/src/main/java/me/zinch/console/Console.java b/src/main/java/me/zinch/console/Console.java index a81fef0..127b18d 100644 --- a/src/main/java/me/zinch/console/Console.java +++ b/src/main/java/me/zinch/console/Console.java @@ -1,8 +1,10 @@ package me.zinch.console; import me.zinch.commands.CommandManager; +import me.zinch.exceptions.ColorFormatException; import me.zinch.exceptions.CommandActionException; import me.zinch.exceptions.IllegalProductDtoException; +import me.zinch.exceptions.UnitOfMeasureFormatException; import me.zinch.files.DbController; import me.zinch.models.Color; import me.zinch.models.Coordinates; @@ -14,6 +16,7 @@ import me.zinch.wrapper.ProductCollection; import java.io.IOException; import java.util.ArrayList; +import java.util.IllegalFormatConversionException; import java.util.List; import java.util.NoSuchElementException; import java.util.Scanner; @@ -40,50 +43,91 @@ public class Console { return history.get(history.size() - 1); } + + private static String readString() { + var input = scanner.nextLine().trim(); + return input.isEmpty() ? null : input; + } + + private static Long readLong() { + var input = scanner.nextLine().trim(); + try { + return Long.parseLong(input); + } catch (NumberFormatException e) { + return null; + } + } + + private static Color readColor() throws ColorFormatException { + System.out.format("Цвет волос(%s): ", Color.getColorsString()); + var input = readString(); + if (input == null || input.isEmpty()) return null; + try { + return Color.create(Integer.parseInt(input)); + } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { + try { + return Color.create(input); + } catch (IllegalArgumentException ex) { + throw new ColorFormatException(ex.getMessage()); + } + } + } + + private static UnitOfMeasure readUnitOfMeasure() throws UnitOfMeasureFormatException { + System.out.format("Единица измерения(%s): ", UnitOfMeasure.getUnitOfMeasuerString()); + var input = readString(); + try { + return UnitOfMeasure.create(Integer.parseInt(input)); + } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { + try { + return UnitOfMeasure.create(input); + } catch (IllegalArgumentException ex) { + throw new ColorFormatException(ex.getMessage()); + } + } + } + + private static Location readLocation() throws NumberFormatException { + System.out.print("Создать поле Location? (Y/n): "); + var input = readString(); + if (input != null && input.equalsIgnoreCase("n")) return null; + System.out.print("Координата x локации: "); + var locationX = Float.parseFloat(readString()); + System.out.print("Координата y локации: "); + var locationY = Integer.parseInt(readString()); + System.out.print("Название: "); + var locationName = readString(); + return new Location(locationX, locationY, locationName); + } + public static ProductDTO readProductDTO() throws IllegalProductDtoException { try { var productDTO = new ProductDTO(); System.out.println("Заполните следующие поля: "); System.out.print("Название: "); - productDTO.setName(scanner.nextLine().trim()); + productDTO.setName(readString()); System.out.print("Координата x: "); - long x = Long.parseLong(scanner.nextLine().trim()); + long x = readLong(); System.out.print("Координата y: "); - long y = Long.parseLong(scanner.nextLine().trim()); + long y = readLong(); productDTO.setCoordinates(new Coordinates(x, y)); System.out.print("Цена: "); - productDTO.setPrice(Long.parseLong(scanner.nextLine().trim())); + productDTO.setPrice(readLong()); System.out.print("Номер части: "); - productDTO.setPartNumber(scanner.nextLine().trim()); + productDTO.setPartNumber(readString()); System.out.print("Себестоимость: "); - productDTO.setManufactureCost(Long.parseLong(scanner.nextLine().trim())); - System.out.print("Единица измерения(Килограммы[0], Сантиметры[1], Граммы[2]): "); - try { - productDTO.setUnitOfMeasure(UnitOfMeasure.create(Integer.parseInt(scanner.nextLine().trim()))); - } catch (NumberFormatException e) { - productDTO.setUnitOfMeasure(UnitOfMeasure.create(scanner.nextLine().trim())); - } + productDTO.setManufactureCost(readLong()); + productDTO.setUnitOfMeasure(readUnitOfMeasure()); System.out.print("Имя владельца: "); - var ownerName = scanner.nextLine().trim(); + var ownerName = readString(); System.out.print("Данные паспорта: "); - var passportId = scanner.nextLine().trim(); - System.out.print("Цвет волос(Зелёный[0], Чёрный[1], Синий[2], Оранжевый[3], Белый[4]): "); - Color color; - try { - color = Color.create(Integer.parseInt(scanner.nextLine().trim())); - } catch (NumberFormatException e) { - color = Color.create(scanner.nextLine().trim()); - } - System.out.print("Координата x локации: "); - var locationX = Float.parseFloat(scanner.nextLine().trim()); - System.out.print("Координата y локации: "); - var locationY = Integer.parseInt(scanner.nextLine().trim()); - System.out.print("Название: "); - var locationName = scanner.nextLine().trim(); - - productDTO.setOwner(new Person(ownerName, passportId, color, new Location(locationX, locationY, locationName))); + var passportId = readString(); + Color color = readColor(); + productDTO.setOwner(new Person(ownerName, passportId, color, readLocation())); return productDTO; - } catch (NumberFormatException e) { + } catch (ColorFormatException | UnitOfMeasureFormatException e) { + throw new IllegalProductDtoException(e.getMessage()); + } catch (NumberFormatException | NullPointerException | IllegalFormatConversionException e) { throw new IllegalProductDtoException(); } } diff --git a/src/main/java/me/zinch/exceptions/ColorFormatException.java b/src/main/java/me/zinch/exceptions/ColorFormatException.java new file mode 100644 index 0000000..8bdf898 --- /dev/null +++ b/src/main/java/me/zinch/exceptions/ColorFormatException.java @@ -0,0 +1,11 @@ +package me.zinch.exceptions; + +public class ColorFormatException extends IllegalArgumentException { + public ColorFormatException() { + super(); + } + + public ColorFormatException(String message) { + super(message); + } +} diff --git a/src/main/java/me/zinch/exceptions/UnitOfMeasureFormatException.java b/src/main/java/me/zinch/exceptions/UnitOfMeasureFormatException.java new file mode 100644 index 0000000..9112345 --- /dev/null +++ b/src/main/java/me/zinch/exceptions/UnitOfMeasureFormatException.java @@ -0,0 +1,11 @@ +package me.zinch.exceptions; + +public class UnitOfMeasureFormatException extends IllegalArgumentException { + public UnitOfMeasureFormatException() { + super(); + } + + public UnitOfMeasureFormatException(String message) { + super(message); + } +} diff --git a/src/main/java/me/zinch/models/Color.java b/src/main/java/me/zinch/models/Color.java index 7c160e1..c615954 100644 --- a/src/main/java/me/zinch/models/Color.java +++ b/src/main/java/me/zinch/models/Color.java @@ -1,6 +1,8 @@ package me.zinch.models; +import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; /** * Represents a color enumeration. @@ -18,21 +20,28 @@ public enum Color { this.color = color; } - public String getColor() { + private String getColor() { return color; } - public static Color create(String input) { + public static Color create(String input) throws IllegalArgumentException { for (var unit : List.of(Color.values())) { - if (unit.getColor().toLowerCase() == input.toLowerCase()) return unit; + if (unit.getColor().equalsIgnoreCase(input)) return unit; } - return Color.BLUE; + throw new IllegalArgumentException("Не существует такого цвета"); } - public static Color create(Integer num) { + public static Color create(Integer num) throws ArrayIndexOutOfBoundsException { return Color.values()[num]; } + public static String getColorsString() { + AtomicInteger i = new AtomicInteger(); + return String.join(", ", Arrays.stream(Color.values()) + .map(color -> String.format("%s[%d]", color.getColor(), i.getAndIncrement())) + .toList()); + } + @Override public String toString() { return "Color{" + diff --git a/src/main/java/me/zinch/models/UnitOfMeasure.java b/src/main/java/me/zinch/models/UnitOfMeasure.java index a5b734e..cb1238b 100644 --- a/src/main/java/me/zinch/models/UnitOfMeasure.java +++ b/src/main/java/me/zinch/models/UnitOfMeasure.java @@ -1,6 +1,8 @@ package me.zinch.models; +import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; /** * Represents a unit of measure enumeration. @@ -20,17 +22,24 @@ public enum UnitOfMeasure { return unitOfMeasure; } - public static UnitOfMeasure create(String input) { + public static UnitOfMeasure create(String input) throws IllegalArgumentException { for (var unit : List.of(UnitOfMeasure.values())) { - if (unit.getUnitOfMeasure().toLowerCase() == input.toLowerCase()) return unit; + if (unit.getUnitOfMeasure().equalsIgnoreCase(input)) return unit; } - return UnitOfMeasure.KILOGRAMS; + throw new IllegalArgumentException("Не существует такой единицы измерения"); } - public static UnitOfMeasure create(Integer num) { + public static UnitOfMeasure create(Integer num) throws ArrayIndexOutOfBoundsException { return UnitOfMeasure.values()[num]; } + public static String getUnitOfMeasuerString() { + AtomicInteger i = new AtomicInteger(); + return String.join(", ", Arrays.stream(UnitOfMeasure.values()) + .map(unitOfMeasure -> String.format("%s[%d]", unitOfMeasure.getUnitOfMeasure(), i.getAndIncrement())) + .toList()); + } + @Override public String toString() {