Merge branch 'dev' into feature_guiOverhaul_M3

This commit is contained in:
giavaphi 2022-11-28 13:10:50 +01:00 committed by GitHub Enterprise
commit ce8bdaba7e
16 changed files with 89 additions and 48 deletions

View File

@ -1,14 +0,0 @@
package ch.zhaw.gartenverwaltung;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class HelloController {
@FXML
private Label welcomeText;
@FXML
protected void onHelloButtonClick() {
welcomeText.setText("Welcome to JavaFX Application!");
}
}

View File

@ -6,7 +6,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotates a method to be executed after all dependencies annotates with {@link Inject}
* Annotates a method to be executed after all dependencies annotated with {@link Inject}
* have been injected.
*/
@Retention(RetentionPolicy.RUNTIME)

View File

@ -23,6 +23,10 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* Class responsible for bootstrapping the application wide dependencies
* and injecting them into JavaFX Controllers.
*/
public class AppLoader {
/**
* Caching the panes
@ -32,17 +36,24 @@ public class AppLoader {
/**
* Application-wide dependencies
*/
private final PlantList plantList = new JsonPlantList();
private final CropList cropList = new JsonCropList();
private final TaskList taskList = new JsonTaskList();
private final GardenSchedule gardenSchedule = new GardenSchedule(taskList, plantList);
private final Garden garden = new Garden(gardenSchedule, cropList);
private final Map<String, Object> dependencies = new HashMap<>();
public AppLoader() throws IOException {
}
PlantList plantList = new JsonPlantList();
CropList cropList = new JsonCropList();
TaskList taskList = new JsonTaskList();
GardenSchedule gardenSchedule = new GardenSchedule(taskList, plantList);
dependencies.put(PlantList.class.getSimpleName(), plantList);
dependencies.put(CropList.class.getSimpleName(), cropList);
dependencies.put(TaskList.class.getSimpleName(), taskList);
dependencies.put(PlantListModel.class.getSimpleName(), new PlantListModel(plantList));
dependencies.put(GardenSchedule.class.getSimpleName(), gardenSchedule);
dependencies.put(Garden.class.getSimpleName(), new Garden(gardenSchedule, cropList));
dependencies.put(AppLoader.class.getSimpleName(), this);
}
/**
* Loads and returns a {@link Pane} (cached).
@ -135,26 +146,18 @@ public class AppLoader {
});
Arrays.stream(controller.getClass().getMethods())
.filter(method -> method.isAnnotationPresent(AfterInject.class))
.filter(method -> method.isAnnotationPresent(AfterInject.class) && method.getParameterCount() == 0)
.forEach(afterInjectMethod -> {
if (afterInjectMethod.getParameterCount() == 0) {
try {
afterInjectMethod.invoke(controller);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO: Log
e.printStackTrace();
}
}
});
}
private Object getAppDependency(Class<?> type) {
return switch (type.getSimpleName()) {
case "Garden" -> garden;
case "PlantList" -> plantList;
case "PlantListModel" -> new PlantListModel(plantList);
case "GardenSchedule" -> gardenSchedule;
case "AppLoader" -> this;
default -> null;
};
return dependencies.get(type.getSimpleName());
}
}

View File

@ -3,11 +3,20 @@ package ch.zhaw.gartenverwaltung.bootstrap;
import javafx.event.Event;
import javafx.event.EventType;
/**
* Represents an event that should lead to a view being changed.
*/
public class ChangeViewEvent extends Event {
private final String view;
public static final EventType<ChangeViewEvent> CHANGE_MAIN_VIEW = new EventType<>("CHANGE_MAIN_VIEW");
/**
* Creates an Event that should lead to the main view being changed.
*
* @param eventType The {@link EventType<ChangeViewEvent>} specifying which view should be changed.
* @param view The filename of the View to be changed to
*/
public ChangeViewEvent(EventType<? extends Event> eventType, String view) {
super(eventType);
this.view = view;

View File

@ -6,7 +6,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotates a Field to be injected from the application-dependencies
* Annotates a Field to be injected from the application-dependencies.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)

View File

@ -6,6 +6,10 @@ import java.io.IOException;
import java.util.List;
import java.util.Optional;
/**
* Represents a List of {@link Crop}s.
* The interface specifies the operations to add/update and remove entries.
*/
public interface CropList {
/**
* Yields a list of all {@link Crop}s in the database.

View File

@ -1,10 +1,18 @@
package ch.zhaw.gartenverwaltung.io;
/**
* Provides an sequential ID starting from the given initial Value.
*/
public class IdProvider {
private long currentId;
public IdProvider(long initialValue) {
currentId = initialValue;
}
/**
* Yields the next ID in the sequence.
* @return The next ID
*/
public long incrementAndGet() {
return ++currentId;
}

View File

@ -19,6 +19,11 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* Implements the {@link CropList} interface for reading and writing {@link Crop} objects
* from and to a local JSON file.
* The reads are cached to minimize file-io operations.
*/
public class JsonCropList implements CropList {
private final URL dataSource;
@ -40,7 +45,7 @@ public class JsonCropList implements CropList {
}
/**
* Default constructor
* Default constructor. Uses a file from the app resources.
*/
public JsonCropList() {
this.dataSource = getClass().getResource("user-crops.json");

View File

@ -20,8 +20,8 @@ import java.util.Map;
import java.util.Optional;
/**
* Implements the {@link PlantList} interface for loading {@link Plant} objects
* from a JSON file.
* Implements the {@link PlantList} interface for reading {@link Plant} objects
* from a local JSON file.
* The reads are cached to minimize file-io operations.
*/
public class JsonPlantList implements PlantList {
@ -44,9 +44,17 @@ public class JsonPlantList implements PlantList {
imageModule.addDeserializer(Image.class, new PlantImageDeserializer());
}
/**
* Default constructor. Uses a file from the app resources.
*/
public JsonPlantList() {
this.dataSource = getClass().getResource("plantdb.json");
}
/**
* Constructor to use a specified {@link URL} as a {@link #dataSource}
* @param dataSource A {@link URL} to the file to be used as a data source
*/
public JsonPlantList(URL dataSource) {
this.dataSource = dataSource;
}
@ -67,7 +75,7 @@ public class JsonPlantList implements PlantList {
}
/**
* @see PlantList#getPlantById(long)
* @see PlantList#getPlantById(HardinessZone, long)
*/
@Override
public Optional<Plant> getPlantById(HardinessZone zone, long id) throws HardinessZoneNotSetException, IOException {

View File

@ -20,8 +20,8 @@ import java.util.List;
import java.util.Map;
/**
* Implements the {@link TaskList} interface for loading and writing {@link Task} objects
* from and to a JSON file.
* Implements the {@link TaskList} interface for reading and writing {@link Task} objects
* from and to a local JSON file.
* The reads are cached to minimize file-io operations.
*/
public class JsonTaskList implements TaskList {
@ -45,9 +45,17 @@ public class JsonTaskList implements TaskList {
timeModule.addSerializer(LocalDate.class, dateSerializer);
}
/**
* Default constructor. Uses a file from the app resources.
*/
public JsonTaskList() {
this.dataSource = getClass().getResource("taskdb.json");
}
/**
* Constructor to use a specified {@link URL} as a {@link #dataSource}
* @param dataSource A {@link URL} to the file to be used as a data source
*/
public JsonTaskList(URL dataSource) {
this.dataSource = dataSource;
}

View File

@ -8,7 +8,7 @@ import java.util.List;
import java.util.Optional;
/**
* A database of {@link Plant}s.
* A List of {@link Plant}s.
* The interface specifies the minimal required operations.
*/
public interface PlantList {

View File

@ -7,8 +7,8 @@ import java.time.LocalDate;
import java.util.List;
/**
* A database of {@link Task}s.
* The interface specifies the minimal required operations.
* Represents a List of {@link Task}s.
* The interface specifies the operations to add/update and remove entries.
*/
public interface TaskList {
/**

View File

@ -7,6 +7,9 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
/**
* Used by the Jackson Library to deserialize a String to a {@link GrowthPhaseType}
*/
public class GrowthPhaseTypeDeserializer extends StdDeserializer<GrowthPhaseType> {
public GrowthPhaseTypeDeserializer(Class<?> vc) {
super(vc);

View File

@ -7,6 +7,9 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
/**
* Used by the Jackson Library to deserialize a String to a {@link HardinessZone}
*/
public class HardinessZoneDeserializer extends StdDeserializer<HardinessZone> {
public HardinessZoneDeserializer(Class<?> vc) {
super(vc);

View File

@ -13,6 +13,9 @@ import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
/**
* Used by the Jackson Library to deserialize a String to a {@link Image}
*/
public class PlantImageDeserializer extends JsonDeserializer<Image> {
@Override

View File

@ -150,6 +150,7 @@ public class GardenSchedule {
task.isDone();
} else {
LocalDate checkDate = task.getNextExecution();
do {
if (date.equals(checkDate) && !date.isAfter(task.getEndDate().orElse(LocalDate.MIN))) {
dayTaskList.get(finalI).add(task);