Compare commits
17
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e14920fbb | ||
|
|
0987b42086 | ||
|
|
d1d9d11b66 | ||
|
|
521f3ae025 | ||
|
|
52b4b1c01d | ||
|
|
007fc81b22 | ||
|
|
bc3ba43b7e | ||
|
|
2e12c3f868 | ||
|
|
29ad2fdae2 | ||
|
|
5c6528a038 | ||
|
|
afac3ba855 | ||
|
|
a87f3da9d2 | ||
|
|
6273b0e59a | ||
|
|
2510608117 | ||
|
|
b79387abc2 | ||
|
|
25057d34f0 | ||
|
|
63d7eddff4 |
@@ -1,8 +1,90 @@
|
||||
package ch.zhaw.gartenverwaltung.gardenplan;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.io.GardenPlan;
|
||||
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||
import ch.zhaw.gartenverwaltung.io.JsonGardenPlan;
|
||||
import ch.zhaw.gartenverwaltung.io.TaskDatabase;
|
||||
import ch.zhaw.gartenverwaltung.taskList.PlantNotFoundException;
|
||||
import ch.zhaw.gartenverwaltung.taskList.TaskListModel;
|
||||
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||
import ch.zhaw.gartenverwaltung.types.Plant;
|
||||
import ch.zhaw.gartenverwaltung.types.Task;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* The Gardenplan model manages the crops in the gardenplan.
|
||||
*/
|
||||
public class Gardenplanmodel {
|
||||
// private JasonGardenplan gardenplan;
|
||||
// liste von crops
|
||||
//task generieren
|
||||
//plant holen, task template mit tasktemplateklasse tasks erstellen
|
||||
private GardenPlan gardenPlan;
|
||||
private List<Crop> cropList;
|
||||
private TaskListModel taskListModel;
|
||||
|
||||
/**
|
||||
* Constructor of Gardenplan model
|
||||
*
|
||||
* @param taskListModel holds a reference to the task list object.
|
||||
*/
|
||||
public Gardenplanmodel(TaskListModel taskListModel) throws IOException {
|
||||
this.taskListModel = taskListModel;
|
||||
gardenPlan = new JsonGardenPlan();
|
||||
cropList = gardenPlan.getCrops();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a Crop with a {@link Plant} and the planting date of the plant. Then let the Tasklistmodel create the
|
||||
* gardening {@link Task} for the crop. Store the crop in the gardenplan file and the cache.
|
||||
*
|
||||
* @param plant The plant which is wnated to be planted
|
||||
* @param plantingDate The date, when the plant is planted
|
||||
* @throws IOException If the database cannot be accessed
|
||||
* @throws HardinessZoneNotSetException If the hardinesszone could not be added
|
||||
* @throws PlantNotFoundException If the plant is not found in the database.
|
||||
*/
|
||||
public void plantAsCrop(Plant plant, LocalDate plantingDate) throws IOException, HardinessZoneNotSetException, PlantNotFoundException {
|
||||
Crop crop = new Crop(plant.id(),plantingDate);
|
||||
//TODO Add Area to Plant
|
||||
crop.withArea(0);
|
||||
|
||||
cropList.add(crop);
|
||||
gardenPlan.saveCrop(crop);
|
||||
taskListModel.planTasksForCrop(crop);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a {@link Crop} from the file and the cache
|
||||
*
|
||||
* @param crop The plant which is wnated to be planted
|
||||
* @throws IOException If the database cannot be accessed
|
||||
*/
|
||||
public void removeCrop(Crop crop) throws IOException {
|
||||
|
||||
cropList.remove(crop);
|
||||
gardenPlan.removeCrop(crop);
|
||||
taskListModel.removeTasksForCrop(crop);
|
||||
}
|
||||
/**
|
||||
* Returns a list of {@link Crop}s which are currently in the gardenplan.
|
||||
*
|
||||
* @throws IOException If the database cannot be accessed
|
||||
*/
|
||||
public List<Crop> getCrops() throws IOException {
|
||||
if(cropList.isEmpty()){
|
||||
cropList = gardenPlan.getCrops();
|
||||
}
|
||||
return cropList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an Optional of {@link Crop} if the crop is the gardenplan
|
||||
*
|
||||
* @param cropId The date, when the plant is planted
|
||||
* @throws IOException If the database cannot be accessed
|
||||
*/
|
||||
public Optional<Crop> getCrop(Long cropId) throws IOException {
|
||||
return gardenPlan.getCropById(cropId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
package ch.zhaw.gartenverwaltung.io;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||
import ch.zhaw.gartenverwaltung.types.Task;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
@@ -24,6 +27,7 @@ import java.util.Map;
|
||||
public class JsonTaskDatabase implements TaskDatabase{
|
||||
IdProvider idProvider;
|
||||
private final URL dataSource = getClass().getResource("taskdb.json");
|
||||
private final static String INVALID_DATASOURCE_MSG = "Invalid datasource specified!";
|
||||
|
||||
private Map<Long, Task> taskMap = Collections.emptyMap();
|
||||
|
||||
@@ -34,7 +38,10 @@ public class JsonTaskDatabase implements TaskDatabase{
|
||||
static {
|
||||
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
LocalDateDeserializer dateDeserializer = new LocalDateDeserializer(dateFormat);
|
||||
LocalDateSerializer dateSerializer = new LocalDateSerializer(dateFormat);
|
||||
|
||||
timeModule.addDeserializer(LocalDate.class, dateDeserializer);
|
||||
timeModule.addSerializer(LocalDate.class, dateSerializer);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -51,6 +58,16 @@ public class JsonTaskDatabase implements TaskDatabase{
|
||||
return taskMap.values().stream().filter(task -> task.isInTimePeriode(start, end)).toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Task> getTaskForCrop(Crop crop) {
|
||||
return null; //TODO implement
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeTasksForCrop(Crop crop) {
|
||||
// TODO implement
|
||||
}
|
||||
|
||||
/**
|
||||
* If no data is currently loaded, data is loaded from {@link #dataSource}.
|
||||
* If the {@link Task} has an id than the task is added to the {@link #taskMap}
|
||||
@@ -95,12 +112,16 @@ public class JsonTaskDatabase implements TaskDatabase{
|
||||
* @throws IOException If the database cannot be accessed
|
||||
*/
|
||||
private void writeTaskListToFile() throws IOException {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.registerModule(timeModule)
|
||||
.registerModule(new Jdk8Module());
|
||||
|
||||
if(dataSource != null) {
|
||||
mapper.writeValue(new File(dataSource.getFile()), taskMap);
|
||||
try {
|
||||
new ObjectMapper()
|
||||
.registerModule(timeModule)
|
||||
.registerModule(new Jdk8Module())
|
||||
.writeValue(new File(dataSource.toURI()), taskMap.values());
|
||||
|
||||
} catch (URISyntaxException e) {
|
||||
throw new IOException(INVALID_DATASOURCE_MSG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +133,8 @@ public class JsonTaskDatabase implements TaskDatabase{
|
||||
private void loadTaskListFromFile() throws IOException {
|
||||
if (dataSource != null) {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.registerModule(timeModule);
|
||||
mapper.registerModule(timeModule)
|
||||
.registerModule(new Jdk8Module());
|
||||
|
||||
List<Task> result;
|
||||
result = mapper.readerForListOf(Task.class).readValue(dataSource);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package ch.zhaw.gartenverwaltung.io;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||
import ch.zhaw.gartenverwaltung.types.HardinessZone;
|
||||
import ch.zhaw.gartenverwaltung.types.Plant;
|
||||
import ch.zhaw.gartenverwaltung.types.Task;
|
||||
@@ -24,6 +25,10 @@ public interface TaskDatabase {
|
||||
*/
|
||||
List<Task> getTaskList(LocalDate start, LocalDate end) throws IOException;
|
||||
|
||||
List<Task> getTaskForCrop(Crop crop); //TODO Javadoc
|
||||
|
||||
void removeTasksForCrop(Crop crop); // TODO Javadoc
|
||||
|
||||
/**
|
||||
* Saves the {@link Task} in the Cache.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package ch.zhaw.gartenverwaltung.taskList;
|
||||
|
||||
public class PlantNotFoundException extends Exception {
|
||||
public PlantNotFoundException() {
|
||||
super("The selected Plant was not found in Database!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
package ch.zhaw.gartenverwaltung.taskList;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||
import ch.zhaw.gartenverwaltung.io.JsonTaskDatabase;
|
||||
import ch.zhaw.gartenverwaltung.io.PlantDatabase;
|
||||
import ch.zhaw.gartenverwaltung.io.TaskDatabase;
|
||||
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||
import ch.zhaw.gartenverwaltung.types.HardinessZone;
|
||||
import ch.zhaw.gartenverwaltung.types.Plant;
|
||||
import ch.zhaw.gartenverwaltung.types.Task;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class TaskListModel {
|
||||
private TaskDatabase taskDatabase;
|
||||
private PlantDatabase plantDatabase;
|
||||
|
||||
static final Comparator<Task> sortByStartDate = Comparator.comparing(Task::getStartDate);
|
||||
|
||||
public TaskListModel(){
|
||||
taskDatabase = new JsonTaskDatabase();
|
||||
}
|
||||
|
||||
public TaskListModel(TaskDatabase taskDatabase, PlantDatabase plantDatabase) {
|
||||
this.taskDatabase = taskDatabase;
|
||||
this.plantDatabase = plantDatabase;
|
||||
}
|
||||
|
||||
public void addTask(Task task) throws IOException {
|
||||
taskDatabase.saveTask(task);
|
||||
}
|
||||
|
||||
public void planTasksForCrop(Crop crop) throws PlantNotFoundException, HardinessZoneNotSetException, IOException {
|
||||
Plant plant = plantDatabase.getPlantById(HardinessZone.ZONE_8A, crop.getPlantId()).orElseThrow(PlantNotFoundException::new);
|
||||
// TODO new exception
|
||||
// TODO HArdiness Zone
|
||||
return;
|
||||
}
|
||||
|
||||
public void removeTasksForCrop(Crop crop) {
|
||||
//TODO implement
|
||||
taskDatabase.removeTasksForCrop(crop);
|
||||
}
|
||||
|
||||
public void removeTask(Task task) throws IOException {
|
||||
taskDatabase.removeTask(task);
|
||||
}
|
||||
|
||||
public List<Task> getTaskList() throws IOException {
|
||||
return getFilteredTaskList(LocalDate.MIN, LocalDate.MAX);
|
||||
}
|
||||
|
||||
public List<Task> getFutureTasks() throws IOException {
|
||||
return getFilteredTaskList(LocalDate.now(), LocalDate.MAX);
|
||||
}
|
||||
|
||||
public List<Task> getPastTasks() throws IOException {
|
||||
return getFilteredTaskList(LocalDate.MIN, LocalDate.now());
|
||||
}
|
||||
|
||||
public List<Task>[] getTasksUpcomingWeek() throws IOException {
|
||||
List<Task>[] listArray = new List[7];
|
||||
for(int i = 0; i < 7; i++) {
|
||||
LocalDate date = LocalDate.now().plusDays(i);
|
||||
listArray[i] = taskDatabase.getTaskList(date, date);
|
||||
}
|
||||
return listArray;
|
||||
}
|
||||
|
||||
public List<Task> getFilteredTaskList(LocalDate start, LocalDate end) throws IOException {
|
||||
return getSortedTaskList(taskDatabase.getTaskList(start, end), sortByStartDate);
|
||||
}
|
||||
|
||||
private List<Task> getSortedTaskList(List<Task> taskList, Comparator<Task> comparator) {
|
||||
return taskList.stream().sorted(comparator).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ public class Task {
|
||||
private final LocalDate startDate;
|
||||
private Integer interval;
|
||||
private LocalDate endDate;
|
||||
private Crop cropId;
|
||||
|
||||
/**
|
||||
* default constructor
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
"description": "Plant the seeds, crops in de bed.",
|
||||
"startDate" : "2022-05-01",
|
||||
"endDate" : "2022-05-01",
|
||||
"interval" : 0
|
||||
"interval" : 0,
|
||||
"cropID" : 0
|
||||
},
|
||||
{
|
||||
"id" : 2,
|
||||
@@ -13,7 +14,8 @@
|
||||
"description": "water the plant, so that the soil is wet around the plant.",
|
||||
"startDate" : "2022-05-01",
|
||||
"endDate" : "2022-09-01",
|
||||
"interval" : 2
|
||||
"interval" : 2,
|
||||
"cropID" : 0
|
||||
},
|
||||
{
|
||||
"id" : 3,
|
||||
@@ -21,7 +23,8 @@
|
||||
"description": "The fertilizer has to be mixed with water. Then fertilize the plants soil with the mixture",
|
||||
"startDate" : "2022-06-01",
|
||||
"endDate" : "2022-08-01",
|
||||
"interval" : 28
|
||||
"interval" : 28,
|
||||
"cropID" : 0
|
||||
},
|
||||
{
|
||||
"id" : 4,
|
||||
@@ -29,7 +32,8 @@
|
||||
"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",
|
||||
"endDate" : "2022-07-01",
|
||||
"interval" : 0
|
||||
"interval" : 0,
|
||||
"cropID" : 0
|
||||
},
|
||||
{
|
||||
"id" : 5,
|
||||
@@ -37,7 +41,8 @@
|
||||
"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",
|
||||
"endDate" : "2022-09-01",
|
||||
"interval" : 5
|
||||
"interval" : 5,
|
||||
"cropID" : 0
|
||||
},
|
||||
{
|
||||
"id" : 6,
|
||||
@@ -45,6 +50,7 @@
|
||||
"description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ",
|
||||
"startDate" : "2022-09-01",
|
||||
"endDate" : "2022-09-01",
|
||||
"interval" : 0
|
||||
"interval" : 0,
|
||||
"cropID" : 0
|
||||
}
|
||||
]
|
||||
@@ -6,32 +6,80 @@ import org.junit.jupiter.api.*;
|
||||
import java.io.IOException;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class JsonTaskDatabaseTest {
|
||||
|
||||
TaskDatabase testDatabase;
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
|
||||
@BeforeEach
|
||||
void connectToDb() {
|
||||
// testDatabase = new JsonTaskDatabase();
|
||||
testDatabase = new JsonTaskDatabase();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@DisplayName("Check if results are retrieved completely")
|
||||
void getTasks(){
|
||||
/*
|
||||
|
||||
List<Task> taskList=null;
|
||||
try {
|
||||
taskList = testDatabase.getTaskList(formatter.parse("01.05.2022"), formatter.parse("01.08.2022"));
|
||||
taskList = testDatabase.getTaskList(LocalDate.parse("30.04.2022",formatter),
|
||||
LocalDate.parse("31.05.2022",formatter));
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (ParseException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Assertions.assertTrue(taskList.size()>0);
|
||||
*/
|
||||
Assertions.assertEquals(3,taskList.size());
|
||||
|
||||
}
|
||||
|
||||
//@Disabled("disabled until idProvider works")
|
||||
@Test
|
||||
@DisplayName("Add task.")
|
||||
void addTask(){
|
||||
Task task = new Task("Testtask","This is a test Task.",LocalDate.parse("01.05.2022",formatter));
|
||||
try {
|
||||
testDatabase.saveTask(task);
|
||||
List<Task> taskList=null;
|
||||
try {
|
||||
taskList = testDatabase.getTaskList(LocalDate.parse("30.04.2022",formatter),
|
||||
LocalDate.parse("31.05.2022",formatter));
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Assertions.assertEquals(4,taskList.size());
|
||||
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Remove task.")
|
||||
void removeTask(){
|
||||
Task task = new Task("Dummy","Dummy",LocalDate.parse("31.05.2022",formatter)).withId(2);
|
||||
try {
|
||||
testDatabase.removeTask(task);
|
||||
List<Task> taskList=null;
|
||||
try {
|
||||
taskList = testDatabase.getTaskList(LocalDate.parse("30.04.2022",formatter),
|
||||
LocalDate.parse("31.05.2022",formatter));
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Assertions.assertEquals(2,taskList.size());
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user