Skip to content
4 changes: 4 additions & 0 deletions files/Task.txt
Original file line number Diff line number Diff line change
@@ -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
20 changes: 19 additions & 1 deletion src/Main.java
Original file line number Diff line number Diff line change
@@ -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);
Expand Down Expand Up @@ -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));
}
}
7 changes: 7 additions & 0 deletions src/exceptions/ManagerSaveException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package exceptions;

public class ManagerSaveException extends RuntimeException {
public ManagerSaveException(String message, String ex) {
super(message);
}
}
143 changes: 143 additions & 0 deletions src/managers/FileBackedTaskManager.java
Original file line number Diff line number Diff line change
@@ -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);
}
}

Choose a reason for hiding this comment

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

Хорошо бы еще проинициализировать idCounter максимальным значением из файла, чтобы не было коллизий при последующем добавлении задач в менеджер.

} 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);
}
}
6 changes: 3 additions & 3 deletions src/managers/InMemoryTaskManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

public class InMemoryTaskManager implements TaskManager {
private int idCounter = 0;
private final Map<Integer, Task> taskList = new HashMap<>();
private final Map<Integer, Epic> epicList = new HashMap<>();
private final Map<Integer, Subtask> subtaskList = new HashMap<>();
protected final Map<Integer, Task> taskList = new HashMap<>();
protected final Map<Integer, Epic> epicList = new HashMap<>();
protected final Map<Integer, Subtask> subtaskList = new HashMap<>();

private final HistoryManager historyManager = Managers.getDefaultHistory();

Expand Down
5 changes: 5 additions & 0 deletions src/tasks/Epic.java
Original file line number Diff line number Diff line change
Expand Up @@ -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{" +
Expand Down
5 changes: 5 additions & 0 deletions src/tasks/Subtask.java
Original file line number Diff line number Diff line change
Expand Up @@ -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() + '\'' +
Expand Down
4 changes: 4 additions & 0 deletions src/tasks/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ public int getId() {
return id;
}

public TaskType getType() {
return TaskType.TASK;
}

public void setId(int id) {
this.id = id;
}
Expand Down
7 changes: 7 additions & 0 deletions src/tasks/TaskType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package tasks;

public enum TaskType {
TASK,
SUBTASK,
EPIC
}
56 changes: 56 additions & 0 deletions test/managers/FileBackedTaskManagerTest.java
Original file line number Diff line number Diff line change
@@ -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());
}
}