-
Notifications
You must be signed in to change notification settings - Fork 0
Sprint 7 solution in file manager #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
5d289f5
57cb47f
3539547
bdf7154
6b4c17f
c135bdf
9813abc
0d1354f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,54 +1,61 @@ | ||
| import manager.InMemoryTaskManager; | ||
| import manager.Managers; | ||
| import manager.FileBackedTaskManager; | ||
| import manager.TaskManager; | ||
| import model.Epic; | ||
| import model.Status; | ||
| import model.Subtask; | ||
| import model.Task; | ||
|
|
||
| import java.util.List; | ||
| import java.io.File; | ||
|
|
||
| public class Main { | ||
| public static void main(String[] args) { | ||
| TaskManager manager = Managers.getDefault(); | ||
| Task task1 = new Task("Task1", "Desc", Status.NEW); | ||
| Task task2 = new Task("Task2", "Desc", Status.NEW); | ||
| File file = new File("tasks.csv"); | ||
| TaskManager manager = new FileBackedTaskManager(file); | ||
|
|
||
| Task task1 = new Task("Планирование отпуска", "Выбрать направление и даты", Status.NEW); | ||
| Task task2 = new Task("Закупка продуктов", "Купить продукты на неделю", Status.IN_PROGRESS); | ||
| manager.addTask(task1); | ||
| manager.addTask(task2); | ||
|
|
||
| Epic epic1 = new Epic("Epic1", "Desc"); | ||
| Epic epic2 = new Epic("Epic2", "Desc"); | ||
| Epic epic1 = new Epic("Организация мероприятия", "Подготовка к корпоративу"); | ||
| manager.addEpic(epic1); | ||
| manager.addEpic(epic2); | ||
|
|
||
| Subtask subtask1 = new Subtask("Sub1", "Desc", Status.NEW, epic1.getId()); | ||
| Subtask subtask2 = new Subtask("Sub2", "Desc", Status.NEW, epic1.getId()); | ||
| Subtask subtask1 = new Subtask("Бронирование зала", "Выбрать и забронировать помещение", Status.NEW, epic1.getId()); | ||
| Subtask subtask2 = new Subtask("Закупка еды", "Заказать еду и напитки", Status.NEW, epic1.getId()); | ||
|
|
||
| manager.addSubtask(subtask1); | ||
| manager.addSubtask(subtask2); | ||
|
|
||
| manager.getTaskById(task1.getId()); | ||
| manager.getEpicById(epic1.getId()); | ||
| manager.getTaskById(task1.getId()); | ||
| manager.getSubtaskById(subtask1.getId()); | ||
| printHistory(manager); | ||
|
|
||
| manager.removeTaskById(task1.getId()); | ||
| printHistory(manager); | ||
|
|
||
| manager.removeEpicById(epic1.getId()); | ||
| printHistory(manager); // [] | ||
| printAll(manager); | ||
| System.out.println("\nВосстановление менеджера из файла:"); | ||
| TaskManager restoredManager = FileBackedTaskManager.loadFromFile(file); | ||
| printAll(restoredManager); | ||
| } | ||
|
|
||
| private static void printHistory(TaskManager manager) { | ||
| List<Task> history = manager.getHistory(); | ||
| if (history.isEmpty()) { | ||
| System.out.println("History is empty"); | ||
| } else { | ||
| System.out.println("\nView history (" + history.size() + " items):"); | ||
| for (int i = 0; i < history.size(); i++) { | ||
| Task task = history.get(i); | ||
| System.out.println((i + 1) + ". " + task.getTitle() + " [ID:" + task.getId() + "]"); | ||
| } | ||
| private static void printAll(TaskManager manager) { | ||
| System.out.println("\n=== Задачи ==="); | ||
| for (Task task : manager.getAllTasks()) { | ||
| System.out.println(task); | ||
| } | ||
|
|
||
| System.out.println("\n=== Эпики ==="); | ||
| for (Epic epic : manager.getAllEpics()) { | ||
| System.out.println(epic); | ||
| } | ||
|
|
||
| System.out.println("\n=== Подзадачи ==="); | ||
| for (Subtask subtask : manager.getAllSubtasks()) { | ||
| System.out.println(subtask); | ||
| } | ||
|
|
||
| System.out.println("\n=== История просмотров ==="); | ||
| for (Task task : manager.getHistory()) { | ||
| System.out.println(task); | ||
|
|
||
| } | ||
| } | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,181 @@ | ||
| package manager; | ||
|
|
||
| import model.*; | ||
| import java.io.*; | ||
| import java.nio.file.Files; | ||
| import java.util.*; | ||
|
|
||
| public class FileBackedTaskManager extends InMemoryTaskManager { | ||
|
|
||
| private final File file; | ||
|
|
||
| public FileBackedTaskManager(File file) { | ||
| this.file = file; | ||
| } | ||
|
|
||
| private void save() { | ||
| try (Writer writer = new FileWriter(file)) { | ||
| writer.write("id,type,name,status,description,epic\n"); | ||
|
|
||
| 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("Ошибка при сохранении данных в файл.", e); | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public void addTask(Task task) { | ||
| super.addTask(task); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void updateTask(Task task) { | ||
| super.updateTask(task); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void removeTaskById(int id) { | ||
| super.removeTaskById(id); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void clearTasks() { | ||
| super.clearTasks(); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void addEpic(Epic epic) { | ||
| super.addEpic(epic); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void updateEpic(Epic epic) { | ||
| super.updateEpic(epic); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void removeEpicById(int id) { | ||
| super.removeEpicById(id); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void clearEpics() { | ||
| super.clearEpics(); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void addSubtask(Subtask subtask) { | ||
| super.addSubtask(subtask); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void updateSubtask(Subtask subtask) { | ||
| super.updateSubtask(subtask); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void removeSubtaskById(int id) { | ||
| super.removeSubtaskById(id); | ||
| save(); | ||
| } | ||
|
|
||
| @Override | ||
| public void clearSubtasks() { | ||
| super.clearSubtasks(); | ||
| save(); | ||
| } | ||
|
|
||
| private String toString(Task task) { | ||
| StringBuilder sb = new StringBuilder(); | ||
| sb.append(task.getId()).append(",") | ||
| .append(task instanceof Epic ? "EPIC" : task instanceof Subtask ? "SUBTASK" : "TASK").append(",") | ||
| .append(task.getTitle()).append(",") | ||
| .append(task.getStatus()).append(",") | ||
| .append(task.getDescription()); | ||
|
|
||
| if (task instanceof Subtask) { | ||
| sb.append(",").append(((Subtask) task).getEpicId()); | ||
| } else { | ||
| sb.append(","); | ||
| } | ||
| return sb.toString(); | ||
| } | ||
|
|
||
| private Task fromString(String line) { | ||
| String[] parts = line.split(","); | ||
| int id = Integer.parseInt(parts[0]); | ||
| String type = parts[1]; | ||
| String title = parts[2]; | ||
| Status status = Status.valueOf(parts[3]); | ||
| String description = parts[4]; | ||
|
|
||
| switch (type) { | ||
| case "TASK": | ||
| Task task = new Task(title, description, status); | ||
| task.setId(id); | ||
| return task; | ||
| case "EPIC": | ||
| Epic epic = new Epic(title, description); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. нужно добавить в эпик статус из файла |
||
| epic.setId(id); | ||
| epic.setStatus(status); | ||
| return epic; | ||
| case "SUBTASK": | ||
| int epicId = Integer.parseInt(parts[5]); | ||
| Subtask subtask = new Subtask(title, description, status, epicId); | ||
| subtask.setId(id); | ||
| return subtask; | ||
| default: | ||
| throw new IllegalArgumentException("Неизвестный тип задачи: " + type); | ||
| } | ||
| } | ||
|
|
||
| public static FileBackedTaskManager loadFromFile(File file) { | ||
| FileBackedTaskManager manager = new FileBackedTaskManager(file); | ||
|
|
||
| try { | ||
| List<String> lines = Files.readAllLines(file.toPath()); | ||
| for (int i = 1; i < lines.size(); i++) { // пропускаем заголовок | ||
| Task task = manager.fromString(lines.get(i)); | ||
| if (task instanceof Epic) { | ||
| manager.epics.put(task.getId(), (Epic) task); | ||
| } else if (task instanceof Subtask) { | ||
| manager.subtasks.put(task.getId(), (Subtask) task); | ||
| } else { | ||
| manager.tasks.put(task.getId(), task); | ||
| } | ||
| if (task.getId() >= manager.nextId) { | ||
| manager.nextId = task.getId() + 1; | ||
| } | ||
| } | ||
| for (Subtask subtask : manager.subtasks.values()) { | ||
| Epic epic = manager.epics.get(subtask.getEpicId()); | ||
| if (epic != null) { | ||
| epic.addSubtask(subtask); | ||
| } | ||
| } | ||
| } catch (IOException e) { | ||
| throw new ManagerSaveException("Ошибка при загрузке данных из файла.", e); | ||
| } | ||
|
|
||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Сейчас вычитанные из файла Эпики потеряли данные о привязанных к ним подзадачах. Чтобы наполнить внутреннее хранилище Эпиков (subtaskIds) нужно пройтись по всем подзадачам из хранилища subtasks, по значению epicId брать конкретный Эпик из хранилища epics и использовать метод addSubtask() |
||
| return manager; | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| package manager; | ||
|
|
||
| public class ManagerSaveException extends RuntimeException { | ||
|
|
||
| public ManagerSaveException(String message) { | ||
| super(message); | ||
| } | ||
|
|
||
| public ManagerSaveException(String message, Throwable cause) { | ||
| super(message, cause); | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
еще нужно переопределить методы массового удаления сущностей