Compare commits

..

3 Commits

Author SHA1 Message Date
schrom01 2d88c9ea91 implemented multithreading 2022-11-25 12:58:03 +01:00
schrom01 e48be29d59 Merge branch 'feature_taskList_m2' into feature_notification_m3 2022-11-25 11:14:47 +01:00
schrom01 f389cfcdfd adapted GardenSchedule and GardenScheduleTest to new Structure of Task 2022-11-25 11:13:45 +01:00
6 changed files with 62 additions and 24 deletions

View File

@ -1,16 +1,23 @@
package ch.zhaw.gartenverwaltung; package ch.zhaw.gartenverwaltung;
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader; import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
import ch.zhaw.gartenverwaltung.notifier.Notifier;
import javafx.application.Application; import javafx.application.Application;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.IOException; import java.io.IOException;
public class HelloApplication extends Application { public class HelloApplication extends Application {
@Override @Override
public void start(Stage stage) throws IOException { public void start(Stage stage) throws IOException {
AppLoader appLoader = new AppLoader(); AppLoader appLoader = new AppLoader();
Notifier notifier = new Notifier(appLoader.getGardenSchedule());
Thread notificationThread = new Thread(notifier);
notificationThread.start();
notificationThread.interrupt();
appLoader.loadSceneToStage("MainFXML.fxml", stage); appLoader.loadSceneToStage("MainFXML.fxml", stage);
stage.setTitle("Gartenverwaltung"); stage.setTitle("Gartenverwaltung");

View File

@ -10,6 +10,7 @@ import ch.zhaw.gartenverwaltung.io.TaskList;
import ch.zhaw.gartenverwaltung.models.Garden; import ch.zhaw.gartenverwaltung.models.Garden;
import ch.zhaw.gartenverwaltung.models.GardenSchedule; import ch.zhaw.gartenverwaltung.models.GardenSchedule;
import ch.zhaw.gartenverwaltung.models.PlantListModel; import ch.zhaw.gartenverwaltung.models.PlantListModel;
import ch.zhaw.gartenverwaltung.notifier.Notifier;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.scene.control.DialogPane; import javafx.scene.control.DialogPane;
@ -41,6 +42,7 @@ public class AppLoader {
public AppLoader() throws IOException { public AppLoader() throws IOException {
} }
@ -154,4 +156,8 @@ public class AppLoader {
default -> null; default -> null;
}; };
} }
public GardenSchedule getGardenSchedule() {
return gardenSchedule;
}
} }

View File

