Compare commits
14 Commits
aa87a23f7d
...
028bc0240d
Author | SHA1 | Date |
---|---|---|
schrom01 | 028bc0240d | |
schrom01 | 8ecc14db91 | |
Gian-Andrea Hutter | c16f99aabc | |
Gian-Andrea Hutter | 6ec0ccaeaa | |
schrom01 | 55f92f92bd | |
schrom01 | fd28ca7cc2 | |
schrom01 | 1faf1c10de | |
Gian-Andrea Hutter | f43bfeebd2 | |
schrom01 | 220d138185 | |
schrom01 | fd184e1248 | |
schrom01 | fbf1700c34 | |
schrom01 | 2d88c9ea91 | |
schrom01 | e48be29d59 | |
schrom01 | a437236788 |
|
@ -26,7 +26,7 @@ tasks.withType(JavaCompile) {
|
||||||
|
|
||||||
application {
|
application {
|
||||||
mainModule = 'ch.zhaw.gartenverwaltung'
|
mainModule = 'ch.zhaw.gartenverwaltung'
|
||||||
mainClass = 'ch.zhaw.gartenverwaltung.HelloApplication'
|
mainClass = 'ch.zhaw.gartenverwaltung.Main'
|
||||||
}
|
}
|
||||||
|
|
||||||
javafx {
|
javafx {
|
||||||
|
@ -42,6 +42,8 @@ dependencies {
|
||||||
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.4'
|
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.4'
|
||||||
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.4'
|
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.4'
|
||||||
testImplementation 'org.mockito:mockito-core:4.3.+'
|
testImplementation 'org.mockito:mockito-core:4.3.+'
|
||||||
|
implementation 'com.sun.mail:javax.mail:1.6.2'
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test {
|
test {
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
package ch.zhaw.gartenverwaltung;
|
|
||||||
|
|
||||||
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
|
||||||
import javafx.application.Application;
|
|
||||||
import javafx.stage.Stage;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
public class HelloApplication extends Application {
|
|
||||||
@Override
|
|
||||||
public void start(Stage stage) throws IOException {
|
|
||||||
AppLoader appLoader = new AppLoader();
|
|
||||||
|
|
||||||
appLoader.loadSceneToStage("MainFXML.fxml", stage);
|
|
||||||
|
|
||||||
stage.setTitle("Gartenverwaltung");
|
|
||||||
stage.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
launch();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package ch.zhaw.gartenverwaltung;
|
||||||
|
|
||||||
|
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
||||||
|
import ch.zhaw.gartenverwaltung.backgroundtasks.BackgroundTasks;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.CropList;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.PlantList;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.TaskList;
|
||||||
|
import ch.zhaw.gartenverwaltung.models.Garden;
|
||||||
|
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||||
|
import javafx.application.Application;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Timer;
|
||||||
|
|
||||||
|
public class Main extends Application {
|
||||||
|
Timer backGroundTaskTimer = new Timer();
|
||||||
|
BackgroundTasks backgroundTasks;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(Stage stage) throws IOException {
|
||||||
|
AppLoader appLoader = new AppLoader();
|
||||||
|
|
||||||
|
backgroundTasks = new BackgroundTasks((TaskList) appLoader.getAppDependency(TaskList.class),(CropList) appLoader.getAppDependency(CropList.class), (PlantList) appLoader.getAppDependency(PlantList.class));
|
||||||
|
backGroundTaskTimer.scheduleAtFixedRate(backgroundTasks, 0, 1000);
|
||||||
|
|
||||||
|
appLoader.loadSceneToStage("MainFXML.fxml", stage);
|
||||||
|
|
||||||
|
stage.setTitle("Gartenverwaltung");
|
||||||
|
stage.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop(){
|
||||||
|
backGroundTaskTimer.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
launch();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,13 +1,23 @@
|
||||||
package ch.zhaw.gartenverwaltung;
|
package ch.zhaw.gartenverwaltung;
|
||||||
|
|
||||||
|
import ch.zhaw.gartenverwaltung.backgroundtasks.email.SmtpCredentials;
|
||||||
import ch.zhaw.gartenverwaltung.types.HardinessZone;
|
import ch.zhaw.gartenverwaltung.types.HardinessZone;
|
||||||
import javafx.beans.property.BooleanProperty;
|
import javafx.beans.property.BooleanProperty;
|
||||||
import javafx.beans.property.SimpleBooleanProperty;
|
import javafx.beans.property.SimpleBooleanProperty;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class Settings {
|
public class Settings {
|
||||||
|
private static final Settings instance;
|
||||||
private HardinessZone currentHardinessZone = HardinessZone.ZONE_8A;
|
private HardinessZone currentHardinessZone = HardinessZone.ZONE_8A;
|
||||||
private static Settings instance;
|
|
||||||
private final BooleanProperty showTutorial = new SimpleBooleanProperty(false);
|
private final BooleanProperty showTutorial = new SimpleBooleanProperty(false);
|
||||||
|
private SmtpCredentials smtpCredentials = new SmtpCredentials("imap.gmail.com", "587", "pm3.hs22.it21b.win.team1@gmail.com", "pm3.hs22.it21b.win.team1@gmail.com", "bisefhhjtrrhtoqr", true);
|
||||||
|
// Gmail Address: pm3.hs22.it21b.win.team1@gmail.com
|
||||||
|
// Gmail Passwort: Gartenverwaltung.PM3.2022
|
||||||
|
// E-Mail Inbox: https://www.mailinator.com/v4/public/inboxes.jsp?to=pm3.hs22.it21b.win.team1
|
||||||
|
private String mailNotificationReceivers = "pm3.hs22.it21b.win.team1@mailinator.com";
|
||||||
|
private String mailNotificationSubjectTemplate = "Task %s is due!"; // {0} = Task Name
|
||||||
|
private String mailNotificationTextTemplate = "Dear user\nYour gardentask %s for plant %s is due at %tF. Don't forget to confirm in your application if the task is done.\nTask description:\n%s"; // {0} = Task Name, {1} = plantname, {2} = nextExecution, {3} = Task description
|
||||||
|
|
||||||
static {
|
static {
|
||||||
instance = new Settings();
|
instance = new Settings();
|
||||||
|
@ -38,4 +48,20 @@ public class Settings {
|
||||||
public boolean getShowTutorial() {
|
public boolean getShowTutorial() {
|
||||||
return this.showTutorial.get();
|
return this.showTutorial.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SmtpCredentials getSmtpCredentials() {
|
||||||
|
return smtpCredentials;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMailNotificationReceivers() {
|
||||||
|
return mailNotificationReceivers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMailNotificationSubjectTemplate() {
|
||||||
|
return mailNotificationSubjectTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMailNotificationTextTemplate() {
|
||||||
|
return mailNotificationTextTemplate;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
package ch.zhaw.gartenverwaltung.backgroundtasks;
|
||||||
|
|
||||||
|
import ch.zhaw.gartenverwaltung.backgroundtasks.weather.WeatherGradenTaskPlanner;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.CropList;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.PlantList;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.TaskList;
|
||||||
|
import ch.zhaw.gartenverwaltung.models.Garden;
|
||||||
|
import ch.zhaw.gartenverwaltung.models.PlantNotFoundException;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
public class BackgroundTasks extends TimerTask {
|
||||||
|
private final Notifier notifier;
|
||||||
|
private final WeatherGradenTaskPlanner weatherGardenTaskPlaner;
|
||||||
|
|
||||||
|
public BackgroundTasks(TaskList taskList, CropList cropList, PlantList plantList) {
|
||||||
|
notifier = new Notifier(taskList, plantList, cropList);
|
||||||
|
weatherGardenTaskPlaner = new WeatherGradenTaskPlanner(taskList, plantList, cropList);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
weatherGardenTaskPlaner.refreshTasks();
|
||||||
|
} catch (IOException | HardinessZoneNotSetException | PlantNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
// TODO logger
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
notifier.sendNotifications();
|
||||||
|
} catch (MessagingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
// TODO logger
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
// TODO logger
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
package ch.zhaw.gartenverwaltung.backgroundtasks;
|
||||||
|
|
||||||
|
import ch.zhaw.gartenverwaltung.Settings;
|
||||||
|
import ch.zhaw.gartenverwaltung.backgroundtasks.email.EMailSender;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.CropList;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.PlantList;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.TaskList;
|
||||||
|
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||||
|
import ch.zhaw.gartenverwaltung.types.Task;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
public class Notifier {
|
||||||
|
private final TaskList taskList;
|
||||||
|
private final CropList cropList;
|
||||||
|
private final PlantList plantList;
|
||||||
|
private final EMailSender eMailSender = new EMailSender();
|
||||||
|
|
||||||
|
public Notifier(TaskList taskList, PlantList plantList, CropList cropList) {
|
||||||
|
this.taskList = taskList;
|
||||||
|
this.cropList = cropList;
|
||||||
|
this.plantList = plantList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendNotification(Task task) {
|
||||||
|
String plantName = "unkown plant";
|
||||||
|
try {
|
||||||
|
if(cropList.getCropById((task.getCropId())).isPresent()){
|
||||||
|
Crop crop = cropList.getCropById(task.getCropId()).get();
|
||||||
|
if(plantList.getPlantById(Settings.getInstance().getCurrentHardinessZone(), crop.getPlantId()).isPresent()) {
|
||||||
|
plantName = plantList.getPlantById(Settings.getInstance().getCurrentHardinessZone(), crop.getPlantId()).get().name();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException | HardinessZoneNotSetException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
// TODO logger
|
||||||
|
}
|
||||||
|
String messageSubject = String.format(Settings.getInstance().getMailNotificationSubjectTemplate(), task.getName());
|
||||||
|
String messageText = String.format(Settings.getInstance().getMailNotificationTextTemplate(), task.getName(), plantName, task.getNextExecution(), task.getDescription());
|
||||||
|
try {
|
||||||
|
eMailSender.sendMails(Settings.getInstance().getMailNotificationReceivers(), messageSubject, messageText);
|
||||||
|
} catch (MessagingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
// TODO Logger
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendNotifications() throws IOException, MessagingException {
|
||||||
|
for (Task task : taskList.getTaskList(LocalDate.MIN, LocalDate.MAX)) {
|
||||||
|
if (task.getNextNotification() != null && task.getNextNotification().isBefore(LocalDate.now().minusDays(1))) {
|
||||||
|
sendNotification(task);
|
||||||
|
task.setNextNotification(LocalDate.now().plusDays(1));
|
||||||
|
taskList.saveTask(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package ch.zhaw.gartenverwaltung.backgroundtasks.email;
|
||||||
|
|
||||||
|
import ch.zhaw.gartenverwaltung.Settings;
|
||||||
|
|
||||||
|
import javax.mail.*;
|
||||||
|
import javax.mail.internet.InternetAddress;
|
||||||
|
import javax.mail.internet.MimeMessage;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class EMailSender {
|
||||||
|
|
||||||
|
|
||||||
|
public EMailSender(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMails(String recipients, String subject, String text) throws MessagingException {
|
||||||
|
// TODO replace printMail with implementation
|
||||||
|
printMail(recipients, subject, text); // TODO Remove Printing E-Mail to console to test it
|
||||||
|
MimeMessage message = new MimeMessage(Settings.getInstance().getSmtpCredentials().getSession());
|
||||||
|
message.addHeader("Content-type", "text/HTML; charset=UTF-8");
|
||||||
|
message.addHeader("format", "flowed");
|
||||||
|
message.addHeader("Content-Transfer-Encoding", "8bit");
|
||||||
|
message.setFrom(new InternetAddress(Settings.getInstance().getSmtpCredentials().fromAddress()));
|
||||||
|
message.setReplyTo(InternetAddress.parse(Settings.getInstance().getSmtpCredentials().fromAddress(), false));
|
||||||
|
message.setSubject(subject);
|
||||||
|
message.setText(text);
|
||||||
|
message.setSentDate(new Date());
|
||||||
|
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients, false));
|
||||||
|
Transport.send(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void printMail(String receiver, String subject, String text){
|
||||||
|
System.out.printf("\nSending E-Mail:\nTo: %s\nSubject: %s\nMessage:\n%s\n", receiver, subject, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
package ch.zhaw.gartenverwaltung.backgroundtasks.email;
|
||||||
|
|
||||||
|
import javax.mail.PasswordAuthentication;
|
||||||
|
import javax.mail.Session;
|
||||||
|
import java.net.Authenticator;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public record SmtpCredentials(
|
||||||
|
String host,
|
||||||
|
String port,
|
||||||
|
String fromAddress,
|
||||||
|
String username,
|
||||||
|
String password,
|
||||||
|
boolean startTLS
|
||||||
|
) {
|
||||||
|
|
||||||
|
private Properties getProperties() {
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.put("mail.smtp.host", host);
|
||||||
|
properties.put("mail.smtp.port", port);
|
||||||
|
properties.put("mail.smtp.auth", "true");
|
||||||
|
properties.put("mail.smtp.starttls.enable", startTLS ? "true" : "false");
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
private javax.mail.Authenticator getAuthenticator() {
|
||||||
|
return new javax.mail.Authenticator() {
|
||||||
|
@Override
|
||||||
|
protected PasswordAuthentication getPasswordAuthentication() {
|
||||||
|
return new PasswordAuthentication(username, password);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Session getSession() {
|
||||||
|
return Session.getInstance(getProperties(), getAuthenticator());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package ch.zhaw.gartenverwaltung.io;
|
package ch.zhaw.gartenverwaltung.backgroundtasks.weather;
|
||||||
|
|
||||||
public enum SevereWeather {
|
public enum SevereWeather {
|
||||||
FROST,SNOW,HAIL,NO_SEVERE_WEATHER,RAIN
|
FROST,SNOW,HAIL,NO_SEVERE_WEATHER,RAIN
|
|
@ -1,5 +1,9 @@
|
||||||
package ch.zhaw.gartenverwaltung.io;
|
package ch.zhaw.gartenverwaltung.backgroundtasks.weather;
|
||||||
|
|
||||||
|
import ch.zhaw.gartenverwaltung.io.CropList;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.PlantList;
|
||||||
|
import ch.zhaw.gartenverwaltung.io.TaskList;
|
||||||
import ch.zhaw.gartenverwaltung.models.PlantNotFoundException;
|
import ch.zhaw.gartenverwaltung.models.PlantNotFoundException;
|
||||||
import ch.zhaw.gartenverwaltung.types.*;
|
import ch.zhaw.gartenverwaltung.types.*;
|
||||||
|
|
||||||
|
@ -73,7 +77,6 @@ public class WeatherGradenTaskPlanner {
|
||||||
for (Crop crop : cropList.getCrops()) {
|
for (Crop crop : cropList.getCrops()) {
|
||||||
Plant plant = plantList.getPlantById(HardinessZone.ZONE_8A,crop.getPlantId()).orElseThrow(PlantNotFoundException::new);
|
Plant plant = plantList.getPlantById(HardinessZone.ZONE_8A,crop.getPlantId()).orElseThrow(PlantNotFoundException::new);
|
||||||
|
|
||||||
// nur für aktuelle growthphase
|
|
||||||
if(plant.wateringCycle().litersPerSqM() < rainAmount){
|
if(plant.wateringCycle().litersPerSqM() < rainAmount){
|
||||||
adjustNextExecutionOfWateringTask(taskList.getTaskList(LocalDate.now(), LocalDate.now().plusDays(7)));
|
adjustNextExecutionOfWateringTask(taskList.getTaskList(LocalDate.now(), LocalDate.now().plusDays(7)));
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package ch.zhaw.gartenverwaltung.io;
|
package ch.zhaw.gartenverwaltung.backgroundtasks.weather;
|
||||||
|
|
||||||
public class WeatherService {
|
public class WeatherService {
|
||||||
private static final int NO_RAIN = 0;
|
private static final int NO_RAIN = 0;
|
|
@ -1,6 +1,6 @@
|
||||||
package ch.zhaw.gartenverwaltung.bootstrap;
|
package ch.zhaw.gartenverwaltung.bootstrap;
|
||||||
|
|
||||||
import ch.zhaw.gartenverwaltung.HelloApplication;
|
import ch.zhaw.gartenverwaltung.Main;
|
||||||
import ch.zhaw.gartenverwaltung.io.*;
|
import ch.zhaw.gartenverwaltung.io.*;
|
||||||
import ch.zhaw.gartenverwaltung.models.Garden;
|
import ch.zhaw.gartenverwaltung.models.Garden;
|
||||||
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
||||||
|
@ -77,7 +77,7 @@ public class AppLoader {
|
||||||
* @throws IOException if the file could not be loaded
|
* @throws IOException if the file could not be loaded
|
||||||
*/
|
*/
|
||||||
public Object loadSceneToStage(String fxmlFile, Stage appendee) throws IOException {
|
public Object loadSceneToStage(String fxmlFile, Stage appendee) throws IOException {
|
||||||
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
|
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(Main.class.getResource(fxmlFile)));
|
||||||
Pane root = loader.load();
|
Pane root = loader.load();
|
||||||
Scene scene = new Scene(root);
|
Scene scene = new Scene(root);
|
||||||
String css = Objects.requireNonNull(this.getClass().getResource("styles.css")).toExternalForm();
|
String css = Objects.requireNonNull(this.getClass().getResource("styles.css")).toExternalForm();
|
||||||
|
@ -99,7 +99,7 @@ public class AppLoader {
|
||||||
* @throws IOException if the file could not be loaded
|
* @throws IOException if the file could not be loaded
|
||||||
*/
|
*/
|
||||||
public Object loadPaneToDialog(String fxmlFile, DialogPane appendee) throws IOException {
|
public Object loadPaneToDialog(String fxmlFile, DialogPane appendee) throws IOException {
|
||||||
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
|
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(Main.class.getResource(fxmlFile)));
|
||||||
appendee.setContent(loader.load());
|
appendee.setContent(loader.load());
|
||||||
Object controller = loader.getController();
|
Object controller = loader.getController();
|
||||||
annotationInject(controller);
|
annotationInject(controller);
|
||||||
|
@ -114,7 +114,7 @@ public class AppLoader {
|
||||||
* @throws IOException if the file could not be loaded
|
* @throws IOException if the file could not be loaded
|
||||||
*/
|
*/
|
||||||
public void loadAndCacheFxml(String fxmlFile) throws IOException {
|
public void loadAndCacheFxml(String fxmlFile) throws IOException {
|
||||||
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
|
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(Main.class.getResource(fxmlFile)));
|
||||||
Pane pane = loader.load();
|
Pane pane = loader.load();
|
||||||
panes.put(fxmlFile, pane);
|
panes.put(fxmlFile, pane);
|
||||||
annotationInject(loader.getController());
|
annotationInject(loader.getController());
|
||||||
|
@ -152,7 +152,7 @@ public class AppLoader {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object getAppDependency(Class<?> type) {
|
public Object getAppDependency(Class<?> type) {
|
||||||
return dependencies.get(type.getSimpleName());
|
return dependencies.get(type.getSimpleName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class GardenSchedule {
|
public class GardenSchedule {
|
||||||
|
|
|
@ -81,8 +81,10 @@ public class Task {
|
||||||
public void done(){
|
public void done(){
|
||||||
if(interval != null && interval != 0 && !nextExecution.plusDays(interval).isAfter(endDate)){
|
if(interval != null && interval != 0 && !nextExecution.plusDays(interval).isAfter(endDate)){
|
||||||
nextExecution = nextExecution.plusDays(interval);
|
nextExecution = nextExecution.plusDays(interval);
|
||||||
|
nextNotification = nextExecution;
|
||||||
} else {
|
} else {
|
||||||
nextExecution = null;
|
nextExecution = null;
|
||||||
|
nextNotification = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@ module ch.zhaw.gartenverwaltung {
|
||||||
requires com.fasterxml.jackson.datatype.jsr310;
|
requires com.fasterxml.jackson.datatype.jsr310;
|
||||||
requires com.fasterxml.jackson.datatype.jdk8;
|
requires com.fasterxml.jackson.datatype.jdk8;
|
||||||
requires java.logging;
|
requires java.logging;
|
||||||
|
requires java.mail;
|
||||||
|
|
||||||
|
|
||||||
opens ch.zhaw.gartenverwaltung to javafx.fxml;
|
opens ch.zhaw.gartenverwaltung to javafx.fxml;
|
||||||
opens ch.zhaw.gartenverwaltung.types to com.fasterxml.jackson.databind;
|
opens ch.zhaw.gartenverwaltung.types to com.fasterxml.jackson.databind;
|
||||||
|
@ -13,4 +15,8 @@ module ch.zhaw.gartenverwaltung {
|
||||||
exports ch.zhaw.gartenverwaltung.types;
|
exports ch.zhaw.gartenverwaltung.types;
|
||||||
exports ch.zhaw.gartenverwaltung.models;
|
exports ch.zhaw.gartenverwaltung.models;
|
||||||
exports ch.zhaw.gartenverwaltung.json;
|
exports ch.zhaw.gartenverwaltung.json;
|
||||||
|
exports ch.zhaw.gartenverwaltung.backgroundtasks;
|
||||||
|
opens ch.zhaw.gartenverwaltung.backgroundtasks to javafx.fxml;
|
||||||
|
exports ch.zhaw.gartenverwaltung.backgroundtasks.email;
|
||||||
|
opens ch.zhaw.gartenverwaltung.backgroundtasks.email to javafx.fxml;
|
||||||
}
|
}
|
|
@ -227,6 +227,11 @@
|
||||||
"measures": "Less water."
|
"measures": "Less water."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"wateringCycle": {
|
||||||
|
"litersPerSqM": 0,
|
||||||
|
"interval": null,
|
||||||
|
"notes": []
|
||||||
|
},
|
||||||
"lifecycle": [
|
"lifecycle": [
|
||||||
{
|
{
|
||||||
"startDate": "12-01",
|
"startDate": "12-01",
|
||||||
|
@ -234,11 +239,7 @@
|
||||||
"type": "SOW",
|
"type": "SOW",
|
||||||
"zone": "ZONE_8A",
|
"zone": "ZONE_8A",
|
||||||
"group": 0,
|
"group": 0,
|
||||||
"wateringCycle": {
|
|
||||||
"litersPerSqM": 0,
|
|
||||||
"interval": null,
|
|
||||||
"notes": []
|
|
||||||
},
|
|
||||||
"taskTemplates": [
|
"taskTemplates": [
|
||||||
{
|
{
|
||||||
"name": "Germinate",
|
"name": "Germinate",
|
||||||
|
@ -255,11 +256,6 @@
|
||||||
"type": "PLANT",
|
"type": "PLANT",
|
||||||
"zone": "ZONE_8A",
|
"zone": "ZONE_8A",
|
||||||
"group": 0,
|
"group": 0,
|
||||||
"wateringCycle": {
|
|
||||||
"litersPerSqM": 25,
|
|
||||||
"interval": 7,
|
|
||||||
"notes": []
|
|
||||||
},
|
|
||||||
"taskTemplates": [
|
"taskTemplates": [
|
||||||
{
|
{
|
||||||
"name": "hilling",
|
"name": "hilling",
|
||||||
|
@ -276,11 +272,6 @@
|
||||||
"type": "HARVEST",
|
"type": "HARVEST",
|
||||||
"zone": "ZONE_8A",
|
"zone": "ZONE_8A",
|
||||||
"group": 0,
|
"group": 0,
|
||||||
"wateringCycle": {
|
|
||||||
"litersPerSqM": 0,
|
|
||||||
"interval": null,
|
|
||||||
"notes": []
|
|
||||||
},
|
|
||||||
"taskTemplates": [
|
"taskTemplates": [
|
||||||
{
|
{
|
||||||
"name": "Harvest",
|
"name": "Harvest",
|
||||||
|
|
|
@ -96,6 +96,7 @@ class GardenScheduleTest {
|
||||||
new ArrayList<>(),
|
new ArrayList<>(),
|
||||||
new WateringCycle(15, 0, null),
|
new WateringCycle(15, 0, null),
|
||||||
List.of(
|
List.of(
|
||||||
|
|
||||||
new GrowthPhase(MonthDay.of(6, 4), MonthDay.of(12, 4), 0, GrowthPhaseType.HARVEST, HardinessZone.ZONE_8A, List.of(
|
new GrowthPhase(MonthDay.of(6, 4), MonthDay.of(12, 4), 0, GrowthPhaseType.HARVEST, HardinessZone.ZONE_8A, List.of(
|
||||||
exampleTaskTemplateList.get(0),
|
exampleTaskTemplateList.get(0),
|
||||||
exampleTaskTemplateList.get(1)
|
exampleTaskTemplateList.get(1)
|
||||||
|
@ -103,6 +104,9 @@ class GardenScheduleTest {
|
||||||
new GrowthPhase(MonthDay.of(4, 3), MonthDay.of(12, 4), 0, GrowthPhaseType.PLANT, HardinessZone.ZONE_8A, List.of(
|
new GrowthPhase(MonthDay.of(4, 3), MonthDay.of(12, 4), 0, GrowthPhaseType.PLANT, HardinessZone.ZONE_8A, List.of(
|
||||||
exampleTaskTemplateList.get(2),
|
exampleTaskTemplateList.get(2),
|
||||||
exampleTaskTemplateList.get(3)
|
exampleTaskTemplateList.get(3)
|
||||||
|
)),
|
||||||
|
new GrowthPhase(MonthDay.of(6, 4), MonthDay.of(12, 4), 0, GrowthPhaseType.SOW, HardinessZone.ZONE_8A, List.of(
|
||||||
|
|
||||||
))
|
))
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,16 +20,16 @@ class PlantTest {
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setUp() {
|
void setUp() {
|
||||||
List<GrowthPhase> growthPhases = new ArrayList<>();
|
List<GrowthPhase> growthPhases = new ArrayList<>();
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(2, 1), MonthDay.of(4, 4), 0, new WateringCycle(0, 0, null), GrowthPhaseType.SOW, HardinessZone.ZONE_8A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(2, 1), MonthDay.of(4, 4), 0, GrowthPhaseType.SOW, HardinessZone.ZONE_8A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(4, 2), MonthDay.of(6, 5), 0, new WateringCycle(0, 0, null), GrowthPhaseType.PLANT, HardinessZone.ZONE_8A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(4, 2), MonthDay.of(6, 5), 0, GrowthPhaseType.PLANT, HardinessZone.ZONE_8A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(6, 3), MonthDay.of(8, 6), 0, new WateringCycle(0, 0, null), GrowthPhaseType.HARVEST, HardinessZone.ZONE_8A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(6, 3), MonthDay.of(8, 6), 0, GrowthPhaseType.HARVEST, HardinessZone.ZONE_8A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(3, 1), MonthDay.of(5, 4), 1, new WateringCycle(0, 0, null), GrowthPhaseType.SOW, HardinessZone.ZONE_8A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(3, 1), MonthDay.of(5, 4), 1, GrowthPhaseType.SOW, HardinessZone.ZONE_8A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(5, 2), MonthDay.of(7, 5), 1, new WateringCycle(0, 0, null), GrowthPhaseType.PLANT, HardinessZone.ZONE_8A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(5, 2), MonthDay.of(7, 5), 1, GrowthPhaseType.PLANT, HardinessZone.ZONE_8A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(7, 3), MonthDay.of(9, 6), 1, new WateringCycle(0, 0, null), GrowthPhaseType.HARVEST, HardinessZone.ZONE_8A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(7, 3), MonthDay.of(9, 6), 1, GrowthPhaseType.HARVEST, HardinessZone.ZONE_8A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(4, 1), MonthDay.of(6, 4), 0, new WateringCycle(0, 0, null), GrowthPhaseType.SOW, HardinessZone.ZONE_1A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(4, 1), MonthDay.of(6, 4), 0, GrowthPhaseType.SOW, HardinessZone.ZONE_1A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(6, 2), MonthDay.of(8, 5), 0, new WateringCycle(0, 0, null), GrowthPhaseType.PLANT, HardinessZone.ZONE_1A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(6, 2), MonthDay.of(8, 5), 0, GrowthPhaseType.PLANT, HardinessZone.ZONE_1A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(7, 2), MonthDay.of(9, 5), 0, new WateringCycle(0, 0, null), GrowthPhaseType.PLANT, HardinessZone.ZONE_1A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(7, 2), MonthDay.of(9, 5), 0, GrowthPhaseType.PLANT, HardinessZone.ZONE_1A, new ArrayList<>()));
|
||||||
growthPhases.add(new GrowthPhase(MonthDay.of(8, 3), MonthDay.of(10, 6), 0, new WateringCycle(0, 0, null), GrowthPhaseType.HARVEST, HardinessZone.ZONE_1A, new ArrayList<>()));
|
growthPhases.add(new GrowthPhase(MonthDay.of(8, 3), MonthDay.of(10, 6), 0, GrowthPhaseType.HARVEST, HardinessZone.ZONE_1A, new ArrayList<>()));
|
||||||
|
|
||||||
testPlant = new Plant(
|
testPlant = new Plant(
|
||||||
20,
|
20,
|
||||||
|
@ -40,6 +40,7 @@ class PlantTest {
|
||||||
0,
|
0,
|
||||||
"sandy to loamy, loose soil, free of stones",
|
"sandy to loamy, loose soil, free of stones",
|
||||||
new ArrayList<>(),
|
new ArrayList<>(),
|
||||||
|
new WateringCycle(25, 0, null),
|
||||||
growthPhases);
|
growthPhases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
"name" : "sow plant",
|
"name" : "sow plant",
|
||||||
"description": "Plant the seeds, crops in de bed.",
|
"description": "Plant the seeds, crops in de bed.",
|
||||||
"startDate" : "2022-05-01",
|
"startDate" : "2022-05-01",
|
||||||
|
"nextExecution": "2022-05-01",
|
||||||
|
"nextNotification": "2022-05-01",
|
||||||
"endDate" : "2022-05-01",
|
"endDate" : "2022-05-01",
|
||||||
"interval" : 0,
|
"interval" : 0,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
|
@ -13,6 +15,8 @@
|
||||||
"name" : "water plant",
|
"name" : "water plant",
|
||||||
"description": "water the plant, so that the soil is wet around the plant.",
|
"description": "water the plant, so that the soil is wet around the plant.",
|
||||||
"startDate" : "2022-05-01",
|
"startDate" : "2022-05-01",
|
||||||
|
"nextExecution": "2022-05-01",
|
||||||
|
"nextNotification": "2022-05-01",
|
||||||
"endDate" : "2022-09-01",
|
"endDate" : "2022-09-01",
|
||||||
"interval" : 2,
|
"interval" : 2,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
|
@ -22,6 +26,8 @@
|
||||||
"name" : "fertilize plant",
|
"name" : "fertilize plant",
|
||||||
"description": "The fertilizer has to be mixed with water. Then fertilize the plants soil with the mixture",
|
"description": "The fertilizer has to be mixed with water. Then fertilize the plants soil with the mixture",
|
||||||
"startDate" : "2022-06-01",
|
"startDate" : "2022-06-01",
|
||||||
|
"nextExecution": "2022-05-01",
|
||||||
|
"nextNotification": "2022-05-01",
|
||||||
"endDate" : "2022-08-01",
|
"endDate" : "2022-08-01",
|
||||||
"interval" : 28,
|
"interval" : 28,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
|
@ -31,6 +37,8 @@
|
||||||
"name" : "covering plant",
|
"name" : "covering plant",
|
||||||
"description": "Take a big enough coverage for the plants. Cover the whole plant with a bit space between the plant and the coverage",
|
"description": "Take a big enough coverage for the plants. Cover the whole plant with a bit space between the plant and the coverage",
|
||||||
"startDate" : "2022-07-01",
|
"startDate" : "2022-07-01",
|
||||||
|
"nextExecution": "2022-05-01",
|
||||||
|
"nextNotification": "2022-05-01",
|
||||||
"endDate" : "2022-07-01",
|
"endDate" : "2022-07-01",
|
||||||
"interval" : 0,
|
"interval" : 0,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
|
@ -40,6 +48,8 @@
|
||||||
"name" : "look after plant",
|
"name" : "look after plant",
|
||||||
"description": "Look for pest or illness at the leaves of the plant. Check the soil around the plant, if the roots are enough covered with soil",
|
"description": "Look for pest or illness at the leaves of the plant. Check the soil around the plant, if the roots are enough covered with soil",
|
||||||
"startDate" : "2022-05-01",
|
"startDate" : "2022-05-01",
|
||||||
|
"nextExecution": "2022-05-01",
|
||||||
|
"nextNotification": "2022-05-01",
|
||||||
"endDate" : "2022-09-01",
|
"endDate" : "2022-09-01",
|
||||||
"interval" : 5,
|
"interval" : 5,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
|
@ -49,6 +59,8 @@
|
||||||
"name" : "harvest plant",
|
"name" : "harvest plant",
|
||||||
"description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ",
|
"description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ",
|
||||||
"startDate" : "2022-09-01",
|
"startDate" : "2022-09-01",
|
||||||
|
"nextExecution": "2022-05-01",
|
||||||
|
"nextNotification": "2022-05-01",
|
||||||
"endDate" : "2022-09-01",
|
"endDate" : "2022-09-01",
|
||||||
"interval" : 0,
|
"interval" : 0,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
|
|
Loading…
Reference in New Issue