From cde60284da725a8a0e840f526bdf659d1dd43f2f Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Sun, 24 Aug 2025 21:54:40 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B3=D0=BB=D1=83=D1=88=D0=BA=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81=D0=B0=20FileBackedTaskManager=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=84=D0=B7=207.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/managers/FileBackedTaskManager.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/managers/FileBackedTaskManager.java diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java new file mode 100644 index 0000000..c509952 --- /dev/null +++ b/src/managers/FileBackedTaskManager.java @@ -0,0 +1,7 @@ +package managers; + +public class FileBackedTaskManager extends InMemoryTaskManager implements TaskManager { + public void save() { + + } +} From cc1ff4f23b3e6336ac4e7ea84f16d461f8691ac1 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 28 Aug 2025 14:40:54 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B3=D0=BB=D1=83=D1=88=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/managers/FileBackedTaskManagerTest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 test/managers/FileBackedTaskManagerTest.java diff --git a/test/managers/FileBackedTaskManagerTest.java b/test/managers/FileBackedTaskManagerTest.java new file mode 100644 index 0000000..132ac9e --- /dev/null +++ b/test/managers/FileBackedTaskManagerTest.java @@ -0,0 +1,4 @@ +package managers; + +public class FileBackedTaskManagerTest { +} From c841e8eb60cc818a96d12b4391b9a4ded4998802 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 28 Aug 2025 14:42:09 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20=D0=B4=D0=BB=D1=8F=20enu?= =?UTF-8?q?m=20Type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.java | 20 +++++++++++++++++++- src/tasks/Epic.java | 5 +++++ src/tasks/Subtask.java | 5 +++++ src/tasks/Task.java | 4 ++++ src/tasks/TaskType.java | 7 +++++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/tasks/TaskType.java diff --git a/src/Main.java b/src/Main.java index 3f7025a..0a625be 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,11 +1,15 @@ +import managers.FileBackedTaskManager; import managers.InMemoryTaskManager; import tasks.Epic; import tasks.Subtask; import tasks.Task; import tasks.TaskStatus; +import java.io.File; +import java.io.IOException; + public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { InMemoryTaskManager inMemoryTaskManager = new InMemoryTaskManager(); Task task1 = new Task("Переезд", "переезд в другой город", TaskStatus.NEW); Task task2 = new Task("Покупка", "покупаем гитару", TaskStatus.IN_PROGRESS); @@ -139,5 +143,19 @@ public static void main(String[] args) { inMemoryTaskManager.removeEpicForId(epic01.getId()); System.out.println("Удалили эпик с подзадачей"); System.out.println(inMemoryTaskManager.getHistory()); + + //спринт 7 + File file = new File("files/Task.txt"); + FileBackedTaskManager fileBackedTaskManager = new FileBackedTaskManager(file); + Task task001 = new Task ("Task001", "Description", TaskStatus.NEW); + fileBackedTaskManager.addTask(task001); + Epic epic001 = new Epic("Epic001", "Description",TaskStatus.NEW); + fileBackedTaskManager.addEpic(epic001); + Subtask subtask001 = new Subtask("Subtask001", "Description", epic001.getId(), TaskStatus.NEW); + fileBackedTaskManager.addSubtask(subtask001); + System.out.println(); + System.out.println(fileBackedTaskManager.toString(task001)); + System.out.println(fileBackedTaskManager.toString(epic001)); + System.out.println(fileBackedTaskManager.toString(subtask001)); } } diff --git a/src/tasks/Epic.java b/src/tasks/Epic.java index cf71ac2..4691ef2 100644 --- a/src/tasks/Epic.java +++ b/src/tasks/Epic.java @@ -5,6 +5,11 @@ public Epic(String title, String description, TaskStatus status) { super(title, description, status); } + @Override + public TaskType getType() { + return TaskType.EPIC; + } + @Override public String toString() { return "tasks.Epic{" + diff --git a/src/tasks/Subtask.java b/src/tasks/Subtask.java index bd9e8af..be7d695 100644 --- a/src/tasks/Subtask.java +++ b/src/tasks/Subtask.java @@ -12,6 +12,11 @@ public int getEpicId() { return epicId; } + @Override + public TaskType getType() { + return TaskType.SUBTASK; + } + @Override public String toString() { return "tasks.Subtask{" + "title='" + getTitle() + '\'' + diff --git a/src/tasks/Task.java b/src/tasks/Task.java index 100c81a..6850f7a 100644 --- a/src/tasks/Task.java +++ b/src/tasks/Task.java @@ -31,6 +31,10 @@ public int getId() { return id; } + public TaskType getType() { + return TaskType.TASK; + } + public void setId(int id) { this.id = id; } diff --git a/src/tasks/TaskType.java b/src/tasks/TaskType.java new file mode 100644 index 0000000..f054232 --- /dev/null +++ b/src/tasks/TaskType.java @@ -0,0 +1,7 @@ +package tasks; + +public enum TaskType { + TASK, + SUBTASK, + EPIC +} From 1079f79ef68b80f339e02acffcb1a9317b7a9cd5 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 28 Aug 2025 14:42:52 +0300 Subject: [PATCH 4/8] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=20=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5?= =?UTF-8?q?=D1=80=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8B=D0=B2=D0=B0=D1=8E?= =?UTF-8?q?=D1=89=D0=B8=D0=B9=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/exceptions/ManagerSaveException.java | 7 ++ src/managers/FileBackedTaskManager.java | 115 ++++++++++++++++++++++- 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/exceptions/ManagerSaveException.java diff --git a/src/exceptions/ManagerSaveException.java b/src/exceptions/ManagerSaveException.java new file mode 100644 index 0000000..cfd46ec --- /dev/null +++ b/src/exceptions/ManagerSaveException.java @@ -0,0 +1,7 @@ +package exceptions; + +public class ManagerSaveException extends RuntimeException { + public ManagerSaveException(String message, String ex) { + super(message); + } +} diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index c509952..1c891a6 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -1,7 +1,120 @@ package managers; -public class FileBackedTaskManager extends InMemoryTaskManager implements TaskManager { +import exceptions.ManagerSaveException; +import tasks.*; +import java.io.*; + +public class FileBackedTaskManager extends InMemoryTaskManager { + private final File tasks; + + public FileBackedTaskManager(File file) { + this.tasks = file; + } + public void save() { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(tasks))) { + if (tasks.length() == 0) { //прописываем первую строку + writer.write("id,type,name,status,description,epic\n"); + } + for (Task task : getTaskList()) { + writer.write(toString(task)); + writer.newLine(); + } + for (Task task : getEpicList()) { + writer.write(toString(task)); + writer.newLine(); + } + for (Task task : getAllSubtask()) { + writer.write(toString(task)); + writer.newLine(); + } + } catch (IOException ex) { + throw new ManagerSaveException("Ошибка сохранения в файл " + tasks.getName(), ex.getMessage()); + } + } + + public static FileBackedTaskManager loadFromFile(File file) { + final FileBackedTaskManager taskManager = new FileBackedTaskManager(file); + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + reader.readLine(); //пропуск первой строки + while (reader.ready()) { + Task task = fromString(reader.readLine()); + if (task.getType() == TaskType.TASK) { + taskManager.addTask(task); + } else if (task.getType() == TaskType.EPIC) { + taskManager.addEpic((Epic) task); + } else { + taskManager.addSubtask((Subtask) task); + } + } + } catch (IOException ex) { + throw new ManagerSaveException("Ошибка чтения файла " + file.getName(), ex.getMessage()); + } + return taskManager; + } + + public String toString(Task task) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(task.getId() + ","); + stringBuilder.append(task.getType() + ","); + stringBuilder.append(task.getTitle() + ","); + stringBuilder.append(task.getStatus() + ","); + stringBuilder.append(task.getDescription() + ","); + stringBuilder.append(task.getClass().getSimpleName() + ","); + if (task.getClass() == Subtask.class) { + stringBuilder.append(((Subtask) task).getEpicId()); + } + return stringBuilder.toString(); + } + + public static Task fromString(String value) { + String[] str = value.split(","); + + if (TaskType.valueOf(str[1]) == (TaskType.TASK)) { + Task task = new Task(str[2], str[4], TaskStatus.valueOf(str[3])); + task.setId(Integer.parseInt(str[0])); + return task; + } else if (TaskType.valueOf(str[1]) == (TaskType.EPIC)) { + Epic task = new Epic(str[2], str[4], TaskStatus.valueOf(str[3])); + task.setId(Integer.parseInt(str[0])); + return task; + } else { + Subtask task = new Subtask(str[2], str[4], Integer.parseInt(str[6]), TaskStatus.valueOf(str[3])); + task.setId(Integer.parseInt(str[0])); + return task; + } + } + + @Override + public void addTask(Task task) { + super.addTask(task); + save(); + } + + @Override + public void addEpic(Epic epic) { + super.addEpic(epic); + save(); + } + + @Override + public void addSubtask(Subtask subtask) { + super.addSubtask(subtask); + save(); + } + public static void main(String[] args) { + File file = new File("files/Task.txt"); + FileBackedTaskManager fileBackedTaskManager = new FileBackedTaskManager(file); + Task task001 = new Task ("Task001", "Description", TaskStatus.NEW); + fileBackedTaskManager.addTask(task001); + Epic epic001 = new Epic("Epic001", "Description",TaskStatus.NEW); + fileBackedTaskManager.addEpic(epic001); + Subtask subtask001 = new Subtask("Subtask001", "Description", epic001.getId(), TaskStatus.NEW); + fileBackedTaskManager.addSubtask(subtask001); + fileBackedTaskManager.deleteAllEpic(); + fileBackedTaskManager.deleteAllSubtask(); + fileBackedTaskManager.deleteTaskList(); + FileBackedTaskManager fileBackedTaskManager1 = loadFromFile(file); } } From 908b0e77eec67e64f39291c2ced5b602685ae938 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 28 Aug 2025 18:28:50 +0300 Subject: [PATCH 5/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/managers/FileBackedTaskManager.java | 18 +++++++ test/managers/FileBackedTaskManagerTest.java | 52 ++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index 1c891a6..c339192 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -103,6 +103,24 @@ public void addSubtask(Subtask subtask) { save(); } + @Override + public void updateTask(Task task) { + super.updateTask(task); + save(); + } + + @Override + public void updateSubtask(Subtask subtask) { + super.updateSubtask(subtask); + save(); + } + + @Override + public void updateEpic(Epic epic) { + super.updateEpic(epic); + save(); + } + public static void main(String[] args) { File file = new File("files/Task.txt"); FileBackedTaskManager fileBackedTaskManager = new FileBackedTaskManager(file); diff --git a/test/managers/FileBackedTaskManagerTest.java b/test/managers/FileBackedTaskManagerTest.java index 132ac9e..43bb1a8 100644 --- a/test/managers/FileBackedTaskManagerTest.java +++ b/test/managers/FileBackedTaskManagerTest.java @@ -1,4 +1,56 @@ package managers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import tasks.Task; +import tasks.TaskStatus; + +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + public class FileBackedTaskManagerTest { + + File temp; + FileBackedTaskManager taskManager; + + @BeforeEach + public void createHistoryManager() { + { + try { + temp = File.createTempFile("Test", ".txt"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + taskManager = new FileBackedTaskManager(temp); + } + + @Test + @DisplayName("Сохранение пустого файла") + public void saveFile() { + taskManager.save(); + assertTrue(temp.exists()); + } + + @Test + @DisplayName("Сохранение файлов") + public void saveTasksToFile() { + Task task001 = new Task ("Task001", "Description", TaskStatus.NEW); + taskManager.addTask(task001); + Task task002 = new Task ("Task002", "Description", TaskStatus.IN_PROGRESS); + taskManager.addTask(task002); + assertTrue(temp.exists()); + assertTrue(temp.length() > 0); + } + + @Test + @DisplayName("Загрузка файлов") + public void loadFile() { + FileBackedTaskManager taskManager1 = FileBackedTaskManager.loadFromFile(temp); + assertEquals(taskManager1.getTaskList().size(), taskManager.getTaskList().size()); + } } From dd707968fec95145802c9e5422871d9da65fac74 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 28 Aug 2025 19:27:46 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20check=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/managers/FileBackedTaskManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index c339192..1dd7a08 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -124,7 +124,7 @@ public void updateEpic(Epic epic) { public static void main(String[] args) { File file = new File("files/Task.txt"); FileBackedTaskManager fileBackedTaskManager = new FileBackedTaskManager(file); - Task task001 = new Task ("Task001", "Description", TaskStatus.NEW); + Task task001 = new Task("Task001", "Description", TaskStatus.NEW); fileBackedTaskManager.addTask(task001); Epic epic001 = new Epic("Epic001", "Description",TaskStatus.NEW); fileBackedTaskManager.addEpic(epic001); From 93e7803e60d8e37afdf3b05cf27e4ebe2b22bf3d Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 28 Aug 2025 19:30:25 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20check=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Main.java b/src/Main.java index 0a625be..3af7c29 100644 --- a/src/Main.java +++ b/src/Main.java @@ -147,7 +147,7 @@ public static void main(String[] args) throws IOException { //спринт 7 File file = new File("files/Task.txt"); FileBackedTaskManager fileBackedTaskManager = new FileBackedTaskManager(file); - Task task001 = new Task ("Task001", "Description", TaskStatus.NEW); + Task task001 = new Task("Task001", "Description", TaskStatus.NEW); fileBackedTaskManager.addTask(task001); Epic epic001 = new Epic("Epic001", "Description",TaskStatus.NEW); fileBackedTaskManager.addEpic(epic001); From a630c3220480b99de527544d76dc4cfbdfa33912 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Fri, 29 Aug 2025 11:23:20 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=92=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D1=81=D0=BE=D0=B3?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=81=D1=87=D0=B5=D1=82=D1=87=D0=B8?= =?UTF-8?q?=D0=BA=20id=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8=D0=B9=D1=81=D1=8F=20?= =?UTF-8?q?=D0=BC=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=D0=BC=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/Task.txt | 4 ++++ src/managers/FileBackedTaskManager.java | 11 ++++++++--- src/managers/InMemoryTaskManager.java | 6 +++--- 3 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 files/Task.txt diff --git a/files/Task.txt b/files/Task.txt new file mode 100644 index 0000000..b8137ec --- /dev/null +++ b/files/Task.txt @@ -0,0 +1,4 @@ +id,type,name,status,description,epic +1,TASK,Task001,NEW,Description,Task, +2,EPIC,Epic001,NEW,Description,Epic, +3,SUBTASK,Subtask001,NEW,Description,Subtask,2 diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index 1dd7a08..c1562ff 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -36,15 +36,20 @@ public void save() { public static FileBackedTaskManager loadFromFile(File file) { final FileBackedTaskManager taskManager = new FileBackedTaskManager(file); try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + int idCounter = 0; reader.readLine(); //пропуск первой строки while (reader.ready()) { Task task = fromString(reader.readLine()); + final int id = task.getId(); + if (idCounter < id) { + idCounter = id; + } if (task.getType() == TaskType.TASK) { - taskManager.addTask(task); + taskManager.taskList.put(task.getId(), task); } else if (task.getType() == TaskType.EPIC) { - taskManager.addEpic((Epic) task); + taskManager.epicList.put(task.getId(), (Epic) task); } else { - taskManager.addSubtask((Subtask) task); + taskManager.subtaskList.put(task.getId(), (Subtask) task); } } } catch (IOException ex) { diff --git a/src/managers/InMemoryTaskManager.java b/src/managers/InMemoryTaskManager.java index 223544c..6275519 100644 --- a/src/managers/InMemoryTaskManager.java +++ b/src/managers/InMemoryTaskManager.java @@ -12,9 +12,9 @@ public class InMemoryTaskManager implements TaskManager { private int idCounter = 0; - private final Map taskList = new HashMap<>(); - private final Map epicList = new HashMap<>(); - private final Map subtaskList = new HashMap<>(); + protected final Map taskList = new HashMap<>(); + protected final Map epicList = new HashMap<>(); + protected final Map subtaskList = new HashMap<>(); private final HistoryManager historyManager = Managers.getDefaultHistory();