@ -136,10 +136,22 @@ public class GardenSchedule {
* @throws IOException If the database cannot be accessed * @throws IOException If the database cannot be accessed
*/ */
public List<List<Task>> getTasksUpcomingWeek() throws IOException { public List<List<Task>> getTasksUpcomingWeek() throws IOException {
final int listLength = 7;
List<Task> weekTasks = taskList.getTaskList(LocalDate.now(), LocalDate.now().plusDays(listLength - 1));
List<List<Task>> dayTaskList = new ArrayList<>(); List<List<Task>> dayTaskList = new ArrayList<>();
for(int i = 0; i < 7; i++) { for(int i = 0; i < listLength; i++) {
LocalDate date = LocalDate.now().plusDays(i); LocalDate date = LocalDate.now().plusDays(i);
dayTaskList.add(taskList.getTaskList(date, date)); dayTaskList.add(new ArrayList<>());
final int finalI = i;
weekTasks.forEach(task -> {
LocalDate checkDate = task.getNextExecution();
do {
if (date.equals(checkDate) && !date.isAfter(task.getEndDate().orElse(LocalDate.MIN))) {
dayTaskList.get(finalI).add(task);
}
checkDate = checkDate.plusDays(task.getInterval().orElse(0));
} while (task.getInterval().isPresent() && checkDate.isBefore(LocalDate.now().plusDays(listLength)));
});
} }
return dayTaskList; return dayTaskList;
} }
@ -150,11 +162,8 @@ public class GardenSchedule {
* @throws IOException If the database cannot be accessed * @throws IOException If the database cannot be accessed
*/ */
public List<List<Task>> getTasksUpcomingWeekForCrop(Long cropId) throws IOException { public List<List<Task>> getTasksUpcomingWeekForCrop(Long cropId) throws IOException {
List<List<Task>> dayTaskList = new ArrayList<>(); List<List<Task>> dayTaskList = getTasksUpcomingWeek();
for(int i = 0; i < 7; i++) { dayTaskList.forEach(taskList -> taskList.removeIf(task -> task.getCropId() != cropId));
LocalDate date = LocalDate.now().plusDays(i);
dayTaskList.add(filterListByCrop(taskList.getTaskList(date, date), cropId));
}
return dayTaskList; return dayTaskList;
} }

View File

@ -9,6 +9,7 @@ import java.util.function.Consumer;
public class Notifier implements Runnable{ public class Notifier implements Runnable{
private final GardenSchedule gardenSchedule; private final GardenSchedule gardenSchedule;
private boolean interrupted = false;
public Notifier(GardenSchedule gardenSchedule) { public Notifier(GardenSchedule gardenSchedule) {
this.gardenSchedule = gardenSchedule; this.gardenSchedule = gardenSchedule;
@ -18,16 +19,13 @@ public class Notifier implements Runnable{
// TODO implement // TODO implement
} }
@Override private void sendNotifications(){
public void run() { System.out.println("sending Notifications");
try { try {
gardenSchedule.getTaskList().forEach(new Consumer<Task>() { gardenSchedule.getTaskList().forEach(task -> {
@Override if(task.getNextNotification() != null && task.getNextNotification().isBefore(LocalDate.now().minusDays(1))){
public void accept(Task task) { sendNotification(task);
if(task.getNextNotification() != null && task.getNextNotification().isBefore(LocalDate.now().minusDays(1))){ task.setNextNotification(task.getNextExecution());
sendNotification(task);
task.setNextNotification(task.getNextExecution());
}
} }
}); });
} catch (IOException e) { } catch (IOException e) {
@ -35,4 +33,16 @@ public class Notifier implements Runnable{
e.printStackTrace(); e.printStackTrace();
} }
} }
@Override
public void run() {
while(!interrupted){
try {
sendNotifications();
Thread.sleep(3000);
} catch (InterruptedException e) {
interrupted = true;
}
}
}
} }

View File

@ -27,6 +27,7 @@ public class Task {
name= ""; name= "";
description= ""; description= "";
startDate = LocalDate.now(); startDate = LocalDate.now();
endDate = startDate;
nextExecution = startDate; nextExecution = startDate;
} }
@ -34,6 +35,7 @@ public class Task {
this.name = name; this.name = name;
this.description = description; this.description = description;
this.startDate = startDate; this.startDate = startDate;
this.endDate = startDate;
nextExecution = startDate; nextExecution = startDate;
this.cropId = cropId; this.cropId = cropId;
} }
@ -63,7 +65,7 @@ public class Task {
} }
public boolean isInTimePeriode(LocalDate searchStartDate, LocalDate searchEndDate){ public boolean isInTimePeriode(LocalDate searchStartDate, LocalDate searchEndDate){
return startDate.isAfter(searchStartDate) && startDate.isBefore(searchEndDate); return endDate.isAfter(searchStartDate) && startDate.isBefore(searchEndDate);
} }
public void done(){ public void done(){

View File

@ -15,7 +15,7 @@ import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
class GardenScheduleTest { class GardenScheduleTest {
LocalDate exampleStartDate = LocalDate.of(2020, 02, 02); LocalDate exampleStartDate = LocalDate.of(2020, 2, 2);
TaskList taskList; TaskList taskList;
PlantList plantList; PlantList plantList;
List<Plant> examplePlantList; List<Plant> examplePlantList;
@ -43,6 +43,7 @@ class GardenScheduleTest {
private TaskList mockTaskDatabase(List<Task> exampleTaskList) throws IOException { private TaskList mockTaskDatabase(List<Task> exampleTaskList) throws IOException {
TaskList taskList = mock(JsonTaskList.class); TaskList taskList = mock(JsonTaskList.class);
when(taskList.getTaskList(LocalDate.MIN, LocalDate.MAX)).thenReturn(exampleTaskList); when(taskList.getTaskList(LocalDate.MIN, LocalDate.MAX)).thenReturn(exampleTaskList);
when(taskList.getTaskList(LocalDate.now(), LocalDate.now().plusDays(7 - 1))).thenReturn(exampleTaskList);
when(taskList.getTaskList(LocalDate.now(), LocalDate.MAX)).thenReturn((exampleTaskList.subList(1, 4))); when(taskList.getTaskList(LocalDate.now(), LocalDate.MAX)).thenReturn((exampleTaskList.subList(1, 4)));
@ -105,7 +106,7 @@ class GardenScheduleTest {
exampleTaskList.add(new Task("name", "description", LocalDate.now().plusDays(1), 2L)); exampleTaskList.add(new Task("name", "description", LocalDate.now().plusDays(1), 2L));
exampleTaskList.add(new Task("name", "description", LocalDate.now(), 1L)); exampleTaskList.add(new Task("name", "description", LocalDate.now(), 1L));
exampleTaskList.add(new Task("name", "description", LocalDate.of(9019, 5, 5), 1L)); exampleTaskList.add(new Task("name", "description", LocalDate.of(9019, 5, 5), 1L));
exampleTaskList.add(new Task("name", "description", LocalDate.of(2019, 5, 5), 2L)); exampleTaskList.add(new Task("name", "description", LocalDate.now().minusDays(10), LocalDate.now().plusDays(4),2, 2L));
} }
@Test @Test
@ -157,19 +158,22 @@ class GardenScheduleTest {
assertEquals(7, dayList.size()); assertEquals(7, dayList.size());
//Check day 0 //Check day 0
assertEquals(1, dayList.get(0).size()); assertEquals(2, dayList.get(0).size());
assertEquals(exampleTaskList.get(2), dayList.get(0).get(0)); assertTrue(dayList.get(0).contains(exampleTaskList.get(2)));
assertTrue(dayList.get(0).contains(exampleTaskList.get(4)));
//Check day 1 //Check day 1
assertEquals(1, dayList.get(1).size()); assertEquals(1, dayList.get(1).size());
assertEquals(exampleTaskList.get(1), dayList.get(1).get(0)); assertTrue(dayList.get(1).contains(exampleTaskList.get(1)));
//Check day 2 //Check day 2
assertEquals(0, dayList.get(2).size()); assertEquals(1, dayList.get(2).size());
assertTrue(dayList.get(2).contains(exampleTaskList.get(4)));
//Check day 3 //Check day 3
assertEquals(0, dayList.get(3).size()); assertEquals(0, dayList.get(3).size());
//Check day 4 //Check day 4
assertEquals(0, dayList.get(4).size()); assertEquals(1, dayList.get(4).size());
assertTrue(dayList.get(4).contains(exampleTaskList.get(4)));
//Check day 5 //Check day 5
assertEquals(0, dayList.get(5).size()); assertEquals(0, dayList.get(5).size());
//Check day 6 //Check day 6