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/Main.java b/src/Main.java index 3f7025a..3af7c29 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/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 new file mode 100644 index 0000000..c1562ff --- /dev/null +++ b/src/managers/FileBackedTaskManager.java @@ -0,0 +1,143 @@ +package managers; + +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))) { + 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.taskList.put(task.getId(), task); + } else if (task.getType() == TaskType.EPIC) { + taskManager.epicList.put(task.getId(), (Epic) task); + } else { + taskManager.subtaskList.put(task.getId(), (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(); + } + + @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); + 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); + } +} 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(); 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 +} diff --git a/test/managers/FileBackedTaskManagerTest.java b/test/managers/FileBackedTaskManagerTest.java new file mode 100644 index 0000000..43bb1a8 --- /dev/null +++ b/test/managers/FileBackedTaskManagerTest.java @@ -0,0 +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()); + } +}