10UMLClass48236010030MainUMLClass1082380370100<<Interface>> PlantDatabase -- + getPlantList(zone: HardinessZone): List<Plant> + getPlantById(zone: HardinessZone id: long): Optional<Plant>UMLClass67271022040TaskListControllerUMLClass1132110300180<<Record>> Plant -- + id: long + name: String + description: String + spacing: int + lifecycle: List<GrowthPhase> -- + calculateStartDate(harvestDate: Date): Date + generateTasks() UMLClass942710210120TaskListModel -- - tasks: ListProperty<Task> - taskDb: TaskDatabase -- + getTask(id: long): Optional<Task> + saveTask(task: Task) + removeTask(task: Task)UMLClass322690250120GardenPlanModel -- - tasks: ListProperty<Crop> - gardenPlan: GardenPlan -- + plantAsCrop(planting: UserPlanting) + removePlanting(planting: UserPlanting)UMLClass7268018080GardenPlanControllerUMLClass1362830490240Task -- + id: long + name: String {readOnly} + description: String {readOnly} + startDate: Date {readOnly} + isOptional: boolean {readOnly} - interval: int - endDate: Date -- + Task(name: String, description: String, startDate: String, isReadOnly: boolean): Task + withInterval(interval: int): Task + withEndDate(endDate: Date): Task + withId(id: long): Task -- + getInterval(): Optional<int> + getEndDate(): Optional<Date>UMLClass902930280140<<Interface>> TaskDatabase -- + getTaskList(start: Date, end: Date): List<Task> + saveTask(Task task) throws ??Exception + removeTask(Task task) throws ??ExceptionUMLClass44244017080MainWindowControllerUMLClass962131021070NotificationService -- - taskDb: TaskDatabase -- + tick()UMLClass1412131024090<<Interface>> WeatherProvider -- + getWeatherForecast: WeatherForecastUMLClass13921150400100WeatherService -- - weatherPovider: WeatherProvider - taskDb: TaskDatabase -- + WeatherService(provider: WeatherProvider, taskDb: TaskDatabase) - updateTasks()UMLClass1502110260150<<Record>> GrowthPhase -- + startDate: MonthDay + endDate: MonthDay + type: GrowthPhaseType Relation142218010040lt=<->>>>> m1=* m2=180;10;10;10Text15213019070Note: -- {final, readOnly} omitted on public data fields in <<Record>> Entities for clarity style=wordwrapRelation117297021050lt=<. m1=* m2=1 returns >190;20;10;20Relation1032820140130lt=<- m1=1 external database m2=1 internal list accesses10;110;10;10UMLClass3221120240150Crop -- - cropId: Long + plantId: long {final, readOnly} + startDate: LocalDate {final, readOnly} + area: Double -- + withId(long): Crop + withArea(double): Crop -- + getCropId(): Optional<Long>Relation126228070120lt=<. m1=* m2=1 returns10;10;10;100UMLClass1632290130100<<Enumeration>> GrowthPhaseType -- SOW PLANT HARVESTRelation158225070120lt=<->>>> m1=1 m2=*50;90;10;90;10;10Relation8827208030lt=<->>>>60;10;10;10Relation4321020110120lt=<. m1=* m2=1 returns / saves10;100;10;10Relation24271010030lt=<->>>>80;10;10;10UMLClass302890280140<<Interface>> GardenPlan -- + getPlantings(): List<UserPlanting> + addPlanting(plantId: long, startDate) + savePlanting(planting: UserPlanting) Relation42280080110lt=<. m1=1 m2=1 accesses10;90;10;10Relation152212403090lt=<.10;70;10;10Relation1062106080270lt=<- m1=1 m2=1 accesses10;10;10;250Relation11421060270170lt=<- m1=1 m2=1 adds Tasks10;10;10;140;250;140UMLClass822114020050JsonTaskDatabaseRelation912106030100lt=<<-10;10;10;80UMLClass156243020050JsonPlantDatabaseRelation144244014030lt=<<-10;10;120;10UMLClass3293020050JsonGardenPlanRelation22294010030lt=<<-80;10;10;10Relation582510220220lt=<.200;200;10;10Relation172510340190lt=<.10;170;320;10UMLClass58225016060PlantListControllerRelation5223803080lt=<.10;60;10;10Relation60230080210lt=<.60;10;10;190UMLClass73239016060PlantListModelRelation73228090130lt=<.70;110;10;10Relation88240022070lt=<- m1=1\nexternal\ndatabase m2=1\ninternal\nlist accesses >200;20;10;20Relation582019050lt=- m1=0..n m2=0..1 teaches to >10;20;170;20UMLClass1412530420200TaskTemplate -- + name: String {readOnly} + description: String {readOnly} + relativeStartDate: int {readOnly} - interval: Integer - relativeEndDate: Integer - isOptional: boolean -- + Task(name: String, description: String, startDate: String): TaskTemplate + setRelativeEndDate(relativeEndDate: int) + setInterval(interval: Integer) + generateTask(realStartDate: LocalDate): Task Relation1752180130490lt=<->>>>> m1=* m2=180;460;110;460;110;10;10;10Relation160272090130lt=<. m1=* m2=1 generates10;110;10;10Relation56277040040lt=<- delegates generating Tasks380;20;10;20