From 3b44bcfed742ac5f45444c8d3eaa2e3bfb8d7351 Mon Sep 17 00:00:00 2001 From: Aesto Date: Wed, 18 Dec 2024 03:35:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20FileBackedTaskManager,=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=91?= =?UTF-8?q?=D0=BD=20Main=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D1=85=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=20=D0=B8=D0=B7=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.java | 44 ++++-- .../manager/FileBackedTaskManager.java | 148 ++++++++++++++++++ .../manager/ManagerSaveException.java | 7 + src/tasktracker/utils/Managers.java | 13 +- test/FileBackedTaskManagerTest.java | 19 +++ test/InMemoryTaskManagerTest.java | 2 +- 6 files changed, 211 insertions(+), 22 deletions(-) create mode 100644 src/tasktracker/manager/FileBackedTaskManager.java create mode 100644 src/tasktracker/manager/ManagerSaveException.java create mode 100644 test/FileBackedTaskManagerTest.java diff --git a/src/Main.java b/src/Main.java index ce661e1..31fe051 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,25 +1,45 @@ -import tasktracker.manager.InMemoryTaskManager; -import tasktracker.manager.TaskManager; +import tasktracker.manager.FileBackedTaskManager; import tasktracker.model.Epic; import tasktracker.model.Subtask; import tasktracker.model.Task; import tasktracker.model.TaskStatus; +import java.io.File; + public class Main { public static void main(String[] args) { - TaskManager manager = new InMemoryTaskManager(); + File file = new File("tasks.csv"); + FileBackedTaskManager manager = new FileBackedTaskManager(file); + + // Создаём задачи + Task task1 = new Task("Task 1", "Description 1", manager.generateId(), TaskStatus.NEW); + manager.createTask(task1); + + Task task2 = new Task("Task 2", "Description 2", manager.generateId(), TaskStatus.NEW); + manager.createTask(task2); + + // Создаём эпик + Epic epic1 = new Epic("Epic 1", "Epic Description", manager.generateId(), TaskStatus.NEW); + manager.createEpic(epic1); + + // Добавляем подзадачи к эпику + Subtask subtask1 = new Subtask("Subtask 1", "Subtask Description", manager.generateId(), TaskStatus.NEW, epic1.getId()); + manager.createSubtask(subtask1); - Task task = new Task("Task 1", "Description 1", manager.generateId(), TaskStatus.NEW); - manager.createTask(task); + Subtask subtask2 = new Subtask("Subtask 2", "Subtask Description", manager.generateId(), TaskStatus.IN_PROGRESS, epic1.getId()); + manager.createSubtask(subtask2); - Epic epic = new Epic("Epic 1", "Epic Description", manager.generateId(), TaskStatus.NEW); - manager.createEpic(epic); + // Выводим задачи перед сохранением + System.out.println("Tasks before loading: " + manager.getAllTasks()); + System.out.println("Epics before loading: " + manager.getAllEpics()); + System.out.println("Subtasks before loading: " + manager.getAllSubtasks()); - Subtask subtask = new Subtask("Subtask 1", "Description 1", manager.generateId(), TaskStatus.NEW, epic.getId()); - manager.createSubtask(subtask); + // Загружаем задачи из файла + FileBackedTaskManager loadedManager = FileBackedTaskManager.loadFromFile(file); - System.out.println("Tasks: " + manager.getAllTasks()); - System.out.println("Epics: " + manager.getAllEpics()); - System.out.println("Subtasks: " + manager.getAllSubtasks()); + // Выводим загруженные данные + System.out.println("Tasks after loading: " + loadedManager.getAllTasks()); + System.out.println("Epics after loading: " + loadedManager.getAllEpics()); + System.out.println("Subtasks after loading: " + loadedManager.getAllSubtasks()); } } diff --git a/src/tasktracker/manager/FileBackedTaskManager.java b/src/tasktracker/manager/FileBackedTaskManager.java new file mode 100644 index 0000000..81dd50b --- /dev/null +++ b/src/tasktracker/manager/FileBackedTaskManager.java @@ -0,0 +1,148 @@ +package tasktracker.manager; + +import tasktracker.model.Epic; +import tasktracker.model.Subtask; +import tasktracker.model.Task; +import tasktracker.model.TaskStatus; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; + +public class FileBackedTaskManager extends InMemoryTaskManager { + + private final File file; + + public FileBackedTaskManager(File file) { + this.file = file; + } + + // Метод сохранения данных в файл + private void save() { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write("id,type,name,status,description,epic\n"); // Заголовок CSV + + for (Task task : getAllTasks()) { + writer.write(toString(task) + "\n"); + } + for (Epic epic : getAllEpics()) { + writer.write(toString(epic) + "\n"); + } + for (Subtask subtask : getAllSubtasks()) { + writer.write(toString(subtask) + "\n"); + } + } catch (IOException e) { + throw new ManagerSaveException("Error saving to file", e); + } + } + + // Метод конвертации задачи в строку CSV + private String toString(Task task) { + return String.format("%d,%s,%s,%s,%s,%s", + task.getId(), + task instanceof Epic ? "EPIC" : + task instanceof Subtask ? "SUBTASK" : "TASK", + task.getTitle(), + task.getStatus(), + task.getDescription(), + task instanceof Subtask ? ((Subtask) task).getEpicId() : ""); + } + + // Метод конвертации строки CSV в задачу + private Task fromString(String value) { + String[] fields = value.split(","); + int id = Integer.parseInt(fields[0]); + String type = fields[1]; + String title = fields[2]; + TaskStatus status = TaskStatus.valueOf(fields[3]); + String description = fields[4]; + + if ("EPIC".equals(type)) { + return new Epic(title, description, id, status); + } else if ("SUBTASK".equals(type)) { + int epicId = Integer.parseInt(fields[5]); + return new Subtask(title, description, id, status, epicId); + } else { + return new Task(title, description, id, status); + } + } + + // Метод загрузки менеджера из файла + public static FileBackedTaskManager loadFromFile(File file) { + FileBackedTaskManager manager = new FileBackedTaskManager(file); + Map subtasks = new HashMap<>(); + + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + reader.readLine(); // Пропускаем заголовок + String line; + + while ((line = reader.readLine()) != null) { + Task task = manager.fromString(line); + if (task instanceof Epic) { + manager.createEpic((Epic) task); + } else if (task instanceof Subtask) { + subtasks.put(task.getId(), (Subtask) task); + } else { + manager.createTask(task); + } + } + + // Восстановление связи подзадач с эпиками + for (Subtask subtask : subtasks.values()) { + manager.createSubtask(subtask); + Epic epic = manager.getEpic(subtask.getEpicId()); + if (epic != null) { + epic.addSubtaskId(subtask.getId()); + } + } + + } catch (IOException e) { + throw new ManagerSaveException("Error loading from file", e); + } + + return manager; + } + + // Переопределение методов для сохранения после каждой модификации + @Override + public void createTask(Task task) { + super.createTask(task); + save(); + } + + @Override + public void createEpic(Epic epic) { + super.createEpic(epic); + save(); + } + + @Override + public void createSubtask(Subtask subtask) { + super.createSubtask(subtask); + save(); + } + + @Override + public void updateTask(Task task) { + super.updateTask(task); + save(); + } + + @Override + public void deleteTaskById(int id) { + super.deleteTaskById(id); + save(); + } + + @Override + public void deleteEpicById(int id) { + super.deleteEpicById(id); + save(); + } + + @Override + public void deleteSubtaskById(int id) { + super.deleteSubtaskById(id); + save(); + } +} diff --git a/src/tasktracker/manager/ManagerSaveException.java b/src/tasktracker/manager/ManagerSaveException.java new file mode 100644 index 0000000..99a5437 --- /dev/null +++ b/src/tasktracker/manager/ManagerSaveException.java @@ -0,0 +1,7 @@ +package tasktracker.manager; + +public class ManagerSaveException extends RuntimeException { + public ManagerSaveException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/tasktracker/utils/Managers.java b/src/tasktracker/utils/Managers.java index a899837..f45f481 100644 --- a/src/tasktracker/utils/Managers.java +++ b/src/tasktracker/utils/Managers.java @@ -1,17 +1,12 @@ package tasktracker.utils; -import tasktracker.manager.HistoryManager; -import tasktracker.manager.InMemoryHistoryManager; -import tasktracker.manager.InMemoryTaskManager; +import tasktracker.manager.FileBackedTaskManager; import tasktracker.manager.TaskManager; +import java.io.File; + public class Managers { public static TaskManager getDefault() { - return new InMemoryTaskManager(); - } - - public static HistoryManager getDefaultHistory() { - return new InMemoryHistoryManager(); + return new FileBackedTaskManager(new File("tasks.csv")); } } - diff --git a/test/FileBackedTaskManagerTest.java b/test/FileBackedTaskManagerTest.java new file mode 100644 index 0000000..7b42733 --- /dev/null +++ b/test/FileBackedTaskManagerTest.java @@ -0,0 +1,19 @@ +import org.junit.jupiter.api.Test; +import tasktracker.manager.FileBackedTaskManager; + +import java.io.File; + +import static org.junit.jupiter.api.Assertions.*; + +public class FileBackedTaskManagerTest { + + @Test + public void shouldLoadFromEmptyFile() { + File file = new File("empty_tasks.csv"); + FileBackedTaskManager loadedManager = FileBackedTaskManager.loadFromFile(file); + + assertTrue(loadedManager.getAllTasks().isEmpty(), "Tasks list should be empty"); + assertTrue(loadedManager.getAllEpics().isEmpty(), "Epics list should be empty"); + assertTrue(loadedManager.getAllSubtasks().isEmpty(), "Subtasks list should be empty"); + } +} diff --git a/test/InMemoryTaskManagerTest.java b/test/InMemoryTaskManagerTest.java index c281115..dc6da86 100644 --- a/test/InMemoryTaskManagerTest.java +++ b/test/InMemoryTaskManagerTest.java @@ -34,4 +34,4 @@ public void getHistoryTest() { public void testInitialization() { assertNotNull(taskManager); } -} +} \ No newline at end of file