From 052b08d1e1e23c914e98b7af779dd210ed2e4783 Mon Sep 17 00:00:00 2001 From: YG Date: Sat, 18 May 2024 12:48:02 +0300 Subject: [PATCH 1/4] Java sprint 7 v1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Созданы классы : FileBackedTaskManager, TaskConverter, TaskData. Класс enum : TaskType. Классы исключения: ManagerSaveException, NotFoundException. Переделаны некоторые классы: InMemoryTaskManager,Manager, Task, Subtask, Epic --- .../javacource/golotin/schedule/Main.java | 5 +- .../schedule/converter/TaskConverter.java | 14 ++ .../exception/ManagerSaveException.java | 7 + .../schedule/exception/NotFoundException.java | 7 + .../golotin/schedule/model/Epic.java | 11 +- .../golotin/schedule/model/Subtask.java | 8 +- .../golotin/schedule/model/Task.java | 11 +- .../golotin/schedule/model/TaskData.java | 21 +++ .../golotin/schedule/model/TaskType.java | 7 + .../service/FileBackedTaskManager.java | 169 ++++++++++++++++++ .../schedule/service/InMemoryTaskManager.java | 32 +++- .../golotin/schedule/service/Manager.java | 2 +- 12 files changed, 270 insertions(+), 24 deletions(-) create mode 100644 src/ru/yandex/javacource/golotin/schedule/converter/TaskConverter.java create mode 100644 src/ru/yandex/javacource/golotin/schedule/exception/ManagerSaveException.java create mode 100644 src/ru/yandex/javacource/golotin/schedule/exception/NotFoundException.java create mode 100644 src/ru/yandex/javacource/golotin/schedule/model/TaskData.java create mode 100644 src/ru/yandex/javacource/golotin/schedule/model/TaskType.java create mode 100644 src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java diff --git a/src/ru/yandex/javacource/golotin/schedule/Main.java b/src/ru/yandex/javacource/golotin/schedule/Main.java index bf9e5d0..9d4ad4b 100644 --- a/src/ru/yandex/javacource/golotin/schedule/Main.java +++ b/src/ru/yandex/javacource/golotin/schedule/Main.java @@ -4,12 +4,13 @@ import ru.yandex.javacource.golotin.schedule.model.Status; import ru.yandex.javacource.golotin.schedule.model.Subtask; import ru.yandex.javacource.golotin.schedule.model.Task; -import ru.yandex.javacource.golotin.schedule.service.InMemoryTaskManager; + +import ru.yandex.javacource.golotin.schedule.service.Manager; import ru.yandex.javacource.golotin.schedule.service.TaskManager; public class Main { public static void main(String[] args) { - TaskManager taskManager = new InMemoryTaskManager(); + TaskManager taskManager = Manager.getDefaults(); taskManager.createTask(new Task("Дом", Status.NEW, "Убраться в кухни и ванной")); taskManager.createTask(new Task("Работа", Status.IN_PROGRESS, "Сделать куча рутины и пойти домой:)")); diff --git a/src/ru/yandex/javacource/golotin/schedule/converter/TaskConverter.java b/src/ru/yandex/javacource/golotin/schedule/converter/TaskConverter.java new file mode 100644 index 0000000..cba03c0 --- /dev/null +++ b/src/ru/yandex/javacource/golotin/schedule/converter/TaskConverter.java @@ -0,0 +1,14 @@ +package ru.yandex.javacource.golotin.schedule.converter; + +import ru.yandex.javacource.golotin.schedule.model.Task; +import ru.yandex.javacource.golotin.schedule.model.TaskType; + +public class TaskConverter { + public TaskType getType() { + return TaskType.TASK; + } + + public String toString(Task task) { + return task.getId() + "," + task.getName() + "," + task.getDescription(); + } +} diff --git a/src/ru/yandex/javacource/golotin/schedule/exception/ManagerSaveException.java b/src/ru/yandex/javacource/golotin/schedule/exception/ManagerSaveException.java new file mode 100644 index 0000000..e84bcad --- /dev/null +++ b/src/ru/yandex/javacource/golotin/schedule/exception/ManagerSaveException.java @@ -0,0 +1,7 @@ +package ru.yandex.javacource.golotin.schedule.exception; + +public class ManagerSaveException extends RuntimeException { + public ManagerSaveException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/ru/yandex/javacource/golotin/schedule/exception/NotFoundException.java b/src/ru/yandex/javacource/golotin/schedule/exception/NotFoundException.java new file mode 100644 index 0000000..a29cb5b --- /dev/null +++ b/src/ru/yandex/javacource/golotin/schedule/exception/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.yandex.javacource.golotin.schedule.exception; + +public class NotFoundException extends RuntimeException { + public NotFoundException(String message) { + super(message); + } +} diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Epic.java b/src/ru/yandex/javacource/golotin/schedule/model/Epic.java index bd4eea1..6607bc4 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Epic.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Epic.java @@ -1,10 +1,11 @@ package ru.yandex.javacource.golotin.schedule.model; import java.util.ArrayList; +import java.util.List; public class Epic extends Task { - private final ArrayList subtaskIds = new ArrayList<>(); + private final List subtaskIds = new ArrayList<>(); public Epic(String name, Status status, String description) { super(name, status, description); @@ -23,15 +24,15 @@ public void removeSubtask(int id) { subtaskIds.remove(id); } - public ArrayList getSubtaskIds() { + public List getSubtaskIds() { return subtaskIds; } + public TaskType getType() {return TaskType.EPIC;} + @Override public String toString() { - return "Epic{" + - "subtaskIds=" + subtaskIds + - '}'; + return STR."Epic{subtaskIds=\{subtaskIds}\{'}'}"; } } diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java b/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java index 9c0e1ce..85d8a64 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java @@ -10,18 +10,20 @@ public Subtask(String name, Status status, String description,int epicId) { setEpicId(epicId); } + @Override public Integer getEpicId() { return epicId; } + @Override + public TaskType getType() {return TaskType.SUBTASK;} + public void setEpicId(Integer epicId) { this.epicId = epicId; } @Override public String toString() { - return "Subtask{" + - "epicId=" + epicId + - '}'; + return STR."Subtask{epicId=\{epicId}\{'}'}"; } } diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Task.java b/src/ru/yandex/javacource/golotin/schedule/model/Task.java index 2fa635c..6c17251 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Task.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Task.java @@ -26,6 +26,8 @@ public String getName() { return name; } + public Integer getEpicId() {return null;} + public void setName(String name) { this.name = name; } @@ -34,6 +36,8 @@ public String getDescription() { return description; } + public TaskType getType() {return TaskType.TASK;} + public void setDescription(String description) { this.description = description; } @@ -61,11 +65,6 @@ public int hashCode() { @Override public String toString() { - return "Task{" + - "id=" + id + - ", name='" + name + '\'' + - ", description='" + description + '\'' + - ", status=" + status + - '}'; + return STR."Task{id=\{id}, name='\{name}\{'\''}, description='\{description}\{'\''}, status=\{status}\{'}'}"; } } diff --git a/src/ru/yandex/javacource/golotin/schedule/model/TaskData.java b/src/ru/yandex/javacource/golotin/schedule/model/TaskData.java new file mode 100644 index 0000000..35536b9 --- /dev/null +++ b/src/ru/yandex/javacource/golotin/schedule/model/TaskData.java @@ -0,0 +1,21 @@ +package ru.yandex.javacource.golotin.schedule.model; + +import java.util.List; + +public class TaskData { + final List tasks; + final List history; + + public TaskData(List tasks, List history) { + this.tasks = tasks; + this.history = history; + } + + public List getTasks() { + return tasks; + } + + public List getHistory() { + return history; + } +} diff --git a/src/ru/yandex/javacource/golotin/schedule/model/TaskType.java b/src/ru/yandex/javacource/golotin/schedule/model/TaskType.java new file mode 100644 index 0000000..b3fda4f --- /dev/null +++ b/src/ru/yandex/javacource/golotin/schedule/model/TaskType.java @@ -0,0 +1,7 @@ +package ru.yandex.javacource.golotin.schedule.model; + +public enum TaskType { + TASK, + SUBTASK, + EPIC +} diff --git a/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java b/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java new file mode 100644 index 0000000..54f5a23 --- /dev/null +++ b/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java @@ -0,0 +1,169 @@ +package ru.yandex.javacource.golotin.schedule.service; + +import static java.nio.charset.StandardCharsets.UTF_8; + +import java.io.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import ru.yandex.javacource.golotin.schedule.converter.TaskConverter; +import ru.yandex.javacource.golotin.schedule.exception.ManagerSaveException; +import ru.yandex.javacource.golotin.schedule.model.*; + +public class FileBackedTaskManager extends InMemoryTaskManager { + HashMap converters; + private final File file; + public FileBackedTaskManager() { + this(Manager.getDefaultHistory()); + } + + public FileBackedTaskManager(HistoryManager historyManager) { + this(historyManager, new File(TASK_CSV)); + } + + public FileBackedTaskManager(File file) { + this(Manager.getDefaultHistory(), file); + } + + + public FileBackedTaskManager(HistoryManager historyManager, File file) { + super(historyManager); + this.file = file; + } + + public void initialization() { + loadFromFile(); + } + + public static FileBackedTaskManager loadFromFile(File file) { + FileBackedTaskManager manager = new FileBackedTaskManager(file); + manager.initialization(); + return manager; + } + @Override + public List getTasks() { + return super.getTasks(); + } + + @Override + public Task getTask(int id) { + return super.getTask(id); + } + + @Override + public Task createTask(Task task) { + Task newTask = super.createTask(task); + saveToFile(); + return newTask; + } + + @Override + public void updateTask(Task task) { + super.updateTask(task); + } + + @Override + public void updateEpic(Epic epic) { + super.updateEpic(epic); + } + + @Override + public void updateSubtask(Subtask subTask) { + super.updateSubtask(subTask); + } + + @Override + public void deleteTask(int id) { + super.deleteTask(id); + } + + @Override + public void deleteSubtask(int id) { + super.deleteSubtask(id); + } + + private String toString(Task task) { + return STR."\{task.getId()},\{task.getName()},\{task.getDescription()},\{task.getEpicId()}"; + } + + private Task fromString(String value) { + final String[] columns = value.split(","); + int id = 0; + int epicId = 0; + String name = ""; + String description = ""; + Status status = null; + TaskType type = TaskType.valueOf(columns[1]); + Task task = null; + switch (type) { + case TASK: + task = new Task(name, status, description); + break; + case SUBTASK: + task = new Subtask(name, status, description, epicId); + break; + case EPIC: + task = new Epic(name, status, description); + break; + } + return task; + } + + static String toString(HistoryManager manager) { + String sb = ""; + manager.getAll(); + return sb; + } + + static List historyFromString(String value) { + final String[] ids = value.split(","); + List history = new ArrayList<>(); + for (String id : ids) { + history.add(Integer.valueOf(id)); + } + return history; + } + + + private void saveToFile() {// Сохранение в файл + try (final BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + for (Map.Entry entry : tasks.entrySet()) { + writer.append(toString(entry.getValue())); + writer.newLine(); + } + } catch (IOException e) { + throw new ManagerSaveException(STR."Ошибка в файле: \{file.getAbsolutePath()}", e); + } + + } + + private void loadFromFile() {// Чтение из в файла + int maxId = 0; + try (final BufferedReader reader = new BufferedReader(new FileReader(file, UTF_8))) { + reader.readLine(); // Пропускаем заголовок + while (true) { + String line = reader.readLine(); + final Task task = fromString(line); + final int id = task.getId(); + if (task.getType() == TaskType.TASK) { + tasks.put(id, task); + } + if (maxId < id) { + maxId = id; + } + if (line.isEmpty()) { + break; + } + } + String line = reader.readLine();// История + } catch (IOException e) {// Отлавливаем ошибки + throw new ManagerSaveException(STR."Ошибка при чтении файла: \{file.getAbsolutePath()}", e); + } + counterId = maxId;// генератор + } + + public static final String TASK_CSV = "task.csv"; +} diff --git a/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java b/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java index 4d81f5f..3592b14 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java @@ -1,5 +1,6 @@ package ru.yandex.javacource.golotin.schedule.service; +import ru.yandex.javacource.golotin.schedule.exception.NotFoundException; import ru.yandex.javacource.golotin.schedule.model.Epic; import ru.yandex.javacource.golotin.schedule.model.Status; import ru.yandex.javacource.golotin.schedule.model.Subtask; @@ -13,10 +14,18 @@ public class InMemoryTaskManager implements TaskManager { protected int counterId = 0; - final Map tasks = new HashMap<>(); - final Map epics = new HashMap<>(); - final Map subtasks = new HashMap<>(); - final HistoryManager historyManager = Manager.getDefaultHistory(); + final Map tasks ; + final Map epics ; + final Map subtasks ; + final HistoryManager historyManager ; + + + public InMemoryTaskManager(HistoryManager historyManager) { + this.historyManager = historyManager; // 3 + this.tasks = new HashMap<>(); + this.epics = new HashMap<>(); + this.subtasks = new HashMap<>(); + } @Override public Task createTask(Task task) {// создание Task @@ -134,17 +143,17 @@ public void deleteEpic(int id) {// удаление по id Epic } @Override - public ArrayList getTasks() { + public List getTasks() { return new ArrayList<>(tasks.values()); }// получаем список Tasks @Override - public ArrayList getEpics() { + public List getEpics() { return new ArrayList<>(epics.values()); }// получаем список Epics @Override - public ArrayList getEpicSubtasks(int epicId) {// получаем список Epic с Subtasks + public List getEpicSubtasks(int epicId) {// получаем список Epic с Subtasks Epic epic = epics.get(epicId); ArrayList getSubtasks = null; for (Integer subtaskId : epic.getSubtaskIds()) { @@ -158,6 +167,9 @@ public ArrayList getEpicSubtasks(int epicId) {// получаем сп @Override public Task getTask(int id) {// получаем Task по id final Task task = tasks.get(id); + if (task == null) { + throw new NotFoundException("Задача с ид=" + id); + } historyManager.add(task); return task; @@ -166,6 +178,9 @@ public Task getTask(int id) {// получаем Task по id @Override public Epic getEpic(int id) {// получаем Epic по id final Epic epic = epics.get(id); + if (epic == null) { + throw new NotFoundException("Эпик с ид=" + id); + } historyManager.add(epic); return epic; } @@ -173,6 +188,9 @@ public Epic getEpic(int id) {// получаем Epic по id @Override public Subtask getSubtask(int id) {// получаем Subtask по id final Subtask subtask = subtasks.get(id); + if (subtask == null) { + throw new NotFoundException("Подзадача с ид=" + id); + } historyManager.add(subtask); return subtask; } diff --git a/src/ru/yandex/javacource/golotin/schedule/service/Manager.java b/src/ru/yandex/javacource/golotin/schedule/service/Manager.java index dd0f7c9..c359f2e 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/Manager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/Manager.java @@ -2,7 +2,7 @@ public class Manager { public static TaskManager getDefaults() { - return new InMemoryTaskManager(); + return new InMemoryTaskManager(getDefaultHistory()); } public static InMemoryHistoryManager getDefaultHistory() { From dbb8ca4e96f38b31af996bc70b822b50fedfeb13 Mon Sep 17 00:00:00 2001 From: YG Date: Sun, 19 May 2024 12:40:27 +0300 Subject: [PATCH 2/4] Java sprint 7 v1.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Удалены классы: TaskConverter, TaskData. Обновлены классы: FileBackedTaskManager,Manager. Добавлены методы в классы исключения; ManagerSaveException, NotFoundException Добавлена перегрузка конструкторов: Task,Subtask,Epic --- .../schedule/converter/TaskConverter.java | 14 -- .../exception/ManagerSaveException.java | 11 + .../schedule/exception/NotFoundException.java | 11 + .../golotin/schedule/model/Epic.java | 5 +- .../golotin/schedule/model/Subtask.java | 6 +- .../golotin/schedule/model/Task.java | 7 + .../golotin/schedule/model/TaskData.java | 21 -- .../service/FileBackedTaskManager.java | 198 +++++++++++------- .../schedule/service/InMemoryTaskManager.java | 8 +- .../golotin/schedule/service/Manager.java | 6 +- .../golotin/schedule/service/TaskManager.java | 3 +- task.csv | 2 + 12 files changed, 169 insertions(+), 123 deletions(-) delete mode 100644 src/ru/yandex/javacource/golotin/schedule/converter/TaskConverter.java delete mode 100644 src/ru/yandex/javacource/golotin/schedule/model/TaskData.java create mode 100644 task.csv diff --git a/src/ru/yandex/javacource/golotin/schedule/converter/TaskConverter.java b/src/ru/yandex/javacource/golotin/schedule/converter/TaskConverter.java deleted file mode 100644 index cba03c0..0000000 --- a/src/ru/yandex/javacource/golotin/schedule/converter/TaskConverter.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.yandex.javacource.golotin.schedule.converter; - -import ru.yandex.javacource.golotin.schedule.model.Task; -import ru.yandex.javacource.golotin.schedule.model.TaskType; - -public class TaskConverter { - public TaskType getType() { - return TaskType.TASK; - } - - public String toString(Task task) { - return task.getId() + "," + task.getName() + "," + task.getDescription(); - } -} diff --git a/src/ru/yandex/javacource/golotin/schedule/exception/ManagerSaveException.java b/src/ru/yandex/javacource/golotin/schedule/exception/ManagerSaveException.java index e84bcad..61cd6ef 100644 --- a/src/ru/yandex/javacource/golotin/schedule/exception/ManagerSaveException.java +++ b/src/ru/yandex/javacource/golotin/schedule/exception/ManagerSaveException.java @@ -1,7 +1,18 @@ package ru.yandex.javacource.golotin.schedule.exception; public class ManagerSaveException extends RuntimeException { + public ManagerSaveException() { + } + + public ManagerSaveException(String message) { + super(message); + } + public ManagerSaveException(String message, Throwable cause) { super(message, cause); } + + public ManagerSaveException(Throwable cause) { + super(cause); + } } diff --git a/src/ru/yandex/javacource/golotin/schedule/exception/NotFoundException.java b/src/ru/yandex/javacource/golotin/schedule/exception/NotFoundException.java index a29cb5b..09ef1ad 100644 --- a/src/ru/yandex/javacource/golotin/schedule/exception/NotFoundException.java +++ b/src/ru/yandex/javacource/golotin/schedule/exception/NotFoundException.java @@ -1,7 +1,18 @@ package ru.yandex.javacource.golotin.schedule.exception; public class NotFoundException extends RuntimeException { + public NotFoundException() { + } + public NotFoundException(String message) { super(message); } + + public NotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public NotFoundException(Throwable cause) { + super(cause); + } } diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Epic.java b/src/ru/yandex/javacource/golotin/schedule/model/Epic.java index 6607bc4..ef57113 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Epic.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Epic.java @@ -11,7 +11,10 @@ public Epic(String name, Status status, String description) { super(name, status, description); } - + public Epic(int id,String name,String description,Status status){ + super(name, status, description); + setId(id); + } public void addSubtaskId(int id) { subtaskIds.add(id); } diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java b/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java index 85d8a64..7c45730 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java @@ -9,7 +9,11 @@ public Subtask(String name, Status status, String description,int epicId) { super(name, status, description); setEpicId(epicId); } - + public Subtask(int id,String name,String description,Status status,Integer epicId){ + super(name, status, description); + setId(id); + setEpicId(epicId); + } @Override public Integer getEpicId() { return epicId; diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Task.java b/src/ru/yandex/javacource/golotin/schedule/model/Task.java index 6c17251..9362cca 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Task.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Task.java @@ -14,6 +14,13 @@ public Task(String name, Status status, String description) { this.description = description; } + public Task(int id,String name,String description,Status status){ + setId(id); + this.name = name; + this.status = status; + this.description = description; + } + public int getId() { return id; } diff --git a/src/ru/yandex/javacource/golotin/schedule/model/TaskData.java b/src/ru/yandex/javacource/golotin/schedule/model/TaskData.java deleted file mode 100644 index 35536b9..0000000 --- a/src/ru/yandex/javacource/golotin/schedule/model/TaskData.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.yandex.javacource.golotin.schedule.model; - -import java.util.List; - -public class TaskData { - final List tasks; - final List history; - - public TaskData(List tasks, List history) { - this.tasks = tasks; - this.history = history; - } - - public List getTasks() { - return tasks; - } - - public List getHistory() { - return history; - } -} diff --git a/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java b/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java index 54f5a23..24c906a 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java @@ -4,140 +4,174 @@ import java.io.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.nio.file.Files; + import java.util.Map; -import ru.yandex.javacource.golotin.schedule.converter.TaskConverter; import ru.yandex.javacource.golotin.schedule.exception.ManagerSaveException; import ru.yandex.javacource.golotin.schedule.model.*; public class FileBackedTaskManager extends InMemoryTaskManager { - HashMap converters; - private final File file; - public FileBackedTaskManager() { - this(Manager.getDefaultHistory()); - } - public FileBackedTaskManager(HistoryManager historyManager) { - this(historyManager, new File(TASK_CSV)); - } + private static final String HEADER = "id,type,name,status,description,epic"; + private final File file; public FileBackedTaskManager(File file) { - this(Manager.getDefaultHistory(), file); - } - - - public FileBackedTaskManager(HistoryManager historyManager, File file) { - super(historyManager); + super(Manager.getDefaultHistory()); this.file = file; } - public void initialization() { - loadFromFile(); - } - public static FileBackedTaskManager loadFromFile(File file) { - FileBackedTaskManager manager = new FileBackedTaskManager(file); - manager.initialization(); - return manager; + final FileBackedTaskManager taskManager = new FileBackedTaskManager(file); + try { + final String csv = Files.readString(file.toPath()); + final String[] lines = csv.split(System.lineSeparator()); + int generatorId = 0; + for (int i = 1; i < lines.length; i++) { + String line = lines[i]; + if (line.isEmpty()) { + break; + } + final Task task = taskFromString(line); + final int id = task.getId(); + if (id > generatorId) { + generatorId = id; + } + if (task.getType() == TaskType.TASK) { + taskManager.createTask(task); + } else if (task.getType() == TaskType.SUBTASK) { + taskManager.createSubtask(new Subtask(task.getId(), task.getName(), task.getDescription(), + task.getStatus(), task.getEpicId())); + } else if (task.getType() == TaskType.EPIC) { + taskManager.createEpic(new Epic(task.getId(), task.getName(), task.getDescription(), + task.getStatus())); + for (Subtask subtask : taskManager.subtasks.values()) {// Поиск подзадач эпика + if (subtask.getEpicId() == task.getId()) { + Epic epic = taskManager.epics.get(task.getId()); + epic.addSubtaskId(subtask.getId()); + } + } + } + } + for (Map.Entry e : taskManager.subtasks.entrySet()) { + final Subtask subtask = e.getValue(); + final Epic epic = taskManager.epics.get(subtask.getEpicId()); + epic.addSubtaskId(subtask.getId()); + } + taskManager.counterId = generatorId; + } catch (IOException e) { + throw new ManagerSaveException(STR."Невозможно прочитать файл: \{file.getName()}", e); + } + return taskManager; } + @Override - public List getTasks() { - return super.getTasks(); + public Task createTask(Task task) { + Task newTask = super.createTask(task); + saveToFile(); + return newTask; } @Override - public Task getTask(int id) { - return super.getTask(id); + public Epic createEpic(Epic epic) { + Epic newEpic = super.createEpic(epic); + saveToFile(); + return newEpic; } @Override - public Task createTask(Task task) { - Task newTask = super.createTask(task); + public Subtask createSubtask(Subtask subtask) { + Subtask newSubtask = super.createSubtask(subtask); saveToFile(); - return newTask; + return newSubtask; } @Override public void updateTask(Task task) { super.updateTask(task); + saveToFile(); } @Override public void updateEpic(Epic epic) { super.updateEpic(epic); + saveToFile(); } @Override public void updateSubtask(Subtask subTask) { super.updateSubtask(subTask); + saveToFile(); } @Override public void deleteTask(int id) { super.deleteTask(id); + saveToFile(); + } + + @Override + public void deleteEpic(int id) { + super.deleteEpic(id); + saveToFile(); } @Override public void deleteSubtask(int id) { super.deleteSubtask(id); + saveToFile(); } - private String toString(Task task) { - return STR."\{task.getId()},\{task.getName()},\{task.getDescription()},\{task.getEpicId()}"; + public static String toString(Task task) { + return STR."\{task.getId()},\{task.getType()},\{task.getName()},\{task.getStatus()},\{task.getDescription()},\{task.getType().equals(TaskType.SUBTASK) ? task.getEpicId() : ""}"; } - private Task fromString(String value) { - final String[] columns = value.split(","); - int id = 0; - int epicId = 0; - String name = ""; - String description = ""; - Status status = null; - TaskType type = TaskType.valueOf(columns[1]); - Task task = null; - switch (type) { - case TASK: - task = new Task(name, status, description); - break; - case SUBTASK: - task = new Subtask(name, status, description, epicId); - break; - case EPIC: - task = new Epic(name, status, description); - break; - } - return task; - } - static String toString(HistoryManager manager) { - String sb = ""; - manager.getAll(); - return sb; - } - - static List historyFromString(String value) { - final String[] ids = value.split(","); - List history = new ArrayList<>(); - for (String id : ids) { - history.add(Integer.valueOf(id)); + public static Task taskFromString(String value) { + final String[] values = value.split(","); + final int id = Integer.parseInt(values[0]); + final TaskType type = TaskType.valueOf(values[1]); + final String name = values[2]; + final Status status = Status.valueOf(values[3]); + final String description = values[4]; + if (type == TaskType.TASK) { + return new Task(id, name, description, status); + } + if (type == TaskType.SUBTASK) { + final int epicId = Integer.parseInt(values[5]); + return new Subtask(id, name, description, status, epicId); } - return history; + + return new Epic(id, name, description, status); } + protected void saveToFile() { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write(HEADER); + writer.newLine(); - private void saveToFile() {// Сохранение в файл - try (final BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { for (Map.Entry entry : tasks.entrySet()) { - writer.append(toString(entry.getValue())); + final Task task = entry.getValue(); + writer.write(CSVTaskFormat.toString(task)); writer.newLine(); } + + for (Map.Entry entry : subtasks.entrySet()) { + final Task task = entry.getValue(); + writer.write(CSVTaskFormat.toString(task)); + writer.newLine(); + } + + for (Map.Entry entry : epics.entrySet()) { + final Task task = entry.getValue(); + writer.write(CSVTaskFormat.toString(task)); + writer.newLine(); + } + + writer.newLine(); } catch (IOException e) { - throw new ManagerSaveException(STR."Ошибка в файле: \{file.getAbsolutePath()}", e); + throw new ManagerSaveException("Ошибка сохранения файла: " + file.getName(), e); } - } private void loadFromFile() {// Чтение из в файла @@ -146,10 +180,21 @@ private void loadFromFile() {// Чтение из в файла reader.readLine(); // Пропускаем заголовок while (true) { String line = reader.readLine(); - final Task task = fromString(line); + final Task task = taskFromString(line); final int id = task.getId(); - if (task.getType() == TaskType.TASK) { + if (task.getType() == TaskType.TASK) {// Задача tasks.put(id, task); + } else if (task.getType() == TaskType.SUBTASK) {// Подзадачи + subtasks.put(id, new Subtask(task.getId(), task.getName(), task.getDescription(), task.getStatus(), + task.getEpicId())); + } else if (task.getType() == TaskType.EPIC) {// Эпики + epics.put(id, new Epic(task.getId(), task.getName(), task.getDescription(), task.getStatus())); + for (Subtask subtask : subtasks.values()) {// Поиск подзадач эпика + if (subtask.getEpicId() == task.getId()) { + Epic epic = epics.get(task.getId()); + epic.addSubtaskId(subtask.getId()); + } + } } if (maxId < id) { maxId = id; @@ -158,12 +203,9 @@ private void loadFromFile() {// Чтение из в файла break; } } - String line = reader.readLine();// История } catch (IOException e) {// Отлавливаем ошибки throw new ManagerSaveException(STR."Ошибка при чтении файла: \{file.getAbsolutePath()}", e); } counterId = maxId;// генератор } - - public static final String TASK_CSV = "task.csv"; } diff --git a/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java b/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java index 3592b14..f5cb431 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/InMemoryTaskManager.java @@ -14,10 +14,10 @@ public class InMemoryTaskManager implements TaskManager { protected int counterId = 0; - final Map tasks ; - final Map epics ; - final Map subtasks ; - final HistoryManager historyManager ; + protected final Map tasks; + protected final Map epics; + protected final Map subtasks; + protected final HistoryManager historyManager; public InMemoryTaskManager(HistoryManager historyManager) { diff --git a/src/ru/yandex/javacource/golotin/schedule/service/Manager.java b/src/ru/yandex/javacource/golotin/schedule/service/Manager.java index c359f2e..d9c4911 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/Manager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/Manager.java @@ -1,8 +1,10 @@ package ru.yandex.javacource.golotin.schedule.service; +import java.io.File; + public class Manager { - public static TaskManager getDefaults() { - return new InMemoryTaskManager(getDefaultHistory()); + public static TaskManager getDefault() { + return new FileBackedTaskManager(new File("resources/task.csv")); } public static InMemoryHistoryManager getDefaultHistory() { diff --git a/src/ru/yandex/javacource/golotin/schedule/service/TaskManager.java b/src/ru/yandex/javacource/golotin/schedule/service/TaskManager.java index 9740aeb..d8f5a77 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/TaskManager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/TaskManager.java @@ -4,13 +4,12 @@ import ru.yandex.javacource.golotin.schedule.model.Subtask; import ru.yandex.javacource.golotin.schedule.model.Task; -import java.util.ArrayList; import java.util.List; public interface TaskManager { Task createTask(Task task); - Epic createEpic(Epic epic); + Task createEpic(Epic epic); Subtask createSubtask(Subtask subtask); diff --git a/task.csv b/task.csv new file mode 100644 index 0000000..d13ba9d --- /dev/null +++ b/task.csv @@ -0,0 +1,2 @@ +1,Дом,Убраться в кухни и ванной,null +2,Работа,Сделать куча рутины и пойти домой:),null From 4dcfd913ce16fdf6a7b440845ffdd96727334834 Mon Sep 17 00:00:00 2001 From: YG Date: Mon, 20 May 2024 08:19:46 +0300 Subject: [PATCH 3/4] Java sprint 7 v1.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обновлен класс FileBackedTaskManager Убран String Templates и переделан под Java 11 reformat code классов Epic,Subtask,Task, FileBackedTaskManager --- .../javacource/golotin/schedule/Main.java | 9 +--- .../golotin/schedule/model/Epic.java | 11 +++-- .../golotin/schedule/model/Subtask.java | 14 ++++-- .../golotin/schedule/model/Task.java | 17 +++++-- .../golotin/schedule/resources/task.csv | 6 +++ .../service/FileBackedTaskManager.java | 46 +++---------------- .../golotin/schedule/service/Manager.java | 2 +- task.csv | 2 - 8 files changed, 45 insertions(+), 62 deletions(-) create mode 100644 src/ru/yandex/javacource/golotin/schedule/resources/task.csv delete mode 100644 task.csv diff --git a/src/ru/yandex/javacource/golotin/schedule/Main.java b/src/ru/yandex/javacource/golotin/schedule/Main.java index 9d4ad4b..8e49743 100644 --- a/src/ru/yandex/javacource/golotin/schedule/Main.java +++ b/src/ru/yandex/javacource/golotin/schedule/Main.java @@ -10,7 +10,7 @@ public class Main { public static void main(String[] args) { - TaskManager taskManager = Manager.getDefaults(); + TaskManager taskManager = Manager.getDefault(); taskManager.createTask(new Task("Дом", Status.NEW, "Убраться в кухни и ванной")); taskManager.createTask(new Task("Работа", Status.IN_PROGRESS, "Сделать куча рутины и пойти домой:)")); @@ -31,13 +31,6 @@ public static void main(String[] args) { System.out.println(taskManager.getTasks()); System.out.println(taskManager.getEpics()); - taskManager.deleteTask(1); - taskManager.deleteEpic(1); - taskManager.deleteSubtask(1); - - taskManager.cleanTasks(); - taskManager.cleanSubtasks(); - taskManager.cleanEpics(); } } \ No newline at end of file diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Epic.java b/src/ru/yandex/javacource/golotin/schedule/model/Epic.java index ef57113..7176116 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Epic.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Epic.java @@ -11,10 +11,11 @@ public Epic(String name, Status status, String description) { super(name, status, description); } - public Epic(int id,String name,String description,Status status){ + public Epic(int id, String name, String description, Status status) { super(name, status, description); setId(id); } + public void addSubtaskId(int id) { subtaskIds.add(id); } @@ -31,11 +32,15 @@ public List getSubtaskIds() { return subtaskIds; } - public TaskType getType() {return TaskType.EPIC;} + public TaskType getType() { + return TaskType.EPIC; + } @Override public String toString() { - return STR."Epic{subtaskIds=\{subtaskIds}\{'}'}"; + return "Epic{" + + "subtaskIds=" + subtaskIds + + '}'; } } diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java b/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java index 7c45730..53ed50c 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Subtask.java @@ -4,23 +4,27 @@ public class Subtask extends Task { private Integer epicId; - public Subtask(String name, Status status, String description,int epicId) { + public Subtask(String name, Status status, String description, int epicId) { super(name, status, description); setEpicId(epicId); } - public Subtask(int id,String name,String description,Status status,Integer epicId){ + + public Subtask(int id, String name, String description, Status status, Integer epicId) { super(name, status, description); setId(id); setEpicId(epicId); } + @Override public Integer getEpicId() { return epicId; } @Override - public TaskType getType() {return TaskType.SUBTASK;} + public TaskType getType() { + return TaskType.SUBTASK; + } public void setEpicId(Integer epicId) { this.epicId = epicId; @@ -28,6 +32,8 @@ public void setEpicId(Integer epicId) { @Override public String toString() { - return STR."Subtask{epicId=\{epicId}\{'}'}"; + return "Subtask{" + + "epicId=" + epicId + + '}'; } } diff --git a/src/ru/yandex/javacource/golotin/schedule/model/Task.java b/src/ru/yandex/javacource/golotin/schedule/model/Task.java index 9362cca..adf1482 100644 --- a/src/ru/yandex/javacource/golotin/schedule/model/Task.java +++ b/src/ru/yandex/javacource/golotin/schedule/model/Task.java @@ -14,7 +14,7 @@ public Task(String name, Status status, String description) { this.description = description; } - public Task(int id,String name,String description,Status status){ + public Task(int id, String name, String description, Status status) { setId(id); this.name = name; this.status = status; @@ -33,7 +33,9 @@ public String getName() { return name; } - public Integer getEpicId() {return null;} + public Integer getEpicId() { + return null; + } public void setName(String name) { this.name = name; @@ -43,7 +45,9 @@ public String getDescription() { return description; } - public TaskType getType() {return TaskType.TASK;} + public TaskType getType() { + return TaskType.TASK; + } public void setDescription(String description) { this.description = description; @@ -72,6 +76,11 @@ public int hashCode() { @Override public String toString() { - return STR."Task{id=\{id}, name='\{name}\{'\''}, description='\{description}\{'\''}, status=\{status}\{'}'}"; + return "Task{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + ", status=" + status + + '}'; } } diff --git a/src/ru/yandex/javacource/golotin/schedule/resources/task.csv b/src/ru/yandex/javacource/golotin/schedule/resources/task.csv new file mode 100644 index 0000000..6958abc --- /dev/null +++ b/src/ru/yandex/javacource/golotin/schedule/resources/task.csv @@ -0,0 +1,6 @@ +id,type,name,status,description,epic +1,TASK,Дом,NEW,Убраться в кухни и ванной, +2,TASK,Работа,IN_PROGRESS,Сделать куча рутины и пойти домой:), +3,EPIC,Прогулка,NEW,Прежде чем погулять нужно:, +4,EPIC,Приготовить кофе,NEW,Пойти на кухню и:, + diff --git a/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java b/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java index 24c906a..c162686 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/FileBackedTaskManager.java @@ -60,7 +60,7 @@ public static FileBackedTaskManager loadFromFile(File file) { } taskManager.counterId = generatorId; } catch (IOException e) { - throw new ManagerSaveException(STR."Невозможно прочитать файл: \{file.getName()}", e); + throw new ManagerSaveException("Невозможно прочитать файл: " + file.getName(), e); } return taskManager; } @@ -123,7 +123,8 @@ public void deleteSubtask(int id) { } public static String toString(Task task) { - return STR."\{task.getId()},\{task.getType()},\{task.getName()},\{task.getStatus()},\{task.getDescription()},\{task.getType().equals(TaskType.SUBTASK) ? task.getEpicId() : ""}"; + return task.getId() + "," + task.getType() + "," + task.getName() + "," + task.getStatus() + "," + + task.getDescription() + "," + (task.getType().equals(TaskType.SUBTASK) ? task.getEpicId() : ""); } @@ -152,19 +153,19 @@ protected void saveToFile() { for (Map.Entry entry : tasks.entrySet()) { final Task task = entry.getValue(); - writer.write(CSVTaskFormat.toString(task)); + writer.write(toString(task)); writer.newLine(); } for (Map.Entry entry : subtasks.entrySet()) { final Task task = entry.getValue(); - writer.write(CSVTaskFormat.toString(task)); + writer.write(toString(task)); writer.newLine(); } for (Map.Entry entry : epics.entrySet()) { final Task task = entry.getValue(); - writer.write(CSVTaskFormat.toString(task)); + writer.write(toString(task)); writer.newLine(); } @@ -173,39 +174,4 @@ protected void saveToFile() { throw new ManagerSaveException("Ошибка сохранения файла: " + file.getName(), e); } } - - private void loadFromFile() {// Чтение из в файла - int maxId = 0; - try (final BufferedReader reader = new BufferedReader(new FileReader(file, UTF_8))) { - reader.readLine(); // Пропускаем заголовок - while (true) { - String line = reader.readLine(); - final Task task = taskFromString(line); - final int id = task.getId(); - if (task.getType() == TaskType.TASK) {// Задача - tasks.put(id, task); - } else if (task.getType() == TaskType.SUBTASK) {// Подзадачи - subtasks.put(id, new Subtask(task.getId(), task.getName(), task.getDescription(), task.getStatus(), - task.getEpicId())); - } else if (task.getType() == TaskType.EPIC) {// Эпики - epics.put(id, new Epic(task.getId(), task.getName(), task.getDescription(), task.getStatus())); - for (Subtask subtask : subtasks.values()) {// Поиск подзадач эпика - if (subtask.getEpicId() == task.getId()) { - Epic epic = epics.get(task.getId()); - epic.addSubtaskId(subtask.getId()); - } - } - } - if (maxId < id) { - maxId = id; - } - if (line.isEmpty()) { - break; - } - } - } catch (IOException e) {// Отлавливаем ошибки - throw new ManagerSaveException(STR."Ошибка при чтении файла: \{file.getAbsolutePath()}", e); - } - counterId = maxId;// генератор - } } diff --git a/src/ru/yandex/javacource/golotin/schedule/service/Manager.java b/src/ru/yandex/javacource/golotin/schedule/service/Manager.java index d9c4911..7772299 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/Manager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/Manager.java @@ -4,7 +4,7 @@ public class Manager { public static TaskManager getDefault() { - return new FileBackedTaskManager(new File("resources/task.csv")); + return new FileBackedTaskManager(new File("/Users/admin/Documents/GitHub/java-kanban/src/ru/yandex/javacource/golotin/schedule/resources/task.csv")); } public static InMemoryHistoryManager getDefaultHistory() { diff --git a/task.csv b/task.csv deleted file mode 100644 index d13ba9d..0000000 --- a/task.csv +++ /dev/null @@ -1,2 +0,0 @@ -1,Дом,Убраться в кухни и ванной,null -2,Работа,Сделать куча рутины и пойти домой:),null From df2672e65d7cf5b5c1355e3228c83a2d00a8da6c Mon Sep 17 00:00:00 2001 From: YG Date: Mon, 20 May 2024 09:56:39 +0300 Subject: [PATCH 4/4] Java sprint 7 v1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit переделан путь папки resources. и путь в классе manager для сохранения файла task.csv --- .../golotin/schedule/resources => resources}/task.csv | 0 src/ru/yandex/javacource/golotin/schedule/service/Manager.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {src/ru/yandex/javacource/golotin/schedule/resources => resources}/task.csv (100%) diff --git a/src/ru/yandex/javacource/golotin/schedule/resources/task.csv b/resources/task.csv similarity index 100% rename from src/ru/yandex/javacource/golotin/schedule/resources/task.csv rename to resources/task.csv diff --git a/src/ru/yandex/javacource/golotin/schedule/service/Manager.java b/src/ru/yandex/javacource/golotin/schedule/service/Manager.java index 7772299..d9c4911 100644 --- a/src/ru/yandex/javacource/golotin/schedule/service/Manager.java +++ b/src/ru/yandex/javacource/golotin/schedule/service/Manager.java @@ -4,7 +4,7 @@ public class Manager { public static TaskManager getDefault() { - return new FileBackedTaskManager(new File("/Users/admin/Documents/GitHub/java-kanban/src/ru/yandex/javacource/golotin/schedule/resources/task.csv")); + return new FileBackedTaskManager(new File("resources/task.csv")); } public static InMemoryHistoryManager getDefaultHistory() {