Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 36 additions & 29 deletions src/Main.java
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);

}
}
}
}
181 changes: 181 additions & 0 deletions src/manager/FileBackedTaskManager.java
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();
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

еще нужно переопределить методы массового удаления сущностей

@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);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The 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);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сейчас вычитанные из файла Эпики потеряли данные о привязанных к ним подзадачах. Чтобы наполнить внутреннее хранилище Эпиков (subtaskIds) нужно пройтись по всем подзадачам из хранилища subtasks, по значению epicId брать конкретный Эпик из хранилища epics и использовать метод addSubtask()

return manager;
}
}
3 changes: 3 additions & 0 deletions src/manager/HistoryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
import java.util.List;

public interface HistoryManager {

void add(Task task);

void remove(int id);

List<Task> getHistory();
}
12 changes: 12 additions & 0 deletions src/manager/ManagerSaveException.java
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);
}
}
6 changes: 6 additions & 0 deletions src/manager/Managers.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package manager;

import java.io.File;

public class Managers {

public static TaskManager getDefault() {
Expand All @@ -9,4 +11,8 @@ public static TaskManager getDefault() {
public static HistoryManager getDefaultHistory() {
return new InMemoryHistoryManager();
}

public static TaskManager getFileBackedTaskManager(File file) {
return new FileBackedTaskManager(file);
}
}
12 changes: 12 additions & 0 deletions src/manager/TaskManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,39 @@
public interface TaskManager {

void addTask(Task task);

void addEpic(Epic epic);

void addSubtask(Subtask subtask);

List<Task> getAllTasks();

List<Epic> getAllEpics();

List<Subtask> getAllSubtasks();

Task getTaskById(int id);

Epic getEpicById(int id);

Subtask getSubtaskById(int id);

void updateTask(Task task);

void updateEpic(Epic epic);

void updateSubtask(Subtask subtask);

void removeTaskById(int id);

void removeEpicById(int id);

void removeSubtaskById(int id);

void clearTasks();

void clearEpics();

void clearSubtasks();

List<Subtask> getSubtasksOfEpic(int epicId);
Expand Down
24 changes: 12 additions & 12 deletions src/model/Epic.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,15 @@ public void removeSubtask(int subtaskId) {

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Epic)) return false;
if (!super.equals(o)) return false;
if (this == o) {
return true;
}
if (!(o instanceof Epic)) {
return false;
}
if (!super.equals(o)) {
return false;
}
Epic epic = (Epic) o;
return Objects.equals(subtaskIds, epic.subtaskIds);
}
Expand All @@ -36,14 +42,8 @@ public boolean equals(Object o) {
public int hashCode() {
return Objects.hash(super.hashCode(), subtaskIds);
}
@Override
public String toString() {
return "Epic{" +
"id=" + getId() +
", title='" + getTitle() + '\'' +
", description='" + getDescription() + '\'' +
", status=" + getStatus() +
", subtaskIds=" + subtaskIds +
'}';

public String toCsvString() {
return String.format("%d,EPIC,%s,%s,%s,", getId(), getTitle(), getStatus(), getDescription());
}
}
Loading