From 42eda0db716fcd1ef1d690f8a7790e83ca38fce0 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Fri, 22 Aug 2025 14:24:28 +0300 Subject: [PATCH 01/11] ADD Console ADD DecoderCommand ADD EncoderCommand ADD ExceptionCatcher ADD InvalidInputException ADD MenuCommand ADD MenuController ADD WrongCommandException --- .../java/com/javarush/bakhtin/Console.java | 38 +++++++++++++++++++ .../javarush/bakhtin/ExceptionCatcher.java | 14 +++++++ .../com/javarush/bakhtin/MenuController.java | 23 +++++++++++ .../bakhtin/command/DecoderCommand.java | 7 ++++ .../bakhtin/command/EncoderCommand.java | 8 ++++ .../javarush/bakhtin/command/MenuCommand.java | 5 +++ .../exception/InvalidInputException.java | 14 +++++++ .../exception/WrongCommandException.java | 19 ++++++++++ 8 files changed, 128 insertions(+) create mode 100644 src/main/java/com/javarush/bakhtin/Console.java create mode 100644 src/main/java/com/javarush/bakhtin/ExceptionCatcher.java create mode 100644 src/main/java/com/javarush/bakhtin/MenuController.java create mode 100644 src/main/java/com/javarush/bakhtin/command/DecoderCommand.java create mode 100644 src/main/java/com/javarush/bakhtin/command/EncoderCommand.java create mode 100644 src/main/java/com/javarush/bakhtin/command/MenuCommand.java create mode 100644 src/main/java/com/javarush/bakhtin/exception/InvalidInputException.java create mode 100644 src/main/java/com/javarush/bakhtin/exception/WrongCommandException.java diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java new file mode 100644 index 0000000..e244f10 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -0,0 +1,38 @@ +package com.javarush.bakhtin; + +import com.javarush.bakhtin.exception.InvalidInputException; +import com.javarush.bakhtin.exception.WrongCommandException; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class Console { + + private static final String menuMessage = "Введите цифру, соответствующую команде:"; + private static final String encodeMessage = "Encode - 0"; + private static final String decodeMessage = "Decode - 1"; + private static final String keyInputMessage = "Введите ключ шифрования:"; + + private final MenuController menuController = new MenuController(); + + public void run() { + while (true) { + Scanner consoleInput = new Scanner(System.in); + System.out.println(menuMessage); + System.out.println(encodeMessage); + System.out.println(decodeMessage); + try { + int answer = consoleInput.nextInt(); + System.out.print(keyInputMessage); + int key = consoleInput.nextInt(); + menuController.control(answer, key); + break; + } catch (InputMismatchException e) { + throw new InvalidInputException("Error: not a number"); + } catch (WrongCommandException e){ + System.err.println(e.getClass().getSimpleName()); + System.err.println(e.getMessage()); + } + } + } +} diff --git a/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java b/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java new file mode 100644 index 0000000..dbcbff2 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java @@ -0,0 +1,14 @@ +package com.javarush.bakhtin; + +import com.javarush.bakhtin.exception.InvalidInputException; + +public class ExceptionCatcher { + public static void main(String[] args) { + try { + new Console().run(); + } catch (InvalidInputException e){ + System.err.println(e.getClass().getSimpleName()); + System.err.println(e.getMessage()); + } + } +} diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java new file mode 100644 index 0000000..92e8aa4 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -0,0 +1,23 @@ +package com.javarush.bakhtin; + +import com.javarush.bakhtin.command.DecoderCommand; +import com.javarush.bakhtin.command.EncoderCommand; +import com.javarush.bakhtin.command.MenuCommand; + +import java.util.HashMap; + +public class MenuController { + + HashMap menuItemMap = new HashMap<>(3); + + public MenuController() { + DecoderCommand decoderCommand = new DecoderCommand(); + EncoderCommand encoderCommand = new EncoderCommand(); + menuItemMap.put(0, decoderCommand); + menuItemMap.put(1, encoderCommand); + } + + public void control(int answer, int key) { + menuItemMap.get(answer).execute(key); + } +} diff --git a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java new file mode 100644 index 0000000..8d195ca --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java @@ -0,0 +1,7 @@ +package com.javarush.bakhtin.command; + +public class DecoderCommand implements MenuCommand { + public void execute(int key){ + + } +} diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java new file mode 100644 index 0000000..4f838b2 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -0,0 +1,8 @@ +package com.javarush.bakhtin.command; + +public class EncoderCommand implements MenuCommand { + + public void execute(int key) { + System.out.println("has"); + } +} diff --git a/src/main/java/com/javarush/bakhtin/command/MenuCommand.java b/src/main/java/com/javarush/bakhtin/command/MenuCommand.java new file mode 100644 index 0000000..5567d6b --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/command/MenuCommand.java @@ -0,0 +1,5 @@ +package com.javarush.bakhtin.command; + +public interface MenuCommand { + void execute(int key); +} diff --git a/src/main/java/com/javarush/bakhtin/exception/InvalidInputException.java b/src/main/java/com/javarush/bakhtin/exception/InvalidInputException.java new file mode 100644 index 0000000..bc7ec4b --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/exception/InvalidInputException.java @@ -0,0 +1,14 @@ +package com.javarush.bakhtin.exception; + +import java.util.InputMismatchException; + +public class InvalidInputException extends InputMismatchException { + public InvalidInputException() { + super(); + } + + public InvalidInputException(String message) { + super(message); + } + +} diff --git a/src/main/java/com/javarush/bakhtin/exception/WrongCommandException.java b/src/main/java/com/javarush/bakhtin/exception/WrongCommandException.java new file mode 100644 index 0000000..79f0569 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/exception/WrongCommandException.java @@ -0,0 +1,19 @@ +package com.javarush.bakhtin.exception; + +public class WrongCommandException extends RuntimeException { + public WrongCommandException() { + super(); + } + + public WrongCommandException(String message) { + super(message); + } + + public WrongCommandException(String message, Throwable cause) { + super(message, cause); + } + + public WrongCommandException(Throwable cause) { + super(cause); + } +} From e29e46f6bd003c976cb867b114da713684dadae4 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Sat, 23 Aug 2025 14:29:09 +0300 Subject: [PATCH 02/11] FIX --- .../java/com/javarush/bakhtin/Console.java | 38 ------------------- .../javarush/bakhtin/ExceptionCatcher.java | 7 ++-- .../com/javarush/bakhtin/MenuController.java | 5 ++- .../bakhtin/command/DecoderCommand.java | 3 +- .../bakhtin/command/EncoderCommand.java | 7 +++- .../javarush/bakhtin/command/ExitCommand.java | 8 ++++ .../com/javarush/bakhtin/console/Console.java | 28 ++++++++++++++ .../javarush/bakhtin/console/MenuPrinter.java | 20 ++++++++++ .../exception/InvalidInputException.java | 14 ------- .../exception/WrongCommandException.java | 19 ---------- 10 files changed, 72 insertions(+), 77 deletions(-) delete mode 100644 src/main/java/com/javarush/bakhtin/Console.java create mode 100644 src/main/java/com/javarush/bakhtin/command/ExitCommand.java create mode 100644 src/main/java/com/javarush/bakhtin/console/Console.java create mode 100644 src/main/java/com/javarush/bakhtin/console/MenuPrinter.java delete mode 100644 src/main/java/com/javarush/bakhtin/exception/InvalidInputException.java delete mode 100644 src/main/java/com/javarush/bakhtin/exception/WrongCommandException.java diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java deleted file mode 100644 index e244f10..0000000 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.javarush.bakhtin; - -import com.javarush.bakhtin.exception.InvalidInputException; -import com.javarush.bakhtin.exception.WrongCommandException; - -import java.util.InputMismatchException; -import java.util.Scanner; - -public class Console { - - private static final String menuMessage = "Введите цифру, соответствующую команде:"; - private static final String encodeMessage = "Encode - 0"; - private static final String decodeMessage = "Decode - 1"; - private static final String keyInputMessage = "Введите ключ шифрования:"; - - private final MenuController menuController = new MenuController(); - - public void run() { - while (true) { - Scanner consoleInput = new Scanner(System.in); - System.out.println(menuMessage); - System.out.println(encodeMessage); - System.out.println(decodeMessage); - try { - int answer = consoleInput.nextInt(); - System.out.print(keyInputMessage); - int key = consoleInput.nextInt(); - menuController.control(answer, key); - break; - } catch (InputMismatchException e) { - throw new InvalidInputException("Error: not a number"); - } catch (WrongCommandException e){ - System.err.println(e.getClass().getSimpleName()); - System.err.println(e.getMessage()); - } - } - } -} diff --git a/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java b/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java index dbcbff2..bfc03e1 100644 --- a/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java +++ b/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java @@ -1,14 +1,15 @@ package com.javarush.bakhtin; -import com.javarush.bakhtin.exception.InvalidInputException; +import com.javarush.bakhtin.console.Console; + public class ExceptionCatcher { public static void main(String[] args) { try { new Console().run(); - } catch (InvalidInputException e){ - System.err.println(e.getClass().getSimpleName()); + } catch (RuntimeException e){ System.err.println(e.getMessage()); + System.out.println(); } } } diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java index 92e8aa4..eabba63 100644 --- a/src/main/java/com/javarush/bakhtin/MenuController.java +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -2,19 +2,22 @@ import com.javarush.bakhtin.command.DecoderCommand; import com.javarush.bakhtin.command.EncoderCommand; +import com.javarush.bakhtin.command.ExitCommand; import com.javarush.bakhtin.command.MenuCommand; import java.util.HashMap; public class MenuController { - HashMap menuItemMap = new HashMap<>(3); + public static HashMap menuItemMap = new HashMap<>(3); public MenuController() { DecoderCommand decoderCommand = new DecoderCommand(); EncoderCommand encoderCommand = new EncoderCommand(); + ExitCommand exitCommand = new ExitCommand(); menuItemMap.put(0, decoderCommand); menuItemMap.put(1, encoderCommand); + menuItemMap.put(2, exitCommand); } public void control(int answer, int key) { diff --git a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java index 8d195ca..b51535a 100644 --- a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java @@ -2,6 +2,7 @@ public class DecoderCommand implements MenuCommand { public void execute(int key){ - + EncoderCommand encoderCommand = new EncoderCommand(); + encoderCommand.execute(key*-1); } } diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java index 4f838b2..f470e72 100644 --- a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -1,8 +1,13 @@ package com.javarush.bakhtin.command; +import java.io.FileReader; +import java.io.Reader; +import java.nio.file.Path; + public class EncoderCommand implements MenuCommand { public void execute(int key) { - System.out.println("has"); +// Path path = Path.of() +// Reader reader = new FileReader(); } } diff --git a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java new file mode 100644 index 0000000..24fa349 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java @@ -0,0 +1,8 @@ +package com.javarush.bakhtin.command; + +public class ExitCommand implements MenuCommand{ + @Override + public void execute(int key) { + System.out.print("Выход из программы..."); + } +} diff --git a/src/main/java/com/javarush/bakhtin/console/Console.java b/src/main/java/com/javarush/bakhtin/console/Console.java new file mode 100644 index 0000000..a84c480 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/console/Console.java @@ -0,0 +1,28 @@ +package com.javarush.bakhtin.console; + +import com.javarush.bakhtin.MenuController; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class Console { + + private final MenuController menuController = new MenuController(); + private static final String keyInputMessage = "Введите ключ шифрования:"; + + public void run() { + Scanner consoleInput = new Scanner(System.in); + MenuPrinter.print(); + try { + int answer = consoleInput.nextInt(); + if (answer<0 || answer>2) throw new RuntimeException("Error: incorrect answer"); + System.out.print(keyInputMessage); + int key = consoleInput.nextInt(); + menuController.control(answer, key); + + } catch (InputMismatchException e) { + throw new RuntimeException("Error: not a number"); + } + + } +} diff --git a/src/main/java/com/javarush/bakhtin/console/MenuPrinter.java b/src/main/java/com/javarush/bakhtin/console/MenuPrinter.java new file mode 100644 index 0000000..850f226 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/console/MenuPrinter.java @@ -0,0 +1,20 @@ +package com.javarush.bakhtin.console; + +import com.javarush.bakhtin.MenuController; +import com.javarush.bakhtin.command.MenuCommand; + +import java.util.Map; + +public class MenuPrinter { + + private static final String menuMessage = "Введите цифру, соответствующую команде:"; + + protected static void print(){ + System.out.println(menuMessage); + for (Map.Entry integerMenuCommandEntry : MenuController.menuItemMap.entrySet()) { + System.out.print(integerMenuCommandEntry.getValue().getClass().getSimpleName()); + System.out.print( " - "); + System.out.println(integerMenuCommandEntry.getKey()); + } + } +} diff --git a/src/main/java/com/javarush/bakhtin/exception/InvalidInputException.java b/src/main/java/com/javarush/bakhtin/exception/InvalidInputException.java deleted file mode 100644 index bc7ec4b..0000000 --- a/src/main/java/com/javarush/bakhtin/exception/InvalidInputException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.javarush.bakhtin.exception; - -import java.util.InputMismatchException; - -public class InvalidInputException extends InputMismatchException { - public InvalidInputException() { - super(); - } - - public InvalidInputException(String message) { - super(message); - } - -} diff --git a/src/main/java/com/javarush/bakhtin/exception/WrongCommandException.java b/src/main/java/com/javarush/bakhtin/exception/WrongCommandException.java deleted file mode 100644 index 79f0569..0000000 --- a/src/main/java/com/javarush/bakhtin/exception/WrongCommandException.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.javarush.bakhtin.exception; - -public class WrongCommandException extends RuntimeException { - public WrongCommandException() { - super(); - } - - public WrongCommandException(String message) { - super(message); - } - - public WrongCommandException(String message, Throwable cause) { - super(message, cause); - } - - public WrongCommandException(Throwable cause) { - super(cause); - } -} From 67a4c13546bdf95ed8957ae2d3c33c0cc35d2531 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Wed, 27 Aug 2025 12:50:26 +0300 Subject: [PATCH 03/11] ADD Caesar ADD CaesarParamReader ADD EncoderCommand ADD FileSystem FIX ALL --- pom.xml | 10 ++++ .../java/com/javarush/bakhtin/Caesar.java | 37 +++++++++++++++ .../java/com/javarush/bakhtin/Console.java | 23 +++++++++ .../java/com/javarush/bakhtin/FileSystem.java | 47 +++++++++++++++++++ .../com/javarush/bakhtin/MenuController.java | 27 +++++++---- .../{ExceptionCatcher.java => Runner.java} | 13 +++-- .../bakhtin/command/CaesarParamReader.java | 41 ++++++++++++++++ .../bakhtin/command/DecoderCommand.java | 17 +++++-- .../bakhtin/command/EncoderCommand.java | 19 +++++--- .../javarush/bakhtin/command/ExitCommand.java | 4 +- .../javarush/bakhtin/command/MenuCommand.java | 2 +- .../com/javarush/bakhtin/console/Console.java | 28 ----------- .../javarush/bakhtin/console/MenuPrinter.java | 20 -------- 13 files changed, 212 insertions(+), 76 deletions(-) create mode 100644 src/main/java/com/javarush/bakhtin/Caesar.java create mode 100644 src/main/java/com/javarush/bakhtin/Console.java create mode 100644 src/main/java/com/javarush/bakhtin/FileSystem.java rename src/main/java/com/javarush/bakhtin/{ExceptionCatcher.java => Runner.java} (55%) create mode 100644 src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java delete mode 100644 src/main/java/com/javarush/bakhtin/console/Console.java delete mode 100644 src/main/java/com/javarush/bakhtin/console/MenuPrinter.java diff --git a/pom.xml b/pom.xml index a519ba9..f750ea4 100644 --- a/pom.xml +++ b/pom.xml @@ -36,5 +36,15 @@ commons-math3 3.6.1 + + junit + junit + test + + + org.junit.jupiter + junit-jupiter + test + \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/Caesar.java b/src/main/java/com/javarush/bakhtin/Caesar.java new file mode 100644 index 0000000..3f13608 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/Caesar.java @@ -0,0 +1,37 @@ +package com.javarush.bakhtin; + +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; + +public class Caesar { + + private final int FIRST_UNICODE_LETTER = 9; + private final int LAST_UNICODE_LETTER = 1104; + private final int NUM_OF_UNICODE_LETTERS = LAST_UNICODE_LETTER - FIRST_UNICODE_LETTER; + + public void decode(int key, Path from, Path to) { + encode(-key, from, to); + } + + public void encode(int key, Path from, Path to) { + FileSystem fileSystem = new FileSystem(from, to); + try (FileReader reader = fileSystem.reader(); FileWriter writer = fileSystem.writer()) { + while (reader.ready()) { + int inputNum = reader.read(); + char resultChar = encodeChar(key, inputNum); + writer.write(resultChar); + } + System.out.println("Выполнение завершено!"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected char encodeChar(int key, int inputNum) { + int resultNum = (inputNum - FIRST_UNICODE_LETTER + key % NUM_OF_UNICODE_LETTERS + NUM_OF_UNICODE_LETTERS) % NUM_OF_UNICODE_LETTERS + FIRST_UNICODE_LETTER; + return (char) resultNum; + } + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java new file mode 100644 index 0000000..70819fd --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -0,0 +1,23 @@ +package com.javarush.bakhtin; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class Console { + + private final MenuController menuController = new MenuController(); + public static Scanner consoleInput = new Scanner(System.in); + + public void run() { + while (true) { + menuController.printCommands(); + try { + int answer = consoleInput.nextInt(); + if (answer < 1 || answer > 3) throw new RuntimeException("Error: incorrect answer"); + menuController.executeCommand(answer); + } catch (InputMismatchException e) { + throw new RuntimeException("Error: not a number"); + } + } + } +} diff --git a/src/main/java/com/javarush/bakhtin/FileSystem.java b/src/main/java/com/javarush/bakhtin/FileSystem.java new file mode 100644 index 0000000..4ef552f --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/FileSystem.java @@ -0,0 +1,47 @@ +package com.javarush.bakhtin; + +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class FileSystem { + + Path fromPath; + Path toPath; + + public FileSystem(Path fromPath, Path toPath) { + this.fromPath = fromPath; + this.toPath = toPath; + } + + public FileReader reader() { + try { + if (!Files.exists(fromPath)) { + Files.createFile(fromPath); + } + return new FileReader(fromPath.toFile()); + } catch (FileNotFoundException e) { + throw new RuntimeException("Error: file not found"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public FileWriter writer() { + try { + if (!Files.exists(toPath)) { + Files.createFile(toPath); + } + return new FileWriter(toPath.toFile()); + } catch (FileNotFoundException e) { + throw new RuntimeException("Error: file not found"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java index eabba63..97764b3 100644 --- a/src/main/java/com/javarush/bakhtin/MenuController.java +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -1,26 +1,35 @@ package com.javarush.bakhtin; -import com.javarush.bakhtin.command.DecoderCommand; -import com.javarush.bakhtin.command.EncoderCommand; -import com.javarush.bakhtin.command.ExitCommand; -import com.javarush.bakhtin.command.MenuCommand; +import com.javarush.bakhtin.command.*; import java.util.HashMap; public class MenuController { - public static HashMap menuItemMap = new HashMap<>(3); + private static final String menuMessage = "Введите цифру, соответствующую команде:"; + private static final HashMap menuItemMap = new HashMap<>(3); + public MenuController() { DecoderCommand decoderCommand = new DecoderCommand(); EncoderCommand encoderCommand = new EncoderCommand(); ExitCommand exitCommand = new ExitCommand(); - menuItemMap.put(0, decoderCommand); menuItemMap.put(1, encoderCommand); - menuItemMap.put(2, exitCommand); + menuItemMap.put(2, decoderCommand); + menuItemMap.put(3, exitCommand); + } + + public void executeCommand(int answer) { + menuItemMap.get(answer).execute(); } - public void control(int answer, int key) { - menuItemMap.get(answer).execute(key); + public void printCommands() { + System.out.println(menuMessage); + for (var menuItem : MenuController.menuItemMap.entrySet()) { + System.out.print(menuItem.getValue().getClass().getSimpleName()); + System.out.print(" - "); + System.out.println(menuItem.getKey()); + } } + } diff --git a/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java b/src/main/java/com/javarush/bakhtin/Runner.java similarity index 55% rename from src/main/java/com/javarush/bakhtin/ExceptionCatcher.java rename to src/main/java/com/javarush/bakhtin/Runner.java index bfc03e1..7749e1e 100644 --- a/src/main/java/com/javarush/bakhtin/ExceptionCatcher.java +++ b/src/main/java/com/javarush/bakhtin/Runner.java @@ -1,15 +1,14 @@ package com.javarush.bakhtin; -import com.javarush.bakhtin.console.Console; - - -public class ExceptionCatcher { +public class Runner { public static void main(String[] args) { + Console console = new Console(); try { - new Console().run(); - } catch (RuntimeException e){ + console.run(); + } catch (Exception e) { System.err.println(e.getMessage()); System.out.println(); + console.run(); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java new file mode 100644 index 0000000..079c312 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -0,0 +1,41 @@ +package com.javarush.bakhtin.command; + +import com.javarush.bakhtin.Console; + +import java.nio.file.Path; + +public class CaesarParamReader { + + private static final String keyInputMessage = "Введите ключ шифрования, по умолчанию - 1:"; + public static final String fromPathInputMessage = "Введите путь, откуда вы хотите считать данные или нажмите enter, чтобы использовать путь по умолчанию"; + public static final String toPathInputMessage = "Введите путь, куда вы хотите записать данные или нажмите enter, чтобы использовать путь по умолчанию"; + private static int key = 1; + + public static int getKeyFromUser() { + System.out.print(keyInputMessage); + int inputKey = Console.consoleInput.nextInt(); + if (inputKey != 0) { + key = inputKey; + } + return key; + } + + public static Path getFromPathFromUser(Path defaultFrom) { + System.out.println(fromPathInputMessage); + String consoleString = Console.consoleInput.nextLine(); + if (!consoleString.isEmpty()) { + defaultFrom = Path.of(consoleString); + } + return defaultFrom; + } + + public static Path getToPathFromUser(Path defaultFrom) { + System.out.println(toPathInputMessage); + String consoleString = Console.consoleInput.nextLine(); + if (!consoleString.isEmpty()) { + defaultFrom = Path.of(consoleString); + } + return defaultFrom; + } + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java index b51535a..13b62f2 100644 --- a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java @@ -1,8 +1,19 @@ package com.javarush.bakhtin.command; +import com.javarush.bakhtin.Caesar; + +import java.nio.file.Path; +import java.nio.file.Paths; + public class DecoderCommand implements MenuCommand { - public void execute(int key){ - EncoderCommand encoderCommand = new EncoderCommand(); - encoderCommand.execute(key*-1); + + Path defaultFromPath = Paths.get("text", "encrypted.txt"); + Path defaultToPath = Paths.get("text", "decrypted.txt"); + + public void execute() { + int key = CaesarParamReader.getKeyFromUser(); + Path from = CaesarParamReader.getFromPathFromUser(defaultFromPath); + Path to = CaesarParamReader.getToPathFromUser(defaultToPath); + new Caesar().decode(key, from, to); } } diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java index f470e72..2556ad6 100644 --- a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -1,13 +1,20 @@ package com.javarush.bakhtin.command; -import java.io.FileReader; -import java.io.Reader; +import com.javarush.bakhtin.Caesar; + import java.nio.file.Path; +import java.nio.file.Paths; public class EncoderCommand implements MenuCommand { - public void execute(int key) { -// Path path = Path.of() -// Reader reader = new FileReader(); + Path defaultFromPath = Paths.get("text", "text.txt"); + Path defaultToPath = Paths.get("text", "encrypted.txt"); + + public void execute() { + int key = CaesarParamReader.getKeyFromUser(); + Path from = CaesarParamReader.getFromPathFromUser(defaultFromPath); + Path to = CaesarParamReader.getToPathFromUser(defaultToPath); + new Caesar().encode(key, from, to); } -} + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java index 24fa349..7aa8568 100644 --- a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java @@ -1,8 +1,8 @@ package com.javarush.bakhtin.command; public class ExitCommand implements MenuCommand{ - @Override - public void execute(int key) { + public void execute() { System.out.print("Выход из программы..."); + System.exit(0); } } diff --git a/src/main/java/com/javarush/bakhtin/command/MenuCommand.java b/src/main/java/com/javarush/bakhtin/command/MenuCommand.java index 5567d6b..885f913 100644 --- a/src/main/java/com/javarush/bakhtin/command/MenuCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/MenuCommand.java @@ -1,5 +1,5 @@ package com.javarush.bakhtin.command; public interface MenuCommand { - void execute(int key); + void execute(); } diff --git a/src/main/java/com/javarush/bakhtin/console/Console.java b/src/main/java/com/javarush/bakhtin/console/Console.java deleted file mode 100644 index a84c480..0000000 --- a/src/main/java/com/javarush/bakhtin/console/Console.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.javarush.bakhtin.console; - -import com.javarush.bakhtin.MenuController; - -import java.util.InputMismatchException; -import java.util.Scanner; - -public class Console { - - private final MenuController menuController = new MenuController(); - private static final String keyInputMessage = "Введите ключ шифрования:"; - - public void run() { - Scanner consoleInput = new Scanner(System.in); - MenuPrinter.print(); - try { - int answer = consoleInput.nextInt(); - if (answer<0 || answer>2) throw new RuntimeException("Error: incorrect answer"); - System.out.print(keyInputMessage); - int key = consoleInput.nextInt(); - menuController.control(answer, key); - - } catch (InputMismatchException e) { - throw new RuntimeException("Error: not a number"); - } - - } -} diff --git a/src/main/java/com/javarush/bakhtin/console/MenuPrinter.java b/src/main/java/com/javarush/bakhtin/console/MenuPrinter.java deleted file mode 100644 index 850f226..0000000 --- a/src/main/java/com/javarush/bakhtin/console/MenuPrinter.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.javarush.bakhtin.console; - -import com.javarush.bakhtin.MenuController; -import com.javarush.bakhtin.command.MenuCommand; - -import java.util.Map; - -public class MenuPrinter { - - private static final String menuMessage = "Введите цифру, соответствующую команде:"; - - protected static void print(){ - System.out.println(menuMessage); - for (Map.Entry integerMenuCommandEntry : MenuController.menuItemMap.entrySet()) { - System.out.print(integerMenuCommandEntry.getValue().getClass().getSimpleName()); - System.out.print( " - "); - System.out.println(integerMenuCommandEntry.getKey()); - } - } -} From f40f3f1906b925d881df7f47f1ca9ad7056baac4 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Wed, 27 Aug 2025 16:40:00 +0300 Subject: [PATCH 04/11] FIX ALL --- src/main/java/com/javarush/bakhtin/Console.java | 2 +- .../java/com/javarush/bakhtin/FileSystem.java | 1 - .../com/javarush/bakhtin/MenuController.java | 6 ++++-- .../bakhtin/command/CaesarParamReader.java | 16 ++++++++++------ .../javarush/bakhtin/command/DecoderCommand.java | 7 ++++--- .../javarush/bakhtin/command/EncoderCommand.java | 7 ++++--- .../javarush/bakhtin/command/ExitCommand.java | 2 +- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java index 70819fd..079e27d 100644 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -12,7 +12,7 @@ public void run() { while (true) { menuController.printCommands(); try { - int answer = consoleInput.nextInt(); + int answer = Integer.parseInt(consoleInput.nextLine()); if (answer < 1 || answer > 3) throw new RuntimeException("Error: incorrect answer"); menuController.executeCommand(answer); } catch (InputMismatchException e) { diff --git a/src/main/java/com/javarush/bakhtin/FileSystem.java b/src/main/java/com/javarush/bakhtin/FileSystem.java index 4ef552f..54c0d56 100644 --- a/src/main/java/com/javarush/bakhtin/FileSystem.java +++ b/src/main/java/com/javarush/bakhtin/FileSystem.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; public class FileSystem { diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java index 97764b3..01c7a3d 100644 --- a/src/main/java/com/javarush/bakhtin/MenuController.java +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -1,6 +1,9 @@ package com.javarush.bakhtin; -import com.javarush.bakhtin.command.*; +import com.javarush.bakhtin.command.DecoderCommand; +import com.javarush.bakhtin.command.EncoderCommand; +import com.javarush.bakhtin.command.ExitCommand; +import com.javarush.bakhtin.command.MenuCommand; import java.util.HashMap; @@ -9,7 +12,6 @@ public class MenuController { private static final String menuMessage = "Введите цифру, соответствующую команде:"; private static final HashMap menuItemMap = new HashMap<>(3); - public MenuController() { DecoderCommand decoderCommand = new DecoderCommand(); EncoderCommand encoderCommand = new EncoderCommand(); diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java index 079c312..4d64ad5 100644 --- a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -1,5 +1,4 @@ package com.javarush.bakhtin.command; - import com.javarush.bakhtin.Console; import java.nio.file.Path; @@ -10,26 +9,32 @@ public class CaesarParamReader { public static final String fromPathInputMessage = "Введите путь, откуда вы хотите считать данные или нажмите enter, чтобы использовать путь по умолчанию"; public static final String toPathInputMessage = "Введите путь, куда вы хотите записать данные или нажмите enter, чтобы использовать путь по умолчанию"; private static int key = 1; + private static final CaesarParamReader instance = new CaesarParamReader(); + + public static CaesarParamReader getInstance() { + return instance; + } - public static int getKeyFromUser() { + public int getKeyFromUser() { System.out.print(keyInputMessage); - int inputKey = Console.consoleInput.nextInt(); + int inputKey = Integer.parseInt(Console.consoleInput.nextLine()); if (inputKey != 0) { key = inputKey; } return key; } - public static Path getFromPathFromUser(Path defaultFrom) { + public Path getFromPathFromUser(Path defaultFrom) { System.out.println(fromPathInputMessage); String consoleString = Console.consoleInput.nextLine(); + System.out.println("Путь: " + consoleString); if (!consoleString.isEmpty()) { defaultFrom = Path.of(consoleString); } return defaultFrom; } - public static Path getToPathFromUser(Path defaultFrom) { + public Path getToPathFromUser(Path defaultFrom) { System.out.println(toPathInputMessage); String consoleString = Console.consoleInput.nextLine(); if (!consoleString.isEmpty()) { @@ -37,5 +42,4 @@ public static Path getToPathFromUser(Path defaultFrom) { } return defaultFrom; } - } \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java index 13b62f2..838ad27 100644 --- a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java @@ -11,9 +11,10 @@ public class DecoderCommand implements MenuCommand { Path defaultToPath = Paths.get("text", "decrypted.txt"); public void execute() { - int key = CaesarParamReader.getKeyFromUser(); - Path from = CaesarParamReader.getFromPathFromUser(defaultFromPath); - Path to = CaesarParamReader.getToPathFromUser(defaultToPath); + var reader = CaesarParamReader.getInstance(); + int key = reader.getKeyFromUser(); + Path from = reader.getFromPathFromUser(defaultFromPath); + Path to = reader.getToPathFromUser(defaultToPath); new Caesar().decode(key, from, to); } } diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java index 2556ad6..7228943 100644 --- a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -11,9 +11,10 @@ public class EncoderCommand implements MenuCommand { Path defaultToPath = Paths.get("text", "encrypted.txt"); public void execute() { - int key = CaesarParamReader.getKeyFromUser(); - Path from = CaesarParamReader.getFromPathFromUser(defaultFromPath); - Path to = CaesarParamReader.getToPathFromUser(defaultToPath); + var reader = CaesarParamReader.getInstance(); + int key = reader.getKeyFromUser(); + Path from = reader.getFromPathFromUser(defaultFromPath); + Path to = reader.getToPathFromUser(defaultToPath); new Caesar().encode(key, from, to); } diff --git a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java index 7aa8568..b04f26a 100644 --- a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java @@ -1,6 +1,6 @@ package com.javarush.bakhtin.command; -public class ExitCommand implements MenuCommand{ +public class ExitCommand implements MenuCommand { public void execute() { System.out.print("Выход из программы..."); System.exit(0); From f05db39110ae06974d9ae3ccd3e14e895daef007 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Fri, 29 Aug 2025 14:21:22 +0300 Subject: [PATCH 05/11] FIX ALL --- .../java/com/javarush/bakhtin/Console.java | 4 +- .../com/javarush/bakhtin/MenuController.java | 9 +-- .../java/com/javarush/bakhtin/Runner.java | 8 +- .../javarush/bakhtin/command/BruteForce.java | 78 +++++++++++++++++++ .../bakhtin/command/CaesarParamReader.java | 60 +++++++++----- .../javarush/bakhtin/command/Constants.java | 11 +++ .../bakhtin/command/DecoderCommand.java | 9 +-- .../bakhtin/command/EncoderCommand.java | 8 +- .../javarush/bakhtin/command/ExitCommand.java | 2 +- 9 files changed, 145 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/javarush/bakhtin/command/BruteForce.java create mode 100644 src/main/java/com/javarush/bakhtin/command/Constants.java diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java index 079e27d..a3433ad 100644 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -16,7 +16,9 @@ public void run() { if (answer < 1 || answer > 3) throw new RuntimeException("Error: incorrect answer"); menuController.executeCommand(answer); } catch (InputMismatchException e) { - throw new RuntimeException("Error: not a number"); + System.err.println("Error: not a number"); + } catch (Exception e) { + System.err.println(e.getMessage()); } } } diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java index 01c7a3d..0ab68cc 100644 --- a/src/main/java/com/javarush/bakhtin/MenuController.java +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -1,9 +1,6 @@ package com.javarush.bakhtin; -import com.javarush.bakhtin.command.DecoderCommand; -import com.javarush.bakhtin.command.EncoderCommand; -import com.javarush.bakhtin.command.ExitCommand; -import com.javarush.bakhtin.command.MenuCommand; +import com.javarush.bakhtin.command.*; import java.util.HashMap; @@ -15,10 +12,12 @@ public class MenuController { public MenuController() { DecoderCommand decoderCommand = new DecoderCommand(); EncoderCommand encoderCommand = new EncoderCommand(); + BruteForce bruteForce = new BruteForce(); ExitCommand exitCommand = new ExitCommand(); menuItemMap.put(1, encoderCommand); menuItemMap.put(2, decoderCommand); - menuItemMap.put(3, exitCommand); + menuItemMap.put(3, bruteForce); + menuItemMap.put(4, exitCommand); } public void executeCommand(int answer) { diff --git a/src/main/java/com/javarush/bakhtin/Runner.java b/src/main/java/com/javarush/bakhtin/Runner.java index 7749e1e..283e4b9 100644 --- a/src/main/java/com/javarush/bakhtin/Runner.java +++ b/src/main/java/com/javarush/bakhtin/Runner.java @@ -3,12 +3,6 @@ public class Runner { public static void main(String[] args) { Console console = new Console(); - try { - console.run(); - } catch (Exception e) { - System.err.println(e.getMessage()); - System.out.println(); - console.run(); - } + console.run(); } } \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/BruteForce.java b/src/main/java/com/javarush/bakhtin/command/BruteForce.java new file mode 100644 index 0000000..e4b6eb5 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/command/BruteForce.java @@ -0,0 +1,78 @@ +package com.javarush.bakhtin.command; + +import com.javarush.bakhtin.Caesar; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class BruteForce implements MenuCommand { + + public static final Pattern PATTERN = Pattern.compile("[а-я]{4,20}"); + + Set wordSet = new HashSet<>(); + Set encodedWordList = new HashSet<>(); // TODO сделать обратно set + + CaesarParamReader caesarParamReader = new CaesarParamReader(); + Caesar caesar = new Caesar(); + + Path dictPath = caesarParamReader.getToDictFromUser(Constants.defaultDictPath); + Path encodedPath = caesarParamReader.getEncodedFromUser(Constants.defaultEncodedPath); + Path decodedPath = caesarParamReader.getDecodedFromUser(Constants.defaultDecodedPath); + + public void makeAWordList() { + try { + String dict = Files.readString(dictPath); + Matcher matcher = PATTERN.matcher(dict); + while (matcher.find()) { + wordSet.add(dict.substring(matcher.start(), matcher.end())); + } + System.out.println("wordList size " + wordSet.size()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void makeAWordListFromDecodedFile(Path path) { + try { + encodedWordList.clear(); + String text = new String(Files.readAllBytes(path)); + Matcher matcher = PATTERN.matcher(text); + while (matcher.find()) { + encodedWordList.add(text.substring(matcher.start(), matcher.end())); + } + System.out.println("encodedWordList size " + encodedWordList.size()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void execute() { + makeAWordList(); + System.out.println("Введите данные для шифрования данных"); + new EncoderCommand().execute(); + int maxNumOfMatches = 0; + int shiftOfMaxNumOfMatches = 0; + for (int shift = -5; shift <= 5; shift++) { + System.out.println("Старт " + shift); + caesar.decode(shift, encodedPath, decodedPath); + makeAWordListFromDecodedFile(decodedPath); + int findCounter = 0; + for (String string : encodedWordList) { + if (wordSet.contains(string)) { + findCounter++; + } + } + System.out.println("Стоп: найдено слов:" + findCounter); + if (findCounter > maxNumOfMatches) maxNumOfMatches = findCounter; + shiftOfMaxNumOfMatches = shift; + } + System.out.println(shiftOfMaxNumOfMatches); + caesar.decode(shiftOfMaxNumOfMatches, encodedPath, decodedPath); + System.out.println("Брутфорс завершен"); + System.out.println(); + } +} diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java index 4d64ad5..154d784 100644 --- a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -1,4 +1,5 @@ package com.javarush.bakhtin.command; + import com.javarush.bakhtin.Console; import java.nio.file.Path; @@ -6,8 +7,11 @@ public class CaesarParamReader { private static final String keyInputMessage = "Введите ключ шифрования, по умолчанию - 1:"; - public static final String fromPathInputMessage = "Введите путь, откуда вы хотите считать данные или нажмите enter, чтобы использовать путь по умолчанию"; - public static final String toPathInputMessage = "Введите путь, куда вы хотите записать данные или нажмите enter, чтобы использовать путь по умолчанию"; + private static final String fromPathInputMessage = "Введите путь, откуда вы хотите считать данные или нажмите enter, чтобы использовать путь по умолчанию"; + private static final String toPathInputMessage = "Введите путь, куда вы хотите записать готовые данные или нажмите enter, чтобы использовать путь по умолчанию"; + private static final String dictPathInputMessage = "Введите путь к словарю или нажмите enter, чтобы выбрать dict.txt"; + private static final String encodedPathInputMessage = "Введите путь к файлу или нажмите enter, чтобы выбрать encrypted.txt"; + private static final String decodedPathInputMessage = "Введите путь к файлу или нажмите enter, чтобы выбрать decrypted.txt"; private static int key = 1; private static final CaesarParamReader instance = new CaesarParamReader(); @@ -15,31 +19,51 @@ public static CaesarParamReader getInstance() { return instance; } + private Path checkForMessage(Path defaultPath) { + String consoleString = Console.consoleInput.nextLine(); + if (!consoleString.isEmpty()) { + defaultPath = Path.of(consoleString); + } + return defaultPath; + } + public int getKeyFromUser() { System.out.print(keyInputMessage); - int inputKey = Integer.parseInt(Console.consoleInput.nextLine()); - if (inputKey != 0) { - key = inputKey; + + try { + int inputKey = Integer.parseInt(Console.consoleInput.nextLine()); + if (inputKey != 0) { + key = inputKey; + } + return key; + } catch (NumberFormatException e) { + throw new RuntimeException("Error: not a number"); } - return key; } public Path getFromPathFromUser(Path defaultFrom) { System.out.println(fromPathInputMessage); - String consoleString = Console.consoleInput.nextLine(); - System.out.println("Путь: " + consoleString); - if (!consoleString.isEmpty()) { - defaultFrom = Path.of(consoleString); - } - return defaultFrom; + return checkForMessage(defaultFrom); } - public Path getToPathFromUser(Path defaultFrom) { + public Path getToPathFromUser(Path defaultTo) { System.out.println(toPathInputMessage); - String consoleString = Console.consoleInput.nextLine(); - if (!consoleString.isEmpty()) { - defaultFrom = Path.of(consoleString); - } - return defaultFrom; + return checkForMessage(defaultTo); + } + + public Path getToDictFromUser(Path defaultDict) { + System.out.println(dictPathInputMessage); + return checkForMessage(defaultDict); } + + public Path getEncodedFromUser(Path defaultEncodedPath) { + System.out.println(encodedPathInputMessage); + return checkForMessage(defaultEncodedPath); + } + + public Path getDecodedFromUser(Path defaultDecodedPath) { + System.out.println(decodedPathInputMessage); + return checkForMessage(defaultDecodedPath); + } + } \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/Constants.java b/src/main/java/com/javarush/bakhtin/command/Constants.java new file mode 100644 index 0000000..925ae52 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/command/Constants.java @@ -0,0 +1,11 @@ +package com.javarush.bakhtin.command; + +import java.nio.file.Path; +import java.nio.file.Paths; + +public class Constants { + protected static Path defaultDictPath = Paths.get("text", "dict.txt"); + protected static Path defaultEncodedPath = Paths.get("text", "encrypted.txt"); + protected static Path defaultDecodedPath = Paths.get("text", "decrypted.txt"); + protected static Path defaultTextPath = Paths.get("text", "text.txt"); +} \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java index 838ad27..d341aea 100644 --- a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java @@ -3,18 +3,15 @@ import com.javarush.bakhtin.Caesar; import java.nio.file.Path; -import java.nio.file.Paths; public class DecoderCommand implements MenuCommand { - Path defaultFromPath = Paths.get("text", "encrypted.txt"); - Path defaultToPath = Paths.get("text", "decrypted.txt"); - public void execute() { var reader = CaesarParamReader.getInstance(); int key = reader.getKeyFromUser(); - Path from = reader.getFromPathFromUser(defaultFromPath); - Path to = reader.getToPathFromUser(defaultToPath); + Path from = reader.getFromPathFromUser(Constants.defaultEncodedPath); + Path to = reader.getToPathFromUser(Constants.defaultDecodedPath); new Caesar().decode(key, from, to); } + } diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java index 7228943..55a979c 100644 --- a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -3,18 +3,14 @@ import com.javarush.bakhtin.Caesar; import java.nio.file.Path; -import java.nio.file.Paths; public class EncoderCommand implements MenuCommand { - Path defaultFromPath = Paths.get("text", "text.txt"); - Path defaultToPath = Paths.get("text", "encrypted.txt"); - public void execute() { var reader = CaesarParamReader.getInstance(); int key = reader.getKeyFromUser(); - Path from = reader.getFromPathFromUser(defaultFromPath); - Path to = reader.getToPathFromUser(defaultToPath); + Path from = reader.getFromPathFromUser(Constants.defaultTextPath); + Path to = reader.getToPathFromUser(Constants.defaultEncodedPath); new Caesar().encode(key, from, to); } diff --git a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java index b04f26a..87022ad 100644 --- a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java @@ -5,4 +5,4 @@ public void execute() { System.out.print("Выход из программы..."); System.exit(0); } -} +} \ No newline at end of file From 82ef80a451ad221b05deaddf35f051882b199c74 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Fri, 29 Aug 2025 17:54:27 +0300 Subject: [PATCH 06/11] FIX BruteForce.java FIX CaesarParamReader.java FIX Console.java FIX DecoderCommand.java FIX EncoderCommand.java DEL Constants.java --- .../java/com/javarush/bakhtin/Console.java | 4 +- .../javarush/bakhtin/command/BruteForce.java | 26 +++++------ .../bakhtin/command/CaesarParamReader.java | 43 +++++++++---------- .../javarush/bakhtin/command/Constants.java | 11 ----- .../bakhtin/command/DecoderCommand.java | 4 +- .../bakhtin/command/EncoderCommand.java | 7 ++- 6 files changed, 40 insertions(+), 55 deletions(-) delete mode 100644 src/main/java/com/javarush/bakhtin/command/Constants.java diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java index a3433ad..4b730f7 100644 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -6,14 +6,14 @@ public class Console { private final MenuController menuController = new MenuController(); - public static Scanner consoleInput = new Scanner(System.in); + public static final Scanner consoleInput = new Scanner(System.in); public void run() { while (true) { menuController.printCommands(); try { int answer = Integer.parseInt(consoleInput.nextLine()); - if (answer < 1 || answer > 3) throw new RuntimeException("Error: incorrect answer"); + if (answer < 1 || answer > 4) throw new RuntimeException("Error: incorrect answer"); menuController.executeCommand(answer); } catch (InputMismatchException e) { System.err.println("Error: not a number"); diff --git a/src/main/java/com/javarush/bakhtin/command/BruteForce.java b/src/main/java/com/javarush/bakhtin/command/BruteForce.java index e4b6eb5..58075ab 100644 --- a/src/main/java/com/javarush/bakhtin/command/BruteForce.java +++ b/src/main/java/com/javarush/bakhtin/command/BruteForce.java @@ -14,23 +14,18 @@ public class BruteForce implements MenuCommand { public static final Pattern PATTERN = Pattern.compile("[а-я]{4,20}"); Set wordSet = new HashSet<>(); - Set encodedWordList = new HashSet<>(); // TODO сделать обратно set + Set encodedWordSet = new HashSet<>(); - CaesarParamReader caesarParamReader = new CaesarParamReader(); - Caesar caesar = new Caesar(); - - Path dictPath = caesarParamReader.getToDictFromUser(Constants.defaultDictPath); - Path encodedPath = caesarParamReader.getEncodedFromUser(Constants.defaultEncodedPath); - Path decodedPath = caesarParamReader.getDecodedFromUser(Constants.defaultDecodedPath); + final CaesarParamReader caesarParamReader = new CaesarParamReader(); + final Caesar caesar = new Caesar(); public void makeAWordList() { try { - String dict = Files.readString(dictPath); + String dict = Files.readString(caesarParamReader.getDictFromUser()); Matcher matcher = PATTERN.matcher(dict); while (matcher.find()) { wordSet.add(dict.substring(matcher.start(), matcher.end())); } - System.out.println("wordList size " + wordSet.size()); } catch (IOException e) { throw new RuntimeException(e); } @@ -38,13 +33,12 @@ public void makeAWordList() { private void makeAWordListFromDecodedFile(Path path) { try { - encodedWordList.clear(); + encodedWordSet.clear(); String text = new String(Files.readAllBytes(path)); Matcher matcher = PATTERN.matcher(text); while (matcher.find()) { - encodedWordList.add(text.substring(matcher.start(), matcher.end())); + encodedWordSet.add(text.substring(matcher.start(), matcher.end())); } - System.out.println("encodedWordList size " + encodedWordList.size()); } catch (IOException e) { throw new RuntimeException(e); } @@ -52,16 +46,16 @@ private void makeAWordListFromDecodedFile(Path path) { public void execute() { makeAWordList(); - System.out.println("Введите данные для шифрования данных"); - new EncoderCommand().execute(); int maxNumOfMatches = 0; int shiftOfMaxNumOfMatches = 0; - for (int shift = -5; shift <= 5; shift++) { + Path encodedPath = caesarParamReader.getEncodedFromUser(); + Path decodedPath = caesarParamReader.getDecodedFromUser(); + for (int shift = -50; shift <= 50; shift++) { System.out.println("Старт " + shift); caesar.decode(shift, encodedPath, decodedPath); makeAWordListFromDecodedFile(decodedPath); int findCounter = 0; - for (String string : encodedWordList) { + for (String string : encodedWordSet) { if (wordSet.contains(string)) { findCounter++; } diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java index 154d784..60c3e6b 100644 --- a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -3,15 +3,19 @@ import com.javarush.bakhtin.Console; import java.nio.file.Path; +import java.nio.file.Paths; public class CaesarParamReader { private static final String keyInputMessage = "Введите ключ шифрования, по умолчанию - 1:"; - private static final String fromPathInputMessage = "Введите путь, откуда вы хотите считать данные или нажмите enter, чтобы использовать путь по умолчанию"; - private static final String toPathInputMessage = "Введите путь, куда вы хотите записать готовые данные или нажмите enter, чтобы использовать путь по умолчанию"; - private static final String dictPathInputMessage = "Введите путь к словарю или нажмите enter, чтобы выбрать dict.txt"; - private static final String encodedPathInputMessage = "Введите путь к файлу или нажмите enter, чтобы выбрать encrypted.txt"; - private static final String decodedPathInputMessage = "Введите путь к файлу или нажмите enter, чтобы выбрать decrypted.txt"; + private static final String fromPathInputMessage = "Введите путь, откуда вы хотите считать данные или нажмите enter, чтобы выбрать "; + private static final String dictPathInputMessage = "Введите путь к словарю или нажмите enter, чтобы выбрать "; + private static final String encodedPathInputMessage = "Введите путь к зашифрованному файлу или нажмите enter, чтобы выбрать "; + private static final String decodedPathInputMessage = "Введите путь к расшифрованному файлу или нажмите enter, чтобы выбрать "; + private static final Path defaultDictPath = Path.of("text", "dict.txt"); + private static final Path defaultEncodedPath = Path.of("text", "encrypted.txt"); + private static final Path defaultDecodedPath = Paths.get("text", "decrypted.txt"); + private static int key = 1; private static final CaesarParamReader instance = new CaesarParamReader(); @@ -19,7 +23,7 @@ public static CaesarParamReader getInstance() { return instance; } - private Path checkForMessage(Path defaultPath) { + private Path getPath(Path defaultPath) { String consoleString = Console.consoleInput.nextLine(); if (!consoleString.isEmpty()) { defaultPath = Path.of(consoleString); @@ -42,28 +46,23 @@ public int getKeyFromUser() { } public Path getFromPathFromUser(Path defaultFrom) { - System.out.println(fromPathInputMessage); - return checkForMessage(defaultFrom); - } - - public Path getToPathFromUser(Path defaultTo) { - System.out.println(toPathInputMessage); - return checkForMessage(defaultTo); + System.out.println(fromPathInputMessage + defaultFrom.getFileName()); + return getPath(defaultFrom); } - public Path getToDictFromUser(Path defaultDict) { - System.out.println(dictPathInputMessage); - return checkForMessage(defaultDict); + public Path getDictFromUser() { + System.out.println(dictPathInputMessage + defaultDictPath.getFileName()); + return getPath(defaultDictPath); } - public Path getEncodedFromUser(Path defaultEncodedPath) { - System.out.println(encodedPathInputMessage); - return checkForMessage(defaultEncodedPath); + public Path getEncodedFromUser() { + System.out.println(encodedPathInputMessage + defaultEncodedPath.getFileName()); + return getPath(defaultEncodedPath); } - public Path getDecodedFromUser(Path defaultDecodedPath) { - System.out.println(decodedPathInputMessage); - return checkForMessage(defaultDecodedPath); + public Path getDecodedFromUser() { + System.out.println(decodedPathInputMessage + defaultDecodedPath.getFileName()); + return getPath(defaultDecodedPath); } } \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/Constants.java b/src/main/java/com/javarush/bakhtin/command/Constants.java deleted file mode 100644 index 925ae52..0000000 --- a/src/main/java/com/javarush/bakhtin/command/Constants.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.javarush.bakhtin.command; - -import java.nio.file.Path; -import java.nio.file.Paths; - -public class Constants { - protected static Path defaultDictPath = Paths.get("text", "dict.txt"); - protected static Path defaultEncodedPath = Paths.get("text", "encrypted.txt"); - protected static Path defaultDecodedPath = Paths.get("text", "decrypted.txt"); - protected static Path defaultTextPath = Paths.get("text", "text.txt"); -} \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java index d341aea..044e9b4 100644 --- a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java @@ -9,8 +9,8 @@ public class DecoderCommand implements MenuCommand { public void execute() { var reader = CaesarParamReader.getInstance(); int key = reader.getKeyFromUser(); - Path from = reader.getFromPathFromUser(Constants.defaultEncodedPath); - Path to = reader.getToPathFromUser(Constants.defaultDecodedPath); + Path from = reader.getEncodedFromUser(); + Path to = reader.getDecodedFromUser(); new Caesar().decode(key, from, to); } diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java index 55a979c..57e8f9b 100644 --- a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -3,14 +3,17 @@ import com.javarush.bakhtin.Caesar; import java.nio.file.Path; +import java.nio.file.Paths; public class EncoderCommand implements MenuCommand { + private static final Path defaultTextPath = Paths.get("text", "text.txt"); + public void execute() { var reader = CaesarParamReader.getInstance(); int key = reader.getKeyFromUser(); - Path from = reader.getFromPathFromUser(Constants.defaultTextPath); - Path to = reader.getToPathFromUser(Constants.defaultEncodedPath); + Path from = reader.getFromPathFromUser(defaultTextPath); + Path to = reader.getEncodedFromUser(); new Caesar().encode(key, from, to); } From 6456079259f1aeea79aa63fe2856496e351cfb84 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Fri, 29 Aug 2025 18:02:31 +0300 Subject: [PATCH 07/11] FIX BruteForce.java FIX Caesar.java FIX CaesarParamReader.java FIX Console.java FIX FileSystem.java FIX MenuController.java --- src/main/java/com/javarush/bakhtin/Caesar.java | 2 +- src/main/java/com/javarush/bakhtin/Console.java | 2 +- src/main/java/com/javarush/bakhtin/FileSystem.java | 4 ++-- src/main/java/com/javarush/bakhtin/MenuController.java | 6 +++--- .../java/com/javarush/bakhtin/command/BruteForce.java | 10 +++++----- .../javarush/bakhtin/command/CaesarParamReader.java | 10 +++++----- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/javarush/bakhtin/Caesar.java b/src/main/java/com/javarush/bakhtin/Caesar.java index 3f13608..f0d1f2f 100644 --- a/src/main/java/com/javarush/bakhtin/Caesar.java +++ b/src/main/java/com/javarush/bakhtin/Caesar.java @@ -29,7 +29,7 @@ public void encode(int key, Path from, Path to) { } } - protected char encodeChar(int key, int inputNum) { + private char encodeChar(int key, int inputNum) { int resultNum = (inputNum - FIRST_UNICODE_LETTER + key % NUM_OF_UNICODE_LETTERS + NUM_OF_UNICODE_LETTERS) % NUM_OF_UNICODE_LETTERS + FIRST_UNICODE_LETTER; return (char) resultNum; } diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java index 4b730f7..7896588 100644 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -8,7 +8,7 @@ public class Console { private final MenuController menuController = new MenuController(); public static final Scanner consoleInput = new Scanner(System.in); - public void run() { + protected void run() { while (true) { menuController.printCommands(); try { diff --git a/src/main/java/com/javarush/bakhtin/FileSystem.java b/src/main/java/com/javarush/bakhtin/FileSystem.java index 54c0d56..bf27d63 100644 --- a/src/main/java/com/javarush/bakhtin/FileSystem.java +++ b/src/main/java/com/javarush/bakhtin/FileSystem.java @@ -9,8 +9,8 @@ public class FileSystem { - Path fromPath; - Path toPath; + private Path fromPath; + private Path toPath; public FileSystem(Path fromPath, Path toPath) { this.fromPath = fromPath; diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java index 0ab68cc..81f2656 100644 --- a/src/main/java/com/javarush/bakhtin/MenuController.java +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -9,7 +9,7 @@ public class MenuController { private static final String menuMessage = "Введите цифру, соответствующую команде:"; private static final HashMap menuItemMap = new HashMap<>(3); - public MenuController() { + protected MenuController() { DecoderCommand decoderCommand = new DecoderCommand(); EncoderCommand encoderCommand = new EncoderCommand(); BruteForce bruteForce = new BruteForce(); @@ -20,11 +20,11 @@ public MenuController() { menuItemMap.put(4, exitCommand); } - public void executeCommand(int answer) { + protected void executeCommand(int answer) { menuItemMap.get(answer).execute(); } - public void printCommands() { + protected void printCommands() { System.out.println(menuMessage); for (var menuItem : MenuController.menuItemMap.entrySet()) { System.out.print(menuItem.getValue().getClass().getSimpleName()); diff --git a/src/main/java/com/javarush/bakhtin/command/BruteForce.java b/src/main/java/com/javarush/bakhtin/command/BruteForce.java index 58075ab..e1cc502 100644 --- a/src/main/java/com/javarush/bakhtin/command/BruteForce.java +++ b/src/main/java/com/javarush/bakhtin/command/BruteForce.java @@ -13,13 +13,13 @@ public class BruteForce implements MenuCommand { public static final Pattern PATTERN = Pattern.compile("[а-я]{4,20}"); - Set wordSet = new HashSet<>(); - Set encodedWordSet = new HashSet<>(); + private Set wordSet = new HashSet<>(); + private Set encodedWordSet = new HashSet<>(); - final CaesarParamReader caesarParamReader = new CaesarParamReader(); - final Caesar caesar = new Caesar(); + private final CaesarParamReader caesarParamReader = new CaesarParamReader(); + private final Caesar caesar = new Caesar(); - public void makeAWordList() { + private void makeAWordList() { try { String dict = Files.readString(caesarParamReader.getDictFromUser()); Matcher matcher = PATTERN.matcher(dict); diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java index 60c3e6b..cf390db 100644 --- a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -31,7 +31,7 @@ private Path getPath(Path defaultPath) { return defaultPath; } - public int getKeyFromUser() { + protected int getKeyFromUser() { System.out.print(keyInputMessage); try { @@ -45,22 +45,22 @@ public int getKeyFromUser() { } } - public Path getFromPathFromUser(Path defaultFrom) { + protected Path getFromPathFromUser(Path defaultFrom) { System.out.println(fromPathInputMessage + defaultFrom.getFileName()); return getPath(defaultFrom); } - public Path getDictFromUser() { + protected Path getDictFromUser() { System.out.println(dictPathInputMessage + defaultDictPath.getFileName()); return getPath(defaultDictPath); } - public Path getEncodedFromUser() { + protected Path getEncodedFromUser() { System.out.println(encodedPathInputMessage + defaultEncodedPath.getFileName()); return getPath(defaultEncodedPath); } - public Path getDecodedFromUser() { + protected Path getDecodedFromUser() { System.out.println(decodedPathInputMessage + defaultDecodedPath.getFileName()); return getPath(defaultDecodedPath); } From eeaae09590c0e2cc249c22c4ae1244be87a3e16d Mon Sep 17 00:00:00 2001 From: igor Date: Fri, 29 Aug 2025 19:37:53 +0300 Subject: [PATCH 08/11] code review --- src/main/java/com/javarush/bakhtin/Caesar.java | 13 +++++++------ src/main/java/com/javarush/bakhtin/Console.java | 8 +++++++- .../java/com/javarush/bakhtin/FileSystem.java | 4 ++++ .../com/javarush/bakhtin/MenuController.java | 3 +++ .../com/javarush/bakhtin/command/BruteForce.java | 16 +++++++++++++--- .../bakhtin/command/CaesarParamReader.java | 2 ++ .../javarush/bakhtin/command/EncoderCommand.java | 3 +++ 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/javarush/bakhtin/Caesar.java b/src/main/java/com/javarush/bakhtin/Caesar.java index 3f13608..0d0eb3c 100644 --- a/src/main/java/com/javarush/bakhtin/Caesar.java +++ b/src/main/java/com/javarush/bakhtin/Caesar.java @@ -19,19 +19,20 @@ public void encode(int key, Path from, Path to) { FileSystem fileSystem = new FileSystem(from, to); try (FileReader reader = fileSystem.reader(); FileWriter writer = fileSystem.writer()) { while (reader.ready()) { - int inputNum = reader.read(); - char resultChar = encodeChar(key, inputNum); + int inputUnicodeCode = reader.read(); + char resultChar = encodeChar(key, inputUnicodeCode); writer.write(resultChar); } - System.out.println("Выполнение завершено!"); } catch (IOException e) { + // TODO выбрасывай IOException throw new RuntimeException(e); } } - protected char encodeChar(int key, int inputNum) { - int resultNum = (inputNum - FIRST_UNICODE_LETTER + key % NUM_OF_UNICODE_LETTERS + NUM_OF_UNICODE_LETTERS) % NUM_OF_UNICODE_LETTERS + FIRST_UNICODE_LETTER; - return (char) resultNum; + protected char encodeChar(int key, int unicodeCode) { + // TODO коментарий что это делает и как работает + return (char) ((unicodeCode - FIRST_UNICODE_LETTER + key % NUM_OF_UNICODE_LETTERS + NUM_OF_UNICODE_LETTERS) + % NUM_OF_UNICODE_LETTERS + FIRST_UNICODE_LETTER); } } \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java index 4b730f7..5a7e938 100644 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -3,17 +3,23 @@ import java.util.InputMismatchException; import java.util.Scanner; +// TODO вообще не нужный класс public class Console { private final MenuController menuController = new MenuController(); + // TODO плохо public public static final Scanner consoleInput = new Scanner(System.in); public void run() { while (true) { menuController.printCommands(); try { + // TODO menuController.getUserCommand int answer = Integer.parseInt(consoleInput.nextLine()); - if (answer < 1 || answer > 4) throw new RuntimeException("Error: incorrect answer"); + if (answer < 1 || answer > 4) { + throw new RuntimeException("Error: incorrect answer"); + } + menuController.executeCommand(answer); } catch (InputMismatchException e) { System.err.println("Error: not a number"); diff --git a/src/main/java/com/javarush/bakhtin/FileSystem.java b/src/main/java/com/javarush/bakhtin/FileSystem.java index 54c0d56..3bcb267 100644 --- a/src/main/java/com/javarush/bakhtin/FileSystem.java +++ b/src/main/java/com/javarush/bakhtin/FileSystem.java @@ -7,8 +7,10 @@ import java.nio.file.Files; import java.nio.file.Path; +// TODO отдельно FileReader и FileWriter public class FileSystem { + // TODO private!! Path fromPath; Path toPath; @@ -19,6 +21,7 @@ public FileSystem(Path fromPath, Path toPath) { public FileReader reader() { try { + // TODO зачем нам пустой файл - дожна быть ошибка и все if (!Files.exists(fromPath)) { Files.createFile(fromPath); } @@ -32,6 +35,7 @@ public FileReader reader() { public FileWriter writer() { try { + // TODO надо просто ВСЕГДА перезаписывать файл if (!Files.exists(toPath)) { Files.createFile(toPath); } diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java index 0ab68cc..27240c8 100644 --- a/src/main/java/com/javarush/bakhtin/MenuController.java +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -10,6 +10,7 @@ public class MenuController { private static final HashMap menuItemMap = new HashMap<>(3); public MenuController() { + // TODO переменные не нужны DecoderCommand decoderCommand = new DecoderCommand(); EncoderCommand encoderCommand = new EncoderCommand(); BruteForce bruteForce = new BruteForce(); @@ -20,6 +21,7 @@ public MenuController() { menuItemMap.put(4, exitCommand); } + public void executeCommand(int answer) { menuItemMap.get(answer).execute(); } @@ -27,6 +29,7 @@ public void executeCommand(int answer) { public void printCommands() { System.out.println(menuMessage); for (var menuItem : MenuController.menuItemMap.entrySet()) { + // TODO сделать красиво вывод имени команды getCommandName System.out.print(menuItem.getValue().getClass().getSimpleName()); System.out.print(" - "); System.out.println(menuItem.getKey()); diff --git a/src/main/java/com/javarush/bakhtin/command/BruteForce.java b/src/main/java/com/javarush/bakhtin/command/BruteForce.java index 58075ab..4271f61 100644 --- a/src/main/java/com/javarush/bakhtin/command/BruteForce.java +++ b/src/main/java/com/javarush/bakhtin/command/BruteForce.java @@ -11,19 +11,25 @@ public class BruteForce implements MenuCommand { + // TODO меньше public - private + // TODO что за pattern - WORD_PATTERN public static final Pattern PATTERN = Pattern.compile("[а-я]{4,20}"); + // TODO меньше public - private Set wordSet = new HashSet<>(); Set encodedWordSet = new HashSet<>(); + // TODO меньше public - private final CaesarParamReader caesarParamReader = new CaesarParamReader(); final Caesar caesar = new Caesar(); + // TODO rename сделать список слов из словаря public void makeAWordList() { try { String dict = Files.readString(caesarParamReader.getDictFromUser()); Matcher matcher = PATTERN.matcher(dict); while (matcher.find()) { + // TODO use matcher.group() wordSet.add(dict.substring(matcher.start(), matcher.end())); } } catch (IOException e) { @@ -34,9 +40,11 @@ public void makeAWordList() { private void makeAWordListFromDecodedFile(Path path) { try { encodedWordSet.clear(); + // TODO readString String text = new String(Files.readAllBytes(path)); Matcher matcher = PATTERN.matcher(text); while (matcher.find()) { + // TODO use matcher.group() encodedWordSet.add(text.substring(matcher.start(), matcher.end())); } } catch (IOException e) { @@ -50,6 +58,7 @@ public void execute() { int shiftOfMaxNumOfMatches = 0; Path encodedPath = caesarParamReader.getEncodedFromUser(); Path decodedPath = caesarParamReader.getDecodedFromUser(); + for (int shift = -50; shift <= 50; shift++) { System.out.println("Старт " + shift); caesar.decode(shift, encodedPath, decodedPath); @@ -61,12 +70,13 @@ public void execute() { } } System.out.println("Стоп: найдено слов:" + findCounter); - if (findCounter > maxNumOfMatches) maxNumOfMatches = findCounter; - shiftOfMaxNumOfMatches = shift; + if (findCounter > maxNumOfMatches) { + maxNumOfMatches = findCounter; + shiftOfMaxNumOfMatches = shift; + } } System.out.println(shiftOfMaxNumOfMatches); caesar.decode(shiftOfMaxNumOfMatches, encodedPath, decodedPath); System.out.println("Брутфорс завершен"); - System.out.println(); } } diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java index 60c3e6b..cdeaad8 100644 --- a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -26,6 +26,7 @@ public static CaesarParamReader getInstance() { private Path getPath(Path defaultPath) { String consoleString = Console.consoleInput.nextLine(); if (!consoleString.isEmpty()) { + // TODO defaultPath как входной параметр переопределять defaultPath = Path.of(consoleString); } return defaultPath; @@ -41,6 +42,7 @@ public int getKeyFromUser() { } return key; } catch (NumberFormatException e) { + // TODO Интерфейс польз должен быть на одном языке throw new RuntimeException("Error: not a number"); } } diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java index 57e8f9b..53afd77 100644 --- a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -11,9 +11,12 @@ public class EncoderCommand implements MenuCommand { public void execute() { var reader = CaesarParamReader.getInstance(); + int key = reader.getKeyFromUser(); + // TODO сделать как reader.getEncodedFromUser(); Path from = reader.getFromPathFromUser(defaultTextPath); Path to = reader.getEncodedFromUser(); + new Caesar().encode(key, from, to); } From 9509951b067e72624a873ad388023351d45411bf Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Sun, 31 Aug 2025 17:48:07 +0300 Subject: [PATCH 09/11] FIX ALL --- .../com/javarush/bakhtin/Application.java | 7 +++ .../java/com/javarush/bakhtin/Caesar.java | 12 ++-- .../java/com/javarush/bakhtin/Console.java | 10 +--- .../java/com/javarush/bakhtin/FileSystem.java | 50 ---------------- .../com/javarush/bakhtin/MenuController.java | 34 ++++++----- .../java/com/javarush/bakhtin/Runner.java | 8 --- .../javarush/bakhtin/command/BruteForce.java | 58 ++++++++----------- .../bakhtin/command/CaesarParamReader.java | 13 ++--- .../bakhtin/command/DecoderCommand.java | 9 ++- .../bakhtin/command/EncoderCommand.java | 10 +++- .../javarush/bakhtin/command/ExitCommand.java | 7 +++ .../javarush/bakhtin/command/MenuCommand.java | 7 ++- .../fileOperations/CaesarFileReader.java | 21 +++++++ .../fileOperations/CaesarFileWriter.java | 20 +++++++ .../bakhtin/fileOperations/FileSystem.java | 26 +++++++++ 15 files changed, 157 insertions(+), 135 deletions(-) create mode 100644 src/main/java/com/javarush/bakhtin/Application.java delete mode 100644 src/main/java/com/javarush/bakhtin/FileSystem.java delete mode 100644 src/main/java/com/javarush/bakhtin/Runner.java create mode 100644 src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileReader.java create mode 100644 src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileWriter.java create mode 100644 src/main/java/com/javarush/bakhtin/fileOperations/FileSystem.java diff --git a/src/main/java/com/javarush/bakhtin/Application.java b/src/main/java/com/javarush/bakhtin/Application.java new file mode 100644 index 0000000..c0e0040 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/Application.java @@ -0,0 +1,7 @@ +package com.javarush.bakhtin; + +public class Application { + public static void main(String[] args) { + new Console().run(); + } +} \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/Caesar.java b/src/main/java/com/javarush/bakhtin/Caesar.java index 0d0eb3c..4dfb31d 100644 --- a/src/main/java/com/javarush/bakhtin/Caesar.java +++ b/src/main/java/com/javarush/bakhtin/Caesar.java @@ -1,5 +1,7 @@ package com.javarush.bakhtin; +import com.javarush.bakhtin.fileOperations.FileSystem; + import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; @@ -11,11 +13,11 @@ public class Caesar { private final int LAST_UNICODE_LETTER = 1104; private final int NUM_OF_UNICODE_LETTERS = LAST_UNICODE_LETTER - FIRST_UNICODE_LETTER; - public void decode(int key, Path from, Path to) { + public void decode(int key, Path from, Path to) throws IOException { encode(-key, from, to); } - public void encode(int key, Path from, Path to) { + public void encode(int key, Path from, Path to) throws IOException { FileSystem fileSystem = new FileSystem(from, to); try (FileReader reader = fileSystem.reader(); FileWriter writer = fileSystem.writer()) { while (reader.ready()) { @@ -23,16 +25,12 @@ public void encode(int key, Path from, Path to) { char resultChar = encodeChar(key, inputUnicodeCode); writer.write(resultChar); } - } catch (IOException e) { - // TODO выбрасывай IOException - throw new RuntimeException(e); } } protected char encodeChar(int key, int unicodeCode) { - // TODO коментарий что это делает и как работает return (char) ((unicodeCode - FIRST_UNICODE_LETTER + key % NUM_OF_UNICODE_LETTERS + NUM_OF_UNICODE_LETTERS) - % NUM_OF_UNICODE_LETTERS + FIRST_UNICODE_LETTER); + % NUM_OF_UNICODE_LETTERS + FIRST_UNICODE_LETTER); // Общая формула для циклического сдвига } } \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java index 9feca74..6b1769e 100644 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -1,25 +1,17 @@ package com.javarush.bakhtin; import java.util.InputMismatchException; -import java.util.Scanner; // TODO вообще не нужный класс public class Console { private final MenuController menuController = new MenuController(); - // TODO плохо public - public static final Scanner consoleInput = new Scanner(System.in); protected void run() { while (true) { menuController.printCommands(); try { - // TODO menuController.getUserCommand - int answer = Integer.parseInt(consoleInput.nextLine()); - if (answer < 1 || answer > 4) { - throw new RuntimeException("Error: incorrect answer"); - } - + int answer = menuController.getUserCommand(); menuController.executeCommand(answer); } catch (InputMismatchException e) { System.err.println("Error: not a number"); diff --git a/src/main/java/com/javarush/bakhtin/FileSystem.java b/src/main/java/com/javarush/bakhtin/FileSystem.java deleted file mode 100644 index 3bcb267..0000000 --- a/src/main/java/com/javarush/bakhtin/FileSystem.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.javarush.bakhtin; - -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -// TODO отдельно FileReader и FileWriter -public class FileSystem { - - // TODO private!! - Path fromPath; - Path toPath; - - public FileSystem(Path fromPath, Path toPath) { - this.fromPath = fromPath; - this.toPath = toPath; - } - - public FileReader reader() { - try { - // TODO зачем нам пустой файл - дожна быть ошибка и все - if (!Files.exists(fromPath)) { - Files.createFile(fromPath); - } - return new FileReader(fromPath.toFile()); - } catch (FileNotFoundException e) { - throw new RuntimeException("Error: file not found"); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public FileWriter writer() { - try { - // TODO надо просто ВСЕГДА перезаписывать файл - if (!Files.exists(toPath)) { - Files.createFile(toPath); - } - return new FileWriter(toPath.toFile()); - } catch (FileNotFoundException e) { - throw new RuntimeException("Error: file not found"); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java index 27240c8..a409056 100644 --- a/src/main/java/com/javarush/bakhtin/MenuController.java +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -2,38 +2,42 @@ import com.javarush.bakhtin.command.*; +import java.io.IOException; import java.util.HashMap; +import java.util.Scanner; public class MenuController { + private static final Scanner consoleInput = new Scanner(System.in); + private static final String menuMessage = "Введите цифру, соответствующую команде:"; private static final HashMap menuItemMap = new HashMap<>(3); - public MenuController() { - // TODO переменные не нужны - DecoderCommand decoderCommand = new DecoderCommand(); - EncoderCommand encoderCommand = new EncoderCommand(); - BruteForce bruteForce = new BruteForce(); - ExitCommand exitCommand = new ExitCommand(); - menuItemMap.put(1, encoderCommand); - menuItemMap.put(2, decoderCommand); - menuItemMap.put(3, bruteForce); - menuItemMap.put(4, exitCommand); + protected MenuController() { + menuItemMap.put(1, new EncoderCommand()); + menuItemMap.put(2, new DecoderCommand()); + menuItemMap.put(3, new BruteForce()); + menuItemMap.put(4, new ExitCommand()); } - - public void executeCommand(int answer) { + protected void executeCommand(int answer) throws IOException { menuItemMap.get(answer).execute(); } - public void printCommands() { + protected void printCommands() { System.out.println(menuMessage); for (var menuItem : MenuController.menuItemMap.entrySet()) { - // TODO сделать красиво вывод имени команды getCommandName - System.out.print(menuItem.getValue().getClass().getSimpleName()); + System.out.print(menuItem.getValue().getCommandName()); System.out.print(" - "); System.out.println(menuItem.getKey()); } } + public int getUserCommand() { + int answer = Integer.parseInt(consoleInput.nextLine()); + if (answer < 1 || answer > 4) { + throw new RuntimeException("Error: incorrect answer"); + } + return answer; + } } diff --git a/src/main/java/com/javarush/bakhtin/Runner.java b/src/main/java/com/javarush/bakhtin/Runner.java deleted file mode 100644 index 283e4b9..0000000 --- a/src/main/java/com/javarush/bakhtin/Runner.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.javarush.bakhtin; - -public class Runner { - public static void main(String[] args) { - Console console = new Console(); - console.run(); - } -} \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/BruteForce.java b/src/main/java/com/javarush/bakhtin/command/BruteForce.java index 4271f61..b0264dc 100644 --- a/src/main/java/com/javarush/bakhtin/command/BruteForce.java +++ b/src/main/java/com/javarush/bakhtin/command/BruteForce.java @@ -11,49 +11,39 @@ public class BruteForce implements MenuCommand { - // TODO меньше public - private - // TODO что за pattern - WORD_PATTERN - public static final Pattern PATTERN = Pattern.compile("[а-я]{4,20}"); + private static final String commandName = "Брутфорс"; - // TODO меньше public - private - Set wordSet = new HashSet<>(); - Set encodedWordSet = new HashSet<>(); + public String getCommandName() { + return commandName; + } - // TODO меньше public - private - final CaesarParamReader caesarParamReader = new CaesarParamReader(); - final Caesar caesar = new Caesar(); + private static final Pattern WORD_PATTERN = Pattern.compile("[а-я]{4,20}"); - // TODO rename сделать список слов из словаря - public void makeAWordList() { - try { - String dict = Files.readString(caesarParamReader.getDictFromUser()); - Matcher matcher = PATTERN.matcher(dict); - while (matcher.find()) { - // TODO use matcher.group() - wordSet.add(dict.substring(matcher.start(), matcher.end())); - } - } catch (IOException e) { - throw new RuntimeException(e); + private Set wordSet = new HashSet<>(); + private Set encodedWordSet = new HashSet<>(); + + private final CaesarParamReader caesarParamReader = new CaesarParamReader(); + private final Caesar caesar = new Caesar(); + + public void makeAWordListFromDictionary() throws IOException { + String dict = Files.readString(caesarParamReader.getDictFromUser()); + Matcher matcher = WORD_PATTERN.matcher(dict); + while (matcher.find()) { + wordSet.add(matcher.group()); } } - private void makeAWordListFromDecodedFile(Path path) { - try { - encodedWordSet.clear(); - // TODO readString - String text = new String(Files.readAllBytes(path)); - Matcher matcher = PATTERN.matcher(text); - while (matcher.find()) { - // TODO use matcher.group() - encodedWordSet.add(text.substring(matcher.start(), matcher.end())); - } - } catch (IOException e) { - throw new RuntimeException(e); + private void makeAWordListFromDecodedFile(Path path) throws IOException { + encodedWordSet.clear(); + String text = Files.readString(path); + Matcher matcher = WORD_PATTERN.matcher(text); + while (matcher.find()) { + encodedWordSet.add(matcher.group()); } } - public void execute() { - makeAWordList(); + public void execute() throws IOException { + makeAWordListFromDictionary(); int maxNumOfMatches = 0; int shiftOfMaxNumOfMatches = 0; Path encodedPath = caesarParamReader.getEncodedFromUser(); diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java index 80ceab5..efb6fa5 100644 --- a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -1,9 +1,8 @@ package com.javarush.bakhtin.command; -import com.javarush.bakhtin.Console; - import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Scanner; public class CaesarParamReader { @@ -16,6 +15,8 @@ public class CaesarParamReader { private static final Path defaultEncodedPath = Path.of("text", "encrypted.txt"); private static final Path defaultDecodedPath = Paths.get("text", "decrypted.txt"); + private final Scanner consoleScanner = new Scanner(System.in); + private static int key = 1; private static final CaesarParamReader instance = new CaesarParamReader(); @@ -24,19 +25,17 @@ public static CaesarParamReader getInstance() { } private Path getPath(Path defaultPath) { - String consoleString = Console.consoleInput.nextLine(); + String consoleString = consoleScanner.nextLine(); if (!consoleString.isEmpty()) { - // TODO defaultPath как входной параметр переопределять - defaultPath = Path.of(consoleString); + return Path.of(consoleString); } return defaultPath; } protected int getKeyFromUser() { System.out.print(keyInputMessage); - try { - int inputKey = Integer.parseInt(Console.consoleInput.nextLine()); + int inputKey = Integer.parseInt(consoleScanner.nextLine()); if (inputKey != 0) { key = inputKey; } diff --git a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java index 044e9b4..231939a 100644 --- a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java @@ -2,11 +2,18 @@ import com.javarush.bakhtin.Caesar; +import java.io.IOException; import java.nio.file.Path; public class DecoderCommand implements MenuCommand { - public void execute() { + private static final String commandName = "Расшифровать"; + + public String getCommandName() { + return commandName; + } + + public void execute() throws IOException { var reader = CaesarParamReader.getInstance(); int key = reader.getKeyFromUser(); Path from = reader.getEncodedFromUser(); diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java index 53afd77..0c1b877 100644 --- a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -2,18 +2,22 @@ import com.javarush.bakhtin.Caesar; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; public class EncoderCommand implements MenuCommand { private static final Path defaultTextPath = Paths.get("text", "text.txt"); + private static final String commandName = "Зашифровать"; - public void execute() { - var reader = CaesarParamReader.getInstance(); + public String getCommandName() { + return commandName; + } + public void execute() throws IOException { + var reader = CaesarParamReader.getInstance(); int key = reader.getKeyFromUser(); - // TODO сделать как reader.getEncodedFromUser(); Path from = reader.getFromPathFromUser(defaultTextPath); Path to = reader.getEncodedFromUser(); diff --git a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java index 87022ad..8a13558 100644 --- a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java @@ -1,6 +1,13 @@ package com.javarush.bakhtin.command; public class ExitCommand implements MenuCommand { + + private static final String commandName = "Выход из программы"; + + public String getCommandName() { + return commandName; + } + public void execute() { System.out.print("Выход из программы..."); System.exit(0); diff --git a/src/main/java/com/javarush/bakhtin/command/MenuCommand.java b/src/main/java/com/javarush/bakhtin/command/MenuCommand.java index 885f913..d997b69 100644 --- a/src/main/java/com/javarush/bakhtin/command/MenuCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/MenuCommand.java @@ -1,5 +1,10 @@ package com.javarush.bakhtin.command; +import java.io.IOException; + public interface MenuCommand { - void execute(); + + String getCommandName(); + + void execute() throws IOException; } diff --git a/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileReader.java b/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileReader.java new file mode 100644 index 0000000..e1e994c --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileReader.java @@ -0,0 +1,21 @@ +package com.javarush.bakhtin.fileOperations; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class CaesarFileReader { + + protected static java.io.FileReader reader(Path fromPath) throws IOException { + try { + if (!Files.exists(fromPath)) { + Files.createFile(fromPath); + } + return new java.io.FileReader(fromPath.toFile()); + } catch (FileNotFoundException e) { + throw new RuntimeException("Error: file not found"); + } + } + +} diff --git a/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileWriter.java b/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileWriter.java new file mode 100644 index 0000000..5910308 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileWriter.java @@ -0,0 +1,20 @@ +package com.javarush.bakhtin.fileOperations; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class CaesarFileWriter { + + protected static java.io.FileWriter writer(Path toPath) throws IOException { + try { + if (!Files.exists(toPath)) { + Files.createFile(toPath); + } + return new java.io.FileWriter(toPath.toFile()); + } catch (FileNotFoundException e) { + throw new RuntimeException("Error: file not found"); + } + } +} diff --git a/src/main/java/com/javarush/bakhtin/fileOperations/FileSystem.java b/src/main/java/com/javarush/bakhtin/fileOperations/FileSystem.java new file mode 100644 index 0000000..ebb1409 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/fileOperations/FileSystem.java @@ -0,0 +1,26 @@ +package com.javarush.bakhtin.fileOperations; + +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; + +public class FileSystem { + + private Path fromPath; + private Path toPath; + + public FileSystem(Path fromPath, Path toPath) { + this.fromPath = fromPath; + this.toPath = toPath; + } + + public FileReader reader() throws IOException { + return CaesarFileReader.reader(fromPath); + } + + public FileWriter writer() throws IOException { + return CaesarFileWriter.writer(toPath); + } + +} From 69ff4a37ea00e3eaa2198210bf0292d84b8f98e7 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Mon, 1 Sep 2025 15:50:55 +0300 Subject: [PATCH 10/11] FIX ALL --- src/main/java/com/javarush/bakhtin/Console.java | 2 +- .../java/com/javarush/bakhtin/command/CaesarParamReader.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java index 6b1769e..9536717 100644 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -2,7 +2,7 @@ import java.util.InputMismatchException; -// TODO вообще не нужный класс +// FIXME ?? вообще не нужный класс public class Console { private final MenuController menuController = new MenuController(); diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java index efb6fa5..be7548e 100644 --- a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -41,7 +41,7 @@ protected int getKeyFromUser() { } return key; } catch (NumberFormatException e) { - // TODO Интерфейс польз должен быть на одном языке + // FIXME ?? Интерфейс польз должен быть на одном языке throw new RuntimeException("Error: not a number"); } } From c7307e2bfdaf1c9b260a88f82a1914292b7b2fd3 Mon Sep 17 00:00:00 2001 From: Denis Bakhtin Date: Mon, 1 Sep 2025 16:58:25 +0300 Subject: [PATCH 11/11] Final version FIX ALL --- .../java/com/javarush/bakhtin/Caesar.java | 6 ++-- .../java/com/javarush/bakhtin/Console.java | 3 +- .../java/com/javarush/bakhtin/FileUtil.java | 31 ++++++++++++++++ .../com/javarush/bakhtin/MenuController.java | 6 ++-- .../javarush/bakhtin/command/BruteForce.java | 6 ++-- .../bakhtin/command/CaesarParamReader.java | 35 +++++++++---------- .../bakhtin/command/DecoderCommand.java | 4 +-- .../bakhtin/command/EncoderCommand.java | 8 ++--- .../javarush/bakhtin/command/ExitCommand.java | 4 +-- .../fileOperations/CaesarFileReader.java | 21 ----------- .../fileOperations/CaesarFileWriter.java | 20 ----------- .../bakhtin/fileOperations/FileSystem.java | 26 -------------- 12 files changed, 65 insertions(+), 105 deletions(-) create mode 100644 src/main/java/com/javarush/bakhtin/FileUtil.java delete mode 100644 src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileReader.java delete mode 100644 src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileWriter.java delete mode 100644 src/main/java/com/javarush/bakhtin/fileOperations/FileSystem.java diff --git a/src/main/java/com/javarush/bakhtin/Caesar.java b/src/main/java/com/javarush/bakhtin/Caesar.java index 4dfb31d..e9fad31 100644 --- a/src/main/java/com/javarush/bakhtin/Caesar.java +++ b/src/main/java/com/javarush/bakhtin/Caesar.java @@ -1,7 +1,5 @@ package com.javarush.bakhtin; -import com.javarush.bakhtin.fileOperations.FileSystem; - import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; @@ -18,8 +16,8 @@ public void decode(int key, Path from, Path to) throws IOException { } public void encode(int key, Path from, Path to) throws IOException { - FileSystem fileSystem = new FileSystem(from, to); - try (FileReader reader = fileSystem.reader(); FileWriter writer = fileSystem.writer()) { + try (FileReader reader = FileUtil.toFileReader(from); + FileWriter writer = FileUtil.toFileWriter(to)) { while (reader.ready()) { int inputUnicodeCode = reader.read(); char resultChar = encodeChar(key, inputUnicodeCode); diff --git a/src/main/java/com/javarush/bakhtin/Console.java b/src/main/java/com/javarush/bakhtin/Console.java index 9536717..391486a 100644 --- a/src/main/java/com/javarush/bakhtin/Console.java +++ b/src/main/java/com/javarush/bakhtin/Console.java @@ -2,7 +2,6 @@ import java.util.InputMismatchException; -// FIXME ?? вообще не нужный класс public class Console { private final MenuController menuController = new MenuController(); @@ -14,7 +13,7 @@ protected void run() { int answer = menuController.getUserCommand(); menuController.executeCommand(answer); } catch (InputMismatchException e) { - System.err.println("Error: not a number"); + System.err.println("Ошибка, введите число"); } catch (Exception e) { System.err.println(e.getMessage()); } diff --git a/src/main/java/com/javarush/bakhtin/FileUtil.java b/src/main/java/com/javarush/bakhtin/FileUtil.java new file mode 100644 index 0000000..6ad1305 --- /dev/null +++ b/src/main/java/com/javarush/bakhtin/FileUtil.java @@ -0,0 +1,31 @@ +package com.javarush.bakhtin; + +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class FileUtil { + + public static FileWriter toFileWriter(Path toPath) throws IOException { + try { + if (!Files.exists(toPath)) { + Files.createFile(toPath); + } + return new FileWriter(toPath.toFile()); + } catch (FileNotFoundException e) { + throw new RuntimeException("Ошибка, файл не найден"); + } + } + + public static FileReader toFileReader(Path fromPath){ + try { + return new FileReader(fromPath.toFile()); + } catch (FileNotFoundException e) { + throw new RuntimeException("Ошибка, файл не найден"); + } + } + +} diff --git a/src/main/java/com/javarush/bakhtin/MenuController.java b/src/main/java/com/javarush/bakhtin/MenuController.java index a409056..6c71781 100644 --- a/src/main/java/com/javarush/bakhtin/MenuController.java +++ b/src/main/java/com/javarush/bakhtin/MenuController.java @@ -10,7 +10,7 @@ public class MenuController { private static final Scanner consoleInput = new Scanner(System.in); - private static final String menuMessage = "Введите цифру, соответствующую команде:"; + private static final String MENU_MESSAGE = "Введите цифру, соответствующую команде:"; private static final HashMap menuItemMap = new HashMap<>(3); protected MenuController() { @@ -25,7 +25,7 @@ protected void executeCommand(int answer) throws IOException { } protected void printCommands() { - System.out.println(menuMessage); + System.out.println(MENU_MESSAGE); for (var menuItem : MenuController.menuItemMap.entrySet()) { System.out.print(menuItem.getValue().getCommandName()); System.out.print(" - "); @@ -36,7 +36,7 @@ protected void printCommands() { public int getUserCommand() { int answer = Integer.parseInt(consoleInput.nextLine()); if (answer < 1 || answer > 4) { - throw new RuntimeException("Error: incorrect answer"); + throw new RuntimeException("Ошибка, введите число от 1 до 4"); } return answer; } diff --git a/src/main/java/com/javarush/bakhtin/command/BruteForce.java b/src/main/java/com/javarush/bakhtin/command/BruteForce.java index b0264dc..25539c9 100644 --- a/src/main/java/com/javarush/bakhtin/command/BruteForce.java +++ b/src/main/java/com/javarush/bakhtin/command/BruteForce.java @@ -11,10 +11,10 @@ public class BruteForce implements MenuCommand { - private static final String commandName = "Брутфорс"; + private static final String COMMAND_NAME = "Брутфорс"; public String getCommandName() { - return commandName; + return COMMAND_NAME; } private static final Pattern WORD_PATTERN = Pattern.compile("[а-я]{4,20}"); @@ -65,7 +65,7 @@ public void execute() throws IOException { shiftOfMaxNumOfMatches = shift; } } - System.out.println(shiftOfMaxNumOfMatches); + System.out.println("Правильный ключ: " + shiftOfMaxNumOfMatches); caesar.decode(shiftOfMaxNumOfMatches, encodedPath, decodedPath); System.out.println("Брутфорс завершен"); } diff --git a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java index be7548e..5dda146 100644 --- a/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java +++ b/src/main/java/com/javarush/bakhtin/command/CaesarParamReader.java @@ -6,14 +6,14 @@ public class CaesarParamReader { - private static final String keyInputMessage = "Введите ключ шифрования, по умолчанию - 1:"; - private static final String fromPathInputMessage = "Введите путь, откуда вы хотите считать данные или нажмите enter, чтобы выбрать "; - private static final String dictPathInputMessage = "Введите путь к словарю или нажмите enter, чтобы выбрать "; - private static final String encodedPathInputMessage = "Введите путь к зашифрованному файлу или нажмите enter, чтобы выбрать "; - private static final String decodedPathInputMessage = "Введите путь к расшифрованному файлу или нажмите enter, чтобы выбрать "; - private static final Path defaultDictPath = Path.of("text", "dict.txt"); - private static final Path defaultEncodedPath = Path.of("text", "encrypted.txt"); - private static final Path defaultDecodedPath = Paths.get("text", "decrypted.txt"); + private static final String KEY_INPUT_MESSAGE = "Введите ключ шифрования, по умолчанию - 1:"; + private static final String FROM_PATH_INPUT_MESSAGE = "Введите путь, откуда вы хотите считать данные или нажмите enter, чтобы выбрать "; + private static final String DICT_PATH_INPUT_MESSAGE = "Введите путь к словарю или нажмите enter, чтобы выбрать "; + private static final String ENCODED_PATH_INPUT_MESSAGE = "Введите путь к зашифрованному файлу или нажмите enter, чтобы выбрать "; + private static final String DECODED_PATH_INPUT_MESSAGE = "Введите путь к расшифрованному файлу или нажмите enter, чтобы выбрать "; + private static final Path DEFAULT_DICT_PATH = Path.of("text", "dict.txt"); + private static final Path DEFAULT_ENCODED_PATH = Path.of("text", "encrypted.txt"); + private static final Path DEFAULT_DECODED_PATH = Paths.get("text", "decrypted.txt"); private final Scanner consoleScanner = new Scanner(System.in); @@ -33,7 +33,7 @@ private Path getPath(Path defaultPath) { } protected int getKeyFromUser() { - System.out.print(keyInputMessage); + System.out.print(KEY_INPUT_MESSAGE); try { int inputKey = Integer.parseInt(consoleScanner.nextLine()); if (inputKey != 0) { @@ -41,29 +41,28 @@ protected int getKeyFromUser() { } return key; } catch (NumberFormatException e) { - // FIXME ?? Интерфейс польз должен быть на одном языке - throw new RuntimeException("Error: not a number"); + throw new RuntimeException("Ошибка, введите число"); } } protected Path getFromPathFromUser(Path defaultFrom) { - System.out.println(fromPathInputMessage + defaultFrom.getFileName()); + System.out.println(FROM_PATH_INPUT_MESSAGE + defaultFrom.getFileName()); return getPath(defaultFrom); } protected Path getDictFromUser() { - System.out.println(dictPathInputMessage + defaultDictPath.getFileName()); - return getPath(defaultDictPath); + System.out.println(DICT_PATH_INPUT_MESSAGE + DEFAULT_DICT_PATH.getFileName()); + return getPath(DEFAULT_DICT_PATH); } protected Path getEncodedFromUser() { - System.out.println(encodedPathInputMessage + defaultEncodedPath.getFileName()); - return getPath(defaultEncodedPath); + System.out.println(ENCODED_PATH_INPUT_MESSAGE + DEFAULT_ENCODED_PATH.getFileName()); + return getPath(DEFAULT_ENCODED_PATH); } protected Path getDecodedFromUser() { - System.out.println(decodedPathInputMessage + defaultDecodedPath.getFileName()); - return getPath(defaultDecodedPath); + System.out.println(DECODED_PATH_INPUT_MESSAGE + DEFAULT_DECODED_PATH.getFileName()); + return getPath(DEFAULT_DECODED_PATH); } } \ No newline at end of file diff --git a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java index 231939a..7d29366 100644 --- a/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/DecoderCommand.java @@ -7,10 +7,10 @@ public class DecoderCommand implements MenuCommand { - private static final String commandName = "Расшифровать"; + private static final String COMMAND_NAME = "Расшифровать"; public String getCommandName() { - return commandName; + return COMMAND_NAME; } public void execute() throws IOException { diff --git a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java index 0c1b877..d0b2db1 100644 --- a/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/EncoderCommand.java @@ -8,17 +8,17 @@ public class EncoderCommand implements MenuCommand { - private static final Path defaultTextPath = Paths.get("text", "text.txt"); - private static final String commandName = "Зашифровать"; + private static final Path DEFAULT_TEXT_PATH = Paths.get("text", "text.txt"); + private static final String COMMAND_NAME = "Зашифровать"; public String getCommandName() { - return commandName; + return COMMAND_NAME; } public void execute() throws IOException { var reader = CaesarParamReader.getInstance(); int key = reader.getKeyFromUser(); - Path from = reader.getFromPathFromUser(defaultTextPath); + Path from = reader.getFromPathFromUser(DEFAULT_TEXT_PATH); Path to = reader.getEncodedFromUser(); new Caesar().encode(key, from, to); diff --git a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java index 8a13558..47ae5bf 100644 --- a/src/main/java/com/javarush/bakhtin/command/ExitCommand.java +++ b/src/main/java/com/javarush/bakhtin/command/ExitCommand.java @@ -2,10 +2,10 @@ public class ExitCommand implements MenuCommand { - private static final String commandName = "Выход из программы"; + private static final String COMMAND_NAME = "Выход из программы"; public String getCommandName() { - return commandName; + return COMMAND_NAME; } public void execute() { diff --git a/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileReader.java b/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileReader.java deleted file mode 100644 index e1e994c..0000000 --- a/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileReader.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.javarush.bakhtin.fileOperations; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -public class CaesarFileReader { - - protected static java.io.FileReader reader(Path fromPath) throws IOException { - try { - if (!Files.exists(fromPath)) { - Files.createFile(fromPath); - } - return new java.io.FileReader(fromPath.toFile()); - } catch (FileNotFoundException e) { - throw new RuntimeException("Error: file not found"); - } - } - -} diff --git a/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileWriter.java b/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileWriter.java deleted file mode 100644 index 5910308..0000000 --- a/src/main/java/com/javarush/bakhtin/fileOperations/CaesarFileWriter.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.javarush.bakhtin.fileOperations; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -public class CaesarFileWriter { - - protected static java.io.FileWriter writer(Path toPath) throws IOException { - try { - if (!Files.exists(toPath)) { - Files.createFile(toPath); - } - return new java.io.FileWriter(toPath.toFile()); - } catch (FileNotFoundException e) { - throw new RuntimeException("Error: file not found"); - } - } -} diff --git a/src/main/java/com/javarush/bakhtin/fileOperations/FileSystem.java b/src/main/java/com/javarush/bakhtin/fileOperations/FileSystem.java deleted file mode 100644 index ebb1409..0000000 --- a/src/main/java/com/javarush/bakhtin/fileOperations/FileSystem.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.javarush.bakhtin.fileOperations; - -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Path; - -public class FileSystem { - - private Path fromPath; - private Path toPath; - - public FileSystem(Path fromPath, Path toPath) { - this.fromPath = fromPath; - this.toPath = toPath; - } - - public FileReader reader() throws IOException { - return CaesarFileReader.reader(fromPath); - } - - public FileWriter writer() throws IOException { - return CaesarFileWriter.writer(toPath); - } - -}