package mvd.jester.simulator.internals.maiabertogna; import java.util.ArrayList; import java.util.Optional; import mvd.jester.model.Segment; import mvd.jester.model.Task; import mvd.jester.simulator.EventPrinter; import mvd.jester.simulator.internals.JobContextInterface; import mvd.jester.simulator.internals.TaskContextInterface; /** * TaskContext */ public class TaskContext implements TaskContextInterface { private final Task task; private final ArrayList segments; private final long deadline; private final long releaseTime; private int currentSegment; private int segmentCounter; public TaskContext(Task task, long releaseTime) { this.task = task; this.segments = new ArrayList<>(); this.currentSegment = 0; this.segmentCounter = 0; this.releaseTime = releaseTime; this.deadline = releaseTime + task.getDeadline(); for (Segment s : task.getSegments()) { segments.add(new SegmentContext(this, s)); } } /** * @return the task */ public Task getTask() { return task; } /** * @return the deadline */ @Override public long getDeadline() { return deadline; } @Override public long getReleaseTime() { return releaseTime; } public Optional acceptNotification(long time) { segmentCounter++; if (segmentCounter >= segments.get(currentSegment).getSegment().getNumberOfJobs()) { currentSegment++; segmentCounter = 0; if (currentSegment >= segments.size()) { EventPrinter.print("Time " + time + ": Task " + this + "finished!"); return Optional.of(this); } } return Optional.empty(); } public Optional getNextJob() { if (currentSegment < segments.size()) { return segments.get(currentSegment).getNextJob(); } return Optional.empty(); } @Override public String toString() { return "(period=" + task.getPeriod() + ", deadline=" + deadline + ", segments=" + segments.size() + ")"; } }