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
72 changes: 35 additions & 37 deletions src/Main.java
Original file line number Diff line number Diff line change
@@ -1,54 +1,52 @@
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 model.*;

import java.util.List;
import java.io.File;
import java.time.Duration;
import java.time.LocalDateTime;

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("Task 1", "Simple task",
Status.NEW, Duration.ofMinutes(30), LocalDateTime.of(2025, 7, 1, 8, 0));
Task task2 = new Task("Task 2", "Another task",
Status.NEW, Duration.ofMinutes(45), LocalDateTime.of(2025, 7, 1, 8, 45));
manager.addTask(task1);
manager.addTask(task2);

Epic epic1 = new Epic("Epic1", "Desc");
Epic epic2 = new Epic("Epic2", "Desc");
manager.addEpic(epic1);
manager.addEpic(epic2);
Epic epic = new Epic("Epic 1", "Epic with subtasks");
manager.addEpic(epic);

Subtask subtask1 = new Subtask("Sub1", "Desc", Status.NEW, epic1.getId());
Subtask subtask2 = new Subtask("Sub2", "Desc", Status.NEW, epic1.getId());
Subtask subtask1 = new Subtask("Subtask 1", "Part 1",
Status.NEW, epic.getId(), Duration.ofMinutes(60), LocalDateTime.of(2025, 7, 1, 10, 0));
Subtask subtask2 = new Subtask("Subtask 2", "Part 2",
Status.DONE, epic.getId(), Duration.ofMinutes(90), LocalDateTime.of(2025, 7, 1, 11, 30));
manager.addSubtask(subtask1);
manager.addSubtask(subtask2);

manager.getTaskById(task1.getId());
manager.getEpicById(epic1.getId());
manager.getTaskById(task1.getId());
manager.getSubtaskById(subtask1.getId());
printHistory(manager);
System.out.println("=== Prioritized Tasks ===");
for (Task task : manager.getPrioritizedTasks()) {
System.out.println(task + " | start=" + task.getStartTime() + " | end=" + task.getEndTime());
}

manager.removeTaskById(task1.getId());
printHistory(manager);
TaskManager loadedManager = FileBackedTaskManager.loadFromFile(file);
System.out.println("\n=== Loaded Tasks ===");
for (Task task : loadedManager.getAllTasks()) {
System.out.println(task);
}

manager.removeEpicById(epic1.getId());
printHistory(manager); // []
}
System.out.println("\n=== Loaded Epics ===");
for (Epic e : loadedManager.getAllEpics()) {
System.out.println(e);
}

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() + "]");
}
System.out.println("\n=== Loaded Subtasks ===");
for (Subtask s : loadedManager.getAllSubtasks()) {
System.out.println(s);
}
}
}
}
217 changes: 217 additions & 0 deletions src/manager/FileBackedTaskManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
package manager;

import model.Epic;
import model.Subtask;
import model.Task;
import model.Status;

import java.io.*;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;

public class FileBackedTaskManager extends InMemoryTaskManager {

private final File file;

public FileBackedTaskManager(File file) {
this.file = file;
}

protected void save() {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write("id,type,name,status,description,epic,duration,startTime\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");
}

writer.write("\n");
String history = historyToString(getHistory());
writer.write(history);

} catch (IOException e) {
System.out.println("Ошибка при сохранении в файл: " + e.getMessage());
}
}

private String toString(Task task) {
StringBuilder sb = new StringBuilder();
sb.append(task.getId()).append(",");
if (task instanceof Epic) {
sb.append("EPIC");
} else if (task instanceof Subtask) {
sb.append("SUBTASK");
} else {
sb.append("TASK");
}
sb.append(",");
sb.append(task.getTitle()).append(",");
sb.append(task.getStatus()).append(",");
sb.append(task.getDescription()).append(",");
if (task instanceof Subtask) {
sb.append(((Subtask) task).getEpicId());
} else {
sb.append("");
}
sb.append(",");
sb.append(task.getDuration() != null ? task.getDuration().toMinutes() : "").append(",");
sb.append(task.getStartTime() != null ? task.getStartTime() : "");
return sb.toString();
}

private List<Integer> historyFromString(String value) {
List<Integer> history = new ArrayList<>();
if (value == null || value.isEmpty()) {
return history;
}
String[] ids = value.split(",");
for (String idStr : ids) {
history.add(Integer.parseInt(idStr));
}
return history;
}

private String historyToString(List<Task> history) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < history.size(); i++) {
sb.append(history.get(i).getId());
if (i < history.size() - 1) {
sb.append(",");
}
}
return sb.toString();
}


public static FileBackedTaskManager loadFromFile(File file) {
FileBackedTaskManager manager = new FileBackedTaskManager(file);

try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line = reader.readLine();

while ((line = reader.readLine()) != null && !line.isEmpty()) {
Task task = fromString(line);
if (task instanceof Epic) {
manager.addEpic((Epic) task);
} else if (task instanceof Subtask) {
manager.addSubtask((Subtask) task);
} else {
manager.addTask(task);
}
}

String emptyLine = reader.readLine();

if (emptyLine != null) {
String historyLine = reader.readLine();
if (historyLine != null && !historyLine.isEmpty()) {
List<Integer> historyIds = manager.historyFromString(historyLine);
for (Integer id : historyIds) {
Task t = manager.getTaskById(id);
if (t != null) {
manager.historyManager.add(t);
}
}
}
}

} catch (IOException e) {
System.out.println("Ошибка при загрузке из файла: " + e.getMessage());
}

return manager;
}

private static Task fromString(String value) {
String[] parts = value.split(",", -1);
int id = Integer.parseInt(parts[0]);
String type = parts[1];
String title = parts[2];
Status status = Status.valueOf(parts[3]);
String description = parts[4];
String epicIdStr = parts[5];
String durationStr = parts[6];
String startTimeStr = parts[7];

Duration duration = durationStr.isEmpty() ? null : Duration.ofMinutes(Long.parseLong(durationStr));
LocalDateTime startTime = startTimeStr.isEmpty() ? null : LocalDateTime.parse(startTimeStr);

switch (type) {
case "EPIC":
Epic epic = new Epic(title, description);
epic.setId(id);
epic.setStatus(status);
return epic;
case "SUBTASK":
Subtask subtask = new Subtask(title, description, status, Integer.parseInt(epicIdStr), duration, startTime);
subtask.setId(id);
return subtask;
case "TASK":
default:
Task task = new Task(title, description, status, duration, startTime);
task.setId(id);
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 updateEpic(Epic epic) {
super.updateEpic(epic);
save();
}

@Override
public void updateSubtask(Subtask subtask) {
super.updateSubtask(subtask);
save();
}

@Override
public void removeTaskById(int id) {
super.removeTaskById(id);
save();
}

@Override
public void removeEpicById(int id) {
super.removeEpicById(id);
save();
}

@Override
public void removeSubtaskById(int id) {
super.removeSubtaskById(id);
save();
}
}
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();
}
3 changes: 2 additions & 1 deletion src/manager/InMemoryHistoryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ protected static class Node {
public void add(Task task) {
if (task == null) return;
int id = task.getId();
remove(id); // Удаляем предыдущий просмотр
remove(id);

linkLast(task);
}

Expand Down
Loading