Compare commits

...

25 Commits

Author SHA1 Message Date
b1e741d95f update ui view 2025-11-21 18:17:13 -05:00
366e85a17c Merge pull request 'bump java to jdk 25, update vscode' (#1) from bump-java-runtime-jdk25 into main
Reviewed-on: #1
2025-11-14 19:57:11 +00:00
597393a58c bump java to jdk 25, update vscode 2025-11-14 14:49:27 -05:00
87fb95c1bd updates 2025-10-04 15:10:55 -04:00
575c83f746 updates 2025-10-04 14:37:08 -04:00
8d381e359d sdd pdf 2025-10-04 13:28:43 -04:00
2e51ec213f change readme 2025-10-04 13:14:09 -04:00
274dae38e3 javafx linux or win32 2025-10-04 13:05:19 -04:00
4f7134c59e updates 2025-10-04 12:54:41 -04:00
ceca2eedc2 updates. 2025-10-04 08:06:35 -04:00
ece3a38a46 changes 2025-10-03 15:11:57 -04:00
9017c4ab69 changes 2025-10-03 15:08:36 -04:00
9bebe024b5 changes 2025-10-03 15:00:27 -04:00
d18e1acc24 updates 2025-10-03 01:00:03 -04:00
1e078ef500 updates. 2025-10-02 15:28:53 -04:00
980c1dc049 add dialog 2025-10-02 08:48:05 -04:00
f924528596 updates 2025-10-01 20:48:55 -04:00
c3114e52c7 updates 2025-10-01 18:56:39 -04:00
cdca875b22 changes 2025-10-01 16:27:34 -04:00
8b4803ac14 gui updates 2025-10-01 14:42:41 -04:00
3fbc82fa94 changes 2025-10-01 11:56:50 -04:00
1b9dc5e6c1 changes 2025-09-30 23:11:46 -04:00
425a7206d6 changes 2025-09-30 22:06:10 -04:00
030d1425e8 changes 2025-09-29 18:21:50 -04:00
5fc8f25d82 changes 2025-09-29 17:14:10 -04:00
57 changed files with 35265 additions and 617 deletions

39
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,39 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "TestAccountLoad",
"request": "launch",
"mainClass": "lodge.TestAccountLoad",
"projectName": "reservationsystem"
},
{
"type": "java",
"name": "TestReservations",
"request": "launch",
"mainClass": "lodge.TestReservations",
"projectName": "reservationsystem"
},
{
"type": "java",
"name": "☕ TestMainFx",
"request": "launch",
"mainClass": "lodge.TestMainFx",
"projectName": "reservationsystem",
"vmArgs": " --module-path ${workspaceFolder}/libs/linux --add-modules ALL-MODULE-PATH --enable-native-access=javafx.web,javafx.controls,javafx.graphics -Dcom.sun.management.jmxremote=false -Djava.awt.headless=true -XX:+DisableAttachMechanism",
"cwd": "${workspaceFolder}",
"console": "integratedTerminal"
},
{
"type": "java",
"name": "☕ main",
"request": "launch",
"mainClass": "lodge.main",
"projectName": "reservationsystem",
"vmArgs": "-Dcom.sun.management.jmxremote=false -Djava.awt.headless=true -XX:+DisableAttachMechanism",
"cwd": "${workspaceFolder}",
"console": "integratedTerminal"
}
]
}

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "automatic"
}

View File

@@ -3,7 +3,7 @@
###
| software | version |
| -------- | ------- |
| Java | 21 |
| Java | 24 |
| json lib | gson-2.13.1 |
| VSCode | 1.103 |
| graphviz | 2.42.4 |
@@ -12,19 +12,31 @@
| extension |
| ----------------- |
| Debugger for Java |
| Java Launcher |
| Java Platform Extension for Visual Studio Code |
| Language Support for Java(TM) by Red Hat |
| Graphviz Interactive Preview |
### Run and Debug Java manually
cd to: libs
java -cp .\libs\gson-2.13.1.jar;.\libs\reservationsystem.jar lodge.TestReservations
### use of javafx, crossplatform issue linux/win32
### check .vscode/launch.json
java requires --module-path ${workspaceFolder}/libs/linux --add-modules ALL-MODULE-PATH --enable-native-access=javafx.web,javafx.controls,javafx.graphics
java requires --module-path ${workspaceFolder}/libs/win32 --add-modules ALL-MODULE-PATH --enable-native-access=javafx.web,javafx.controls,javafx.graphics
### compile - build:
### create jar archive:
gradle clean build jar
### Dot file review for classdiagram
Install Graphviz in your OS
dot -Tsvg classdiagram.dot -o classdiagram.svg
### build a list of accomodations
https://earth.google.com/web : to find building address
https://www.unitedstateszipcodes.org/ : to check zipcodes

View File

