Skip to content
Merged
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
16 changes: 16 additions & 0 deletions java-kanban.iml
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,21 @@
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="JUnit5.8.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter/5.8.1/junit-jupiter-5.8.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-api/5.8.1/junit-jupiter-api-5.8.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-commons/1.8.1/junit-platform-commons-1.8.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-params/5.8.1/junit-jupiter-params-5.8.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-engine/5.8.1/junit-jupiter-engine-5.8.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-engine/1.8.1/junit-platform-engine-1.8.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>
7 changes: 5 additions & 2 deletions src/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,18 @@
import tasks.Subtask;
import tasks.Task;

import java.time.Duration;
import java.time.LocalDateTime;

public class Main {

public static void main(String[] args) {
// Создаем managers.TaskManager
TaskManager taskManager = Managers.getDefault();

// Создаем задачи и добавляем их в managers.TaskManager
Task task1 = new Task("Закупка продуктов", "Купить все для праздничного ужина.", Status.NEW);
Task task2 = new Task("Планирование тренировки", "Составить план тренировок на месяц.", Status.NEW);
Task task1 = new Task("Закупка продуктов", "Купить все для праздничного ужина.", Status.NEW, Duration.ofMinutes(60), LocalDateTime.now());
Task task2 = new Task("Планирование тренировки", "Составить план тренировок на месяц.", Status.NEW, Duration.ofMinutes(60), LocalDateTime.now());
taskManager.addTask(task1);
taskManager.addTask(task2);

Expand Down
162 changes: 84 additions & 78 deletions src/managers/FileBackedTaskManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,16 @@
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Stream;

public class FileBackedTaskManager extends InMemoryTaskManager {
public static void main(String[] args) {
File file = new File("tasks.csv");
InMemoryHistoryManager inMemoryHistoryManager = new InMemoryHistoryManager();

FileBackedTaskManager manager = new FileBackedTaskManager(file, inMemoryHistoryManager);

Task task = new Task("Task1", "Description task", Status.NEW);
Epic epic = new Epic("Epic1", "Description epic", Status.IN_PROGRESS);
Subtask subtask = new Subtask("Subtask", "Description subtask", Status.NEW, epic.getId());

manager.addTask(task);
manager.addEpic(epic);
manager.addSubtask(subtask);

System.out.println("до сохранения:\n");
System.out.println(manager.getAllTasks());
System.out.println(manager.getAllEpic());
System.out.println(manager.getAllSubtask());

FileBackedTaskManager loaderManager = FileBackedTaskManager.loadFromFile(file, inMemoryHistoryManager);

System.out.println("после загрузки:\n");
System.out.println(loaderManager.getAllTasks());
System.out.println(loaderManager.getAllEpic());
System.out.println(loaderManager.getAllSubtask());
}

private final File file;

public FileBackedTaskManager(File file, InMemoryHistoryManager inMemoryHistoryManager) {
super(inMemoryHistoryManager);
public FileBackedTaskManager(File file, InMemoryHistoryManager historyManager) {
super(historyManager);
this.file = file;
}

Expand Down Expand Up @@ -113,81 +89,111 @@ public void addSubtask(Subtask subtask) {
save();
}

public static FileBackedTaskManager loadFromFile(File file, InMemoryHistoryManager inMemoryHistoryManager) {
FileBackedTaskManager manager = new FileBackedTaskManager(file, inMemoryHistoryManager);
try {
List<String> lines = Files.readAllLines(file.toPath());

if (lines.size() < 2) {
return manager;
}
@Override
public void updateSubtask(Subtask subtask) {
super.updateSubtask(subtask);
save();
}

for (int i = 1; i < lines.size(); i++) {
Task task = manager.fromString(lines.get(i));
switch (task.getType()) {
case TASK:
manager.addTask(task);
break;
case SUBTASK:
manager.addSubtask((Subtask) task);
break;
case EPIC:
manager.addEpic((Epic) task);
break;
}
@Override
public List<Task> getPrioritizedTasks() {
return super.getPrioritizedTasks();
}

/**
* Загружает менеджер из CSV. Бросает IOException при проблемах с файлом.
*/
public static FileBackedTaskManager loadFromFile(File file,
InMemoryHistoryManager historyManager) throws IOException {
FileBackedTaskManager manager = new FileBackedTaskManager(file, historyManager);
List<String> lines = Files.readAllLines(file.toPath());
if (lines.size() < 2) {
return manager;
}
for (int i = 1; i < lines.size(); i++) {
Task task = manager.fromString(lines.get(i));
switch (task.getType()) {
case TASK:
manager.addTask(task);
break;
case SUBTASK:
manager.addSubtask((Subtask) task);
break;
case EPIC:
manager.addEpic((Epic) task);
break;
}
} catch (IOException e) {
throw new ManagerSaveException("При загрузке файла произошла ошибка: ", e);
}
return manager;
}


protected void save() {
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file))) {
bufferedWriter.write("id,type,name,status,description,epic\n");

for (Task task : getAllTasks()) {
bufferedWriter.write(toString(task) + "\n");
}

for (Subtask subtask : getAllSubtask()) {
bufferedWriter.write(toString(subtask) + "\n");
}

for (Epic epic : getAllEpic()) {
bufferedWriter.write(toString(epic) + "\n");
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write("id,type,name,status,description,StartTime,duration,epic\n");
Stream.concat(
Stream.concat(
getAllTasks().stream(),
getAllSubtask().stream()
),
getAllEpic().stream()
).forEach(task -> {
try {
writer.write(toString(task));
writer.newLine();
} catch (IOException e) {
throw new ManagerSaveException("Ошибка при записи задачи в файл", e);
}
});
} catch (IOException e) {
throw new ManagerSaveException("Ошибка в сохранении файла");
throw new ManagerSaveException("Ошибка в сохранении файла", e);
}
}

private String toString(Task task) {
String description = task.getDescription().replace(",", " "); //добавил в случае, если в описании будет запятая
return String.format("%d,%s,%s,%s,%s,%s",
task.getId(), task.getType(), task.getName(), task.getStatus(), description,
(task instanceof Subtask) ? ((Subtask) task).getEpicId() : ""
String description = task.getDescription().replace(",", " ");
String startTime = task.getStartTime() == null ? "null" : task.getStartTime().toString();
String duration = task.getDuration() == null ? "0" : String.valueOf(task.getDuration().toMinutes());
String epicId = task instanceof Subtask ? String.valueOf(((Subtask) task).getEpicId()) : "";
return String.format("%d,%s,%s,%s,%s,%s,%s,%s",
task.getId(), task.getType(), task.getName(), task.getStatus(),
description, startTime, duration, epicId
);
}

private Task fromString(String line) {
String[] parts = line.split(",", 6);

String[] parts = line.split(",", 8);
if (parts.length < 8) {
throw new IllegalArgumentException("Недостаточно данных для разбора строки: " + line);
}
int id = Integer.parseInt(parts[0]);
TypeOfTask type = TypeOfTask.valueOf(parts[1]);
String name = parts[2];
Status status = Status.valueOf(parts[3]);
String description = parts[4];
String startTimeStr = parts[5];
long minutes = Long.parseLong(parts[6]);
Duration duration = Duration.ofMinutes(minutes);
String epicIdStr = parts[7];

LocalDateTime startTime = startTimeStr.equals("null") ? null : LocalDateTime.parse(startTimeStr);

switch (type) {
case TASK:
return new Task(name, description, status);
Task task = new Task(name, description, status, duration, startTime);
task.setId(id);
return task;
case SUBTASK:
int epicId = Integer.parseInt(parts[5]);
return new Subtask(name, description, status, epicId);
if (epicIdStr.isEmpty()) {
throw new IllegalArgumentException("ИД Эпика не может быть пустым");
}
int epicId = Integer.parseInt(epicIdStr);
Subtask subtask = new Subtask(name, description, status, epicId, duration, startTime);
subtask.setId(id);
return subtask;
case EPIC:
return new Epic(name, description, status);
Epic epic = new Epic(name, description, status);
epic.setId(id);
return epic;
default:
throw new IllegalArgumentException("Задача неизвестного типа: " + type);
}
Expand Down
4 changes: 4 additions & 0 deletions src/managers/InMemoryHistoryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ private void addLast(Task task) {

@Override
public void add(Task task) {
if (task == null) {
return;
}

if (historyMap.containsKey(task.getId())) {
remove(task.getId());
}
Expand Down
Loading