diff --git a/assignment/src/main/java/appointmentplanner/APFactory.java b/assignment/src/main/java/appointmentplanner/APFactory.java index 5dd1f71..c56deb5 100644 --- a/assignment/src/main/java/appointmentplanner/APFactory.java +++ b/assignment/src/main/java/appointmentplanner/APFactory.java @@ -28,8 +28,7 @@ public class APFactory implements AbstractAPFactory { @Override public LocalDayPlan createLocalDayPlan(LocalDay day, Instant start, Instant end) { - // TODO Return an instance of your class that implements LocalDayPlan - return null; + return new LocalDayPlanImpl(day, start, end); } @Override diff --git a/assignment/src/main/java/appointmentplanner/AppointmentImpl.java b/assignment/src/main/java/appointmentplanner/AppointmentImpl.java index 2ad57e6..1fc203d 100644 --- a/assignment/src/main/java/appointmentplanner/AppointmentImpl.java +++ b/assignment/src/main/java/appointmentplanner/AppointmentImpl.java @@ -12,6 +12,13 @@ public class AppointmentImpl implements Appointment { private AppointmentRequest request; + public AppointmentImpl(Instant start, AppointmentRequest request) { + this.start = start; + this.request = request; + + this.stop = start.plus(request.duration()); + } + @Override public Instant start() { return start; diff --git a/assignment/src/main/java/appointmentplanner/LocalDayPlanImpl.java b/assignment/src/main/java/appointmentplanner/LocalDayPlanImpl.java index fb0be1c..895ad57 100644 --- a/assignment/src/main/java/appointmentplanner/LocalDayPlanImpl.java +++ b/assignment/src/main/java/appointmentplanner/LocalDayPlanImpl.java @@ -3,6 +3,7 @@ package appointmentplanner; import java.time.Duration; import java.time.Instant; import java.time.LocalTime; +import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -15,11 +16,12 @@ import appointmentplanner.api.LocalDayPlan; import appointmentplanner.api.TimePreference; import appointmentplanner.api.TimeSlot; import appointmentplanner.customlist.CustomLinkedListImpl; +import appointmentplanner.customlist.CustomListToJavaBinding; import appointmentplanner.customlist.api.CustomLinkedList; public class LocalDayPlanImpl implements LocalDayPlan { - private CustomLinkedList timeline = new CustomLinkedListImpl<>(); + private CustomLinkedList timeline = new CustomLinkedListImpl<>(); public LocalDayPlanImpl(LocalDay day, Instant start, Instant end) { this.day = day; @@ -55,8 +57,7 @@ public class LocalDayPlanImpl implements LocalDayPlan { @Override public Optional addAppointment(AppointmentData appointmentData, LocalTime startTime) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'addAppointment'"); + throw new UnsupportedOperationException(); } @Override @@ -67,20 +68,26 @@ public class LocalDayPlanImpl implements LocalDayPlan { @Override public AppointmentRequest removeAppointment(Appointment appointment) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'removeAppointment'"); + Appointment removedItem = timeline.remove(appointment); + return removedItem == null ? null : removedItem.request(); } @Override public List removeAppointments(Predicate filter) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'removeAppointments'"); + + CustomLinkedList removedRequests = new CustomLinkedListImpl<>(); + + for (Appointment appointment : timeline.removeFound(filter)) { + removedRequests.add(appointment.request()); + } + + return new CustomListToJavaBinding<>(removedRequests); + } @Override public List appointments() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'appointments'"); + return new CustomListToJavaBinding(timeline); } @Override @@ -119,20 +126,17 @@ public class LocalDayPlanImpl implements LocalDayPlan { @Override public List findAppointments(Predicate filter) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAppointments'"); + return new CustomListToJavaBinding<>(timeline.find(filter)); } @Override public boolean contains(Appointment appointment) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'contains'"); + return timeline.contains(appointment); } @Override public int nrOfAppointments() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'nrOfAppointments'"); + return timeline.size(); } @Override diff --git a/assignment/src/main/java/appointmentplanner/customlist/CustomLinkedListImpl.java b/assignment/src/main/java/appointmentplanner/customlist/CustomLinkedListImpl.java index 5d482a2..316730d 100644 --- a/assignment/src/main/java/appointmentplanner/customlist/CustomLinkedListImpl.java +++ b/assignment/src/main/java/appointmentplanner/customlist/CustomLinkedListImpl.java @@ -1,6 +1,7 @@ package appointmentplanner.customlist; import java.util.Iterator; +import java.util.function.Predicate; import appointmentplanner.customlist.api.CustomLinkedList; @@ -84,31 +85,32 @@ public class CustomLinkedListImpl implements CustomLinkedList { } @Override - public void remove(T item) { + public T remove(T item) { if (head == null) { - return; + return null; } if (head.getItem().equals(item)) { head = head.getNext(); - return; + return item; } CustomLinkedListNode beforeNode = traverseFind(head, item, ItemPosition.BEFORE); if (beforeNode == null) { - return; + return item; } CustomLinkedListNode nodeToRemove = beforeNode.getNext(); if (beforeNode.getNext() == null) { beforeNode.setNext(null); - return; + return item; } beforeNode.setNext(nodeToRemove.getNext()); + return item; } @Override @@ -172,4 +174,34 @@ public class CustomLinkedListImpl implements CustomLinkedList { return recursiveSizeCalc(this.head, 1); } + private CustomLinkedList traverseFilter(Predicate filter, CustomLinkedListNode node, + CustomLinkedList found) { + + if (node == null) { + return found; + } + + T item = node.getItem(); + + if (filter.test(item)) { + found.add(item); + } + + return traverseFilter(filter, node.getNext(), found); + } + + @Override + public CustomLinkedList find(Predicate filter) { + return traverseFilter(filter, head, new CustomLinkedListImpl<>()); + } + + @Override + public CustomLinkedList removeFound(Predicate filter) { + CustomLinkedList items = find(filter); + for (T item : items) { + remove(item); + } + return items; + } + } diff --git a/assignment/src/main/java/appointmentplanner/customlist/CustomLinkedListIterator.java b/assignment/src/main/java/appointmentplanner/customlist/CustomLinkedListIterator.java index a8d56a7..a688e79 100644 --- a/assignment/src/main/java/appointmentplanner/customlist/CustomLinkedListIterator.java +++ b/assignment/src/main/java/appointmentplanner/customlist/CustomLinkedListIterator.java @@ -17,6 +17,9 @@ public class CustomLinkedListIterator implements Iterator { @Override public boolean hasNext() { + if (lastNode == null) { + return false; + } return lastNode.getNext() != null; }