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)); // 08:00–08:30
Task task2 = new Task("Task 2", "Another task",
Status.NEW, Duration.ofMinutes(45), LocalDateTime.of(2025, 7, 1, 8, 45)); // 08:45–09:30
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)); // 10:00–11:00
Subtask subtask2 = new Subtask("Subtask 2", "Part 2",
Status.DONE, epic.getId(), Duration.ofMinutes(90), LocalDateTime.of(2025, 7, 1, 11, 30)); // 11:30–13:00
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);
}
}
}
}
2 changes: 1 addition & 1 deletion src/manager/BaseHttpHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,6 @@ protected void sendError(HttpExchange exchange, int statusCode, String message)
try {
String json = "{\"error\":\"" + message + "\"}";
sendText(exchange, json, statusCode);
} catch (IOException ignored) {}
} catch (IOException ignored) { }
}
}
32 changes: 24 additions & 8 deletions src/model/Epic.java
Original file line number Diff line number Diff line change
@@ -1,49 +1,65 @@
package model;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class Epic extends Task {
private final List<Integer> subtaskIds = new ArrayList<>();
private LocalDateTime endTime;

public Epic(String title, String description) {
super(title, description, Status.NEW);
super(title, description, Status.NEW, Duration.ZERO, null);
}


public List<Integer> getSubtaskIds() {
return subtaskIds;
}

public void addSubtask(Subtask subtask) {
subtaskIds.add(subtask.getId());
public void addSubtaskId(int id) {
subtaskIds.add(id);
}

public void removeSubtask(int subtaskId) {
subtaskIds.remove((Integer) subtaskId);
public void removeSubtaskId(int id) {
subtaskIds.remove(Integer.valueOf(id));
}

@Override
public LocalDateTime getEndTime() {
return endTime;
}

public void setEndTime(LocalDateTime endTime) {
this.endTime = endTime;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Epic)) return false;
if (!(o instanceof Epic epic)) return false;
if (!super.equals(o)) return false;
Epic epic = (Epic) o;
return Objects.equals(subtaskIds, epic.subtaskIds);
}

@Override
public int hashCode() {
return Objects.hash(super.hashCode(), subtaskIds);
}

@Override
public String toString() {
return "Epic{" +
"id=" + getId() +
", title='" + getTitle() + '\'' +
", description='" + getDescription() + '\'' +
", status=" + getStatus() +
", startTime=" + getStartTime() +
", duration=" + getDuration() +
", endTime=" + getEndTime() +
", subtaskIds=" + subtaskIds +
'}';
}
}
}
19 changes: 14 additions & 5 deletions src/model/Subtask.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
package model;

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

public class Subtask extends Task {
private final int epicId;
private int epicId;

public Subtask(String title, String description, Status status, int epicId) {
super(title, description, status);
public Subtask(String title, String description, Status status, int epicId, Duration duration, LocalDateTime startTime) {
super(title, description, status, duration, startTime);
this.epicId = epicId;
}

public int getEpicId() {
return epicId;
}

public void setEpicId(int epicId) {
this.epicId = epicId;
}

@Override
public String toString() {
return "Subtask{" +
"id=" + getId() +
"epicId=" + epicId +
", id=" + getId() +
", title='" + getTitle() + '\'' +
", description='" + getDescription() + '\'' +
", status=" + getStatus() +
", epicId=" + epicId +
", duration=" + (getDuration() != null ? getDuration().toMinutes() : "null") +
", startTime=" + getStartTime() +
'}';
}
}
83 changes: 60 additions & 23 deletions src/model/Task.java
Original file line number Diff line number Diff line change
@@ -1,43 +1,78 @@
package model;


import java.util.Objects;
import java.time.Duration;
import java.time.LocalDateTime;

public class Task {
private int id;
private String title;
private String description;
private Status status;
private Duration duration;
private LocalDateTime startTime;

public Task(String title, String description, Status status) {
public Task(String title, String description, Status status, Duration duration, LocalDateTime startTime) {
this.title = title;
this.description = description;
this.status = status;
this.duration = duration;
this.startTime = startTime;
}

public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public Status getStatus() { return status; }
public void setStatus(Status status) { this.status = status; }
public int getId() {
return id;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Task)) return false;
Task task = (Task) o;
return id == task.id &&
Objects.equals(title, task.title) &&
Objects.equals(description, task.description) &&
status == task.status;
public void setId(int id) {
this.id = id;
}

@Override
public int hashCode() {
return Objects.hash(id, title, description, status);

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public Status getStatus() {
return status;
}

public void setStatus(Status status) {
this.status = status;
}

public Duration getDuration() {
return duration;
}

public void setDuration(Duration duration) {
this.duration = duration;
}

public LocalDateTime getStartTime() {
return startTime;
}

public void setStartTime(LocalDateTime startTime) {
this.startTime = startTime;
}

public LocalDateTime getEndTime() {
if (startTime != null && duration != null) {
return startTime.plus(duration);
}
return null;
}

@Override
Expand All @@ -47,6 +82,8 @@ public String toString() {
", title='" + title + '\'' +
", description='" + description + '\'' +
", status=" + status +
", duration=" + (duration != null ? duration.toMinutes() : "null") +
", startTime=" + startTime +
'}';
}
}
Loading