From 05e6b0bacd60d29919f7cbe723a21ac3b8b694fd Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 25 Nov 2025 09:22:19 +0300 Subject: [PATCH 1/8] ADD golikov package with sart class ConsoleRunner used to run a console application --- src/main/java/com/javarush/golikov/ConsoleRunner.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/javarush/golikov/ConsoleRunner.java diff --git a/src/main/java/com/javarush/golikov/ConsoleRunner.java b/src/main/java/com/javarush/golikov/ConsoleRunner.java new file mode 100644 index 0000000..8dfe116 --- /dev/null +++ b/src/main/java/com/javarush/golikov/ConsoleRunner.java @@ -0,0 +1,7 @@ +package com.javarush.golikov; + +public class ConsoleRunner { + public static void main(String[] args) { + + } +} From dcb60bcc5e0448c051198238b5f5e00692988c26 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 25 Nov 2025 11:41:25 +0300 Subject: [PATCH 2/8] ADD architecture without implementation of the task --- .../com/javarush/golikov/Application.java | 20 +++++++++++++++ .../com/javarush/golikov/ConsoleRunner.java | 7 +++++- .../golikov/constatnts/Constants.java | 8 ++++++ .../javarush/golikov/controller/Actions.java | 25 +++++++++++++++++++ .../golikov/controller/Controller.java | 13 ++++++++++ .../com/javarush/golikov/entite/Result.java | 19 ++++++++++++++ .../golikov/menuComands/Decoding.java | 11 ++++++++ .../golikov/menuComands/Encryption.java | 11 ++++++++ .../golikov/menuComands/MenuCommands.java | 7 ++++++ 9 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/javarush/golikov/Application.java create mode 100644 src/main/java/com/javarush/golikov/constatnts/Constants.java create mode 100644 src/main/java/com/javarush/golikov/controller/Actions.java create mode 100644 src/main/java/com/javarush/golikov/controller/Controller.java create mode 100644 src/main/java/com/javarush/golikov/entite/Result.java create mode 100644 src/main/java/com/javarush/golikov/menuComands/Decoding.java create mode 100644 src/main/java/com/javarush/golikov/menuComands/Encryption.java create mode 100644 src/main/java/com/javarush/golikov/menuComands/MenuCommands.java diff --git a/src/main/java/com/javarush/golikov/Application.java b/src/main/java/com/javarush/golikov/Application.java new file mode 100644 index 0000000..1f7044a --- /dev/null +++ b/src/main/java/com/javarush/golikov/Application.java @@ -0,0 +1,20 @@ +package com.javarush.golikov; + +import com.javarush.golikov.controller.Controller; +import com.javarush.golikov.entite.Result; + +public class Application { + private final Controller controller; + private final int menuItem; + private final String[] parametrises; + + public Application(int menuItem, String[] parametrises) { + controller = new Controller(); + this.menuItem = menuItem; + this.parametrises = parametrises; + } + + public Result run() { + return controller.doAction(menuItem, parametrises); + } +} diff --git a/src/main/java/com/javarush/golikov/ConsoleRunner.java b/src/main/java/com/javarush/golikov/ConsoleRunner.java index 8dfe116..b8b9c9a 100644 --- a/src/main/java/com/javarush/golikov/ConsoleRunner.java +++ b/src/main/java/com/javarush/golikov/ConsoleRunner.java @@ -1,7 +1,12 @@ package com.javarush.golikov; +import com.javarush.golikov.entite.Result; + public class ConsoleRunner { public static void main(String[] args) { - + String[] parametrises = {"inn file", "Out file"}; + Application application = new Application(1,parametrises); + Result result = application.run(); + System.out.println(result); } } diff --git a/src/main/java/com/javarush/golikov/constatnts/Constants.java b/src/main/java/com/javarush/golikov/constatnts/Constants.java new file mode 100644 index 0000000..973db7e --- /dev/null +++ b/src/main/java/com/javarush/golikov/constatnts/Constants.java @@ -0,0 +1,8 @@ +package com.javarush.golikov.constatnts; + +public class Constants { + private static final String ruAlphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЭЬЭЮЯ"; + private static final String specialCharacters = "\n.,”’:-!? "; + + public static final char[] ALPHABET = (ruAlphabet + specialCharacters).toCharArray(); +} diff --git a/src/main/java/com/javarush/golikov/controller/Actions.java b/src/main/java/com/javarush/golikov/controller/Actions.java new file mode 100644 index 0000000..a7d2ecc --- /dev/null +++ b/src/main/java/com/javarush/golikov/controller/Actions.java @@ -0,0 +1,25 @@ +package com.javarush.golikov.controller; + +import com.javarush.golikov.menuComands.MenuCommands; +import com.javarush.golikov.menuComands.Decoding; +import com.javarush.golikov.menuComands.Encryption; + +import java.util.HashMap; +import java.util.Map; + +public class Actions { + private MenuCommands menuCommands; + private final Map actionMap = new HashMap<>(); + + public Actions() { + actionMap.put(1,new Encryption()); + actionMap.put(2,new Decoding()); + } + + public MenuCommands findAction(int actionName) { + MenuCommands menuCommands = null; + if (actionMap.containsKey(actionName)) + menuCommands = actionMap.get(actionName); + return menuCommands; + } +} diff --git a/src/main/java/com/javarush/golikov/controller/Controller.java b/src/main/java/com/javarush/golikov/controller/Controller.java new file mode 100644 index 0000000..610a65c --- /dev/null +++ b/src/main/java/com/javarush/golikov/controller/Controller.java @@ -0,0 +1,13 @@ +package com.javarush.golikov.controller; + +import com.javarush.golikov.entite.Result; +import com.javarush.golikov.menuComands.MenuCommands; + + +public class Controller { + public Result doAction(int actionNumber, String[] parametrises){ + Actions actions = new Actions(); + MenuCommands menuCommands = actions.findAction(actionNumber); + return menuCommands.execute(parametrises[0]); + } +} diff --git a/src/main/java/com/javarush/golikov/entite/Result.java b/src/main/java/com/javarush/golikov/entite/Result.java new file mode 100644 index 0000000..33bcab1 --- /dev/null +++ b/src/main/java/com/javarush/golikov/entite/Result.java @@ -0,0 +1,19 @@ +package com.javarush.golikov.entite; + +public class Result { +private final String message; +private final String resultCode; + +public Result(String message, String resultCode){ + this.message = message; + this.resultCode = resultCode; +} + + @Override + public String toString() { + return "Result{" + + "message='" + message + '\'' + + ", resultCode='" + resultCode + '\'' + + '}'; + } +} diff --git a/src/main/java/com/javarush/golikov/menuComands/Decoding.java b/src/main/java/com/javarush/golikov/menuComands/Decoding.java new file mode 100644 index 0000000..e669c6d --- /dev/null +++ b/src/main/java/com/javarush/golikov/menuComands/Decoding.java @@ -0,0 +1,11 @@ +package com.javarush.golikov.menuComands; + +import com.javarush.golikov.entite.Result; + +public class Decoding implements MenuCommands { + + @Override + public Result execute(String result) { + return null; + } +} diff --git a/src/main/java/com/javarush/golikov/menuComands/Encryption.java b/src/main/java/com/javarush/golikov/menuComands/Encryption.java new file mode 100644 index 0000000..f9f1e11 --- /dev/null +++ b/src/main/java/com/javarush/golikov/menuComands/Encryption.java @@ -0,0 +1,11 @@ +package com.javarush.golikov.menuComands; + +import com.javarush.golikov.entite.Result; + +public class Encryption implements MenuCommands { + + @Override + public Result execute(String result) { + return new Result("Encrypted Result", result); + } +} diff --git a/src/main/java/com/javarush/golikov/menuComands/MenuCommands.java b/src/main/java/com/javarush/golikov/menuComands/MenuCommands.java new file mode 100644 index 0000000..3c33ea2 --- /dev/null +++ b/src/main/java/com/javarush/golikov/menuComands/MenuCommands.java @@ -0,0 +1,7 @@ +package com.javarush.golikov.menuComands; + +import com.javarush.golikov.entite.Result; + +public interface MenuCommands { + Result execute(String result); +} From b7387c9cc539b6e48405eabd2f1fd356aeab35e4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 25 Nov 2025 15:59:12 +0300 Subject: [PATCH 3/8] FIX all warnings. ADD ShowMenu class. ADD ApplicationExceptions In ShowMenu implemented reading from the console. In Controller implemented exception catching. In Actions implemented exception generation --- .../com/javarush/golikov/Application.java | 16 +++--- .../com/javarush/golikov/ConsoleRunner.java | 7 ++- .../golikov/constatnts/Constants.java | 3 ++ .../javarush/golikov/controller/Actions.java | 20 ++++--- .../golikov/controller/Controller.java | 11 ++-- .../com/javarush/golikov/entite/Result.java | 9 +--- .../exception/ApplicationExceptions.java | 13 +++++ .../golikov/menuComands/Decoding.java | 4 +- .../golikov/menuComands/Encryption.java | 6 ++- .../golikov/menuComands/MenuCommands.java | 2 +- .../com/javarush/golikov/view/ShowMenu.java | 52 +++++++++++++++++++ 11 files changed, 105 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/javarush/golikov/exception/ApplicationExceptions.java create mode 100644 src/main/java/com/javarush/golikov/view/ShowMenu.java diff --git a/src/main/java/com/javarush/golikov/Application.java b/src/main/java/com/javarush/golikov/Application.java index 1f7044a..63924bf 100644 --- a/src/main/java/com/javarush/golikov/Application.java +++ b/src/main/java/com/javarush/golikov/Application.java @@ -2,19 +2,15 @@ import com.javarush.golikov.controller.Controller; import com.javarush.golikov.entite.Result; +import com.javarush.golikov.view.ShowMenu; public class Application { - private final Controller controller; - private final int menuItem; - private final String[] parametrises; - - public Application(int menuItem, String[] parametrises) { - controller = new Controller(); - this.menuItem = menuItem; - this.parametrises = parametrises; - } + private final Controller controller = new Controller(); + private final ShowMenu showMenu = new ShowMenu(); public Result run() { - return controller.doAction(menuItem, parametrises); + int menuIndex = showMenu.getMenuItem(); + String[] parametrises = showMenu.getParameterises(menuIndex == 0 || menuIndex == 1); + return controller.doAction(menuIndex, parametrises); } } diff --git a/src/main/java/com/javarush/golikov/ConsoleRunner.java b/src/main/java/com/javarush/golikov/ConsoleRunner.java index b8b9c9a..b5f6ff9 100644 --- a/src/main/java/com/javarush/golikov/ConsoleRunner.java +++ b/src/main/java/com/javarush/golikov/ConsoleRunner.java @@ -4,9 +4,8 @@ public class ConsoleRunner { public static void main(String[] args) { - String[] parametrises = {"inn file", "Out file"}; - Application application = new Application(1,parametrises); - Result result = application.run(); - System.out.println(result); + Application application = new Application(); + Result result = application.run(); + System.out.println(result); } } diff --git a/src/main/java/com/javarush/golikov/constatnts/Constants.java b/src/main/java/com/javarush/golikov/constatnts/Constants.java index 973db7e..e574fdc 100644 --- a/src/main/java/com/javarush/golikov/constatnts/Constants.java +++ b/src/main/java/com/javarush/golikov/constatnts/Constants.java @@ -1,8 +1,11 @@ package com.javarush.golikov.constatnts; +import java.io.File; + public class Constants { private static final String ruAlphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЭЬЭЮЯ"; private static final String specialCharacters = "\n.,”’:-!? "; public static final char[] ALPHABET = (ruAlphabet + specialCharacters).toCharArray(); + public static final String DEFAULT_FOLDER = System.getProperty("user.dir") + File.separator + "text" + File.separator; } diff --git a/src/main/java/com/javarush/golikov/controller/Actions.java b/src/main/java/com/javarush/golikov/controller/Actions.java index a7d2ecc..5fef8da 100644 --- a/src/main/java/com/javarush/golikov/controller/Actions.java +++ b/src/main/java/com/javarush/golikov/controller/Actions.java @@ -1,5 +1,6 @@ package com.javarush.golikov.controller; +import com.javarush.golikov.exception.ApplicationExceptions; import com.javarush.golikov.menuComands.MenuCommands; import com.javarush.golikov.menuComands.Decoding; import com.javarush.golikov.menuComands.Encryption; @@ -8,18 +9,21 @@ import java.util.Map; public class Actions { - private MenuCommands menuCommands; + private final Map actionMap = new HashMap<>(); public Actions() { - actionMap.put(1,new Encryption()); - actionMap.put(2,new Decoding()); + actionMap.put(0,new Encryption()); + actionMap.put(1,new Decoding()); } - public MenuCommands findAction(int actionName) { - MenuCommands menuCommands = null; - if (actionMap.containsKey(actionName)) - menuCommands = actionMap.get(actionName); - return menuCommands; + public MenuCommands findAction(int actionIndex) { + if (actionMap.containsKey(actionIndex)) { + try { + return actionMap.get(actionIndex); + } catch (IllegalArgumentException e) { + throw new ApplicationExceptions("Пункт меню не реализован!", e); + } + } else throw new ApplicationExceptions("Пункт меню не реализован!"); } } diff --git a/src/main/java/com/javarush/golikov/controller/Controller.java b/src/main/java/com/javarush/golikov/controller/Controller.java index 610a65c..661f15c 100644 --- a/src/main/java/com/javarush/golikov/controller/Controller.java +++ b/src/main/java/com/javarush/golikov/controller/Controller.java @@ -1,13 +1,18 @@ package com.javarush.golikov.controller; import com.javarush.golikov.entite.Result; +import com.javarush.golikov.exception.ApplicationExceptions; import com.javarush.golikov.menuComands.MenuCommands; public class Controller { - public Result doAction(int actionNumber, String[] parametrises){ + public Result doAction(int actionNumber, String[] parametrises) { Actions actions = new Actions(); - MenuCommands menuCommands = actions.findAction(actionNumber); - return menuCommands.execute(parametrises[0]); + try{ + MenuCommands menuCommands = actions.findAction(actionNumber); + return menuCommands.execute(parametrises); + } catch (IllegalArgumentException | ApplicationExceptions e) { + return new Result(e.getMessage(), "Error"); + } } } diff --git a/src/main/java/com/javarush/golikov/entite/Result.java b/src/main/java/com/javarush/golikov/entite/Result.java index 33bcab1..54a6370 100644 --- a/src/main/java/com/javarush/golikov/entite/Result.java +++ b/src/main/java/com/javarush/golikov/entite/Result.java @@ -1,13 +1,6 @@ package com.javarush.golikov.entite; -public class Result { -private final String message; -private final String resultCode; - -public Result(String message, String resultCode){ - this.message = message; - this.resultCode = resultCode; -} +public record Result(String message, String resultCode) { @Override public String toString() { diff --git a/src/main/java/com/javarush/golikov/exception/ApplicationExceptions.java b/src/main/java/com/javarush/golikov/exception/ApplicationExceptions.java new file mode 100644 index 0000000..56a46b6 --- /dev/null +++ b/src/main/java/com/javarush/golikov/exception/ApplicationExceptions.java @@ -0,0 +1,13 @@ +package com.javarush.golikov.exception; + +public class ApplicationExceptions extends RuntimeException { + + public ApplicationExceptions(String message) { + super(message); + } + + public ApplicationExceptions(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/src/main/java/com/javarush/golikov/menuComands/Decoding.java b/src/main/java/com/javarush/golikov/menuComands/Decoding.java index e669c6d..521b15e 100644 --- a/src/main/java/com/javarush/golikov/menuComands/Decoding.java +++ b/src/main/java/com/javarush/golikov/menuComands/Decoding.java @@ -5,7 +5,7 @@ public class Decoding implements MenuCommands { @Override - public Result execute(String result) { - return null; + public Result execute(String[] parametrises) { + return new Result("Дешифрование завершено", "Ok"); } } diff --git a/src/main/java/com/javarush/golikov/menuComands/Encryption.java b/src/main/java/com/javarush/golikov/menuComands/Encryption.java index f9f1e11..78ca814 100644 --- a/src/main/java/com/javarush/golikov/menuComands/Encryption.java +++ b/src/main/java/com/javarush/golikov/menuComands/Encryption.java @@ -1,11 +1,13 @@ package com.javarush.golikov.menuComands; +import com.javarush.golikov.constatnts.Constants; import com.javarush.golikov.entite.Result; public class Encryption implements MenuCommands { @Override - public Result execute(String result) { - return new Result("Encrypted Result", result); + public Result execute(String[] parametrises) { + int length = Constants.ALPHABET.length; + return new Result("Шифрование завершено " + length + " букв", "Ok"); } } diff --git a/src/main/java/com/javarush/golikov/menuComands/MenuCommands.java b/src/main/java/com/javarush/golikov/menuComands/MenuCommands.java index 3c33ea2..60fd277 100644 --- a/src/main/java/com/javarush/golikov/menuComands/MenuCommands.java +++ b/src/main/java/com/javarush/golikov/menuComands/MenuCommands.java @@ -3,5 +3,5 @@ import com.javarush.golikov.entite.Result; public interface MenuCommands { - Result execute(String result); + Result execute(String[] parametrises); } diff --git a/src/main/java/com/javarush/golikov/view/ShowMenu.java b/src/main/java/com/javarush/golikov/view/ShowMenu.java new file mode 100644 index 0000000..f699d2a --- /dev/null +++ b/src/main/java/com/javarush/golikov/view/ShowMenu.java @@ -0,0 +1,52 @@ +package com.javarush.golikov.view; + +import com.javarush.golikov.constatnts.Constants; + +import java.util.Scanner; + + +public class ShowMenu { + private final Scanner scanner = new Scanner(System.in); + + public int getMenuItem() { + int item; + do { + System.out.println("Выберите пункт меню\n" + + """ + 1. Шифрование + 2. Дешифровка + 3. "Brute force" + 4. Анализ + 5. Выход + """ ); + String input = scanner.nextLine(); + item = switch (input) { + case "1" -> 0; + case "2" -> 1; + case "3" -> 2; + case "4" -> 3; + case "5" -> 4; + default -> { + System.out.println("Неверный ввод. Повторите ввод"); + yield -1; + } + }; + } while (item < 0); + return item; + } + + public String[] getParameterises(boolean isKeyNeeded) { + String[] parameterises = new String[3]; + if (isKeyNeeded){ + System.out.println("Введите ключ шифрования/дешифрования"); + parameterises[2] = scanner.nextLine(); + } + System.out.println("Введите путь исходного файла по умолчанию директория пользователя папка text"); + String innFile = scanner.nextLine(); + parameterises[0] = innFile.isEmpty() ? Constants.DEFAULT_FOLDER : innFile; + System.out.println("Введите путь конечного файла по умолчанию директория пользователя папка text"); + String outFile = scanner.nextLine(); + parameterises[1] = outFile.isEmpty() ? Constants.DEFAULT_FOLDER : innFile; + return parameterises; + } +} From c26ec46ff3f78d80152708e0c99997f25e1d6616 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 25 Nov 2025 16:55:15 +0300 Subject: [PATCH 4/8] ADD implementation of key-based encryption --- .../golikov/constatnts/Constants.java | 10 ++++- .../golikov/menuComands/Commands.java | 38 +++++++++++++++++++ .../golikov/menuComands/Encryption.java | 24 ++++++++++-- 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/javarush/golikov/menuComands/Commands.java diff --git a/src/main/java/com/javarush/golikov/constatnts/Constants.java b/src/main/java/com/javarush/golikov/constatnts/Constants.java index e574fdc..20ce8e6 100644 --- a/src/main/java/com/javarush/golikov/constatnts/Constants.java +++ b/src/main/java/com/javarush/golikov/constatnts/Constants.java @@ -1,11 +1,19 @@ package com.javarush.golikov.constatnts; import java.io.File; +import java.util.ArrayList; +import java.util.List; public class Constants { private static final String ruAlphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЭЬЭЮЯ"; private static final String specialCharacters = "\n.,”’:-!? "; - public static final char[] ALPHABET = (ruAlphabet + specialCharacters).toCharArray(); + public static final char[] ALPHABET = (ruAlphabet.toLowerCase() + specialCharacters).toCharArray(); public static final String DEFAULT_FOLDER = System.getProperty("user.dir") + File.separator + "text" + File.separator; + + public static final List ALPHABET_LIST = new ArrayList<>(); + + static { + for(Character simbol : ALPHABET) ALPHABET_LIST.add(simbol); + } } diff --git a/src/main/java/com/javarush/golikov/menuComands/Commands.java b/src/main/java/com/javarush/golikov/menuComands/Commands.java new file mode 100644 index 0000000..20e89fe --- /dev/null +++ b/src/main/java/com/javarush/golikov/menuComands/Commands.java @@ -0,0 +1,38 @@ +package com.javarush.golikov.menuComands; + +import com.javarush.golikov.constatnts.Constants; +import com.javarush.golikov.entite.Result; +import com.javarush.golikov.exception.ApplicationExceptions; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public abstract class Commands implements MenuCommands { + public Result doCommand(String source, String target, int key) { + Path sourceFile = Path.of(source); + Path targetFile = Path.of(target); + + try (BufferedReader fileReader = Files.newBufferedReader(sourceFile); + BufferedWriter fileWriter = Files.newBufferedWriter(targetFile)) { + int value; + int length = Constants.ALPHABET.length; + while ((value = fileReader.read()) > -1) { + char character = (char) value; + character = Character.toLowerCase(character); + if (Constants.ALPHABET_LIST.contains(character)) { + int index = Constants.ALPHABET_LIST.indexOf(character); + index = (index + key + Math.abs(key) * length) % length; + fileWriter.write(Constants.ALPHABET[index]); + } else if (character == '\n') { + fileWriter.write(character); + } + } + } catch (IOException e) { + throw new ApplicationExceptions("Файл не найден" + e.getMessage(), e); + } + return new Result(this.getClass().getSimpleName(), "Ok"); + } +} diff --git a/src/main/java/com/javarush/golikov/menuComands/Encryption.java b/src/main/java/com/javarush/golikov/menuComands/Encryption.java index 78ca814..807902a 100644 --- a/src/main/java/com/javarush/golikov/menuComands/Encryption.java +++ b/src/main/java/com/javarush/golikov/menuComands/Encryption.java @@ -1,13 +1,29 @@ package com.javarush.golikov.menuComands; -import com.javarush.golikov.constatnts.Constants; import com.javarush.golikov.entite.Result; +import com.javarush.golikov.exception.ApplicationExceptions; -public class Encryption implements MenuCommands { +import java.nio.file.Files; +import java.nio.file.Path; + +public class Encryption extends Commands { @Override public Result execute(String[] parametrises) { - int length = Constants.ALPHABET.length; - return new Result("Шифрование завершено " + length + " букв", "Ok"); + String source = parametrises[0]; + if (Files.isDirectory(Path.of(source))) { + source += "text.txt"; + } + String target = parametrises[1]; + if (Files.isDirectory(Path.of(target))) { + target += "output.txt"; + } + int key; + try{ + key = Integer.parseInt(parametrises[2]); + } catch(NumberFormatException e){ + throw new ApplicationExceptions("Неверный ключ"); + } + return doCommand(source, target, key); } } From a016e486db9db82a127ccc54e4473167a1b59582 Mon Sep 17 00:00:00 2001 From: Xaxatumbik Date: Tue, 25 Nov 2025 18:40:37 +0300 Subject: [PATCH 5/8] FIX ALPHABET. ADD decoding implementation. --- .../golikov/constatnts/Constants.java | 2 +- .../golikov/menuComands/Decoding.java | 22 +++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/javarush/golikov/constatnts/Constants.java b/src/main/java/com/javarush/golikov/constatnts/Constants.java index 20ce8e6..ef39201 100644 --- a/src/main/java/com/javarush/golikov/constatnts/Constants.java +++ b/src/main/java/com/javarush/golikov/constatnts/Constants.java @@ -5,7 +5,7 @@ import java.util.List; public class Constants { - private static final String ruAlphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЭЬЭЮЯ"; + private static final String ruAlphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЭЮЯ"; private static final String specialCharacters = "\n.,”’:-!? "; public static final char[] ALPHABET = (ruAlphabet.toLowerCase() + specialCharacters).toCharArray(); diff --git a/src/main/java/com/javarush/golikov/menuComands/Decoding.java b/src/main/java/com/javarush/golikov/menuComands/Decoding.java index 521b15e..dc16723 100644 --- a/src/main/java/com/javarush/golikov/menuComands/Decoding.java +++ b/src/main/java/com/javarush/golikov/menuComands/Decoding.java @@ -1,11 +1,29 @@ package com.javarush.golikov.menuComands; import com.javarush.golikov.entite.Result; +import com.javarush.golikov.exception.ApplicationExceptions; -public class Decoding implements MenuCommands { +import java.nio.file.Files; +import java.nio.file.Path; + +public class Decoding extends Commands { @Override public Result execute(String[] parametrises) { - return new Result("Дешифрование завершено", "Ok"); + String source = parametrises[0]; + if (Files.isDirectory(Path.of(source))) { + source += "output.txt"; + } + String target = parametrises[1]; + if (Files.isDirectory(Path.of(target))) { + target += "decoding.txt"; + } + int key; + try { + key = Integer.parseInt(parametrises[2]); + } catch (NumberFormatException e) { + throw new ApplicationExceptions("Неверный ключ"); + } + return doCommand(source, target, key * -1); } } From 79553b9cb11c2b85a6ed0453147a57d362904c33 Mon Sep 17 00:00:00 2001 From: Xaxatumbik Date: Tue, 25 Nov 2025 19:02:42 +0300 Subject: [PATCH 6/8] FIX ALPHABET. ADD BruteForce. --- .../golikov/constatnts/Constants.java | 2 +- .../javarush/golikov/controller/Actions.java | 2 + .../golikov/menuComands/BruteForce.java | 56 +++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/javarush/golikov/menuComands/BruteForce.java diff --git a/src/main/java/com/javarush/golikov/constatnts/Constants.java b/src/main/java/com/javarush/golikov/constatnts/Constants.java index ef39201..5b08f05 100644 --- a/src/main/java/com/javarush/golikov/constatnts/Constants.java +++ b/src/main/java/com/javarush/golikov/constatnts/Constants.java @@ -6,7 +6,7 @@ public class Constants { private static final String ruAlphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЭЮЯ"; - private static final String specialCharacters = "\n.,”’:-!? "; + private static final String specialCharacters = "\n.,\":-!? "; public static final char[] ALPHABET = (ruAlphabet.toLowerCase() + specialCharacters).toCharArray(); public static final String DEFAULT_FOLDER = System.getProperty("user.dir") + File.separator + "text" + File.separator; diff --git a/src/main/java/com/javarush/golikov/controller/Actions.java b/src/main/java/com/javarush/golikov/controller/Actions.java index 5fef8da..25a4d82 100644 --- a/src/main/java/com/javarush/golikov/controller/Actions.java +++ b/src/main/java/com/javarush/golikov/controller/Actions.java @@ -1,6 +1,7 @@ package com.javarush.golikov.controller; import com.javarush.golikov.exception.ApplicationExceptions; +import com.javarush.golikov.menuComands.BruteForce; import com.javarush.golikov.menuComands.MenuCommands; import com.javarush.golikov.menuComands.Decoding; import com.javarush.golikov.menuComands.Encryption; @@ -15,6 +16,7 @@ public class Actions { public Actions() { actionMap.put(0,new Encryption()); actionMap.put(1,new Decoding()); + actionMap.put(2, new BruteForce()); } public MenuCommands findAction(int actionIndex) { diff --git a/src/main/java/com/javarush/golikov/menuComands/BruteForce.java b/src/main/java/com/javarush/golikov/menuComands/BruteForce.java new file mode 100644 index 0000000..f89fe1a --- /dev/null +++ b/src/main/java/com/javarush/golikov/menuComands/BruteForce.java @@ -0,0 +1,56 @@ +package com.javarush.golikov.menuComands; + +import com.javarush.golikov.constatnts.Constants; +import com.javarush.golikov.entite.Result; +import com.javarush.golikov.exception.ApplicationExceptions; + +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class BruteForce extends Commands { + @Override + public Result execute(String[] parametrises) { + String source = parametrises[0]; + if (Files.isDirectory(Path.of(source))) { + source += "output.txt"; + } + String target = parametrises[1]; + if (Files.isDirectory(Path.of(target))) { + target += "bfresult.txt"; + } + int bestKey = 0; + int bestSpaceCount = 0; + char space = ' '; + for (int key = 0; key < Constants.ALPHABET.length; key++) { + int spaceCount = countCharInFileWithKey(source, key, space); + if (spaceCount > bestSpaceCount) { + bestSpaceCount = spaceCount; + bestKey = key; + } + } + return doCommand(source, target, bestKey); + } + + private int countCharInFileWithKey(String encryptedFilename, int key, char fixChar) { + int spaceCount = 0; + Path path = Path.of(encryptedFilename); + try (BufferedReader reader = Files.newBufferedReader(path)) { + int value; + while ((value = reader.read()) > -1) { + char character = (char) value; + if (Constants.ALPHABET_LIST.contains(character)) { + int index = Constants.ALPHABET_LIST.indexOf(character); + index = (index + key + Constants.ALPHABET.length) % Constants.ALPHABET.length; + if (Constants.ALPHABET[index] == fixChar) { + spaceCount++; + } + } + } + } catch (IOException e) { + throw new ApplicationExceptions("Файл не найден" + encryptedFilename, e); + } + return spaceCount; + } +} From 19c6671e99be367eb5954d1308349bad00c7fb91 Mon Sep 17 00:00:00 2001 From: Xaxatumbik Date: Tue, 25 Nov 2025 19:25:01 +0300 Subject: [PATCH 7/8] FIX ALPHABET --- src/main/java/com/javarush/golikov/constatnts/Constants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/javarush/golikov/constatnts/Constants.java b/src/main/java/com/javarush/golikov/constatnts/Constants.java index 5b08f05..5b5adf6 100644 --- a/src/main/java/com/javarush/golikov/constatnts/Constants.java +++ b/src/main/java/com/javarush/golikov/constatnts/Constants.java @@ -5,7 +5,7 @@ import java.util.List; public class Constants { - private static final String ruAlphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЭЮЯ"; + private static final String ruAlphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; private static final String specialCharacters = "\n.,\":-!? "; public static final char[] ALPHABET = (ruAlphabet.toLowerCase() + specialCharacters).toCharArray(); From c8313c9dfa2a479400a916578ad84eb6de6d5e75 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 26 Nov 2025 08:50:31 +0300 Subject: [PATCH 8/8] MERGE golikovBranch to main. --- src/main/java/com/javarush/golikov/controller/Actions.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/javarush/golikov/controller/Actions.java b/src/main/java/com/javarush/golikov/controller/Actions.java index 25a4d82..92c4063 100644 --- a/src/main/java/com/javarush/golikov/controller/Actions.java +++ b/src/main/java/com/javarush/golikov/controller/Actions.java @@ -14,8 +14,8 @@ public class Actions { private final Map actionMap = new HashMap<>(); public Actions() { - actionMap.put(0,new Encryption()); - actionMap.put(1,new Decoding()); + actionMap.put(0, new Encryption()); + actionMap.put(1, new Decoding()); actionMap.put(2, new BruteForce()); }