@@ -9,26 +9,32 @@
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.1.0'
}
group = 'lodge'
version = '1.0'
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(24)
languageVersion = JavaLanguageVersion.of(25)
}
}
application {
mainClass = 'lodge.TestReservations'
applicationDefaultJvmArgs = ["--add-opens", "java.base/jdk.internal.loader=ALL-UNNAMED"]
mainClass = 'lodge.TestMainFx'
}
sourceSets {
main {
java {
srcDirs = ['src/main/java']
}
}
main {
java {
srcDirs = ['src/main/java']
}
resources {
srcDirs = ['src/resources/media']
}
}
test {
java {
srcDirs = ['src/test/java']
@@ -42,23 +48,37 @@ repositories {
fileTree(dir:'libs', include:'*.jar')
}
javafx {
version = "24"
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.graphics', 'javafx.web' ]
}
dependencies {
//https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation 'com.google.code.gson:gson:2.13.2'
implementation 'org.openjfx:javafx-base:24.0.1'
implementation 'org.openjfx:javafx-fxml:24.0.1'
implementation 'org.openjfx:javafx-controls:24.0.1'
implementation 'org.openjfx:javafx-graphics:24.0.1'
implementation 'org.openjfx:javafx-web:24.0.1'
implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.17'
implementation group: 'org.slf4j', name: 'slf4j-simple', version: '2.0.17'
}
jar {
manifest {
attributes 'Main-Class': application.mainClass
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}
tasks.named('jar') {
manifest {
attributes('Implementation-Title': 'lodge.reservationsystem',
'Implementation-Version': 1.0,
'Main-Class': 'lodge.TestReservations',
'Class-Path': 'lodge.reservationsystem com.google.gson .' )
'Main-Class': application.mainClass,
'Class-Path': 'lodge.reservationsystem javafx.base javafx.fxml javafx.controls javafx.graphics javafx.web com.google.gson .' )
}
}

Binary file not shown.

5
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
# Copyright © 2015 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -114,7 +114,6 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@@ -172,7 +171,6 @@ fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
@@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"

3
gradlew.bat vendored
View File

@@ -70,11 +70,10 @@ goto fail
:execute
@rem Setup the command line
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
sdd/test_code1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

17195
sdd/ui-idea1.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 517 KiB

BIN
sdd/ui-idea2.pptx Normal file

Binary file not shown.

16949
sdd/ui-idea2.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 508 KiB

BIN
sdd/ui-screen-idea-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
sdd/ui-srceen-2.pptx Normal file

Binary file not shown.

View File

@@ -2,4 +2,4 @@ Manifest-Version: 1.0
Main-Class: lodge.TestReservations
Implementation-Title: lodge.reservationsystem
Implementation-Version: 1.0
Class-Path: lodge.reservationsystem com.google.gson .
Class-Path: lodge.reservationsystem com.google.gson avafx.base,javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web .

View File

@@ -5,6 +5,9 @@
package lodge;
import java.util.ArrayList;
import java.util.List;
import lodge.datamodel.Account;
import lodge.datamodel.Address;
import lodge.datamodel.EmailAddress;
@@ -30,31 +33,42 @@ public final class TestAccountLoad {
// memory
mgr.UpdateAccount(acct);
}
final static Address findIventory(List<Address> propertyIventory, String street) {
Address inventory = propertyIventory
.stream()
.filter((Address inv) -> {
return inv.getStreet().equals("10 wilco ave");
}).findFirst().orElse(null);
return inventory;
}
public static void main(String[] args) throws Exception {
// Configure data repository
AccomodationManager mgr = new AccomodationManager(getRepositoryConfig.getPath());
AccomodationManager mgr = new AccomodationManager(AccomodationManager.getRepositoryConfig.getPath());
List<Address> propertyIventory = new ArrayList<Address>();
propertyIventory.add(new Address("10 wilco ave", "wilco", "WY", "82801"));
propertyIventory.add(new Address("30 Amstadam ave", "New York", "NY", "12010"));
propertyIventory.add(new Address("400 hotel ave", "Maryland City", "MD", "20723"));
// 3. Add new account object to the list managed by Manager (if account object
// already exists on add action with the same account number, it is considered
// an error)
Test_AddAccount(mgr, mgr.newAccount("701-456-7890",
new Address("10 wilco ave", "wilco", "WY", "82801"),
new EmailAddress("wilco@wyommin.net")));
Test_AddAccount(mgr, mgr.newAccount("701-456-7890",
new Address("10 wilco ave", "wilco", "WY", "82801"),
findIventory(propertyIventory, "10 wilco ave"),
new EmailAddress("wilco@wyommin.net")));
System.out.println("Account already exists in list, so add attempt should fail:");
mgr.showAccountList();
Test_AddAccount(mgr, mgr.newAccount("701-456-7890",
findIventory(propertyIventory, "10 wilco ave"),
new EmailAddress("wilco@wyommin.net")));
System.out.println("Program Completed.");
}
public final static class getRepositoryConfig {
public final static String getPath() {
String home = System.getenv("HOME") != null ? System.getenv("HOME")
: System.getenv("HOMEDRIVE") + System.getenv("HOMEPATH");
return home.replace('\\', '/') + "/workspace/reservationsystem/src/resources";
}
}
}

View File

@@ -0,0 +1,27 @@
package lodge;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class TestMainFx extends Application {
@Override
public void start(Stage primaryStage) {
try {
primaryStage.setTitle("Lodge ReservationSystem");
Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("mainViewModel.fxml"));
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}

View File

@@ -0,0 +1,75 @@
package lodge;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.TextField;
import javafx.util.Callback;
import lodge.datamodel.Address;
public class TestMainFxCommandDialog extends Dialog<Address> {
@FXML
private TextField tfStreet;
@FXML
private TextField tfCity;
@FXML
private TextField tfState;
@FXML
private TextField tfZip;
public TestMainFxCommandDialog() {
super();
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getClassLoader().getResource("dialogCommandAddress.fxml"));
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
getDialogPane().setContent(fxmlLoader.getRoot());
getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
setTitle("AccomodationAddress Dialog");
setHeaderText("Enter Inventory Details");
setPropertyBindings();
setResultConverter();
}
private void setPropertyBindings() {
System.out.println("setPropertyBindings called.");
}
private void setResultConverter() {
System.out.println("setResultConverter called.");
Callback<ButtonType, Address> aRC = (buttonType) -> {
if (buttonType == ButtonType.OK) {
if(getStreet().isEmpty() || getCity().isEmpty() || getState().isEmpty() || getZip().isEmpty()) {
return null;
}
return new Address(getStreet(), getCity(), getState(), getZip());
}
return null;
};
setResultConverter(aRC);
}
private String getZip() {
return tfZip.getText();
}
private String getState() {
return tfState.getText();
}
private String getCity() {
return tfCity.getText();
}
private String getStreet() {
return tfStreet.getText();
}
}

View File

@@ -0,0 +1,80 @@
package lodge;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import lodge.datamodel.Address;
public class TestMainFxView {
@FXML
private Button btnAdd;
@FXML
private TableView<Address> tvInventory;
private final ObservableList<Address> rows = FXCollections.observableArrayList();
@FXML
private void initialize() {
rows.add(new Address("10 wilco ave", "wilco", "WY", "82801"));
rows.add(new Address("30 Amstadam ave", "New York", "NY", "12010"));
rows.add(new Address("400 hotel ave", "Maryland City", "MD", "20723"));
rows.add(new Address("160 Canal Road", "South Bethany", "Delaware", "19930"));
TableColumn<Address, String> tcStreet = new TableColumn<>("Street");
TableColumn<Address, String> tcCity = new TableColumn<>("City");
TableColumn<Address, String> tcState = new TableColumn<>("State");
TableColumn<Address, String> tcZip = new TableColumn<>("Zip");
List<TableColumn<Address, String>> columns = new ArrayList<>();
tcStreet.setPrefWidth(100.0d);
tcStreet.setMinWidth(100.0d);
tcCity.setPrefWidth(100.0d);
tcState.setPrefWidth(100.0d);
tcZip.setPrefWidth(100.0d);
tcStreet.setCellValueFactory(new PropertyValueFactory<Address, String>("street"));
tcCity.setCellValueFactory(new PropertyValueFactory<Address, String>("city"));
tcState.setCellValueFactory(new PropertyValueFactory<Address, String>("state"));
tcZip.setCellValueFactory(new PropertyValueFactory<Address, String>("zip"));
tvInventory.getColumns().clear();
columns.add(tcStreet);
columns.add(tcCity);
columns.add(tcState);
columns.add(tcZip);
tvInventory.getColumns().addAll(columns);
tvInventory.itemsProperty().bind(new SimpleObjectProperty<>(rows));
btnAdd.setOnAction((ev) -> {
TestMainFxCommandDialog accomodationDialog = new TestMainFxCommandDialog();
Optional<Address> result = accomodationDialog.showAndWait();
if (result.isPresent()) {
System.out.println("result is present.");
// add to storage
rows.add((Address) result.get());
// bind to model
tvInventory.refresh();
}
});
}
}

View File

@@ -60,7 +60,7 @@ public final class TestReservations {
public static void main(String[] args) throws Exception {
// Configure data repository
AccomodationManager mgr = new AccomodationManager(getRepositoryConfig.getPath());
AccomodationManager mgr = new AccomodationManager(AccomodationManager.getRepositoryConfig.getPath());
// 1. Get the list of loaded accounts from Manager
mgr.loadAll();
@@ -149,12 +149,4 @@ public final class TestReservations {
System.out.println("Program Completed.");
}
public final static class getRepositoryConfig {
public final static String getPath() {
String home = System.getenv("HOME") != null ? System.getenv("HOME")
: System.getenv("HOMEDRIVE") + System.getenv("HOMEPATH");
return home.replace('\\', '/') + "/workspace/reservationsystem/src/resources";
}
}
}

View File

@@ -14,8 +14,8 @@ public final class Address{
/** not used
*
*/
@SuppressWarnings("unused")
private Address() {
public Address() {
}
public Address(String street, String city, String state, String zip) {

View File

@@ -34,7 +34,7 @@ public abstract class Reservation implements IReservation{
private Float price;
protected String accountNumber = null;
protected String accountNumber = "-99";
protected Reservation() {
numberOfBeds = 1;

View File

@@ -6,7 +6,6 @@ package lodge.reservationsystem;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.List;
@@ -28,7 +27,6 @@ public final class AccomodationManager {
};
public AccomodationManager(String home) {
setDataStoreRoot(home);
};
@@ -36,12 +34,15 @@ public final class AccomodationManager {
DataRepository.setDataStoreRoot(home);
}
String getDataStoreRoot(){
return DataRepository.getPath();
}
public final void loadAll()
throws IOException, IllegalArgumentException, IllegalOperationException, DuplicateObjectException {
accounts.clear();
// walk directories
Path rootDir = Paths.get(DataRepository.getPath());
DataRepository.WalkFileSystemTree(this, rootDir);
DataRepository.WalkFileSystemTree(this, Path.of(DataRepository.getPath()));
System.out.println(String.format("%s LoadAll Accounts %d", "Deserializing", accounts.size()));
}
@@ -125,4 +126,12 @@ public final class AccomodationManager {
System.out.println(String.format("Account %s", acct.getAccount_number()));
}
}
public final static class getRepositoryConfig {
public final static String getPath() {
String home = System.getenv("HOME") != null ? System.getenv("HOME")
: System.getenv("HOMEDRIVE") + System.getenv("HOMEPATH");
return home.replace('\\', '/') + "/workspace/reservationsystem/src/resources/db";
}
}
}

View File

@@ -43,9 +43,6 @@ public final class CabinReservation extends Reservation {
if (getPhysical_address() == null) {
throw new IllegalArgumentException(String.format("not valid, physical_address %s", this.getReservation_number()));
}
if (getMailing_address() == null) {
throw new IllegalArgumentException(String.format("not valid, mailing_address: %s", this.getReservation_number()));
}
return true;
}

View File

@@ -65,9 +65,6 @@ public final class HotelReservation extends Reservation {
if (getPhysical_address() == null) {
throw new IllegalArgumentException(String.format("not valid, physical_address %s", this.getReservation_number()));
}
if (getMailing_address() == null) {
throw new IllegalArgumentException(String.format("not valid, mailing_address: %s", this.getReservation_number()));
}
return true;
}

View File

@@ -53,9 +53,6 @@ public final class HouseReservation extends Reservation {
if (getPhysical_address() == null) {
throw new IllegalArgumentException(String.format("not valid, physical_address %s", this.getReservation_number()));
}
if (getMailing_address() == null) {
throw new IllegalArgumentException(String.format("not valid, mailing_address: %s", this.getReservation_number()));
}
return true;
}

View File

@@ -1 +0,0 @@
{ "Account":{"account_number": "A07421233","phone_number": "301-356-3890","mailing_address": { "Address":{"street": "30 Amstadam ave","city": "New York","state": "NY","zip": "12010"}},"email_address": { "EmailAddress":{"email": "newbee952@aol.com"}},"reservations":[{"HotelReservation":{"reservation_number":"R0123087344"}},{"CabinReservation":{"reservation_number":"R2042828431"}}]}}

View File

@@ -0,0 +1,41 @@
{
"Account": {
"account_number": "A07421233",
"phone_number": "301-356-3890",
"mailing_address": {
"Address": {
"street": "30 Amstadam ave",
"city": "New York",
"state": "NY",
"zip": "12010"
}
},
"email_address": {
"EmailAddress": {
"email": "newbee952@aol.com"
}
},
"reservations": [
{
"HotelReservation": {
"reservation_number": "R0123087344"
}
},
{
"CabinReservation": {
"reservation_number": "R2042828431"
}
},
{
"CabinReservation": {
"reservation_number": "R0535276622"
}
},
{
"HouseReservation": {
"reservation_number": "R0499811708"
}
}
]
}
}

View File

@@ -1 +1 @@
{ "Account":{"account_number": "A45098176","phone_number": "701-456-7890","mailing_address": { "Address":{"street": "10 wilco ave","city": "wilco","state": "WY","zip": "82801"}},"email_address": { "EmailAddress":{"email": "wilco@wyommin.net"}},"reservations":[{"CabinReservation":{"reservation_number":"R0535276622"}},{"HouseReservation":{"reservation_number":"R0499811708"}}]}}
{ "Account":{"account_number": "A45098176","phone_number": "701-456-7890","mailing_address": { "Address":{"street": "10 wilco ave","city": "wilco","state": "WY","zip": "82801"}},"email_address": { "EmailAddress":{"email": "wilco@wyommin.net"}},"reservations":[{"HotelReservation":{"reservation_number":"R0123087344"}},{"CabinReservation":{"reservation_number":"R2042828431"}}]}}

View File

@@ -1 +1 @@
{ "HotelReservation":{"reservation_type": "HotelReservation","reservation_number": "R0123087344","reservation_status": "Canceled","reservation_start_date": "2025-09-05T10:00Z[UTC]","reservation_end_date": "2025-09-09T10:00Z[UTC]","account_number": "A07421233","physical_address": { "Address":{"street": "400 hotel ave","city": "Maryland City","state": "MD","zip": "20723"}},"mailing_address": { "Address":{"street": "400 hotel ave","city": "Maryland City","state": "MD","zip": "20723"}},"kitchen": "Kitchenette","numberOfBeds": "2","numberOfBedRooms": "1","numberOfBathRooms": "1","numberOfFloors": "1","squareFeet": "450","price": "410.0"}}
{ "HotelReservation":{"reservation_type": "HotelReservation","reservation_number": "R0123087344","reservation_status": "Canceled","reservation_start_date": "2025-09-05T10:00Z[UTC]","reservation_end_date": "2025-09-09T10:00Z[UTC]","account_number": "A45098176","physical_address": { "Address":{"street": "400 hotel ave","city": "Maryland City","state": "MD","zip": "20723"}},"mailing_address": { "Address":{"street": "400 hotel ave","city": "Maryland City","state": "MD","zip": "20723"}},"kitchen": "Kitchenette","numberOfBeds": "2","numberOfBedRooms": "1","numberOfBathRooms": "1","numberOfFloors": "1","squareFeet": "450","price": "410.0"}}

View File

@@ -1 +1 @@
{ "HouseReservation":{"reservation_type": "HouseReservation","reservation_number": "R0499811708","reservation_status": "Draft","reservation_start_date": "2025-09-05T10:00Z[UTC]","reservation_end_date": "2025-09-09T10:00Z[UTC]","account_number": "A45098176","physical_address": { "Address":{"street": "3000 Osage ave","city": "GreenBelt","state": "MD","zip": "20740"}},"mailing_address": { "Address":{"street": "40012 College ave","city": "College Park","state": "MD","zip": "20740"}},"kitchen": "Kitchenette","numberOfBeds": "2","numberOfBedRooms": "1","numberOfBathRooms": "1","numberOfFloors": "1","squareFeet": "450","price": "360.0"}}
{ "HouseReservation":{"reservation_type": "HouseReservation","reservation_number": "R0499811708","reservation_status": "Draft","reservation_start_date": "2025-09-05T10:00Z[UTC]","reservation_end_date": "2025-09-09T10:00Z[UTC]","account_number": "A07421233","physical_address": { "Address":{"street": "3000 Osage ave","city": "GreenBelt","state": "MD","zip": "20740"}},"mailing_address": { "Address":{"street": "40012 College ave","city": "College Park","state": "MD","zip": "20740"}},"kitchen": "Kitchenette","numberOfBeds": "2","numberOfBedRooms": "1","numberOfBathRooms": "1","numberOfFloors": "1","squareFeet": "450","price": "360.0"}}

View File

@@ -0,0 +1 @@
{ "CabinReservation":{"reservation_type": "CabinReservation","reservation_number": "R0535276622","reservation_status": "Draft","reservation_start_date": "2025-09-05T10:00Z[UTC]","reservation_end_date": "2025-09-09T10:00Z[UTC]","account_number": "A07421233","physical_address": { "Address":{"street": "40 cabin ave","city": "Carnelian","state": "CA","zip": "96140"}},"mailing_address": { "Address":{"street": "40 cabin ave","city": "Carnelian Bay","state": "CA","zip": "96140"}},"kitchen": "Kitchenette","numberOfBeds": "2","numberOfBedRooms": "1","numberOfBathRooms": "1","numberOfFloors": "1","squareFeet": "450","price": "360.0"}}

View File

@@ -1 +1 @@
{ "CabinReservation":{"reservation_type": "CabinReservation","reservation_number": "R2042828431","reservation_status": "Draft","reservation_start_date": "2025-09-05T10:00Z[UTC]","reservation_end_date": "2025-09-09T10:00Z[UTC]","account_number": "A07421233","physical_address": { "Address":{"street": "30 cabin ave","city": "Carnelian","state": "CA","zip": "96140"}},"mailing_address": { "Address":{"street": "30 cabin ave","city": "Carnelian Bay","state": "CA","zip": "96140"}},"kitchen": "Kitchenette","numberOfBeds": "2","numberOfBedRooms": "1","numberOfBathRooms": "1","numberOfFloors": "1","squareFeet": "450","price": "360.0"}}
{ "CabinReservation":{"reservation_type": "CabinReservation","reservation_number": "R2042828431","reservation_status": "Draft","reservation_start_date": "2025-09-05T10:00Z[UTC]","reservation_end_date": "2025-09-09T10:00Z[UTC]","account_number": "A45098176","physical_address": { "Address":{"street": "30 cabin ave","city": "Carnelian","state": "CA","zip": "96140"}},"mailing_address": { "Address":{"street": "30 cabin ave","city": "Carnelian Bay","state": "CA","zip": "96140"}},"kitchen": "Kitchenette","numberOfBeds": "2","numberOfBedRooms": "1","numberOfBathRooms": "1","numberOfFloors": "1","squareFeet": "450","price": "360.0"}}

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="364.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/25.0.1">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="294.0" minWidth="-Infinity" prefWidth="168.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="477.0" minWidth="10.0" prefWidth="432.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="128.0" minHeight="10.0" prefHeight="43.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="189.0" minHeight="10.0" prefHeight="48.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="309.0" minHeight="10.0" prefHeight="180.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label prefHeight="18.0" prefWidth="165.0" text="Email:" />
<TextField promptText="email address" GridPane.columnIndex="1" />
<Label prefHeight="18.0" prefWidth="165.0" text="Phone Number:" GridPane.rowIndex="1" />
<Label prefHeight="18.0" prefWidth="165.0" text="Mailing Address:" GridPane.rowIndex="2" />
<TextField promptText="phone number" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<VBox prefHeight="180.0" prefWidth="432.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
<children>
<Label text="Street" />
<TextField fx:id="tfStreet" promptText="street"/>
<GridPane prefHeight="90.0" prefWidth="432.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="210.0" minWidth="10.0" prefWidth="151.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="295.0" minWidth="10.0" prefWidth="123.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="295.0" minWidth="10.0" prefWidth="159.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="40.0" minHeight="10.0" prefHeight="33.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="66.0" minHeight="10.0" prefHeight="48.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="66.0" minHeight="10.0" prefHeight="54.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="40.0" minHeight="10.0" prefHeight="17.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="State" GridPane.columnIndex="1" />
<Label text="City" />
<Label text="Zip" GridPane.columnIndex="2" />
<TextField fx:id="tfCity" prefHeight="38.0" prefWidth="150.0" GridPane.rowIndex="1" />
<TextField fx:id="tfState" prefHeight="38.0" prefWidth="120.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<TextField fx:id="tfZip" prefHeight="38.0" prefWidth="159.0" GridPane.columnIndex="2" GridPane.rowIndex="1" />
</children>
</GridPane>
<ButtonBar prefHeight="38.0" prefWidth="429.0">
<buttons/>
</ButtonBar>
</children>
</VBox>
</children>
</GridPane>

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015, 2019, Gluon and/or its affiliates.
All rights reserved. Use is subject to license terms.
This file is available and licensed under the following license:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
- Neither the name of Oracle Corporation nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.text.Font?>
<VBox prefHeight="600.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/25.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lodge.TestMainFxView">
<children>
<SplitPane dividerPositions="0.31469933184855237" focusTraversable="true" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
<items>
<AnchorPane maxWidth="200.0" prefHeight="549.0" prefWidth="300.0">
<children>
<SplitPane dividerPositions="0.2979094076655052, 0.6480836236933798" layoutY="88.0" orientation="VERTICAL" prefHeight="576.0" prefWidth="140.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<AnchorPane prefHeight="291.0" prefWidth="98.0">
<VBox>
<children>
<ButtonBar layoutY="71.0" prefHeight="40.0" prefWidth="129.0">
<buttons>
<Button fx:id="btnAdd" mnemonicParsing="false" prefHeight="30.0" text="Add" />
<Button mnemonicParsing="false" prefHeight="30.0" text="Reserve" />
</buttons>
</ButtonBar>
</children></VBox></AnchorPane>
<AnchorPane prefHeight="78.0" prefWidth="98.0" />
<AnchorPane prefHeight="223.0" prefWidth="98.0" />
</items>
</SplitPane>
</children>
</AnchorPane>
<AnchorPane prefHeight="459.0" prefWidth="574.0">
<children>
<Label alignment="CENTER" layoutX="10.0" layoutY="10.0" style="&#10;" text="Accomodations" textAlignment="CENTER" wrapText="false">
<font>
<Font size="18.0" fx:id="x1" />
</font>
<textFill>
<Color red="0.624" green="0.624" blue="0.624" fx:id="x2" />
</textFill></Label>
<VBox layoutX="34.0" layoutY="54.0" prefHeight="576.0" prefWidth="761.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<HBox prefHeight="36.0" prefWidth="483.0">
<children>
<Label prefHeight="30.0" prefWidth="66.0" text="" />
<Label prefHeight="28.0" prefWidth="115.0" />
<TextField prefHeight="31.0" prefWidth="314.0" promptText="search" />
</children>
</HBox>
<TableView fx:id="tvInventory" prefHeight="501.0" prefWidth="761.0">
<columns>
<TableColumn prefWidth="75.0" text="Street" />
<TableColumn prefWidth="75.0" text="City" />
<TableColumn prefWidth="75.0" text="State" />
<TableColumn prefWidth="75.0" text="Zip" />
</columns>
</TableView>
</children>
</VBox>
</children>
</AnchorPane>
</items>
</SplitPane>
<HBox id="HBox" alignment="CENTER_LEFT" spacing="5.0" VBox.vgrow="NEVER">
<children>
<Label maxHeight="1.7976931348623157E308" maxWidth="-1.0" text="Left status" HBox.hgrow="ALWAYS">
<font>
<Font size="11.0" fx:id="x3" />
</font>
<textFill>
<Color red="0.625" green="0.625" blue="0.625" fx:id="x4" />
</textFill>
</Label>
<Pane prefHeight="-1.0" prefWidth="-1.0" HBox.hgrow="ALWAYS" />
<Label font="$x3" maxWidth="-1.0" text="Right status" textFill="$x4" HBox.hgrow="NEVER" />
</children>
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
</HBox>
</children>
</VBox>

View File

@@ -1 +0,0 @@
{ "CabinReservation":{"reservation_type": "CabinReservation","reservation_number": "R0535276622","reservation_status": "Completed","reservation_start_date": "2025-09-05T10:00Z[UTC]","reservation_end_date": "2025-09-09T10:00Z[UTC]","account_number": "A45098176","physical_address": { "Address":{"street": "40 cabin ave","city": "Carnelian","state": "CA","zip": "96140"}},"mailing_address": { "Address":{"street": "40 cabin ave","city": "Carnelian Bay","state": "CA","zip": "96140"}},"kitchen": "Kitchenette","numberOfBeds": "2","numberOfBedRooms": "1","numberOfBathRooms": "1","numberOfFloors": "1","squareFeet": "450","price": "360.0"}}

View File

@@ -83,7 +83,7 @@ digraph ClassDiagram {
// Composition / Aggregation
AccomodationManager -> AccountList [arrowhead=diamond, label="has a"];
AccountList -> Account [arrowhead=diamond, label="0..*"];
AccountList -> Account [arrowhead=odiamond, label="0..*"];
Account -> AccountReservationList [arrowhead=diamond, label="has a"];
AccountReservationList -> IReservation [arrowhead=diamond, label="0..*"];
Account -> Address [arrowhead=odiamond, label="mailing"];

View File

@@ -1,323 +1,317 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.0.0 (20250921.2048)
-->
<!-- Title: ClassDiagram Pages: 1 -->
<svg width="2238pt" height="1056pt"
viewBox="0.00 0.00 2238.00 1056.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1052)">
<title>ClassDiagram</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-1052 2233.62,-1052 2233.62,4 -4,4"/>
<!-- IReservation -->
<g id="node1" class="node">
<title>IReservation</title>
<polygon fill="palegreen" stroke="black" points="90.75,-0.5 90.75,-142.5 315.25,-142.5 315.25,-0.5 90.75,-0.5"/>
<text xml:space="preserve" text-anchor="middle" x="203" y="-125.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00">interface</text>
<text xml:space="preserve" text-anchor="middle" x="203" y="-109.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">IReservation</text>
<polyline fill="none" stroke="black" points="90.75,-103 315.25,-103"/>
<text xml:space="preserve" text-anchor="start" x="98.75" y="-85.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ ReservationType(): String</text>
<text xml:space="preserve" text-anchor="start" x="98.75" y="-69.95" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ checkValid(): boolean</text>
<text xml:space="preserve" text-anchor="start" x="98.75" y="-54.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ calculatePrice(): float</text>
<text xml:space="preserve" text-anchor="start" x="98.75" y="-38.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ getReservation_number(): String</text>
<text xml:space="preserve" text-anchor="start" x="98.75" y="-22.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ getPhysical_address(): Address</text>
<text xml:space="preserve" text-anchor="start" x="98.75" y="-6.95" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ getAccountNumber(): String</text>
</g>
<!-- Reservation -->
<g id="node2" class="node">
<title>Reservation</title>
<polygon fill="lightyellow" stroke="black" points="517,-575 517,-611 605,-611 605,-575 517,-575"/>
<text xml:space="preserve" text-anchor="middle" x="561" y="-587.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">Reservation</text>
</g>
<!-- Reservation&#45;&gt;IReservation -->
<g id="edge1" class="edge">
<title>Reservation&#45;&gt;IReservation</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M516.64,-587C428.97,-587 241.94,-587 241.94,-587 241.94,-587 241.94,-154.42 241.94,-154.42"/>
<polygon fill="none" stroke="black" points="245.44,-154.42 241.94,-144.42 238.44,-154.42 245.44,-154.42"/>
<text xml:space="preserve" text-anchor="middle" x="181.25" y="-354.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">implements</text>
</g>
<!-- DataRepository -->
<g id="node4" class="node">
<title>DataRepository</title>
<polygon fill="orchid" stroke="black" points="947.5,-258.88 947.5,-294.88 1056.5,-294.88 1056.5,-258.88 947.5,-258.88"/>
<text xml:space="preserve" text-anchor="middle" x="1002" y="-271.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">DataRepository</text>
</g>
<!-- Reservation&#45;&gt;DataRepository -->
<g id="edge24" class="edge">
<title>Reservation&#45;&gt;DataRepository</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M605.37,-587C707.62,-587 951.12,-587 951.12,-587 951.12,-587 951.12,-306.56 951.12,-306.56"/>
<polygon fill="black" stroke="black" points="951.13,-296.56 955.63,-306.56 951.13,-300.35 951.13,-306.56 951.13,-306.56 951.13,-306.56 951.13,-300.35 946.63,-306.56 951.13,-296.56"/>
<text xml:space="preserve" text-anchor="middle" x="847.12" y="-425.57" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses for Write()</text>
</g>
<!-- Address -->
<g id="node13" class="node">
<title>Address</title>
<polygon fill="lightblue" stroke="black" points="436.38,-253.12 436.38,-300.62 685.62,-300.62 685.62,-253.12 436.38,-253.12"/>
<text xml:space="preserve" text-anchor="middle" x="561" y="-283.32" font-family="Helvetica,Arial,sans-serif" font-size="14.00">Address</text>
<polyline fill="none" stroke="black" points="436.38,-276.88 685.62,-276.88"/>
<text xml:space="preserve" text-anchor="start" x="444.38" y="-259.57" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ Address(String, String, String, String)</text>
</g>
<!-- Reservation&#45;&gt;Address -->
<g id="edge11" class="edge">
<title>Reservation&#45;&gt;Address</title>
<path fill="none" stroke="black" d="M575.67,-574.64C575.67,-574.64 575.67,-313.79 575.67,-313.79"/>
<polygon fill="none" stroke="black" points="575.67,-313.64 571.67,-307.64 575.67,-301.64 579.67,-307.64 575.67,-313.64"/>
<text xml:space="preserve" text-anchor="middle" x="609" y="-425.57" font-family="Helvetica,Arial,sans-serif" font-size="14.00">physical/mailing</text>
</g>
<!-- ReservationStatusEnum -->
<g id="node15" class="node">
<title>ReservationStatusEnum</title>
<polygon fill="lightgray" stroke="black" points="254.88,-411.25 254.88,-450.75 417.12,-450.75 417.12,-411.25 254.88,-411.25"/>
<text xml:space="preserve" text-anchor="middle" x="336" y="-433.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">enum</text>
<text xml:space="preserve" text-anchor="middle" x="336" y="-417.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">ReservationStatusEnum</text>
</g>
<!-- Reservation&#45;&gt;ReservationStatusEnum -->
<g id="edge25" class="edge">
<title>Reservation&#45;&gt;ReservationStatusEnum</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M546.33,-574.81C546.33,-530.4 546.33,-420 546.33,-420 546.33,-420 428.84,-420 428.84,-420"/>
<polygon fill="black" stroke="black" points="418.84,-420 428.84,-415.5 422.62,-420 428.84,-420 428.84,-420 428.84,-420 422.62,-420 428.84,-424.5 418.84,-420"/>
<text xml:space="preserve" text-anchor="middle" x="350.25" y="-496.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses</text>
</g>
<!-- AccomodationManager -->
<g id="node3" class="node">
<title>AccomodationManager</title>
<polygon fill="lightyellow" stroke="black" points="1026.5,-735.25 1026.5,-908.75 1375.5,-908.75 1375.5,-735.25 1026.5,-735.25"/>
<text xml:space="preserve" text-anchor="middle" x="1201" y="-891.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">AccomodationManager</text>
<polyline fill="none" stroke="black" points="1026.5,-885 1375.5,-885"/>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-867.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ AccomodationManager(String)</text>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-851.95" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ loadAll(): void</text>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-836.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ retrieveAccount(String): Account</text>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-820.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ retrieveLoadedAccounts(): AccountList</text>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-804.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ newAccount(String, Address, EmailAddress): Account</text>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-788.95" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ AddAccount(Account): void</text>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-773.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ UpdateAccount(Account): void</text>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-757.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ addReservation(Account, Reservation): boolean</text>
<text xml:space="preserve" text-anchor="start" x="1034.5" y="-741.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ showReservationList(): void</text>
</g>
<!-- AccomodationManager&#45;&gt;DataRepository -->
<g id="edge21" class="edge">
<title>AccomodationManager&#45;&gt;DataRepository</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1036.5,-735.02C1036.5,-735.02 1036.5,-306.25 1036.5,-306.25"/>
<polygon fill="black" stroke="black" points="1036.5,-296.25 1041,-306.25 1036.5,-300.03 1036.5,-306.25 1036.5,-306.25 1036.5,-306.25 1036.5,-300.03 1032,-306.25 1036.5,-296.25"/>
<text xml:space="preserve" text-anchor="middle" x="1016.25" y="-496.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses</text>
</g>
<!-- Account -->
<g id="node5" class="node">
<title>Account</title>
<polygon fill="lightyellow" stroke="black" points="1360.62,-413 1360.62,-449 1425.38,-449 1425.38,-413 1360.62,-413"/>
<text xml:space="preserve" text-anchor="middle" x="1393" y="-425.57" font-family="Helvetica,Arial,sans-serif" font-size="14.00">Account</text>
</g>
<!-- AccomodationManager&#45;&gt;Account -->
<g id="edge22" class="edge">
<title>AccomodationManager&#45;&gt;Account</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1268.38,-734.82C1268.38,-622.63 1268.38,-442 1268.38,-442 1268.38,-442 1349.04,-442 1349.04,-442"/>
<polygon fill="black" stroke="black" points="1359.04,-442 1349.04,-446.5 1355.26,-442 1349.04,-442 1349.04,-442 1349.04,-442 1355.26,-442 1349.04,-437.5 1359.04,-442"/>
<text xml:space="preserve" text-anchor="middle" x="1211.12" y="-587.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">manages</text>
</g>
<!-- AccountList -->
<g id="node6" class="node">
<title>AccountList</title>
<polygon fill="lightyellow" stroke="black" points="1311.12,-553.5 1311.12,-632.5 1474.88,-632.5 1474.88,-553.5 1311.12,-553.5"/>
<text xml:space="preserve" text-anchor="middle" x="1393" y="-615.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00">AccountList</text>
<polyline fill="none" stroke="black" points="1311.12,-608.75 1474.88,-608.75"/>
<text xml:space="preserve" text-anchor="start" x="1319.12" y="-591.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ add(Account): boolean</text>
<text xml:space="preserve" text-anchor="start" x="1319.12" y="-575.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ find(String): Account</text>
<text xml:space="preserve" text-anchor="start" x="1319.12" y="-559.95" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ save(Account): void</text>
</g>
<!-- AccomodationManager&#45;&gt;AccountList -->
<g id="edge5" class="edge">
<title>AccomodationManager&#45;&gt;AccountList</title>
<path fill="none" stroke="black" d="M1343.31,-734.77C1343.31,-734.77 1343.31,-645.8 1343.31,-645.8"/>
<polygon fill="black" stroke="black" points="1343.31,-645.65 1339.31,-639.65 1343.31,-633.65 1347.31,-639.65 1343.31,-645.65"/>
<text xml:space="preserve" text-anchor="middle" x="1380.5" y="-678.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">has a</text>
</g>
<!-- Account&#45;&gt;DataRepository -->
<g id="edge23" class="edge">
<title>Account&#45;&gt;DataRepository</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1360.4,-427C1274.15,-427 1046.5,-427 1046.5,-427 1046.5,-427 1046.5,-306.5 1046.5,-306.5"/>
<polygon fill="black" stroke="black" points="1046.5,-296.5 1051,-306.5 1046.5,-300.28 1046.5,-306.5 1046.5,-306.5 1046.5,-306.5 1046.5,-300.28 1042,-306.5 1046.5,-296.5"/>
<text xml:space="preserve" text-anchor="middle" x="1283.12" y="-354.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses for Write()</text>
</g>
<!-- AccountReservationList -->
<g id="node7" class="node">
<title>AccountReservationList</title>
<polygon fill="lightyellow" stroke="black" points="1225.62,-245.25 1225.62,-308.5 1416.38,-308.5 1416.38,-245.25 1225.62,-245.25"/>
<text xml:space="preserve" text-anchor="middle" x="1321" y="-291.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00">AccountReservationList</text>
<polyline fill="none" stroke="black" points="1225.62,-284.75 1416.38,-284.75"/>
<text xml:space="preserve" text-anchor="start" x="1233.62" y="-267.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ add(IReservation): boolean</text>
<text xml:space="preserve" text-anchor="start" x="1233.62" y="-251.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ find(String): Reservation</text>
</g>
<!-- Account&#45;&gt;AccountReservationList -->
<g id="edge7" class="edge">
<title>Account&#45;&gt;AccountReservationList</title>
<path fill="none" stroke="black" d="M1388.5,-412.71C1388.5,-412.71 1388.5,-321.85 1388.5,-321.85"/>
<polygon fill="black" stroke="black" points="1388.5,-321.7 1384.5,-315.7 1388.5,-309.7 1392.5,-315.7 1388.5,-321.7"/>
<text xml:space="preserve" text-anchor="middle" x="1422.5" y="-354.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">has a</text>
</g>
<!-- Account&#45;&gt;Address -->
<g id="edge9" class="edge">
<title>Account&#45;&gt;Address</title>
<path fill="none" stroke="black" d="M1360.38,-435C1216.4,-435 644.94,-435 644.94,-435 644.94,-435 644.94,-313.94 644.94,-313.94"/>
<polygon fill="none" stroke="black" points="644.94,-313.79 640.94,-307.79 644.94,-301.79 648.94,-307.79 644.94,-313.79"/>
<text xml:space="preserve" text-anchor="middle" x="1137.75" y="-354.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">mailing</text>
</g>
<!-- EmailAddress -->
<g id="node14" class="node">
<title>EmailAddress</title>
<polygon fill="lightblue" stroke="black" points="1639.88,-253.12 1639.88,-300.62 1796.12,-300.62 1796.12,-253.12 1639.88,-253.12"/>
<text xml:space="preserve" text-anchor="middle" x="1718" y="-283.32" font-family="Helvetica,Arial,sans-serif" font-size="14.00">EmailAddress</text>
<polyline fill="none" stroke="black" points="1639.88,-276.88 1796.12,-276.88"/>
<text xml:space="preserve" text-anchor="start" x="1647.88" y="-259.57" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ EmailAddress(String)</text>
</g>
<!-- Account&#45;&gt;EmailAddress -->
<g id="edge10" class="edge">
<title>Account&#45;&gt;EmailAddress</title>
<path fill="none" stroke="black" d="M1420.88,-412.73C1420.88,-370.36 1420.88,-269 1420.88,-269 1420.88,-269 1626.49,-269 1626.49,-269"/>
<polygon fill="none" stroke="black" points="1626.64,-269 1632.64,-265 1638.64,-269 1632.64,-273 1626.64,-269"/>
</g>
<!-- AccountList&#45;&gt;Account -->
<g id="edge6" class="edge">
<title>AccountList&#45;&gt;Account</title>
<path fill="none" stroke="black" d="M1393,-553.37C1393,-553.37 1393,-462.35 1393,-462.35"/>
<polygon fill="black" stroke="black" points="1393,-462.2 1389,-456.2 1393,-450.2 1397,-456.2 1393,-462.2"/>
<text xml:space="preserve" text-anchor="middle" x="1403.12" y="-496.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">0..*</text>
</g>
<!-- AccountReservationList&#45;&gt;IReservation -->
<g id="edge8" class="edge">
<title>AccountReservationList&#45;&gt;IReservation</title>
<path fill="none" stroke="black" d="M1225.4,-249C968.94,-249 285.06,-249 285.06,-249 285.06,-249 285.06,-155.98 285.06,-155.98"/>
<polygon fill="black" stroke="black" points="285.06,-155.83 281.06,-149.83 285.06,-143.83 289.06,-149.83 285.06,-155.83"/>
<text xml:space="preserve" text-anchor="middle" x="800.12" y="-188.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">0..*</text>
</g>
<!-- HotelReservation -->
<g id="node8" class="node">
<title>HotelReservation</title>
<polygon fill="lightyellow" stroke="black" points="229,-790.38 229,-853.62 419,-853.62 419,-790.38 229,-790.38"/>
<text xml:space="preserve" text-anchor="middle" x="324" y="-836.33" font-family="Helvetica,Arial,sans-serif" font-size="14.00">HotelReservation</text>
<polyline fill="none" stroke="black" points="229,-829.88 419,-829.88"/>
<text xml:space="preserve" text-anchor="start" x="237" y="-812.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ HotelReservation(Address)</text>
<text xml:space="preserve" text-anchor="start" x="237" y="-796.83" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ calculatePrice(): float</text>
</g>
<!-- HotelReservation&#45;&gt;Reservation -->
<g id="edge2" class="edge">
<title>HotelReservation&#45;&gt;Reservation</title>
<path fill="none" stroke="black" d="M336,-790.05C336,-728.39 336,-599 336,-599 336,-599 505.03,-599 505.03,-599"/>
<polygon fill="none" stroke="black" points="505.03,-602.5 515.03,-599 505.03,-595.5 505.03,-602.5"/>
<text xml:space="preserve" text-anchor="middle" x="404.62" y="-678.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">extends</text>
</g>
<!-- CabinReservation -->
<g id="node9" class="node">
<title>CabinReservation</title>
<polygon fill="lightyellow" stroke="black" points="491.12,-790.38 491.12,-853.62 684.88,-853.62 684.88,-790.38 491.12,-790.38"/>
<text xml:space="preserve" text-anchor="middle" x="588" y="-836.33" font-family="Helvetica,Arial,sans-serif" font-size="14.00">CabinReservation</text>
<polyline fill="none" stroke="black" points="491.12,-829.88 684.88,-829.88"/>
<text xml:space="preserve" text-anchor="start" x="499.12" y="-812.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ CabinReservation(Address)</text>
<text xml:space="preserve" text-anchor="start" x="499.12" y="-796.83" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ calculatePrice(): float</text>
</g>
<!-- CabinReservation&#45;&gt;Reservation -->
<g id="edge3" class="edge">
<title>CabinReservation&#45;&gt;Reservation</title>
<path fill="none" stroke="black" d="M561,-790.16C561,-790.16 561,-622.79 561,-622.79"/>
<polygon fill="none" stroke="black" points="564.5,-622.79 561,-612.79 557.5,-622.79 564.5,-622.79"/>
<text xml:space="preserve" text-anchor="middle" x="598.62" y="-678.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">extends</text>
</g>
<!-- HouseReservation -->
<g id="node10" class="node">
<title>HouseReservation</title>
<polygon fill="lightyellow" stroke="black" points="757.25,-790.38 757.25,-853.62 954.75,-853.62 954.75,-790.38 757.25,-790.38"/>
<text xml:space="preserve" text-anchor="middle" x="856" y="-836.33" font-family="Helvetica,Arial,sans-serif" font-size="14.00">HouseReservation</text>
<polyline fill="none" stroke="black" points="757.25,-829.88 954.75,-829.88"/>
<text xml:space="preserve" text-anchor="start" x="765.25" y="-812.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ HouseReservation(Address)</text>
<text xml:space="preserve" text-anchor="start" x="765.25" y="-796.83" font-family="Helvetica,Arial,sans-serif" font-size="14.00">+ calculatePrice(): float</text>
</g>
<!-- HouseReservation&#45;&gt;Reservation -->
<g id="edge4" class="edge">
<title>HouseReservation&#45;&gt;Reservation</title>
<path fill="none" stroke="black" d="M852.38,-790.05C852.38,-728.39 852.38,-599 852.38,-599 852.38,-599 616.77,-599 616.77,-599"/>
<polygon fill="none" stroke="black" points="616.77,-595.5 606.77,-599 616.77,-602.5 616.77,-595.5"/>
<text xml:space="preserve" text-anchor="middle" x="807.62" y="-678.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">extends</text>
</g>
<!-- TestReservations -->
<g id="node11" class="node">
<title>TestReservations</title>
<polygon fill="lightyellow" stroke="black" points="1141.25,-1011.5 1141.25,-1047.5 1260.75,-1047.5 1260.75,-1011.5 1141.25,-1011.5"/>
<text xml:space="preserve" text-anchor="middle" x="1201" y="-1024.08" font-family="Helvetica,Arial,sans-serif" font-size="14.00">TestReservations</text>
</g>
<!-- TestReservations&#45;&gt;AccomodationManager -->
<g id="edge12" class="edge">
<title>TestReservations&#45;&gt;AccomodationManager</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1201,-1011.09C1201,-1011.09 1201,-920.37 1201,-920.37"/>
<polygon fill="black" stroke="black" points="1201,-910.37 1205.5,-920.37 1201,-914.15 1201,-920.37 1201,-920.37 1201,-920.37 1201,-914.15 1196.5,-920.37 1201,-910.37"/>
<text xml:space="preserve" text-anchor="middle" x="1215.25" y="-954.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses</text>
</g>
<!-- TestReservations&#45;&gt;Account -->
<g id="edge17" class="edge">
<title>TestReservations&#45;&gt;Account</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1261.11,-1018C1352.19,-1018 1514.67,-1018 1514.67,-1018 1514.67,-1018 1514.67,-431 1514.67,-431 1514.67,-431 1436.82,-431 1436.82,-431"/>
<polygon fill="black" stroke="black" points="1426.82,-431 1436.82,-426.5 1430.6,-431 1436.82,-431 1436.82,-431 1436.82,-431 1430.6,-431 1436.82,-435.5 1426.82,-431"/>
<text xml:space="preserve" text-anchor="middle" x="1527.25" y="-678.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses</text>
</g>
<!-- TestReservations&#45;&gt;HotelReservation -->
<g id="edge14" class="edge">
<title>TestReservations&#45;&gt;HotelReservation</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1141.07,-1041C943.3,-1041 324,-1041 324,-1041 324,-1041 324,-865.06 324,-865.06"/>
<polygon fill="black" stroke="black" points="324,-855.06 328.5,-865.06 324,-858.84 324,-865.06 324,-865.06 324,-865.06 324,-858.84 319.5,-865.06 324,-855.06"/>
<text xml:space="preserve" text-anchor="middle" x="491.12" y="-954.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">creates</text>
</g>
<!-- TestReservations&#45;&gt;CabinReservation -->
<g id="edge15" class="edge">
<title>TestReservations&#45;&gt;CabinReservation</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1140.83,-1026C986.38,-1026 588,-1026 588,-1026 588,-1026 588,-865.09 588,-865.09"/>
<polygon fill="black" stroke="black" points="588,-855.09 592.5,-865.09 588,-858.88 588,-865.09 588,-865.09 588,-865.09 588,-858.88 583.5,-865.09 588,-855.09"/>
<text xml:space="preserve" text-anchor="middle" x="683.12" y="-954.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">creates</text>
</g>
<!-- TestReservations&#45;&gt;HouseReservation -->
<g id="edge16" class="edge">
<title>TestReservations&#45;&gt;HouseReservation</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1140.91,-1018C1042.06,-1018 856,-1018 856,-1018 856,-1018 856,-865.15 856,-865.15"/>
<polygon fill="black" stroke="black" points="856,-855.15 860.5,-865.15 856,-858.93 856,-865.15 856,-865.15 856,-865.15 856,-858.93 851.5,-865.15 856,-855.15"/>
<text xml:space="preserve" text-anchor="middle" x="990.12" y="-954.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">creates</text>
</g>
<!-- TestReservations.getRepositoryConfig -->
<g id="node12" class="node">
<title>TestReservations.getRepositoryConfig</title>
<polygon fill="lightyellow" stroke="black" points="1594.25,-804 1594.25,-840 1839.75,-840 1839.75,-804 1594.25,-804"/>
<text xml:space="preserve" text-anchor="middle" x="1717" y="-816.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">TestReservations.getRepositoryConfig</text>
</g>
<!-- TestReservations&#45;&gt;TestReservations.getRepositoryConfig -->
<g id="edge13" class="edge">
<title>TestReservations&#45;&gt;TestReservations.getRepositoryConfig</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1261.2,-1033C1397.32,-1033 1717,-1033 1717,-1033 1717,-1033 1717,-851.57 1717,-851.57"/>
<polygon fill="black" stroke="black" points="1717,-841.57 1721.5,-851.57 1717,-845.36 1717,-851.57 1717,-851.57 1717,-851.57 1717,-845.36 1712.5,-851.57 1717,-841.57"/>
<text xml:space="preserve" text-anchor="middle" x="1731.25" y="-954.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses</text>
</g>
<!-- TestReservations&#45;&gt;Address -->
<g id="edge18" class="edge">
<title>TestReservations&#45;&gt;Address</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1140.98,-1033C965.18,-1033 463.75,-1033 463.75,-1033 463.75,-1033 463.75,-311.97 463.75,-311.97"/>
<polygon fill="black" stroke="black" points="463.75,-301.97 468.25,-311.97 463.75,-305.75 463.75,-311.97 463.75,-311.97 463.75,-311.97 463.75,-305.75 459.25,-311.97 463.75,-301.97"/>
<text xml:space="preserve" text-anchor="middle" x="22.12" y="-587.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">creates</text>
</g>
<!-- TestReservations&#45;&gt;EmailAddress -->
<g id="edge19" class="edge">
<title>TestReservations&#45;&gt;EmailAddress</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1260.96,-1026C1361.8,-1026 1554.46,-1026 1554.46,-1026 1554.46,-1026 1554.46,-285 1554.46,-285 1554.46,-285 1628.36,-285 1628.36,-285"/>
<polygon fill="black" stroke="black" points="1638.36,-285 1628.36,-289.5 1634.58,-285 1628.36,-285 1628.36,-285 1628.36,-285 1634.58,-285 1628.36,-280.5 1638.36,-285"/>
<text xml:space="preserve" text-anchor="middle" x="1971.12" y="-587.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">creates</text>
</g>
<!-- DuplicateObjectException -->
<g id="node16" class="node">
<title>DuplicateObjectException</title>
<polygon fill="lightpink" stroke="black" points="2058.38,-802.25 2058.38,-841.75 2229.62,-841.75 2229.62,-802.25 2058.38,-802.25"/>
<text xml:space="preserve" text-anchor="middle" x="2144" y="-824.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">exception</text>
<text xml:space="preserve" text-anchor="middle" x="2144" y="-808.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">DuplicateObjectException</text>
</g>
<!-- TestReservations&#45;&gt;DuplicateObjectException -->
<g id="edge20" class="edge">
<title>TestReservations&#45;&gt;DuplicateObjectException</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1261.06,-1041C1468.77,-1041 2144,-1041 2144,-1041 2144,-1041 2144,-853.43 2144,-853.43"/>
<polygon fill="black" stroke="black" points="2144,-843.43 2148.5,-853.43 2144,-847.21 2144,-853.43 2144,-853.43 2144,-853.43 2144,-847.21 2139.5,-853.43 2144,-843.43"/>
<text xml:space="preserve" text-anchor="middle" x="2167.25" y="-954.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">catches</text>
</g>
</g>
</svg>
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="2188pt" height="1090pt" viewBox="0.00 0.00 2188.25 1089.60">
<g id="graph0" class="graph" transform="translate(4,1085.5999755859375) scale(1)" data-name="ClassDiagram">
<polygon fill="white" stroke="none" points="-4,4 -4,-1085.6 2184.25,-1085.6 2184.25,4 -4,4" style=""/>
<!-- IReservation -->
<g id="node1" class="node" pointer-events="visible" data-name="IReservation">
<polygon fill="palegreen" stroke="black" points="96.96,-0.5 96.96,-150.9 309.04,-150.9 309.04,-0.5 96.96,-0.5" style=""/>
<text text-anchor="middle" x="203" y="-134.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">interface</text>
<text text-anchor="middle" x="203" y="-117.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">IReservation</text>
<polyline fill="none" stroke="black" points="96.96,-109.3 309.04,-109.3" style=""/>
<text text-anchor="start" x="104.96" y="-92.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ ReservationType(): String</text>
<text text-anchor="start" x="104.96" y="-75.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ checkValid(): boolean</text>
<text text-anchor="start" x="104.96" y="-59.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ calculatePrice(): float</text>
<text text-anchor="start" x="104.96" y="-42.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ getReservation_number(): String</text>
<text text-anchor="start" x="104.96" y="-25.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ getPhysical_address(): Address</text>
<text text-anchor="start" x="104.96" y="-8.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ getAccountNumber(): String</text>
</g>
<!-- Reservation -->
<g id="node2" class="node" pointer-events="visible" data-name="Reservation">
<polygon fill="lightyellow" stroke="black" points="507.57,-593.9 507.57,-629.9 590.43,-629.9 590.43,-593.9 507.57,-593.9" style=""/>
<text text-anchor="middle" x="549" y="-607.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">Reservation</text>
</g>
<!-- Reservation&#45;&gt;IReservation -->
<g id="edge1" class="edge" data-name="Reservation-&gt;IReservation">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M507.77,-605C425.81,-605 250.22,-605 250.22,-605 250.22,-605 250.22,-162.21 250.22,-162.21" style=""/>
<polygon fill="none" stroke="black" points="253.72,-162.21 250.22,-152.21 246.72,-162.21 253.72,-162.21" style=""/>
<text text-anchor="middle" x="178.66" y="-368.8" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">implements</text>
</g>
<!-- DataRepository -->
<g id="node4" class="node" pointer-events="visible" data-name="DataRepository">
<polygon fill="orchid" stroke="black" points="932.07,-269.9 932.07,-305.9 1035.93,-305.9 1035.93,-269.9 932.07,-269.9" style=""/>
<text text-anchor="middle" x="984" y="-283.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">DataRepository</text>
</g>
<!-- Reservation&#45;&gt;DataRepository -->
<g id="edge24" class="edge" data-name="Reservation-&gt;DataRepository">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M590.17,-605C696.93,-605 974.38,-605 974.38,-605 974.38,-605 974.38,-315.86 974.38,-315.86" style=""/>
<polygon fill="black" stroke="black" points="974.38,-305.86 978.88,-315.86 974.38,-310.86 974.38,-315.86 974.38,-315.86 974.38,-315.86 974.38,-310.86 969.88,-315.86 974.38,-305.86 974.38,-305.86" style=""/>
<text text-anchor="middle" x="830.31" y="-441.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses for Write()</text>
</g>
<!-- Address -->
<g id="node13" class="node" pointer-events="visible" data-name="Address">
<polygon fill="lightblue" stroke="black" points="428.74,-263.1 428.74,-312.7 669.26,-312.7 669.26,-263.1 428.74,-263.1" style=""/>
<text text-anchor="middle" x="549" y="-296.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">Address</text>
<polyline fill="none" stroke="black" points="428.74,-287.9 669.26,-287.9" style=""/>
<text text-anchor="start" x="436.74" y="-271.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ Address(String, String, String, String)</text>
</g>
<!-- Reservation&#45;&gt;Address -->
<g id="edge11" class="edge" data-name="Reservation-&gt;Address">
<path fill="none" stroke="black" d="M562.81,-594.02C562.81,-594.02 562.81,-324.57 562.81,-324.57" style=""/>
<polygon fill="none" stroke="black" points="562.81,-324.57 558.81,-318.57 562.81,-312.57 566.81,-318.57 562.81,-324.57" style=""/>
<text text-anchor="middle" x="595.66" y="-441.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">physical/mailing</text>
</g>
<!-- ReservationStatusEnum -->
<g id="node15" class="node" pointer-events="visible" data-name="ReservationStatusEnum">
<polygon fill="lightgray" stroke="black" points="254.73,-424.9 254.73,-466.5 405.27,-466.5 405.27,-424.9 254.73,-424.9" style=""/>
<text text-anchor="middle" x="330" y="-449.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">enum</text>
<text text-anchor="middle" x="330" y="-433.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">ReservationStatusEnum</text>
</g>
<!-- Reservation&#45;&gt;ReservationStatusEnum -->
<g id="edge25" class="edge" data-name="Reservation-&gt;ReservationStatusEnum">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M535.19,-594.19C535.19,-549.19 535.19,-434 535.19,-434 535.19,-434 415.24,-434 415.24,-434" style=""/>
<polygon fill="black" stroke="black" points="405.24,-434 415.24,-429.5 410.24,-434 415.24,-434 415.24,-434 415.24,-434 410.24,-434 415.24,-438.5 405.24,-434 405.24,-434" style=""/>
<text text-anchor="middle" x="342.06" y="-514.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
</g>
<!-- AccomodationManager -->
<g id="node3" class="node" pointer-events="visible" data-name="AccomodationManager">
<polygon fill="lightyellow" stroke="black" points="1010.14,-757.3 1010.14,-941.3 1345.86,-941.3 1345.86,-757.3 1010.14,-757.3" style=""/>
<text text-anchor="middle" x="1178" y="-924.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">AccomodationManager</text>
<polyline fill="none" stroke="black" points="1010.14,-916.5 1345.86,-916.5" style=""/>
<text text-anchor="start" x="1018.14" y="-899.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ AccomodationManager(String)</text>
<text text-anchor="start" x="1018.14" y="-883.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ loadAll(): void</text>
<text text-anchor="start" x="1018.14" y="-866.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ retrieveAccount(String): Account</text>
<text text-anchor="start" x="1018.14" y="-849.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ retrieveLoadedAccounts(): AccountList</text>
<text text-anchor="start" x="1018.14" y="-832.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ newAccount(String, Address, EmailAddress): Account</text>
<text text-anchor="start" x="1018.14" y="-815.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ AddAccount(Account): void</text>
<text text-anchor="start" x="1018.14" y="-799.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ UpdateAccount(Account): void</text>
<text text-anchor="start" x="1018.14" y="-782.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ addReservation(Account, Reservation): boolean</text>
<text text-anchor="start" x="1018.14" y="-765.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ showReservationList(): void</text>
</g>
<!-- AccomodationManager&#45;&gt;DataRepository -->
<g id="edge21" class="edge" data-name="AccomodationManager-&gt;DataRepository">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1018.74,-757.54C1018.74,-757.54 1018.74,-315.5 1018.74,-315.5" style=""/>
<polygon fill="black" stroke="black" points="1018.74,-305.5 1023.24,-315.5 1018.74,-310.5 1018.74,-315.5 1018.74,-315.5 1018.74,-315.5 1018.74,-310.5 1014.24,-315.5 1018.74,-305.5 1018.74,-305.5" style=""/>
<text text-anchor="middle" x="996.06" y="-514.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
</g>
<!-- Account -->
<g id="node5" class="node" pointer-events="visible" data-name="Account">
<polygon fill="lightyellow" stroke="black" points="1332.29,-427.7 1332.29,-463.7 1395.71,-463.7 1395.71,-427.7 1332.29,-427.7" style=""/>
<text text-anchor="middle" x="1364" y="-441.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">Account</text>
</g>
<!-- AccomodationManager&#45;&gt;Account -->
<g id="edge22" class="edge" data-name="AccomodationManager-&gt;Account">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1243.44,-757.58C1243.44,-641.37 1243.44,-456 1243.44,-456 1243.44,-456 1322.32,-456 1322.32,-456" style=""/>
<polygon fill="black" stroke="black" points="1332.32,-456 1322.32,-460.5 1327.32,-456 1322.32,-456 1322.32,-456 1322.32,-456 1327.32,-456 1322.32,-451.5 1332.32,-456 1332.32,-456" style=""/>
<text text-anchor="middle" x="1189.49" y="-607.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">manages</text>
</g>
<!-- AccountList -->
<g id="node6" class="node" pointer-events="visible" data-name="AccountList">
<polygon fill="lightyellow" stroke="black" points="1285.97,-570.3 1285.97,-653.5 1442.03,-653.5 1442.03,-570.3 1285.97,-570.3" style=""/>
<text text-anchor="middle" x="1364" y="-636.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">AccountList</text>
<polyline fill="none" stroke="black" points="1285.97,-628.7 1442.03,-628.7" style=""/>
<text text-anchor="start" x="1293.97" y="-612.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ add(Account): boolean</text>
<text text-anchor="start" x="1293.97" y="-595.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ find(String): Account</text>
<text text-anchor="start" x="1293.97" y="-578.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ save(Account): void</text>
</g>
<!-- AccomodationManager&#45;&gt;AccountList -->
<g id="edge5" class="edge" data-name="AccomodationManager-&gt;AccountList">
<path fill="none" stroke="black" d="M1315.91,-757.51C1315.91,-757.51 1315.91,-665.24 1315.91,-665.24" style=""/>
<polygon fill="black" stroke="black" points="1315.91,-665.24 1311.91,-659.24 1315.91,-653.24 1319.91,-659.24 1315.91,-665.24" style=""/>
<text text-anchor="middle" x="1353.19" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">has a</text>
</g>
<!-- Account&#45;&gt;DataRepository -->
<g id="edge23" class="edge" data-name="Account-&gt;DataRepository">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1332.33,-442C1248.52,-442 1027.34,-442 1027.34,-442 1027.34,-442 1027.34,-315.88 1027.34,-315.88" style=""/>
<polygon fill="black" stroke="black" points="1027.34,-305.88 1031.84,-315.88 1027.34,-310.88 1027.34,-315.88 1027.34,-315.88 1027.34,-315.88 1027.34,-310.88 1022.84,-315.88 1027.34,-305.88 1027.34,-305.88" style=""/>
<text text-anchor="middle" x="1262.31" y="-368.8" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses for Write()</text>
</g>
<!-- AccountReservationList -->
<g id="node7" class="node" pointer-events="visible" data-name="AccountReservationList">
<polygon fill="lightyellow" stroke="black" points="1200.91,-254.7 1200.91,-321.1 1381.09,-321.1 1381.09,-254.7 1200.91,-254.7" style=""/>
<text text-anchor="middle" x="1291" y="-304.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">AccountReservationList</text>
<polyline fill="none" stroke="black" points="1200.91,-296.3 1381.09,-296.3" style=""/>
<text text-anchor="start" x="1208.91" y="-279.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ add(IReservation): boolean</text>
<text text-anchor="start" x="1208.91" y="-262.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ find(String): Reservation</text>
</g>
<!-- Account&#45;&gt;AccountReservationList -->
<g id="edge7" class="edge" data-name="Account-&gt;AccountReservationList">
<path fill="none" stroke="black" d="M1356.69,-427.91C1356.69,-427.91 1356.69,-333.01 1356.69,-333.01" style=""/>
<polygon fill="black" stroke="black" points="1356.69,-333.01 1352.69,-327.01 1356.69,-321.01 1360.69,-327.01 1356.69,-333.01" style=""/>
<text text-anchor="middle" x="1398.19" y="-368.8" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">has a</text>
</g>
<!-- Account&#45;&gt;Address -->
<g id="edge9" class="edge" data-name="Account-&gt;Address">
<path fill="none" stroke="black" d="M1332.45,-449C1191.93,-449 629.85,-449 629.85,-449 629.85,-449 629.85,-324.37 629.85,-324.37" style=""/>
<polygon fill="none" stroke="black" points="629.85,-324.37 625.85,-318.37 629.85,-312.37 633.85,-318.37 629.85,-324.37" style=""/>
<text text-anchor="middle" x="1119.39" y="-368.8" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">mailing</text>
</g>
<!-- EmailAddress -->
<g id="node14" class="node" pointer-events="visible" data-name="EmailAddress">
<polygon fill="lightblue" stroke="black" points="1698.87,-263.1 1698.87,-312.7 1849.13,-312.7 1849.13,-263.1 1698.87,-263.1" style=""/>
<text text-anchor="middle" x="1774" y="-296.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">EmailAddress</text>
<polyline fill="none" stroke="black" points="1698.87,-287.9 1849.13,-287.9" style=""/>
<text text-anchor="start" x="1706.87" y="-271.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ EmailAddress(String)</text>
</g>
<!-- Account&#45;&gt;EmailAddress -->
<g id="edge10" class="edge" data-name="Account-&gt;EmailAddress">
<path fill="none" stroke="black" d="M1388.4,-427.8C1388.4,-386.3 1388.4,-287 1388.4,-287 1388.4,-287 1687.2,-287 1687.2,-287" style=""/>
<polygon fill="none" stroke="black" points="1687.2,-287 1693.2,-283 1699.2,-287 1693.2,-291 1687.2,-287" style=""/>
</g>
<!-- AccountList&#45;&gt;Account -->
<g id="edge6" class="edge" data-name="AccountList-&gt;Account">
<path fill="none" stroke="black" d="M1364,-570.39C1364,-570.39 1364,-475.41 1364,-475.41" style=""/>
<polygon fill="none" stroke="black" points="1364,-475.41 1360,-469.41 1364,-463.41 1368,-469.41 1364,-475.41" style=""/>
<text text-anchor="middle" x="1374.5" y="-514.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">0..*</text>
</g>
<!-- AccountReservationList&#45;&gt;IReservation -->
<g id="edge8" class="edge" data-name="AccountReservationList-&gt;IReservation">
<path fill="none" stroke="black" d="M1201,-258C953.67,-258 281.88,-258 281.88,-258 281.88,-258 281.88,-162.64 281.88,-162.64" style=""/>
<polygon fill="black" stroke="black" points="281.88,-162.64 277.88,-156.64 281.88,-150.64 285.88,-156.64 281.88,-162.64" style=""/>
<text text-anchor="middle" x="785.5" y="-198.6" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">0..*</text>
</g>
<!-- HotelReservation -->
<g id="node8" class="node" pointer-events="visible" data-name="HotelReservation">
<polygon fill="lightyellow" stroke="black" points="245.71,-816.1 245.71,-882.5 426.29,-882.5 426.29,-816.1 245.71,-816.1" style=""/>
<text text-anchor="middle" x="336" y="-865.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">HotelReservation</text>
<polyline fill="none" stroke="black" points="245.71,-857.7 426.29,-857.7" style=""/>
<text text-anchor="start" x="253.71" y="-841.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ HotelReservation(Address)</text>
<text text-anchor="start" x="253.71" y="-824.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ calculatePrice(): float</text>
</g>
<!-- HotelReservation&#45;&gt;Reservation -->
<g id="edge2" class="edge" data-name="HotelReservation-&gt;Reservation">
<path fill="none" stroke="black" d="M415.78,-816.16C415.78,-752.2 415.78,-618 415.78,-618 415.78,-618 496.06,-618 496.06,-618" style=""/>
<polygon fill="none" stroke="black" points="496.06,-621.5 506.06,-618 496.06,-614.5 496.06,-621.5" style=""/>
<text text-anchor="middle" x="413.38" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">extends</text>
</g>
<!-- CabinReservation -->
<g id="node9" class="node" pointer-events="visible" data-name="CabinReservation">
<polygon fill="lightyellow" stroke="black" points="498.54,-816.1 498.54,-882.5 681.46,-882.5 681.46,-816.1 498.54,-816.1" style=""/>
<text text-anchor="middle" x="590" y="-865.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">CabinReservation</text>
<polyline fill="none" stroke="black" points="498.54,-857.7 681.46,-857.7" style=""/>
<text text-anchor="start" x="506.54" y="-841.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ CabinReservation(Address)</text>
<text text-anchor="start" x="506.54" y="-824.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ calculatePrice(): float</text>
</g>
<!-- CabinReservation&#45;&gt;Reservation -->
<g id="edge3" class="edge" data-name="CabinReservation-&gt;Reservation">
<path fill="none" stroke="black" d="M549,-816.29C549,-816.29 549,-641.16 549,-641.16" style=""/>
<polygon fill="none" stroke="black" points="552.5,-641.16 549,-631.16 545.5,-641.16 552.5,-641.16" style=""/>
<text text-anchor="middle" x="590.38" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">extends</text>
</g>
<!-- HouseReservation -->
<g id="node10" class="node" pointer-events="visible" data-name="HouseReservation">
<polygon fill="lightyellow" stroke="black" points="753.38,-816.1 753.38,-882.5 938.62,-882.5 938.62,-816.1 753.38,-816.1" style=""/>
<text text-anchor="middle" x="846" y="-865.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">HouseReservation</text>
<polyline fill="none" stroke="black" points="753.38,-857.7 938.62,-857.7" style=""/>
<text text-anchor="start" x="761.38" y="-841.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ HouseReservation(Address)</text>
<text text-anchor="start" x="761.38" y="-824.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ calculatePrice(): float</text>
</g>
<!-- HouseReservation&#45;&gt;Reservation -->
<g id="edge4" class="edge" data-name="HouseReservation-&gt;Reservation">
<path fill="none" stroke="black" d="M842.72,-816.16C842.72,-752.2 842.72,-618 842.72,-618 842.72,-618 601.66,-618 601.66,-618" style=""/>
<polygon fill="none" stroke="black" points="601.66,-614.5 591.66,-618 601.66,-621.5 601.66,-614.5" style=""/>
<text text-anchor="middle" x="779.38" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">extends</text>
</g>
<!-- TestReservations -->
<g id="node11" class="node" pointer-events="visible" data-name="TestReservations">
<polygon fill="lightyellow" stroke="black" points="1121.79,-1045.1 1121.79,-1081.1 1234.21,-1081.1 1234.21,-1045.1 1121.79,-1045.1" style=""/>
<text text-anchor="middle" x="1178" y="-1058.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">TestReservations</text>
</g>
<!-- TestReservations&#45;&gt;AccomodationManager -->
<g id="edge12" class="edge" data-name="TestReservations-&gt;AccomodationManager">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1178,-1045.24C1178,-1045.24 1178,-951.14 1178,-951.14" style=""/>
<polygon fill="black" stroke="black" points="1178,-941.14 1182.5,-951.14 1178,-946.14 1178,-951.14 1178,-951.14 1178,-951.14 1178,-946.14 1173.5,-951.14 1178,-941.14 1178,-941.14" style=""/>
<text text-anchor="middle" x="1190.06" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
</g>
<!-- TestReservations&#45;&gt;Account -->
<g id="edge17" class="edge" data-name="TestReservations-&gt;Account">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1233.9,-1052C1326.87,-1052 1503.18,-1052 1503.18,-1052 1503.18,-1052 1503.18,-445 1503.18,-445 1503.18,-445 1405.58,-445 1405.58,-445" style=""/>
<polygon fill="black" stroke="black" points="1395.58,-445 1405.58,-440.5 1400.58,-445 1405.58,-445 1405.58,-445 1405.58,-445 1400.58,-445 1405.58,-449.5 1395.58,-445 1395.58,-445" style=""/>
<text text-anchor="middle" x="1491.06" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
</g>
<!-- TestReservations&#45;&gt;HotelReservation -->
<g id="edge14" class="edge" data-name="TestReservations-&gt;HotelReservation">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1122.1,-1074C934.04,-1074 336,-1074 336,-1074 336,-1074 336,-892.46 336,-892.46" style=""/>
<polygon fill="black" stroke="black" points="336,-882.46 340.5,-892.46 336,-887.46 336,-892.46 336,-892.46 336,-892.46 336,-887.46 331.5,-892.46 336,-882.46 336,-882.46" style=""/>
<text text-anchor="middle" x="417.43" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
</g>
<!-- TestReservations&#45;&gt;CabinReservation -->
<g id="edge15" class="edge" data-name="TestReservations-&gt;CabinReservation">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1121.89,-1059C974.91,-1059 590,-1059 590,-1059 590,-1059 590,-892.07 590,-892.07" style=""/>
<polygon fill="black" stroke="black" points="590,-882.07 594.5,-892.07 590,-887.07 590,-892.07 590,-892.07 590,-892.07 590,-887.07 585.5,-892.07 590,-882.07 590,-882.07" style=""/>
<text text-anchor="middle" x="780.43" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
</g>
<!-- TestReservations&#45;&gt;HouseReservation -->
<g id="edge16" class="edge" data-name="TestReservations-&gt;HouseReservation">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1122.06,-1052C1027.44,-1052 846,-1052 846,-1052 846,-1052 846,-892.32 846,-892.32" style=""/>
<polygon fill="black" stroke="black" points="846,-882.32 850.5,-892.32 846,-887.32 846,-892.32 846,-892.32 846,-892.32 846,-887.32 841.5,-892.32 846,-882.32 846,-882.32" style=""/>
<text text-anchor="middle" x="1019.43" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
</g>
<!-- TestReservations.getRepositoryConfig -->
<g id="node12" class="node" pointer-events="visible" data-name="TestReservations.getRepositoryConfig">
<polygon fill="lightyellow" stroke="black" points="1564.32,-831.3 1564.32,-867.3 1797.68,-867.3 1797.68,-831.3 1564.32,-831.3" style=""/>
<text text-anchor="middle" x="1681" y="-845.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">TestReservations.getRepositoryConfig</text>
</g>
<!-- TestReservations&#45;&gt;TestReservations.getRepositoryConfig -->
<g id="edge13" class="edge" data-name="TestReservations-&gt;TestReservations.getRepositoryConfig">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1233.75,-1059C1364.71,-1059 1681,-1059 1681,-1059 1681,-1059 1681,-877.18 1681,-877.18" style=""/>
<polygon fill="black" stroke="black" points="1681,-867.18 1685.5,-877.18 1681,-872.18 1681,-877.18 1681,-877.18 1681,-877.18 1681,-872.18 1676.5,-877.18 1681,-867.18 1681,-867.18" style=""/>
<text text-anchor="middle" x="1693.06" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
</g>
<!-- TestReservations&#45;&gt;Address -->
<g id="edge18" class="edge" data-name="TestReservations-&gt;Address">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1121.95,-1066C953.54,-1066 463.64,-1066 463.64,-1066 463.64,-1066 463.64,-322.47 463.64,-322.47" style=""/>
<polygon fill="black" stroke="black" points="463.64,-312.47 468.14,-322.47 463.64,-317.47 463.64,-322.47 463.64,-322.47 463.64,-322.47 463.64,-317.47 459.14,-322.47 463.64,-312.47 463.64,-312.47" style=""/>
<text text-anchor="middle" x="19.43" y="-607.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
</g>
<!-- TestReservations&#45;&gt;EmailAddress -->
<g id="edge19" class="edge" data-name="TestReservations-&gt;EmailAddress">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1234.15,-1066C1391.17,-1066 1823.41,-1066 1823.41,-1066 1823.41,-1066 1823.41,-322.47 1823.41,-322.47" style=""/>
<polygon fill="black" stroke="black" points="1823.41,-312.47 1827.91,-322.47 1823.41,-317.47 1823.41,-322.47 1823.41,-322.47 1823.41,-322.47 1823.41,-317.47 1818.91,-322.47 1823.41,-312.47 1823.41,-312.47" style=""/>
<text text-anchor="middle" x="1926.43" y="-607.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
</g>
<!-- DuplicateObjectException -->
<g id="node16" class="node" pointer-events="visible" data-name="DuplicateObjectException">
<polygon fill="lightpink" stroke="black" points="2015.75,-828.5 2015.75,-870.1 2180.25,-870.1 2180.25,-828.5 2015.75,-828.5" style=""/>
<text text-anchor="middle" x="2098" y="-853.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">exception</text>
<text text-anchor="middle" x="2098" y="-836.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">DuplicateObjectException</text>
</g>
<!-- TestReservations&#45;&gt;DuplicateObjectException -->
<g id="edge20" class="edge" data-name="TestReservations-&gt;DuplicateObjectException">
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1234.17,-1074C1433.91,-1074 2098,-1074 2098,-1074 2098,-1074 2098,-880.04 2098,-880.04" style=""/>
<polygon fill="black" stroke="black" points="2098,-870.04 2102.5,-880.04 2098,-875.04 2098,-880.04 2098,-880.04 2098,-880.04 2098,-875.04 2093.5,-880.04 2098,-870.04 2098,-870.04" style=""/>
<text text-anchor="middle" x="2118.6" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">catches</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -3,10 +3,10 @@ digraph "Reservation System - Account Load" {
graph [
rankdir="TB",
splines=ortho,
nodesep=1.0,
nodesep=0.0,
ranksep=1.0,
fontname="Arial",
fontsize=12,
fontname="Times New Roman",
fontsize=14,
label="Reservation System - Account Loading"
];
@@ -15,7 +15,7 @@ digraph "Reservation System - Account Load" {
shape=record,
style=filled,
fillcolor=lightyellow,
fontname="Arial",
fontname="Times New Roman",
fontsize=10
];
edge [
@@ -45,21 +45,8 @@ digraph "Reservation System - Account Load" {
DuplicateObjectException [label="<<exception>>\nDuplicateObjectException"];
IllegalArgumentException [label="<<exception>>\nIllegalArgumentException"];
}
subgraph cluster_test {
label="lodge (Test)";
style=filled;
color=honeydew;
TestAccountLoad [label="{TestAccountLoad|+ main(args: String[])\l- Test_AddAccount(mgr: AccomodationManager, acct: Account)\l}"];
TestAccountLoad_getRepositoryConfig [label="{getRepositoryConfig|+ getPath(): String\l}"];
}
// Class Relationships
TestAccountLoad -> AccomodationManager [label="uses"];
TestAccountLoad -> Account [label="uses"];
TestAccountLoad -> Address [label="creates"];
TestAccountLoad -> EmailAddress [label="creates"];
TestAccountLoad -> TestAccountLoad_getRepositoryConfig [style=dashed, arrowhead=open, label="has inner"];
AccomodationManager -> AccountList [arrowhead=diamond,label="manages 1"];
AccomodationManager -> DataRepository [label="uses"];

View File

@@ -1,260 +1,197 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.4 (0)
-->
<!-- Title: Reservation System &#45; Account Load Pages: 1 -->
<svg width="1610pt" height="757pt"
viewBox="0.00 0.00 1610.00 757.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 753)">
<title>Reservation System &#45; Account Load</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-753 1606,-753 1606,4 -4,4"/>
<text text-anchor="middle" x="801" y="-7.4" font-family="Arial" font-size="12.00">Reservation System &#45; Account Loading</text>
<g id="clust1" class="cluster">
<title>cluster_reservationsystem</title>
<polygon fill="lightgrey" stroke="lightgrey" points="326,-304 326,-608 688,-608 688,-304 326,-304"/>
<text text-anchor="middle" x="507" y="-594.4" font-family="Arial" font-size="12.00">lodge.reservationsystem</text>
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="993pt" height="654pt" viewBox="0.00 0.00 992.53 654">
<g id="graph0" class="graph" transform="translate(4,650) scale(1)" data-name="Reservation System - Account Load">
<polygon fill="white" stroke="none" points="-4,4 -4,-650 988.53,-650 988.53,4 -4,4"/>
<text text-anchor="middle" x="492.27" y="-8.2" font-family="Times New Roman" font-size="14">Reservation System - Account Loading</text>
<g id="clust1" class="cluster" data-name="cluster_reservationsystem">
<polygon fill="lightgrey" stroke="lightgrey" points="8,-316.4 8,-638 348,-638 348,-316.4 8,-316.4"/>
<text text-anchor="middle" x="178" y="-621.4" font-family="Times New Roman" font-size="14">lodge.reservationsystem</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_datamodel</title>
<polygon fill="lightblue" stroke="lightblue" points="696,-29 696,-428 1418,-428 1418,-29 696,-29"/>
<text text-anchor="middle" x="1057" y="-414.4" font-family="Arial" font-size="12.00">lodge.datamodel</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_test</title>
<polygon fill="honeydew" stroke="honeydew" points="8,-510 8,-741 318,-741 318,-510 8,-510"/>
<text text-anchor="middle" x="163" y="-727.4" font-family="Arial" font-size="12.00">lodge (Test)</text>
<g id="clust2" class="cluster" data-name="cluster_datamodel">
<polygon fill="lightblue" stroke="lightblue" points="356,-32.8 356,-450.2 901,-450.2 901,-32.8 356,-32.8"/>
<text text-anchor="middle" x="628.5" y="-433.6" font-family="Times New Roman" font-size="14">lodge.datamodel</text>
</g>
<!-- AccomodationManager -->
<g id="node1" class="node">
<title>AccomodationManager</title>
<polygon fill="lightyellow" stroke="black" points="333.5,-496.5 333.5,-578.5 680.5,-578.5 680.5,-496.5 333.5,-496.5"/>
<text text-anchor="middle" x="507" y="-566.5" font-family="Arial" font-size="10.00">AccomodationManager</text>
<polyline fill="none" stroke="black" points="333.5,-559.5 680.5,-559.5 "/>
<text text-anchor="start" x="341.5" y="-547.5" font-family="Arial" font-size="10.00">+ AccomodationManager(home: String)</text>
<text text-anchor="start" x="341.5" y="-536.5" font-family="Arial" font-size="10.00">+ newAccount(phone: String, addr: Address, email: EmailAddress): Account</text>
<text text-anchor="start" x="341.5" y="-525.5" font-family="Arial" font-size="10.00">+ AddAccount(acct: Account)</text>
<text text-anchor="start" x="341.5" y="-514.5" font-family="Arial" font-size="10.00">+ UpdateAccount(acct: Account)</text>
<text text-anchor="start" x="341.5" y="-503.5" font-family="Arial" font-size="10.00">+ showAccountList()</text>
<g id="node1" class="node" pointer-events="visible" data-name="AccomodationManager">
<polygon fill="lightyellow" stroke="black" points="15.69,-516.7 15.69,-604.7 340.31,-604.7 340.31,-516.7 15.69,-516.7"/>
<text text-anchor="middle" x="178" y="-591.7" font-family="Times New Roman" font-size="10.00">AccomodationManager</text>
<polyline fill="none" stroke="black" points="15.69,-584.7 340.31,-584.7"/>
<text text-anchor="start" x="23.69" y="-571.7" font-family="Times New Roman" font-size="10.00">+ AccomodationManager(home: String)</text>
<text text-anchor="start" x="23.69" y="-559.7" font-family="Times New Roman" font-size="10.00">+ newAccount(phone: String, addr: Address, email: EmailAddress): Account</text>
<text text-anchor="start" x="23.69" y="-547.7" font-family="Times New Roman" font-size="10.00">+ AddAccount(acct: Account)</text>
<text text-anchor="start" x="23.69" y="-535.7" font-family="Times New Roman" font-size="10.00">+ UpdateAccount(acct: Account)</text>
<text text-anchor="start" x="23.69" y="-523.7" font-family="Times New Roman" font-size="10.00">+ showAccountList()</text>
</g>
<!-- DataRepository -->
<g id="node2" class="node">
<title>DataRepository</title>
<polygon fill="lightyellow" stroke="black" points="442.5,-312.5 442.5,-413.5 611.5,-413.5 611.5,-312.5 442.5,-312.5"/>
<text text-anchor="middle" x="527" y="-401.5" font-family="Arial" font-size="10.00">DataRepository (Singleton)</text>
<polyline fill="none" stroke="black" points="442.5,-394.5 611.5,-394.5 "/>
<text text-anchor="start" x="450.5" y="-382.5" font-family="Arial" font-size="10.00">&#45; directoryPath: String</text>
<text text-anchor="start" x="450.5" y="-371.5" font-family="Arial" font-size="10.00">&#45; instance: DataRepository</text>
<polyline fill="none" stroke="black" points="442.5,-364.5 611.5,-364.5 "/>
<text text-anchor="start" x="450.5" y="-352.5" font-family="Arial" font-size="10.00">+ getInstance(): DataRepository</text>
<text text-anchor="start" x="450.5" y="-341.5" font-family="Arial" font-size="10.00">+ setDataStoreRoot(path: String)</text>
<text text-anchor="start" x="450.5" y="-330.5" font-family="Arial" font-size="10.00">+ getPath(): String</text>
<text text-anchor="start" x="450.5" y="-319.5" font-family="Arial" font-size="10.00">+ LoadAccount(file: Path): Account</text>
<g id="node2" class="node" pointer-events="visible" data-name="DataRepository">
<polygon fill="lightyellow" stroke="black" points="179.62,-324.9 179.62,-432.9 340.38,-432.9 340.38,-324.9 179.62,-324.9"/>
<text text-anchor="middle" x="260" y="-419.9" font-family="Times New Roman" font-size="10.00">DataRepository (Singleton)</text>
<polyline fill="none" stroke="black" points="179.62,-412.9 340.38,-412.9"/>
<text text-anchor="start" x="187.62" y="-399.9" font-family="Times New Roman" font-size="10.00">- directoryPath: String</text>
<text text-anchor="start" x="187.62" y="-387.9" font-family="Times New Roman" font-size="10.00">- instance: DataRepository</text>
<polyline fill="none" stroke="black" points="179.62,-380.9 340.38,-380.9"/>
<text text-anchor="start" x="187.62" y="-367.9" font-family="Times New Roman" font-size="10.00">+ getInstance(): DataRepository</text>
<text text-anchor="start" x="187.62" y="-355.9" font-family="Times New Roman" font-size="10.00">+ setDataStoreRoot(path: String)</text>
<text text-anchor="start" x="187.62" y="-343.9" font-family="Times New Roman" font-size="10.00">+ getPath(): String</text>
<text text-anchor="start" x="187.62" y="-331.9" font-family="Times New Roman" font-size="10.00">+ LoadAccount(file: Path): Account</text>
</g>
<!-- AccomodationManager&#45;&gt;DataRepository -->
<g id="edge7" class="edge">
<title>AccomodationManager&#45;&gt;DataRepository</title>
<path fill="none" stroke="black" d="M527,-496.15C527,-496.15 527,-423.72 527,-423.72"/>
<polygon fill="black" stroke="black" points="530.5,-423.72 527,-413.72 523.5,-423.72 530.5,-423.72"/>
<text text-anchor="middle" x="527" y="-452.8" font-family="Arial" font-size="9.00">uses</text>
<g id="edge2" class="edge" data-name="AccomodationManager-&gt;DataRepository">
<path fill="none" stroke="black" d="M259.97,-517.15C259.97,-517.15 259.97,-444.33 259.97,-444.33"/>
<polygon fill="black" stroke="black" points="263.47,-444.33 259.97,-434.33 256.47,-444.33 263.47,-444.33"/>
<text text-anchor="middle" x="228.51" y="-472.1" font-family="Arial" font-size="9.00">uses</text>
</g>
<!-- Account -->
<g id="node3" class="node">
<title>Account</title>
<polygon fill="lightyellow" stroke="black" points="704,-158.5 704,-229.5 1010,-229.5 1010,-158.5 704,-158.5"/>
<text text-anchor="middle" x="857" y="-217.5" font-family="Arial" font-size="10.00">Account</text>
<polyline fill="none" stroke="black" points="704,-210.5 1010,-210.5 "/>
<text text-anchor="start" x="712" y="-198.5" font-family="Arial" font-size="10.00">+ Account()</text>
<text text-anchor="start" x="712" y="-187.5" font-family="Arial" font-size="10.00">+ Account(phone: String, mailAddr: Address, email: EmailAddress)</text>
<text text-anchor="start" x="712" y="-176.5" font-family="Arial" font-size="10.00">+ Write(acct: Account)</text>
<text text-anchor="start" x="712" y="-165.5" font-family="Arial" font-size="10.00">+ checkValid()</text>
<g id="node3" class="node" pointer-events="visible" data-name="Account">
<polygon fill="lightyellow" stroke="black" points="364.32,-165.1 364.32,-241.1 653.68,-241.1 653.68,-165.1 364.32,-165.1"/>
<text text-anchor="middle" x="509" y="-228.1" font-family="Times New Roman" font-size="10.00">Account</text>
<polyline fill="none" stroke="black" points="364.32,-221.1 653.68,-221.1"/>
<text text-anchor="start" x="372.32" y="-208.1" font-family="Times New Roman" font-size="10.00">+ Account()</text>
<text text-anchor="start" x="372.32" y="-196.1" font-family="Times New Roman" font-size="10.00">+ Account(phone: String, mailAddr: Address, email: EmailAddress)</text>
<text text-anchor="start" x="372.32" y="-184.1" font-family="Times New Roman" font-size="10.00">+ Write(acct: Account)</text>
<text text-anchor="start" x="372.32" y="-172.1" font-family="Times New Roman" font-size="10.00">+ checkValid()</text>
</g>
<!-- AccomodationManager&#45;&gt;Account -->
<g id="edge8" class="edge">
<title>AccomodationManager&#45;&gt;Account</title>
<path fill="none" stroke="black" d="M634.5,-496.39C634.5,-410.09 634.5,-218 634.5,-218 634.5,-218 693.99,-218 693.99,-218"/>
<polygon fill="black" stroke="black" points="693.99,-221.5 703.99,-218 693.99,-214.5 693.99,-221.5"/>
<text text-anchor="middle" x="1073" y="-360.8" font-family="Arial" font-size="9.00">creates/updates</text>
<g id="edge3" class="edge" data-name="AccomodationManager-&gt;Account">
<path fill="none" stroke="black" d="M97.65,-516.93C97.65,-419.81 97.65,-194.8 97.65,-194.8 97.65,-194.8 353.04,-194.8 353.04,-194.8"/>
<polygon fill="black" stroke="black" points="353.04,-198.3 363.04,-194.8 353.04,-191.3 353.04,-198.3"/>
<text text-anchor="middle" x="580.02" y="-376.2" font-family="Arial" font-size="9.00">creates/updates</text>
</g>
<!-- AccountList -->
<g id="node4" class="node">
<title>AccountList</title>
<polygon fill="lightyellow" stroke="black" points="704,-327.5 704,-398.5 896,-398.5 896,-327.5 704,-327.5"/>
<text text-anchor="middle" x="800" y="-386.5" font-family="Arial" font-size="10.00">AccountList</text>
<polyline fill="none" stroke="black" points="704,-379.5 896,-379.5 "/>
<text text-anchor="start" x="712" y="-367.5" font-family="Arial" font-size="10.00">+ add(acct: Account)</text>
<text text-anchor="start" x="712" y="-356.5" font-family="Arial" font-size="10.00">+ save(acct: Account)</text>
<text text-anchor="start" x="712" y="-345.5" font-family="Arial" font-size="10.00">+ find(account_number: String): Account</text>
<text text-anchor="start" x="712" y="-334.5" font-family="Arial" font-size="10.00">+ showAccountList()</text>
<g id="node4" class="node" pointer-events="visible" data-name="AccountList">
<polygon fill="lightyellow" stroke="black" points="363.78,-340.9 363.78,-416.9 546.22,-416.9 546.22,-340.9 363.78,-340.9"/>
<text text-anchor="middle" x="455" y="-403.9" font-family="Times New Roman" font-size="10.00">AccountList</text>
<polyline fill="none" stroke="black" points="363.78,-396.9 546.22,-396.9"/>
<text text-anchor="start" x="371.78" y="-383.9" font-family="Times New Roman" font-size="10.00">+ add(acct: Account)</text>
<text text-anchor="start" x="371.78" y="-371.9" font-family="Times New Roman" font-size="10.00">+ save(acct: Account)</text>
<text text-anchor="start" x="371.78" y="-359.9" font-family="Times New Roman" font-size="10.00">+ find(account_number: String): Account</text>
<text text-anchor="start" x="371.78" y="-347.9" font-family="Times New Roman" font-size="10.00">+ showAccountList()</text>
</g>
<!-- AccomodationManager&#45;&gt;AccountList -->
<g id="edge6" class="edge">
<title>AccomodationManager&#45;&gt;AccountList</title>
<path fill="none" stroke="black" d="M657.5,-496.15C657.5,-444.54 657.5,-363 657.5,-363 657.5,-363 691.77,-363 691.77,-363"/>
<polygon fill="black" stroke="black" points="691.77,-363 697.77,-359 703.77,-363 697.77,-367 691.77,-363"/>
<text text-anchor="middle" x="745" y="-452.8" font-family="Arial" font-size="9.00">manages 1</text>
<g id="edge1" class="edge" data-name="AccomodationManager-&gt;AccountList">
<path fill="none" stroke="black" d="M339.93,-545.8C400.55,-545.8 455,-545.8 455,-545.8 455,-545.8 455,-428.77 455,-428.77"/>
<polygon fill="black" stroke="black" points="455,-428.77 451,-422.77 455,-416.77 459,-422.77 455,-428.77"/>
<text text-anchor="middle" x="392.26" y="-472.1" font-family="Arial" font-size="9.00">manages 1</text>
</g>
<!-- Exception -->
<g id="node11" class="node">
<title>Exception</title>
<polygon fill="lightyellow" stroke="black" points="258,-345 258,-381 318,-381 318,-345 258,-345"/>
<text text-anchor="middle" x="288" y="-360.5" font-family="Arial" font-size="10.00">Exception</text>
<g id="node9" class="node" pointer-events="visible" data-name="Exception">
<polygon fill="lightyellow" stroke="black" points="908.73,-360.9 908.73,-396.9 965.27,-396.9 965.27,-360.9 908.73,-360.9"/>
<text text-anchor="middle" x="937" y="-375.9" font-family="Times New Roman" font-size="10.00">Exception</text>
</g>
<!-- AccomodationManager&#45;&gt;Exception -->
<g id="edge14" class="edge">
<title>AccomodationManager&#45;&gt;Exception</title>
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M333.34,-507C321.27,-507 313.75,-507 313.75,-507 313.75,-507 313.75,-391.24 313.75,-391.24"/>
<polygon fill="red" stroke="red" points="313.75,-381.24 318.25,-391.24 313.75,-386.24 313.75,-391.24 313.75,-391.24 313.75,-391.24 313.75,-386.24 309.25,-391.24 313.75,-381.24 313.75,-381.24"/>
<text text-anchor="middle" x="312.5" y="-452.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
<g id="edge9" class="edge" data-name="AccomodationManager-&gt;Exception">
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M339.89,-574.8C562.8,-574.8 937,-574.8 937,-574.8 937,-574.8 937,-406.63 937,-406.63"/>
<polygon fill="red" stroke="red" points="937,-396.63 941.5,-406.63 937,-401.63 937,-406.63 937,-406.63 937,-406.63 937,-401.63 932.5,-406.63 937,-396.63 937,-396.63"/>
<text text-anchor="middle" x="960.77" y="-472.1" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g>
<!-- DataRepository&#45;&gt;Account -->
<g id="edge13" class="edge">
<title>DataRepository&#45;&gt;Account</title>
<path fill="none" stroke="black" d="M599.5,-312.46C599.5,-266.56 599.5,-206 599.5,-206 599.5,-206 693.86,-206 693.86,-206"/>
<polygon fill="black" stroke="black" points="693.86,-209.5 703.86,-206 693.86,-202.5 693.86,-209.5"/>
<text text-anchor="middle" x="609.5" y="-268.8" font-family="Arial" font-size="9.00">loads</text>
<g id="edge8" class="edge" data-name="DataRepository-&gt;Account">
<path fill="none" stroke="black" d="M332.44,-324.92C332.44,-280.84 332.44,-225.8 332.44,-225.8 332.44,-225.8 352.9,-225.8 352.9,-225.8"/>
<polygon fill="black" stroke="black" points="352.9,-229.3 362.9,-225.8 352.9,-222.3 352.9,-229.3"/>
<text text-anchor="middle" x="323.76" y="-280.3" font-family="Arial" font-size="9.00">loads</text>
</g>
<!-- IOException -->
<g id="node12" class="node">
<title>IOException</title>
<polygon fill="lightyellow" stroke="black" points="504.5,-38.5 504.5,-74.5 575.5,-74.5 575.5,-38.5 504.5,-38.5"/>
<text text-anchor="middle" x="540" y="-54" font-family="Arial" font-size="10.00">IOException</text>
<g id="node10" class="node" pointer-events="visible" data-name="IOException">
<polygon fill="lightyellow" stroke="black" points="249.45,-43.3 249.45,-79.3 316.55,-79.3 316.55,-43.3 249.45,-43.3"/>
<text text-anchor="middle" x="283" y="-58.3" font-family="Times New Roman" font-size="10.00">IOException</text>
</g>
<!-- DataRepository&#45;&gt;IOException -->
<g id="edge18" class="edge">
<title>DataRepository&#45;&gt;IOException</title>
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M528.17,-312.39C528.17,-312.39 528.17,-84.62 528.17,-84.62"/>
<polygon fill="red" stroke="red" points="528.17,-74.62 532.67,-84.62 528.17,-79.62 528.17,-84.62 528.17,-84.62 528.17,-84.62 528.17,-79.62 523.67,-84.62 528.17,-74.62 528.17,-74.62"/>
<text text-anchor="middle" x="508.5" y="-191.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
<g id="edge13" class="edge" data-name="DataRepository-&gt;IOException">
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M271.82,-325.02C271.82,-325.02 271.82,-89.21 271.82,-89.21"/>
<polygon fill="red" stroke="red" points="271.82,-79.21 276.32,-89.21 271.82,-84.21 271.82,-89.21 271.82,-89.21 271.82,-89.21 271.82,-84.21 267.32,-89.21 271.82,-79.21 271.82,-79.21"/>
<text text-anchor="middle" x="303.77" y="-200.4" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g>
<!-- Account&#45;&gt;DataRepository -->
<g id="edge12" class="edge">
<title>Account&#45;&gt;DataRepository</title>
<path fill="none" stroke="black" d="M703.75,-194C643.07,-194 587.5,-194 587.5,-194 587.5,-194 587.5,-302.29 587.5,-302.29"/>
<polygon fill="black" stroke="black" points="584,-302.29 587.5,-312.29 591,-302.29 584,-302.29"/>
<text text-anchor="middle" x="739" y="-268.8" font-family="Arial" font-size="9.00">uses for persistence</text>
<g id="edge7" class="edge" data-name="Account-&gt;DataRepository">
<path fill="none" stroke="black" d="M364.53,-210.8C341.18,-210.8 324.49,-210.8 324.49,-210.8 324.49,-210.8 324.49,-313.74 324.49,-313.74"/>
<polygon fill="black" stroke="black" points="320.99,-313.74 324.49,-323.74 327.99,-313.74 320.99,-313.74"/>
<text text-anchor="middle" x="394.27" y="-280.3" font-family="Arial" font-size="9.00">uses for persistence</text>
</g>
<!-- Address -->
<g id="node5" class="node">
<title>Address</title>
<polygon fill="lightyellow" stroke="black" points="904,-37.5 904,-75.5 1190,-75.5 1190,-37.5 904,-37.5"/>
<text text-anchor="middle" x="1047" y="-63.5" font-family="Arial" font-size="10.00">Address</text>
<polyline fill="none" stroke="black" points="904,-56.5 1190,-56.5 "/>
<text text-anchor="start" x="912" y="-44.5" font-family="Arial" font-size="10.00">+ Address(street: String, city: String, state: String, zip: String)</text>
<g id="node5" class="node" pointer-events="visible" data-name="Address">
<polygon fill="lightyellow" stroke="black" points="628.66,-41.3 628.66,-81.3 893.34,-81.3 893.34,-41.3 628.66,-41.3"/>
<text text-anchor="middle" x="761" y="-68.3" font-family="Times New Roman" font-size="10.00">Address</text>
<polyline fill="none" stroke="black" points="628.66,-61.3 893.34,-61.3"/>
<text text-anchor="start" x="636.66" y="-48.3" font-family="Times New Roman" font-size="10.00">+ Address(street: String, city: String, state: String, zip: String)</text>
</g>
<!-- Account&#45;&gt;Address -->
<g id="edge10" class="edge">
<title>Account&#45;&gt;Address</title>
<path fill="none" stroke="black" d="M957,-158.23C957,-158.23 957,-85.58 957,-85.58"/>
<polygon fill="black" stroke="black" points="960.5,-85.58 957,-75.58 953.5,-85.58 960.5,-85.58"/>
<text text-anchor="middle" x="1019" y="-114.8" font-family="Arial" font-size="9.00">has mailing</text>
<g id="edge5" class="edge" data-name="Account-&gt;Address">
<path fill="none" stroke="black" d="M641.17,-165.1C641.17,-165.1 641.17,-92.57 641.17,-92.57"/>
<polygon fill="black" stroke="black" points="644.67,-92.57 641.17,-82.57 637.67,-92.57 644.67,-92.57"/>
<text text-anchor="middle" x="712.76" y="-120.5" font-family="Arial" font-size="9.00">has mailing</text>
</g>
<!-- EmailAddress -->
<g id="node6" class="node">
<title>EmailAddress</title>
<polygon fill="lightyellow" stroke="black" points="1262.5,-37.5 1262.5,-75.5 1409.5,-75.5 1409.5,-37.5 1262.5,-37.5"/>
<text text-anchor="middle" x="1336" y="-63.5" font-family="Arial" font-size="10.00">EmailAddress</text>
<polyline fill="none" stroke="black" points="1262.5,-56.5 1409.5,-56.5 "/>
<text text-anchor="start" x="1270.5" y="-44.5" font-family="Arial" font-size="10.00">+ EmailAddress(email: String)</text>
<g id="node6" class="node" pointer-events="visible" data-name="EmailAddress">
<polygon fill="lightyellow" stroke="black" points="364.3,-41.3 364.3,-81.3 503.7,-81.3 503.7,-41.3 364.3,-41.3"/>
<text text-anchor="middle" x="434" y="-68.3" font-family="Times New Roman" font-size="10.00">EmailAddress</text>
<polyline fill="none" stroke="black" points="364.3,-61.3 503.7,-61.3"/>
<text text-anchor="start" x="372.3" y="-48.3" font-family="Times New Roman" font-size="10.00">+ EmailAddress(email: String)</text>
</g>
<!-- Account&#45;&gt;EmailAddress -->
<g id="edge11" class="edge">
<title>Account&#45;&gt;EmailAddress</title>
<path fill="none" stroke="black" d="M1010.24,-166C1142.19,-166 1311.5,-166 1311.5,-166 1311.5,-166 1311.5,-85.57 1311.5,-85.57"/>
<polygon fill="black" stroke="black" points="1315,-85.57 1311.5,-75.57 1308,-85.57 1315,-85.57"/>
<text text-anchor="middle" x="1262" y="-114.8" font-family="Arial" font-size="9.00">has</text>
<g id="edge6" class="edge" data-name="Account-&gt;EmailAddress">
<path fill="none" stroke="black" d="M434.01,-165.1C434.01,-165.1 434.01,-92.57 434.01,-92.57"/>
<polygon fill="black" stroke="black" points="437.51,-92.57 434.01,-82.57 430.51,-92.57 437.51,-92.57"/>
<text text-anchor="middle" x="468.26" y="-120.5" font-family="Arial" font-size="9.00">has</text>
</g>
<!-- IllegalArgumentException -->
<g id="node8" class="node">
<title>IllegalArgumentException</title>
<polygon fill="lightyellow" stroke="black" points="704,-38.5 704,-74.5 832,-74.5 832,-38.5 704,-38.5"/>
<text text-anchor="middle" x="768" y="-54" font-family="Arial" font-size="10.00">IllegalArgumentException</text>
<g id="node8" class="node" pointer-events="visible" data-name="IllegalArgumentException">
<polygon fill="lightyellow" stroke="black" points="504.68,-43.3 504.68,-79.3 627.32,-79.3 627.32,-43.3 504.68,-43.3"/>
<text text-anchor="middle" x="566" y="-58.3" font-family="Times New Roman" font-size="10.00">IllegalArgumentException</text>
</g>
<!-- Account&#45;&gt;IllegalArgumentException -->
<g id="edge16" class="edge">
<title>Account&#45;&gt;IllegalArgumentException</title>
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M768,-158.23C768,-158.23 768,-84.82 768,-84.82"/>
<polygon fill="red" stroke="red" points="768,-74.82 772.5,-84.82 768,-79.82 768,-84.82 768,-84.82 768,-84.82 768,-79.82 763.5,-84.82 768,-74.82 768,-74.82"/>
<text text-anchor="middle" x="841.5" y="-114.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
<g id="edge11" class="edge" data-name="Account-&gt;IllegalArgumentException">
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M566,-165.1C566,-165.1 566,-89.13 566,-89.13"/>
<polygon fill="red" stroke="red" points="566,-79.13 570.5,-89.13 566,-84.13 566,-89.13 566,-89.13 566,-89.13 566,-84.13 561.5,-89.13 566,-79.13 566,-79.13"/>
<text text-anchor="middle" x="560.77" y="-120.5" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g>
<!-- Account&#45;&gt;IOException -->
<g id="edge17" class="edge">
<title>Account&#45;&gt;IOException</title>
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M703.97,-170C627.83,-170 551.83,-170 551.83,-170 551.83,-170 551.83,-84.74 551.83,-84.74"/>
<polygon fill="red" stroke="red" points="551.83,-74.74 556.33,-84.74 551.83,-79.74 551.83,-84.74 551.83,-84.74 551.83,-84.74 551.83,-79.74 547.33,-84.74 551.83,-74.74 551.83,-74.74"/>
<text text-anchor="middle" x="668.5" y="-114.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
<g id="edge12" class="edge" data-name="Account-&gt;IOException">
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M364.52,-179.8C325.66,-179.8 294.18,-179.8 294.18,-179.8 294.18,-179.8 294.18,-89.3 294.18,-89.3"/>
<polygon fill="red" stroke="red" points="294.18,-79.3 298.68,-89.3 294.18,-84.3 294.18,-89.3 294.18,-89.3 294.18,-89.3 294.18,-84.3 289.68,-89.3 294.18,-79.3 294.18,-79.3"/>
<text text-anchor="middle" x="356.77" y="-120.5" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g>
<!-- AccountList&#45;&gt;Account -->
<g id="edge9" class="edge">
<title>AccountList&#45;&gt;Account</title>
<path fill="none" stroke="black" d="M800,-327.16C800,-327.16 800,-241.79 800,-241.79"/>
<polygon fill="none" stroke="black" points="800,-241.79 796,-235.79 800,-229.79 804,-235.79 800,-241.79"/>
<text text-anchor="middle" x="864" y="-268.8" font-family="Arial" font-size="9.00">0..*</text>
<g id="edge4" class="edge" data-name="AccountList-&gt;Account">
<path fill="none" stroke="black" d="M455.27,-341.19C455.27,-341.19 455.27,-253.05 455.27,-253.05"/>
<polygon fill="none" stroke="black" points="455.27,-253.05 451.27,-247.05 455.27,-241.05 459.27,-247.05 455.27,-253.05"/>
<text text-anchor="middle" x="466.75" y="-280.3" font-family="Arial" font-size="9.00">0..*</text>
</g>
<!-- DuplicateObjectException -->
<g id="node7" class="node">
<title>DuplicateObjectException</title>
<polygon fill="lightyellow" stroke="black" points="1082,-176 1082,-212 1212,-212 1212,-176 1082,-176"/>
<text text-anchor="middle" x="1147" y="-191.5" font-family="Arial" font-size="10.00">DuplicateObjectException</text>
<g id="node7" class="node" pointer-events="visible" data-name="DuplicateObjectException">
<polygon fill="lightyellow" stroke="black" points="654.97,-185.1 654.97,-221.1 777.03,-221.1 777.03,-185.1 654.97,-185.1"/>
<text text-anchor="middle" x="716" y="-200.1" font-family="Times New Roman" font-size="10.00">DuplicateObjectException</text>
</g>
<!-- AccountList&#45;&gt;DuplicateObjectException -->
<g id="edge15" class="edge">
<title>AccountList&#45;&gt;DuplicateObjectException</title>
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M896.2,-363C998.89,-363 1147,-363 1147,-363 1147,-363 1147,-222.09 1147,-222.09"/>
<polygon fill="red" stroke="red" points="1147,-212.09 1151.5,-222.09 1147,-217.09 1147,-222.09 1147,-222.09 1147,-222.09 1147,-217.09 1142.5,-222.09 1147,-212.09 1147,-212.09"/>
<text text-anchor="middle" x="973.5" y="-268.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g>
<!-- TestAccountLoad -->
<g id="node9" class="node">
<title>TestAccountLoad</title>
<polygon fill="lightyellow" stroke="black" points="16.5,-662.5 16.5,-711.5 309.5,-711.5 309.5,-662.5 16.5,-662.5"/>
<text text-anchor="middle" x="163" y="-699.5" font-family="Arial" font-size="10.00">TestAccountLoad</text>
<polyline fill="none" stroke="black" points="16.5,-692.5 309.5,-692.5 "/>
<text text-anchor="start" x="24.5" y="-680.5" font-family="Arial" font-size="10.00">+ main(args: String[])</text>
<text text-anchor="start" x="24.5" y="-669.5" font-family="Arial" font-size="10.00">&#45; Test_AddAccount(mgr: AccomodationManager, acct: Account)</text>
</g>
<!-- TestAccountLoad&#45;&gt;AccomodationManager -->
<g id="edge1" class="edge">
<title>TestAccountLoad&#45;&gt;AccomodationManager</title>
<path fill="none" stroke="black" d="M283.75,-662.34C283.75,-627.49 283.75,-568 283.75,-568 283.75,-568 323.3,-568 323.3,-568"/>
<polygon fill="black" stroke="black" points="323.3,-571.5 333.3,-568 323.3,-564.5 323.3,-571.5"/>
<text text-anchor="middle" x="403" y="-618.8" font-family="Arial" font-size="9.00">uses</text>
</g>
<!-- TestAccountLoad&#45;&gt;Account -->
<g id="edge2" class="edge">
<title>TestAccountLoad&#45;&gt;Account</title>
<path fill="none" stroke="black" d="M237,-662.3C237,-560.91 237,-182 237,-182 237,-182 693.74,-182 693.74,-182"/>
<polygon fill="black" stroke="black" points="693.74,-185.5 703.74,-182 693.74,-178.5 693.74,-185.5"/>
<text text-anchor="middle" x="1225" y="-452.8" font-family="Arial" font-size="9.00">uses</text>
</g>
<!-- TestAccountLoad&#45;&gt;Address -->
<g id="edge3" class="edge">
<title>TestAccountLoad&#45;&gt;Address</title>
<path fill="none" stroke="black" d="M309.8,-678C560.89,-678 1046,-678 1046,-678 1046,-678 1046,-85.78 1046,-85.78"/>
<polygon fill="black" stroke="black" points="1049.5,-85.78 1046,-75.78 1042.5,-85.78 1049.5,-85.78"/>
<text text-anchor="middle" x="1411.5" y="-360.8" font-family="Arial" font-size="9.00">creates</text>
</g>
<!-- TestAccountLoad&#45;&gt;EmailAddress -->
<g id="edge4" class="edge">
<title>TestAccountLoad&#45;&gt;EmailAddress</title>
<path fill="none" stroke="black" d="M309.54,-695C629.15,-695 1360.5,-695 1360.5,-695 1360.5,-695 1360.5,-85.61 1360.5,-85.61"/>
<polygon fill="black" stroke="black" points="1364,-85.61 1360.5,-75.61 1357,-85.61 1364,-85.61"/>
<text text-anchor="middle" x="1586.5" y="-360.8" font-family="Arial" font-size="9.00">creates</text>
</g>
<!-- TestAccountLoad_getRepositoryConfig -->
<g id="node10" class="node">
<title>TestAccountLoad_getRepositoryConfig</title>
<polygon fill="lightyellow" stroke="black" points="110,-518.5 110,-556.5 216,-556.5 216,-518.5 110,-518.5"/>
<text text-anchor="middle" x="163" y="-544.5" font-family="Arial" font-size="10.00">getRepositoryConfig</text>
<polyline fill="none" stroke="black" points="110,-537.5 216,-537.5 "/>
<text text-anchor="start" x="118" y="-525.5" font-family="Arial" font-size="10.00">+ getPath(): String</text>
</g>
<!-- TestAccountLoad&#45;&gt;TestAccountLoad_getRepositoryConfig -->
<g id="edge5" class="edge">
<title>TestAccountLoad&#45;&gt;TestAccountLoad_getRepositoryConfig</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M163,-662.31C163,-662.31 163,-566.52 163,-566.52"/>
<polygon fill="black" stroke="black" points="163,-556.52 167.5,-566.52 163,-561.52 163,-566.52 163,-566.52 163,-566.52 163,-561.52 158.5,-566.52 163,-556.52 163,-556.52"/>
<text text-anchor="middle" x="182.5" y="-618.8" font-family="Arial" font-size="9.00">has inner</text>
</g>
</g>
</svg>
<g id="edge10" class="edge" data-name="AccountList-&gt;DuplicateObjectException">
<path fill="none" stroke="red" stroke-dasharray="5,2" d="M545.92,-349.8C621.24,-349.8 716,-349.8 716,-349.8 716,-349.8 716,-231.09 716,-231.09"/>
<polygon fill="red" stroke="red" points="716,-221.09 720.5,-231.09 716,-226.09 716,-231.09 716,-231.09 716,-231.09 716,-226.09 711.5,-231.09 716,-221.09 716,-221.09"/>
<text text-anchor="middle" x="508.77" y="-280.3" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g></g>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 14 KiB

105
uml/classdiagram8.dot Normal file
View File

@@ -0,0 +1,105 @@
digraph ReservationSystemDiagram {
graph [
rankdir=TB,
splines=ortho,
label="Lodge Reservation System",
fontsize=20
];
node [
shape=record,
style=filled,
fillcolor=lightyellow,
fontname="Helvetica"
];
edge [
penwidth=1.0,
fontname="Helvetica"
];
// Class Definitions
AccomodationManager [label="{AccomodationManager|- accounts: AccountList\l|+ setDataStoreRoot(home: String): void\l+ loadAll(): void\l+ retrieveLoadedAccounts(): List<Account>\l+ retrieveAccount(acct_id: String): Account\l+ AddAccount(acct: Account): void\l+ UpdateAccount(acct: Account): void\l+ newAccount(...): Account\l+ addReservation(account: Account, reservation: Reservation): boolean\l+ findReservation(reservation_number: String): Reservation\l}"];
AccountList [label="{AccountList|# extends ArrayList<Account>\l+ add(account: Account): boolean\l+ save(acct: Account): void\l+ find(account_number: String): Account\l}"];
HotelReservation [label="{HotelReservation|+ ReservationType(): String\l+ calculatePrice(): float\l+ getPricePerNight(): float\l}"];
HouseReservation [label="{HouseReservation|+ ReservationType(): String\l+ calculatePrice(): float\l+ getPricePerNight(): float\l}"];
CabinReservation [label="{CabinReservation|+ ReservationType(): String\l+ calculatePrice(): float\l+ getPricePerNight(): float\l}"];
DataRepository [label="{DataRepository|- directoryPath: String\l- instance: DataRepository\l+ {static} setDataStoreRoot(path: String): void\l+ {static} getPath(): String\l+ {static} LoadAccount(file: Path): Account\l+ {static} WalkFileSystemTree(...): void\l}"];
// Data model classes (simplified)
subgraph cluster_datamodel {
label = "Data Models";
style = "dashed";
Address [label="{Address|- street: String\l- city: String\l- state: String\l- zip: String\l}"];
EmailAddress [label="{EmailAddress|- email: String\l}"];
Account [label="{Account|- account_number: String\l- phone_number: String\l- mailing_address: Address\l- email_address: EmailAddress\l- reservations: AccountReservationList\l|+ add(rsrv: Reservation): boolean\l+ Write(acct: Account): void\l+ findReservation(reservation_number: String): Reservation\l+ checkValid(): boolean\l}"];
AccountReservationList [label="{AccountReservationList|# extends ArrayList<IReservation>\l+ add(reservation: IReservation): boolean\l+ find(reservation_number: String): Reservation\l}"];
IReservation [label="{<<interface>>\nIReservation|+ getReservation_number(): String\l+ getAccountNumber(): String\l+ calculatePrice(): float\l+ checkValid(): boolean\l+ ReservationType(): String\l}"];
Reservation [label="{<<abstract>>\nReservation|- reservation_number: String\l- physical_address: Address\l- reservation_start_date: ZonedDateTime\l- reservation_end_date: ZonedDateTime\l- reservation_status: ReservationStatusEnum\l- price: Float\l# accountNumber: String\l|+ Change(reservation: Reservation, newStatus: ReservationStatusEnum): void\l+ ReservationType(): String\l}"];
}
// Relationships
// Composition / Aggregation
AccomodationManager -> AccountList [
arrowhead=odiamond,
label="manages",
taillabel="1",
headlabel="1"
];
AccountList -> Account [
arrowhead=odiamond,
label="contains",
taillabel="1",
headlabel="0..*"
];
Account -> AccountReservationList [
arrowhead=odiamond,
label="has",
taillabel="1",
headlabel="1"
];
AccountReservationList -> IReservation [
arrowhead=odiamond,
label="contains",
taillabel="1",
headlabel="0..*"
];
// Inheritance / Implementation
Reservation -> IReservation [arrowhead=onormal, style=dashed, label="implements"];
HotelReservation -> Reservation [arrowhead=empty, label="extends"];
HouseReservation -> Reservation [arrowhead=empty, label="extends"];
CabinReservation -> Reservation [arrowhead=empty, label="extends"];
// Association / Dependency
AccomodationManager -> DataRepository [arrowhead=vee, style=dashed, label="uses"];
Account -> Address [
arrowhead=vee, style=dashed,
label="has a mailing address",
taillabel="*",
headlabel="1"
];
Account -> EmailAddress [
arrowhead=vee, style=dashed,
label="has an email",
taillabel="*",
headlabel="1"
];
Reservation -> Address [arrowhead=vee, style=dashed, label="has physical & mailing addresses"];
}