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 | | software | version |
| -------- | ------- | | -------- | ------- |
| Java | 21 | | Java | 24 |
| json lib | gson-2.13.1 | | json lib | gson-2.13.1 |
| VSCode | 1.103 | | VSCode | 1.103 |
| graphviz | 2.42.4 | | graphviz | 2.42.4 |
@@ -12,19 +12,31 @@
| extension | | extension |
| ----------------- | | ----------------- |
| Debugger for Java | | Debugger for Java |
| Java Launcher | | Java Platform Extension for Visual Studio Code |
| Language Support for Java(TM) by Red Hat | | Language Support for Java(TM) by Red Hat |
| Graphviz Interactive Preview |
### Run and Debug Java manually ### Run and Debug Java manually
cd to: libs cd to: libs
java -cp .\libs\gson-2.13.1.jar;.\libs\reservationsystem.jar lodge.TestReservations 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: ### compile - build:
### create jar archive: ### create jar archive:
gradle clean build jar gradle clean build jar
### Dot file review for classdiagram ### Dot file review for classdiagram
Install Graphviz in your OS Install Graphviz in your OS
dot -Tsvg classdiagram.dot -o classdiagram.svg 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 { plugins {
id 'java' id 'java'
id 'application' 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. // Apply a specific Java toolchain to ease working on different environments.
java { java {
toolchain { toolchain {
languageVersion = JavaLanguageVersion.of(24) languageVersion = JavaLanguageVersion.of(25)
} }
} }
application { application {
mainClass = 'lodge.TestReservations' mainClass = 'lodge.TestMainFx'
applicationDefaultJvmArgs = ["--add-opens", "java.base/jdk.internal.loader=ALL-UNNAMED"]
} }
sourceSets { sourceSets {
main { main {
java { java {
srcDirs = ['src/main/java'] srcDirs = ['src/main/java']
} }
} resources {
srcDirs = ['src/resources/media']
}
}
test { test {
java { java {
srcDirs = ['src/test/java'] srcDirs = ['src/test/java']
@@ -42,23 +48,37 @@ repositories {
fileTree(dir:'libs', include:'*.jar') fileTree(dir:'libs', include:'*.jar')
} }
javafx {
version = "24"
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.graphics', 'javafx.web' ]
}
dependencies { dependencies {
//https://mvnrepository.com/artifact/com.google.code.gson/gson //https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation 'com.google.code.gson:gson:2.13.2' 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 { jar {
manifest { manifest {
attributes 'Main-Class': application.mainClass attributes 'Main-Class': application.mainClass
} }
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
} }
tasks.named('jar') { tasks.named('jar') {
manifest { manifest {
attributes('Implementation-Title': 'lodge.reservationsystem', attributes('Implementation-Title': 'lodge.reservationsystem',
'Implementation-Version': 1.0, 'Implementation-Version': 1.0,
'Main-Class': 'lodge.TestReservations', 'Main-Class': application.mainClass,
'Class-Path': 'lodge.reservationsystem com.google.gson .' ) '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 #!/bin/sh
# #
# Copyright © 2015-2021 the original authors. # Copyright © 2015 the original authors.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@@ -114,7 +114,6 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;; NONSTOP* ) nonstop=true ;;
esac esac
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM. # 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 # For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" ) JAVACMD=$( cygpath --unix "$JAVACMD" )
@@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@" "$@"

3
gradlew.bat vendored
View File

@@ -70,11 +70,10 @@ goto fail
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=
@rem Execute Gradle @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 :end
@rem End local scope for the variables with windows NT shell @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 Main-Class: lodge.TestReservations
Implementation-Title: lodge.reservationsystem Implementation-Title: lodge.reservationsystem
Implementation-Version: 1.0 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; package lodge;
import java.util.ArrayList;
import java.util.List;
import lodge.datamodel.Account; import lodge.datamodel.Account;
import lodge.datamodel.Address; import lodge.datamodel.Address;
import lodge.datamodel.EmailAddress; import lodge.datamodel.EmailAddress;
@@ -30,31 +33,42 @@ public final class TestAccountLoad {
// memory // memory
mgr.UpdateAccount(acct); 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 { public static void main(String[] args) throws Exception {
// Configure data repository // 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 // 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 // already exists on add action with the same account number, it is considered
// an error) // 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", 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"))); new EmailAddress("wilco@wyommin.net")));
System.out.println("Account already exists in list, so add attempt should fail:");
mgr.showAccountList(); 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."); 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 { public static void main(String[] args) throws Exception {
// Configure data repository // 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 // 1. Get the list of loaded accounts from Manager
mgr.loadAll(); mgr.loadAll();
@@ -149,12 +149,4 @@ public final class TestReservations {
System.out.println("Program Completed."); 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 /** not used
* *
*/ */
@SuppressWarnings("unused")
private Address() { public Address() {
} }
public Address(String street, String city, String state, String zip) { 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; private Float price;
protected String accountNumber = null; protected String accountNumber = "-99";
protected Reservation() { protected Reservation() {
numberOfBeds = 1; numberOfBeds = 1;

View File

@@ -6,7 +6,6 @@ package lodge.reservationsystem;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -28,7 +27,6 @@ public final class AccomodationManager {
}; };
public AccomodationManager(String home) { public AccomodationManager(String home) {
setDataStoreRoot(home); setDataStoreRoot(home);
}; };
@@ -36,12 +34,15 @@ public final class AccomodationManager {
DataRepository.setDataStoreRoot(home); DataRepository.setDataStoreRoot(home);
} }
String getDataStoreRoot(){
return DataRepository.getPath();
}
public final void loadAll() public final void loadAll()
throws IOException, IllegalArgumentException, IllegalOperationException, DuplicateObjectException { throws IOException, IllegalArgumentException, IllegalOperationException, DuplicateObjectException {
accounts.clear(); accounts.clear();
// walk directories // walk directories
Path rootDir = Paths.get(DataRepository.getPath()); DataRepository.WalkFileSystemTree(this, Path.of(DataRepository.getPath()));
DataRepository.WalkFileSystemTree(this, rootDir);
System.out.println(String.format("%s LoadAll Accounts %d", "Deserializing", accounts.size())); 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())); 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) { if (getPhysical_address() == null) {
throw new IllegalArgumentException(String.format("not valid, physical_address %s", this.getReservation_number())); 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; return true;
} }

View File

@@ -65,9 +65,6 @@ public final class HotelReservation extends Reservation {
if (getPhysical_address() == null) { if (getPhysical_address() == null) {
throw new IllegalArgumentException(String.format("not valid, physical_address %s", this.getReservation_number())); 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; return true;
} }

View File

@@ -53,9 +53,6 @@ public final class HouseReservation extends Reservation {
if (getPhysical_address() == null) { if (getPhysical_address() == null) {
throw new IllegalArgumentException(String.format("not valid, physical_address %s", this.getReservation_number())); 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; 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 // Composition / Aggregation
AccomodationManager -> AccountList [arrowhead=diamond, label="has a"]; 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"]; Account -> AccountReservationList [arrowhead=diamond, label="has a"];
AccountReservationList -> IReservation [arrowhead=diamond, label="0..*"]; AccountReservationList -> IReservation [arrowhead=diamond, label="0..*"];
Account -> Address [arrowhead=odiamond, label="mailing"]; Account -> Address [arrowhead=odiamond, label="mailing"];

View File

@@ -1,323 +1,317 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <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">
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <g id="graph0" class="graph" transform="translate(4,1085.5999755859375) scale(1)" data-name="ClassDiagram">
<!-- Generated by graphviz version 14.0.0 (20250921.2048)
--> <polygon fill="white" stroke="none" points="-4,4 -4,-1085.6 2184.25,-1085.6 2184.25,4 -4,4" style=""/>
<!-- Title: ClassDiagram Pages: 1 --> <!-- IReservation -->
<svg width="2238pt" height="1056pt" <g id="node1" class="node" pointer-events="visible" data-name="IReservation">
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)"> <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=""/>
<title>ClassDiagram</title> <text text-anchor="middle" x="203" y="-134.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">interface</text>
<polygon fill="white" stroke="none" points="-4,4 -4,-1052 2233.62,-1052 2233.62,4 -4,4"/> <text text-anchor="middle" x="203" y="-117.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">IReservation</text>
<!-- IReservation --> <polyline fill="none" stroke="black" points="96.96,-109.3 309.04,-109.3" style=""/>
<g id="node1" class="node"> <text text-anchor="start" x="104.96" y="-92.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ ReservationType(): String</text>
<title>IReservation</title> <text text-anchor="start" x="104.96" y="-75.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ checkValid(): boolean</text>
<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 text-anchor="start" x="104.96" y="-59.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ calculatePrice(): float</text>
<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 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 xml:space="preserve" text-anchor="middle" x="203" y="-109.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">IReservation</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>
<polyline fill="none" stroke="black" points="90.75,-103 315.25,-103"/> <text text-anchor="start" x="104.96" y="-8.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ getAccountNumber(): String</text>
<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> </g>
<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> <!-- Reservation -->
<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> <g id="node2" class="node" pointer-events="visible" data-name="Reservation">
<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> <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 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> <text text-anchor="middle" x="549" y="-607.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">Reservation</text>
</g> </g>
<!-- Reservation --> <!-- Reservation&#45;&gt;IReservation -->
<g id="node2" class="node"> <g id="edge1" class="edge" data-name="Reservation-&gt;IReservation">
<title>Reservation</title>
<polygon fill="lightyellow" stroke="black" points="517,-575 517,-611 605,-611 605,-575 517,-575"/> <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=""/>
<text xml:space="preserve" text-anchor="middle" x="561" y="-587.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">Reservation</text> <polygon fill="none" stroke="black" points="253.72,-162.21 250.22,-152.21 246.72,-162.21 253.72,-162.21" style=""/>
</g> <text text-anchor="middle" x="178.66" y="-368.8" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">implements</text>
<!-- Reservation&#45;&gt;IReservation --> </g>
<g id="edge1" class="edge"> <!-- DataRepository -->
<title>Reservation&#45;&gt;IReservation</title> <g id="node4" class="node" pointer-events="visible" data-name="DataRepository">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="181.25" y="-354.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">implements</text> <text text-anchor="middle" x="984" y="-283.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">DataRepository</text>
</g> </g>
<!-- DataRepository --> <!-- Reservation&#45;&gt;DataRepository -->
<g id="node4" class="node"> <g id="edge24" class="edge" data-name="Reservation-&gt;DataRepository">
<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"/> <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=""/>
<text xml:space="preserve" text-anchor="middle" x="1002" y="-271.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">DataRepository</text> <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=""/>
</g> <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>
<!-- Reservation&#45;&gt;DataRepository --> </g>
<g id="edge24" class="edge"> <!-- Address -->
<title>Reservation&#45;&gt;DataRepository</title> <g id="node13" class="node" pointer-events="visible" data-name="Address">
<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"/> <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 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> <text text-anchor="middle" x="549" y="-296.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">Address</text>
</g> <polyline fill="none" stroke="black" points="428.74,-287.9 669.26,-287.9" style=""/>
<!-- Address --> <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 id="node13" class="node"> </g>
<title>Address</title> <!-- Reservation&#45;&gt;Address -->
<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"/> <g id="edge11" class="edge" data-name="Reservation-&gt;Address">
<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"/> <path fill="none" stroke="black" d="M562.81,-594.02C562.81,-594.02 562.81,-324.57 562.81,-324.57" style=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="595.66" y="-441.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">physical/mailing</text>
<!-- Reservation&#45;&gt;Address --> </g>
<g id="edge11" class="edge"> <!-- ReservationStatusEnum -->
<title>Reservation&#45;&gt;Address</title> <g id="node15" class="node" pointer-events="visible" data-name="ReservationStatusEnum">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="609" y="-425.57" font-family="Helvetica,Arial,sans-serif" font-size="14.00">physical/mailing</text> <text text-anchor="middle" x="330" y="-449.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">enum</text>
</g> <text text-anchor="middle" x="330" y="-433.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">ReservationStatusEnum</text>
<!-- ReservationStatusEnum --> </g>
<g id="node15" class="node"> <!-- Reservation&#45;&gt;ReservationStatusEnum -->
<title>ReservationStatusEnum</title> <g id="edge25" class="edge" data-name="Reservation-&gt;ReservationStatusEnum">
<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> <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=""/>
<text xml:space="preserve" text-anchor="middle" x="336" y="-417.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">ReservationStatusEnum</text> <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=""/>
</g> <text text-anchor="middle" x="342.06" y="-514.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
<!-- Reservation&#45;&gt;ReservationStatusEnum --> </g>
<g id="edge25" class="edge"> <!-- AccomodationManager -->
<title>Reservation&#45;&gt;ReservationStatusEnum</title> <g id="node3" class="node" pointer-events="visible" data-name="AccomodationManager">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="350.25" y="-496.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses</text> <text text-anchor="middle" x="1178" y="-924.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">AccomodationManager</text>
</g> <polyline fill="none" stroke="black" points="1010.14,-916.5 1345.86,-916.5" style=""/>
<!-- AccomodationManager --> <text text-anchor="start" x="1018.14" y="-899.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ AccomodationManager(String)</text>
<g id="node3" class="node"> <text text-anchor="start" x="1018.14" y="-883.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ loadAll(): void</text>
<title>AccomodationManager</title> <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>
<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 text-anchor="start" x="1018.14" y="-849.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ retrieveLoadedAccounts(): AccountList</text>
<text xml:space="preserve" text-anchor="middle" x="1201" y="-891.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">AccomodationManager</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>
<polyline fill="none" stroke="black" points="1026.5,-885 1375.5,-885"/> <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 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 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 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 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 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 text-anchor="start" x="1018.14" y="-765.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ showReservationList(): void</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> </g>
<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> <!-- AccomodationManager&#45;&gt;DataRepository -->
<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> <g id="edge21" class="edge" data-name="AccomodationManager-&gt;DataRepository">
<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> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="996.06" y="-514.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
<!-- AccomodationManager&#45;&gt;DataRepository --> </g>
<g id="edge21" class="edge"> <!-- Account -->
<title>AccomodationManager&#45;&gt;DataRepository</title> <g id="node5" class="node" pointer-events="visible" data-name="Account">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="1016.25" y="-496.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">uses</text> <text text-anchor="middle" x="1364" y="-441.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">Account</text>
</g> </g>
<!-- Account --> <!-- AccomodationManager&#45;&gt;Account -->
<g id="node5" class="node"> <g id="edge22" class="edge" data-name="AccomodationManager-&gt;Account">
<title>Account</title>
<polygon fill="lightyellow" stroke="black" points="1360.62,-413 1360.62,-449 1425.38,-449 1425.38,-413 1360.62,-413"/> <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=""/>
<text xml:space="preserve" text-anchor="middle" x="1393" y="-425.57" font-family="Helvetica,Arial,sans-serif" font-size="14.00">Account</text> <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=""/>
</g> <text text-anchor="middle" x="1189.49" y="-607.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">manages</text>
<!-- AccomodationManager&#45;&gt;Account --> </g>
<g id="edge22" class="edge"> <!-- AccountList -->
<title>AccomodationManager&#45;&gt;Account</title> <g id="node6" class="node" pointer-events="visible" data-name="AccountList">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="1211.12" y="-587.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">manages</text> <text text-anchor="middle" x="1364" y="-636.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">AccountList</text>
</g> <polyline fill="none" stroke="black" points="1285.97,-628.7 1442.03,-628.7" style=""/>
<!-- AccountList --> <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>
<g id="node6" class="node"> <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>
<title>AccountList</title> <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>
<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"/> </g>
<text xml:space="preserve" text-anchor="middle" x="1393" y="-615.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00">AccountList</text> <!-- AccomodationManager&#45;&gt;AccountList -->
<polyline fill="none" stroke="black" points="1311.12,-608.75 1474.88,-608.75"/> <g id="edge5" class="edge" data-name="AccomodationManager-&gt;AccountList">
<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> <path fill="none" stroke="black" d="M1315.91,-757.51C1315.91,-757.51 1315.91,-665.24 1315.91,-665.24" style=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="1353.19" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">has a</text>
<!-- AccomodationManager&#45;&gt;AccountList --> </g>
<g id="edge5" class="edge"> <!-- Account&#45;&gt;DataRepository -->
<title>AccomodationManager&#45;&gt;AccountList</title> <g id="edge23" class="edge" data-name="Account-&gt;DataRepository">
<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"/> <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=""/>
<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> <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=""/>
</g> <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>
<!-- Account&#45;&gt;DataRepository --> </g>
<g id="edge23" class="edge"> <!-- AccountReservationList -->
<title>Account&#45;&gt;DataRepository</title> <g id="node7" class="node" pointer-events="visible" data-name="AccountReservationList">
<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"/> <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 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> <text text-anchor="middle" x="1291" y="-304.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">AccountReservationList</text>
</g> <polyline fill="none" stroke="black" points="1200.91,-296.3 1381.09,-296.3" style=""/>
<!-- AccountReservationList --> <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>
<g id="node7" class="node"> <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>
<title>AccountReservationList</title> </g>
<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"/> <!-- Account&#45;&gt;AccountReservationList -->
<text xml:space="preserve" text-anchor="middle" x="1321" y="-291.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00">AccountReservationList</text> <g id="edge7" class="edge" data-name="Account-&gt;AccountReservationList">
<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> <path fill="none" stroke="black" d="M1356.69,-427.91C1356.69,-427.91 1356.69,-333.01 1356.69,-333.01" style=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="1398.19" y="-368.8" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">has a</text>
<!-- Account&#45;&gt;AccountReservationList --> </g>
<g id="edge7" class="edge"> <!-- Account&#45;&gt;Address -->
<title>Account&#45;&gt;AccountReservationList</title> <g id="edge9" class="edge" data-name="Account-&gt;Address">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="1119.39" y="-368.8" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">mailing</text>
<!-- Account&#45;&gt;Address --> </g>
<g id="edge9" class="edge"> <!-- EmailAddress -->
<title>Account&#45;&gt;Address</title> <g id="node14" class="node" pointer-events="visible" data-name="EmailAddress">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="1137.75" y="-354.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">mailing</text> <text text-anchor="middle" x="1774" y="-296.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">EmailAddress</text>
</g> <polyline fill="none" stroke="black" points="1698.87,-287.9 1849.13,-287.9" style=""/>
<!-- EmailAddress --> <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 id="node14" class="node"> </g>
<title>EmailAddress</title> <!-- Account&#45;&gt;EmailAddress -->
<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"/> <g id="edge10" class="edge" data-name="Account-&gt;EmailAddress">
<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"/> <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=""/>
<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> <polygon fill="none" stroke="black" points="1687.2,-287 1693.2,-283 1699.2,-287 1693.2,-291 1687.2,-287" style=""/>
</g> </g>
<!-- Account&#45;&gt;EmailAddress --> <!-- AccountList&#45;&gt;Account -->
<g id="edge10" class="edge"> <g id="edge6" class="edge" data-name="AccountList-&gt;Account">
<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"/> <path fill="none" stroke="black" d="M1364,-570.39C1364,-570.39 1364,-475.41 1364,-475.41" style=""/>
<polygon fill="none" stroke="black" points="1626.64,-269 1632.64,-265 1638.64,-269 1632.64,-273 1626.64,-269"/> <polygon fill="none" stroke="black" points="1364,-475.41 1360,-469.41 1364,-463.41 1368,-469.41 1364,-475.41" style=""/>
</g> <text text-anchor="middle" x="1374.5" y="-514.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">0..*</text>
<!-- AccountList&#45;&gt;Account --> </g>
<g id="edge6" class="edge"> <!-- AccountReservationList&#45;&gt;IReservation -->
<title>AccountList&#45;&gt;Account</title> <g id="edge8" class="edge" data-name="AccountReservationList-&gt;IReservation">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="785.5" y="-198.6" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">0..*</text>
<!-- AccountReservationList&#45;&gt;IReservation --> </g>
<g id="edge8" class="edge"> <!-- HotelReservation -->
<title>AccountReservationList&#45;&gt;IReservation</title> <g id="node8" class="node" pointer-events="visible" data-name="HotelReservation">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="800.12" y="-188.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">0..*</text> <text text-anchor="middle" x="336" y="-865.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">HotelReservation</text>
</g> <polyline fill="none" stroke="black" points="245.71,-857.7 426.29,-857.7" style=""/>
<!-- HotelReservation --> <text text-anchor="start" x="253.71" y="-841.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ HotelReservation(Address)</text>
<g id="node8" class="node"> <text text-anchor="start" x="253.71" y="-824.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ calculatePrice(): float</text>
<title>HotelReservation</title> </g>
<polygon fill="lightyellow" stroke="black" points="229,-790.38 229,-853.62 419,-853.62 419,-790.38 229,-790.38"/> <!-- HotelReservation&#45;&gt;Reservation -->
<text xml:space="preserve" text-anchor="middle" x="324" y="-836.33" font-family="Helvetica,Arial,sans-serif" font-size="14.00">HotelReservation</text> <g id="edge2" class="edge" data-name="HotelReservation-&gt;Reservation">
<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> <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=""/>
<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> <polygon fill="none" stroke="black" points="496.06,-621.5 506.06,-618 496.06,-614.5 496.06,-621.5" style=""/>
</g> <text text-anchor="middle" x="413.38" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">extends</text>
<!-- HotelReservation&#45;&gt;Reservation --> </g>
<g id="edge2" class="edge"> <!-- CabinReservation -->
<title>HotelReservation&#45;&gt;Reservation</title> <g id="node9" class="node" pointer-events="visible" data-name="CabinReservation">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="404.62" y="-678.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">extends</text> <text text-anchor="middle" x="590" y="-865.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">CabinReservation</text>
</g> <polyline fill="none" stroke="black" points="498.54,-857.7 681.46,-857.7" style=""/>
<!-- CabinReservation --> <text text-anchor="start" x="506.54" y="-841.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ CabinReservation(Address)</text>
<g id="node9" class="node"> <text text-anchor="start" x="506.54" y="-824.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ calculatePrice(): float</text>
<title>CabinReservation</title> </g>
<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"/> <!-- CabinReservation&#45;&gt;Reservation -->
<text xml:space="preserve" text-anchor="middle" x="588" y="-836.33" font-family="Helvetica,Arial,sans-serif" font-size="14.00">CabinReservation</text> <g id="edge3" class="edge" data-name="CabinReservation-&gt;Reservation">
<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> <path fill="none" stroke="black" d="M549,-816.29C549,-816.29 549,-641.16 549,-641.16" style=""/>
<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> <polygon fill="none" stroke="black" points="552.5,-641.16 549,-631.16 545.5,-641.16 552.5,-641.16" style=""/>
</g> <text text-anchor="middle" x="590.38" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">extends</text>
<!-- CabinReservation&#45;&gt;Reservation --> </g>
<g id="edge3" class="edge"> <!-- HouseReservation -->
<title>CabinReservation&#45;&gt;Reservation</title> <g id="node10" class="node" pointer-events="visible" data-name="HouseReservation">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="598.62" y="-678.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">extends</text> <text text-anchor="middle" x="846" y="-865.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">HouseReservation</text>
</g> <polyline fill="none" stroke="black" points="753.38,-857.7 938.62,-857.7" style=""/>
<!-- HouseReservation --> <text text-anchor="start" x="761.38" y="-841.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ HouseReservation(Address)</text>
<g id="node10" class="node"> <text text-anchor="start" x="761.38" y="-824.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">+ calculatePrice(): float</text>
<title>HouseReservation</title> </g>
<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"/> <!-- HouseReservation&#45;&gt;Reservation -->
<text xml:space="preserve" text-anchor="middle" x="856" y="-836.33" font-family="Helvetica,Arial,sans-serif" font-size="14.00">HouseReservation</text> <g id="edge4" class="edge" data-name="HouseReservation-&gt;Reservation">
<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> <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=""/>
<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> <polygon fill="none" stroke="black" points="601.66,-614.5 591.66,-618 601.66,-621.5 601.66,-614.5" style=""/>
</g> <text text-anchor="middle" x="779.38" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">extends</text>
<!-- HouseReservation&#45;&gt;Reservation --> </g>
<g id="edge4" class="edge"> <!-- TestReservations -->
<title>HouseReservation&#45;&gt;Reservation</title> <g id="node11" class="node" pointer-events="visible" data-name="TestReservations">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="807.62" y="-678.45" font-family="Helvetica,Arial,sans-serif" font-size="14.00">extends</text> <text text-anchor="middle" x="1178" y="-1058.9" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">TestReservations</text>
</g> </g>
<!-- TestReservations --> <!-- TestReservations&#45;&gt;AccomodationManager -->
<g id="node11" class="node"> <g id="edge12" class="edge" data-name="TestReservations-&gt;AccomodationManager">
<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"/> <path fill="none" stroke="black" stroke-dasharray="5,2" d="M1178,-1045.24C1178,-1045.24 1178,-951.14 1178,-951.14" style=""/>
<text xml:space="preserve" text-anchor="middle" x="1201" y="-1024.08" font-family="Helvetica,Arial,sans-serif" font-size="14.00">TestReservations</text> <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=""/>
</g> <text text-anchor="middle" x="1190.06" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
<!-- TestReservations&#45;&gt;AccomodationManager --> </g>
<g id="edge12" class="edge"> <!-- TestReservations&#45;&gt;Account -->
<title>TestReservations&#45;&gt;AccomodationManager</title> <g id="edge17" class="edge" data-name="TestReservations-&gt;Account">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="1491.06" y="-701.2" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
<!-- TestReservations&#45;&gt;Account --> </g>
<g id="edge17" class="edge"> <!-- TestReservations&#45;&gt;HotelReservation -->
<title>TestReservations&#45;&gt;Account</title> <g id="edge14" class="edge" data-name="TestReservations-&gt;HotelReservation">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="417.43" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
<!-- TestReservations&#45;&gt;HotelReservation --> </g>
<g id="edge14" class="edge"> <!-- TestReservations&#45;&gt;CabinReservation -->
<title>TestReservations&#45;&gt;HotelReservation</title> <g id="edge15" class="edge" data-name="TestReservations-&gt;CabinReservation">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="780.43" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
<!-- TestReservations&#45;&gt;CabinReservation --> </g>
<g id="edge15" class="edge"> <!-- TestReservations&#45;&gt;HouseReservation -->
<title>TestReservations&#45;&gt;CabinReservation</title> <g id="edge16" class="edge" data-name="TestReservations-&gt;HouseReservation">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="1019.43" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
<!-- TestReservations&#45;&gt;HouseReservation --> </g>
<g id="edge16" class="edge"> <!-- TestReservations.getRepositoryConfig -->
<title>TestReservations&#45;&gt;HouseReservation</title> <g id="node12" class="node" pointer-events="visible" data-name="TestReservations.getRepositoryConfig">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="990.12" y="-954.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">creates</text> <text text-anchor="middle" x="1681" y="-845.1" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">TestReservations.getRepositoryConfig</text>
</g> </g>
<!-- TestReservations.getRepositoryConfig --> <!-- TestReservations&#45;&gt;TestReservations.getRepositoryConfig -->
<g id="node12" class="node"> <g id="edge13" class="edge" data-name="TestReservations-&gt;TestReservations.getRepositoryConfig">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="1693.06" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">uses</text>
<!-- TestReservations&#45;&gt;TestReservations.getRepositoryConfig --> </g>
<g id="edge13" class="edge"> <!-- TestReservations&#45;&gt;Address -->
<title>TestReservations&#45;&gt;TestReservations.getRepositoryConfig</title> <g id="edge18" class="edge" data-name="TestReservations-&gt;Address">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="19.43" y="-607.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
<!-- TestReservations&#45;&gt;Address --> </g>
<g id="edge18" class="edge"> <!-- TestReservations&#45;&gt;EmailAddress -->
<title>TestReservations&#45;&gt;Address</title> <g id="edge19" class="edge" data-name="TestReservations-&gt;EmailAddress">
<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"/> <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=""/>
<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> <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=""/>
</g> <text text-anchor="middle" x="1926.43" y="-607.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">creates</text>
<!-- TestReservations&#45;&gt;EmailAddress --> </g>
<g id="edge19" class="edge"> <!-- DuplicateObjectException -->
<title>TestReservations&#45;&gt;EmailAddress</title> <g id="node16" class="node" pointer-events="visible" data-name="DuplicateObjectException">
<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"/> <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 xml:space="preserve" text-anchor="middle" x="1971.12" y="-587.58" font-family="Helvetica,Arial,sans-serif" font-size="14.00">creates</text> <text text-anchor="middle" x="2098" y="-853.5" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">exception</text>
</g> <text text-anchor="middle" x="2098" y="-836.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">DuplicateObjectException</text>
<!-- DuplicateObjectException --> </g>
<g id="node16" class="node"> <!-- TestReservations&#45;&gt;DuplicateObjectException -->
<title>DuplicateObjectException</title> <g id="edge20" class="edge" data-name="TestReservations-&gt;DuplicateObjectException">
<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> <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=""/>
<text xml:space="preserve" text-anchor="middle" x="2144" y="-808.7" font-family="Helvetica,Arial,sans-serif" font-size="14.00">DuplicateObjectException</text> <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=""/>
</g> <text text-anchor="middle" x="2118.6" y="-989" font-family="Helvetica,Arial,sans-serif" font-size="14.00" style="">catches</text>
<!-- TestReservations&#45;&gt;DuplicateObjectException --> </g>
<g id="edge20" class="edge"> </g>
<title>TestReservations&#45;&gt;DuplicateObjectException</title> </svg>
<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>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -3,10 +3,10 @@ digraph "Reservation System - Account Load" {
graph [ graph [
rankdir="TB", rankdir="TB",
splines=ortho, splines=ortho,
nodesep=1.0, nodesep=0.0,
ranksep=1.0, ranksep=1.0,
fontname="Arial", fontname="Times New Roman",
fontsize=12, fontsize=14,
label="Reservation System - Account Loading" label="Reservation System - Account Loading"
]; ];
@@ -15,7 +15,7 @@ digraph "Reservation System - Account Load" {
shape=record, shape=record,
style=filled, style=filled,
fillcolor=lightyellow, fillcolor=lightyellow,
fontname="Arial", fontname="Times New Roman",
fontsize=10 fontsize=10
]; ];
edge [ edge [
@@ -45,21 +45,8 @@ digraph "Reservation System - Account Load" {
DuplicateObjectException [label="<<exception>>\nDuplicateObjectException"]; DuplicateObjectException [label="<<exception>>\nDuplicateObjectException"];
IllegalArgumentException [label="<<exception>>\nIllegalArgumentException"]; 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 // 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 -> AccountList [arrowhead=diamond,label="manages 1"];
AccomodationManager -> DataRepository [label="uses"]; AccomodationManager -> DataRepository [label="uses"];

View File

@@ -1,260 +1,197 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <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">
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <g id="graph0" class="graph" transform="translate(4,650) scale(1)" data-name="Reservation System - Account Load">
<!-- Generated by graphviz version 2.42.4 (0)
--> <polygon fill="white" stroke="none" points="-4,4 -4,-650 988.53,-650 988.53,4 -4,4"/>
<!-- Title: Reservation System &#45; Account Load Pages: 1 --> <text text-anchor="middle" x="492.27" y="-8.2" font-family="Times New Roman" font-size="14">Reservation System - Account Loading</text>
<svg width="1610pt" height="757pt" <g id="clust1" class="cluster" data-name="cluster_reservationsystem">
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)"> <polygon fill="lightgrey" stroke="lightgrey" points="8,-316.4 8,-638 348,-638 348,-316.4 8,-316.4"/>
<title>Reservation System &#45; Account Load</title> <text text-anchor="middle" x="178" y="-621.4" font-family="Times New Roman" font-size="14">lodge.reservationsystem</text>
<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>
</g> </g>
<g id="clust2" class="cluster"> <g id="clust2" class="cluster" data-name="cluster_datamodel">
<title>cluster_datamodel</title>
<polygon fill="lightblue" stroke="lightblue" points="696,-29 696,-428 1418,-428 1418,-29 696,-29"/> <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="1057" y="-414.4" font-family="Arial" font-size="12.00">lodge.datamodel</text> <text text-anchor="middle" x="628.5" y="-433.6" font-family="Times New Roman" font-size="14">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> </g>
<!-- AccomodationManager --> <!-- AccomodationManager -->
<g id="node1" class="node"> <g id="node1" class="node" pointer-events="visible" data-name="AccomodationManager">
<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"/> <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="507" y="-566.5" font-family="Arial" font-size="10.00">AccomodationManager</text> <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="333.5,-559.5 680.5,-559.5 "/> <polyline fill="none" stroke="black" points="15.69,-584.7 340.31,-584.7"/>
<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="23.69" y="-571.7" font-family="Times New Roman" 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="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="341.5" y="-525.5" font-family="Arial" font-size="10.00">+ AddAccount(acct: 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="341.5" y="-514.5" font-family="Arial" font-size="10.00">+ UpdateAccount(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="341.5" y="-503.5" font-family="Arial" font-size="10.00">+ showAccountList()</text> <text text-anchor="start" x="23.69" y="-523.7" font-family="Times New Roman" font-size="10.00">+ showAccountList()</text>
</g> </g>
<!-- DataRepository --> <!-- DataRepository -->
<g id="node2" class="node"> <g id="node2" class="node" pointer-events="visible" data-name="DataRepository">
<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"/> <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="527" y="-401.5" font-family="Arial" font-size="10.00">DataRepository (Singleton)</text> <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="442.5,-394.5 611.5,-394.5 "/> <polyline fill="none" stroke="black" points="179.62,-412.9 340.38,-412.9"/>
<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="187.62" y="-399.9" font-family="Times New Roman" font-size="10.00">- directoryPath: String</text>
<text text-anchor="start" x="450.5" y="-371.5" font-family="Arial" font-size="10.00">&#45; instance: DataRepository</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="442.5,-364.5 611.5,-364.5 "/> <polyline fill="none" stroke="black" points="179.62,-380.9 340.38,-380.9"/>
<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="187.62" y="-367.9" font-family="Times New Roman" 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="187.62" y="-355.9" font-family="Times New Roman" 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="187.62" y="-343.9" font-family="Times New Roman" 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> <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> </g>
<!-- AccomodationManager&#45;&gt;DataRepository --> <!-- AccomodationManager&#45;&gt;DataRepository -->
<g id="edge7" class="edge"> <g id="edge2" class="edge" data-name="AccomodationManager-&gt;DataRepository">
<title>AccomodationManager&#45;&gt;DataRepository</title>
<path fill="none" stroke="black" d="M527,-496.15C527,-496.15 527,-423.72 527,-423.72"/> <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="530.5,-423.72 527,-413.72 523.5,-423.72 530.5,-423.72"/> <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="527" y="-452.8" font-family="Arial" font-size="9.00">uses</text> <text text-anchor="middle" x="228.51" y="-472.1" font-family="Arial" font-size="9.00">uses</text>
</g> </g>
<!-- Account --> <!-- Account -->
<g id="node3" class="node"> <g id="node3" class="node" pointer-events="visible" data-name="Account">
<title>Account</title>
<polygon fill="lightyellow" stroke="black" points="704,-158.5 704,-229.5 1010,-229.5 1010,-158.5 704,-158.5"/> <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="857" y="-217.5" font-family="Arial" font-size="10.00">Account</text> <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="704,-210.5 1010,-210.5 "/> <polyline fill="none" stroke="black" points="364.32,-221.1 653.68,-221.1"/>
<text text-anchor="start" x="712" y="-198.5" font-family="Arial" font-size="10.00">+ Account()</text> <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="712" y="-187.5" font-family="Arial" font-size="10.00">+ Account(phone: String, mailAddr: Address, email: EmailAddress)</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="712" y="-176.5" font-family="Arial" font-size="10.00">+ Write(acct: Account)</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="712" y="-165.5" font-family="Arial" font-size="10.00">+ checkValid()</text> <text text-anchor="start" x="372.32" y="-172.1" font-family="Times New Roman" font-size="10.00">+ checkValid()</text>
</g> </g>
<!-- AccomodationManager&#45;&gt;Account --> <!-- AccomodationManager&#45;&gt;Account -->
<g id="edge8" class="edge"> <g id="edge3" class="edge" data-name="AccomodationManager-&gt;Account">
<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"/> <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="693.99,-221.5 703.99,-218 693.99,-214.5 693.99,-221.5"/> <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="1073" y="-360.8" font-family="Arial" font-size="9.00">creates/updates</text> <text text-anchor="middle" x="580.02" y="-376.2" font-family="Arial" font-size="9.00">creates/updates</text>
</g> </g>
<!-- AccountList --> <!-- AccountList -->
<g id="node4" class="node"> <g id="node4" class="node" pointer-events="visible" data-name="AccountList">
<title>AccountList</title>
<polygon fill="lightyellow" stroke="black" points="704,-327.5 704,-398.5 896,-398.5 896,-327.5 704,-327.5"/> <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="800" y="-386.5" font-family="Arial" font-size="10.00">AccountList</text> <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="704,-379.5 896,-379.5 "/> <polyline fill="none" stroke="black" points="363.78,-396.9 546.22,-396.9"/>
<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="371.78" y="-383.9" font-family="Times New Roman" 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="371.78" y="-371.9" font-family="Times New Roman" 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="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="712" y="-334.5" font-family="Arial" font-size="10.00">+ showAccountList()</text> <text text-anchor="start" x="371.78" y="-347.9" font-family="Times New Roman" font-size="10.00">+ showAccountList()</text>
</g> </g>
<!-- AccomodationManager&#45;&gt;AccountList --> <!-- AccomodationManager&#45;&gt;AccountList -->
<g id="edge6" class="edge"> <g id="edge1" class="edge" data-name="AccomodationManager-&gt;AccountList">
<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"/> <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="691.77,-363 697.77,-359 703.77,-363 697.77,-367 691.77,-363"/> <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="745" y="-452.8" font-family="Arial" font-size="9.00">manages 1</text> <text text-anchor="middle" x="392.26" y="-472.1" font-family="Arial" font-size="9.00">manages 1</text>
</g> </g>
<!-- Exception --> <!-- Exception -->
<g id="node11" class="node"> <g id="node9" class="node" pointer-events="visible" data-name="Exception">
<title>Exception</title>
<polygon fill="lightyellow" stroke="black" points="258,-345 258,-381 318,-381 318,-345 258,-345"/> <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="288" y="-360.5" font-family="Arial" font-size="10.00">Exception</text> <text text-anchor="middle" x="937" y="-375.9" font-family="Times New Roman" font-size="10.00">Exception</text>
</g> </g>
<!-- AccomodationManager&#45;&gt;Exception --> <!-- AccomodationManager&#45;&gt;Exception -->
<g id="edge14" class="edge"> <g id="edge9" class="edge" data-name="AccomodationManager-&gt;Exception">
<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"/> <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="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"/> <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="312.5" y="-452.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text> <text text-anchor="middle" x="960.77" y="-472.1" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g> </g>
<!-- DataRepository&#45;&gt;Account --> <!-- DataRepository&#45;&gt;Account -->
<g id="edge13" class="edge"> <g id="edge8" class="edge" data-name="DataRepository-&gt;Account">
<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"/> <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="693.86,-209.5 703.86,-206 693.86,-202.5 693.86,-209.5"/> <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="609.5" y="-268.8" font-family="Arial" font-size="9.00">loads</text> <text text-anchor="middle" x="323.76" y="-280.3" font-family="Arial" font-size="9.00">loads</text>
</g> </g>
<!-- IOException --> <!-- IOException -->
<g id="node12" class="node"> <g id="node10" class="node" pointer-events="visible" data-name="IOException">
<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"/> <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="540" y="-54" font-family="Arial" font-size="10.00">IOException</text> <text text-anchor="middle" x="283" y="-58.3" font-family="Times New Roman" font-size="10.00">IOException</text>
</g> </g>
<!-- DataRepository&#45;&gt;IOException --> <!-- DataRepository&#45;&gt;IOException -->
<g id="edge18" class="edge"> <g id="edge13" class="edge" data-name="DataRepository-&gt;IOException">
<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"/> <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="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"/> <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="508.5" y="-191.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text> <text text-anchor="middle" x="303.77" y="-200.4" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g> </g>
<!-- Account&#45;&gt;DataRepository --> <!-- Account&#45;&gt;DataRepository -->
<g id="edge12" class="edge"> <g id="edge7" class="edge" data-name="Account-&gt;DataRepository">
<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"/> <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="584,-302.29 587.5,-312.29 591,-302.29 584,-302.29"/> <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="739" y="-268.8" font-family="Arial" font-size="9.00">uses for persistence</text> <text text-anchor="middle" x="394.27" y="-280.3" font-family="Arial" font-size="9.00">uses for persistence</text>
</g> </g>
<!-- Address --> <!-- Address -->
<g id="node5" class="node"> <g id="node5" class="node" pointer-events="visible" data-name="Address">
<title>Address</title>
<polygon fill="lightyellow" stroke="black" points="904,-37.5 904,-75.5 1190,-75.5 1190,-37.5 904,-37.5"/> <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="1047" y="-63.5" font-family="Arial" font-size="10.00">Address</text> <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="904,-56.5 1190,-56.5 "/> <polyline fill="none" stroke="black" points="628.66,-61.3 893.34,-61.3"/>
<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> <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> </g>
<!-- Account&#45;&gt;Address --> <!-- Account&#45;&gt;Address -->
<g id="edge10" class="edge"> <g id="edge5" class="edge" data-name="Account-&gt;Address">
<title>Account&#45;&gt;Address</title>
<path fill="none" stroke="black" d="M957,-158.23C957,-158.23 957,-85.58 957,-85.58"/> <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="960.5,-85.58 957,-75.58 953.5,-85.58 960.5,-85.58"/> <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="1019" y="-114.8" font-family="Arial" font-size="9.00">has mailing</text> <text text-anchor="middle" x="712.76" y="-120.5" font-family="Arial" font-size="9.00">has mailing</text>
</g> </g>
<!-- EmailAddress --> <!-- EmailAddress -->
<g id="node6" class="node"> <g id="node6" class="node" pointer-events="visible" data-name="EmailAddress">
<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"/> <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="1336" y="-63.5" font-family="Arial" font-size="10.00">EmailAddress</text> <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="1262.5,-56.5 1409.5,-56.5 "/> <polyline fill="none" stroke="black" points="364.3,-61.3 503.7,-61.3"/>
<text text-anchor="start" x="1270.5" y="-44.5" font-family="Arial" font-size="10.00">+ EmailAddress(email: String)</text> <text text-anchor="start" x="372.3" y="-48.3" font-family="Times New Roman" font-size="10.00">+ EmailAddress(email: String)</text>
</g> </g>
<!-- Account&#45;&gt;EmailAddress --> <!-- Account&#45;&gt;EmailAddress -->
<g id="edge11" class="edge"> <g id="edge6" class="edge" data-name="Account-&gt;EmailAddress">
<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"/> <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="1315,-85.57 1311.5,-75.57 1308,-85.57 1315,-85.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="1262" y="-114.8" font-family="Arial" font-size="9.00">has</text> <text text-anchor="middle" x="468.26" y="-120.5" font-family="Arial" font-size="9.00">has</text>
</g> </g>
<!-- IllegalArgumentException --> <!-- IllegalArgumentException -->
<g id="node8" class="node"> <g id="node8" class="node" pointer-events="visible" data-name="IllegalArgumentException">
<title>IllegalArgumentException</title>
<polygon fill="lightyellow" stroke="black" points="704,-38.5 704,-74.5 832,-74.5 832,-38.5 704,-38.5"/> <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="768" y="-54" font-family="Arial" font-size="10.00">IllegalArgumentException</text> <text text-anchor="middle" x="566" y="-58.3" font-family="Times New Roman" font-size="10.00">IllegalArgumentException</text>
</g> </g>
<!-- Account&#45;&gt;IllegalArgumentException --> <!-- Account&#45;&gt;IllegalArgumentException -->
<g id="edge16" class="edge"> <g id="edge11" class="edge" data-name="Account-&gt;IllegalArgumentException">
<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"/> <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="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"/> <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="841.5" y="-114.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text> <text text-anchor="middle" x="560.77" y="-120.5" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g> </g>
<!-- Account&#45;&gt;IOException --> <!-- Account&#45;&gt;IOException -->
<g id="edge17" class="edge"> <g id="edge12" class="edge" data-name="Account-&gt;IOException">
<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"/> <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="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"/> <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="668.5" y="-114.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text> <text text-anchor="middle" x="356.77" y="-120.5" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text>
</g> </g>
<!-- AccountList&#45;&gt;Account --> <!-- AccountList&#45;&gt;Account -->
<g id="edge9" class="edge"> <g id="edge4" class="edge" data-name="AccountList-&gt;Account">
<title>AccountList&#45;&gt;Account</title>
<path fill="none" stroke="black" d="M800,-327.16C800,-327.16 800,-241.79 800,-241.79"/> <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="800,-241.79 796,-235.79 800,-229.79 804,-235.79 800,-241.79"/> <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="864" y="-268.8" font-family="Arial" font-size="9.00">0..*</text> <text text-anchor="middle" x="466.75" y="-280.3" font-family="Arial" font-size="9.00">0..*</text>
</g> </g>
<!-- DuplicateObjectException --> <!-- DuplicateObjectException -->
<g id="node7" class="node"> <g id="node7" class="node" pointer-events="visible" data-name="DuplicateObjectException">
<title>DuplicateObjectException</title>
<polygon fill="lightyellow" stroke="black" points="1082,-176 1082,-212 1212,-212 1212,-176 1082,-176"/> <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="1147" y="-191.5" font-family="Arial" font-size="10.00">DuplicateObjectException</text> <text text-anchor="middle" x="716" y="-200.1" font-family="Times New Roman" font-size="10.00">DuplicateObjectException</text>
</g> </g>
<!-- AccountList&#45;&gt;DuplicateObjectException --> <!-- AccountList&#45;&gt;DuplicateObjectException -->
<g id="edge15" class="edge"> <g id="edge10" class="edge" data-name="AccountList-&gt;DuplicateObjectException">
<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"/> <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="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"/> <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="973.5" y="-268.8" font-family="Arial" font-size="9.00">&lt;&lt;throws&gt;&gt;</text> <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></g>
<!-- TestAccountLoad --> </svg>
<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>

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"];
}