diff --git a/README.md b/README.md index ef1891b..2b7a113 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,20 @@ Associations: Shows composition relationships (Customer has Address, Transaction Enumerations: InventoryType and TransactionOperationEnum Exceptions: four application exception classes extend RuntimeException Manager Classes: Singleton pattern managers with their collections -Collections: Custom list classes extending ArrayList \ No newline at end of file +Collections: Custom list classes extending ArrayList + + +Abstract base class (InventoryPiece) with 4 concrete implementations (Drawing, Painting, Print, Sculpture) +Enumerations (InventoryType, TransactionOperationEnum) +Manager classes (Singleton pattern): InventoryManager, CustomerManager, TransactionManager +Model classes: Customer, Address, Transaction +Collection classes: InventoryList, CustomerList, TransactionList +Repository: DataRepository for persistence +Exception classes: 4 custom runtime exceptions + +Relationships shown: + +Inheritance (empty arrow heads) +Composition (diamond arrow heads) +Associations (open arrow heads) +Dependencies (dashed lines) \ No newline at end of file diff --git a/uml/classdiagram.dot b/uml/classdiagram.dot index d1cdbf3..a79dc99 100644 --- a/uml/classdiagram.dot +++ b/uml/classdiagram.dot @@ -1,91 +1,90 @@ digraph InventoryManagementSystem { rankdir=TB; - node [shape=record, fontname="Arial", fontsize=10]; - edge [fontname="Arial", fontsize=9]; + node [shape=record, fontname=Arial, fontsize=10]; + edge [fontname=Arial, fontsize=9]; - // Core Model Classes - Address [label="{Address|+ street: String\l+ city: String\l+ state: String\l+ zip: String\l|+ getStreet(): String\l+ setStreet(String): void\l+ getCity(): String\l+ setCity(String): void\l+ getState(): String\l+ setState(String): void\l+ getZip(): String\l+ setZip(String): void\l+ hashCode(): int\l+ equals(Object): boolean\l+ toString(): String\l}"]; + // Abstract and Base Classes + InventoryPiece [label="{InventoryPiece\n(abstract)|+ id: String\n+ price: float\n+ created: ZonedDateTime\n+ title: String\n+ description: String\n+ Author: String\n- iventoryType: InventoryType|+ getId(): String\n+ setId(String): void\n+ getPrice(): float\n+ setPrice(float): void\n+ getCreated(): ZonedDateTime\n+ setCreated(ZonedDateTime): void\n+ getTitle(): String\n+ setTitle(String): void\n+ getDescription(): String\n+ setDescription(String): void\n+ getAuthor(): String\n+ setAuthor(String): void\n+ isArt(InventoryPiece): Boolean\n+ getType(): String}", style=filled, fillcolor=lightblue]; - Customer [label="{Customer|# id: String\l# updated: ZonedDateTime\l- phone: String\l- mailing: Address\l- email: String\l- nameFirst: String\l- nameLast: String\l|+ Customer()\l+ Customer(String, String, String, String)\l+ getId(): String\l+ setId(String): void\l+ getPhone(): String\l+ setPhone(String): void\l+ getMailing(): Address\l+ setMailing(Address): void\l+ getEmail(): String\l+ setEmail(String): void\l+ getNameFirst(): String\l+ setNameFirst(String): void\l+ getNameLast(): String\l+ setNameLast(String): void\l}"]; - - InventoryPiece [label="{«abstract»\lInventoryPiece|+ id: String\l+ price: float\l+ created: ZonedDateTime\l+ title: String\l+ description: String\l+ Author: String\l- iventoryType: InventoryType\l|+ InventoryPiece()\l+ InventoryPiece(InventoryType)\l+ isArt(InventoryPiece): Boolean\l+ getType(): String\l+ getId(): String\l+ setId(String): void\l+ getPrice(): float\l+ setPrice(float): void\l+ getCreated(): ZonedDateTime\l+ setCreated(ZonedDateTime): void\l+ getTitle(): String\l+ setTitle(String): void\l+ getDescription(): String\l+ setDescription(String): void\l+ getAuthor(): String\l+ setAuthor(String): void\l}"]; - - Transaction [label="{Transaction|- id: String\l- created: ZonedDateTime\l- completed: ZonedDateTime\l- customerId: String\l- shipToAddress: Address\l- customerInventoryList: InventoryList\l- attributes: JsonArray\l|+ Transaction()\l+ getId(): String\l+ setId(String): void\l+ getCreated(): ZonedDateTime\l+ setCreated(ZonedDateTime): void\l+ getCompleted(): ZonedDateTime\l+ setCompleted(ZonedDateTime): void\l}"]; - - // Inventory Subclasses - Drawing [label="{Drawing|+ style: String\l+ technique: String\l+ category: String\l|+ Drawing()\l}"]; - - Painting [label="{Painting|- height: int\l- width: int\l- style: String\l- technique: String\l- category: String\l|+ Painting()\l}"]; - - Print [label="{Print|- openEditionType: String\l- category: String\l|+ Print()\l+ Print(String, String)\l+ getOpenEditionType(): String\l+ setOpenEditionType(String): void\l+ getCategory(): String\l+ setCategory(String): void\l}"]; - - Sculpture [label="{Sculpture|- material: String\l- weight: float\l|+ Sculpture()\l}"]; + // Concrete Inventory Classes + Drawing [label="{Drawing|+ style: String\n+ technique: String\n+ category: String|+ Drawing()}", style=filled, fillcolor=lightgreen]; + + Painting [label="{Painting|+ height: int\n+ width: int\n+ style: String\n+ technique: String\n+ category: String|+ Painting()}", style=filled, fillcolor=lightgreen]; + + Print [label="{Print|+ openEditionType: String\n+ category: String|+ Print()\n+ Print(String, String)\n+ getOpenEditionType(): String\n+ setOpenEditionType(String): void\n+ getCategory(): String\n+ setCategory(String): void}", style=filled, fillcolor=lightgreen]; + + Sculpture [label="{Sculpture|+ material: String\n+ weight: float|+ Sculpture()}", style=filled, fillcolor=lightgreen]; // Enums - InventoryType [label="{«enumeration»\lInventoryType|PAINTING\lDRAWING\lPRINT\lSCULPTURE\l}"]; + InventoryType [label="{\\<\\\\>\nInventoryType|PAINTING\nDRAWING\nPRINT\nSCULPTURE}", style=filled, fillcolor=lightyellow]; + + TransactionOperationEnum [label="{\\<\\\\>\nTransactionOperationEnum|Completed\nDraft\nPricing\nRemoved\nShipping}", style=filled, fillcolor=lightyellow]; - TransactionOperationEnum [label="{«enumeration»\lTransactionOperationEnum|Completed\lDraft\lPricing\lRemoved\lShipping\l}"]; + // Customer Related Classes + Customer [label="{Customer|# id: String\n# updated: ZonedDateTime\n- phone: String\n- mailing: Address\n- email: String\n- nameFirst: String\n- nameLast: String|+ Customer()\n+ Customer(String, String, String, String)\n+ getEmail(): String\n+ getId(): String\n+ setId(String): void\n+ getPhone(): String\n+ setPhone(String): void\n+ getMailing(): Address\n+ setMailing(Address): void\n+ setEmail(String): void\n+ getNameFirst(): String\n+ setNameFirst(String): void\n+ getNameLast(): String\n+ setNameLast(String): void}", style=filled, fillcolor=lightcyan]; - // Collections - CustomerList [label="{CustomerList|+ CustomerList()\l}"]; - InventoryList [label="{InventoryList|+ InventoryList()\l}"]; - TransactionList [label="{TransactionList|+ TransactionList()\l+ add(Transaction): boolean\l}"]; + Address [label="{Address|- street: String\n- city: String\n- state: String\n- zip: String|+ Address()\n+ Address(String, String, String, String)\n+ getStreet(): String\n+ setStreet(String): void\n+ getCity(): String\n+ setCity(String): void\n+ getState(): String\n+ setState(String): void\n+ getZip(): String\n+ setZip(String): void\n+ hashCode(): int\n+ equals(Object): boolean\n+ toString(): String}", style=filled, fillcolor=white]; - // Managers - CustomerManager [label="{CustomerManager|- INSTANCE: CustomerManager\l+ CUSTOMERS: CustomerList\l|+ getInstance(): CustomerManager\l+ add(Customer): boolean\l- check(Customer): void\l+ findById(String): Customer\l+ findByEmail(String): Customer\l}"]; + // Transaction + Transaction [label="{Transaction|- id: String\n- created: ZonedDateTime\n- completed: ZonedDateTime\n- customerId: String\n- shipToAddress: Address\n- customerInventoryList: InventoryList\n- attributes: JsonArray|+ Transaction()\n+ getId(): String\n+ setId(String): void\n+ getCreated(): ZonedDateTime\n+ setCreated(ZonedDateTime): void\n+ getCompleted(): ZonedDateTime\n+ setCompleted(ZonedDateTime): void}", style=filled, fillcolor=lightcyan]; - InventoryManager [label="{InventoryManager|- INSTANCE: InventoryManager\l+ INVENTORY: InventoryList\l|+ getInstance(): InventoryManager\l+ getArtPieceTypes(): Set\l+ add(InventoryPiece): void\l+ find(String): InventoryPiece\l+ update(InventoryPiece): InventoryPiece\l+ save(): void\l+ loadAll(): void\l+ Remove(InventoryPiece): void\l}"]; + // List Classes (Collections) + InventoryList [label="{InventoryList|\\\\>|+ InventoryList()}", style=filled, fillcolor=wheat]; + + CustomerList [label="{CustomerList|\\\\>|+ CustomerList()}", style=filled, fillcolor=wheat]; + + TransactionList [label="{TransactionList|\\\\>|+ TransactionList()\n+ add(Transaction): boolean}", style=filled, fillcolor=wheat]; - TransactionManager [label="{TransactionManager|- INSTANCE: TransactionManager\l+ TRANSACTIONS: TransactionList\l|+ getInstance(): TransactionManager\l+ TransactRequest(Customer, InventoryList, Transaction): Transaction\l+ compute(Transaction, TransactionOperationEnum): void\l+ compute(Transaction): void\l+ complete(Transaction): void\l+ findByCustomerEmail(String): TransactionList\l+ findByTransactionId(String): TransactionList\l+ findByTransactionDate(ZonedDateTime): TransactionList\l+ remove(Transaction): void\l+ save(): void\l}"]; + // Manager Classes (Singletons) + InventoryManager [label="{InventoryManager|+ INVENTORY: InventoryList\n- INSTANCE: InventoryManager|+ getInstance(): InventoryManager\n+ getArtPieceTypes(): Set\\\n+ add(InventoryPiece): void\n+ find(String): InventoryPiece\n+ update(InventoryPiece): InventoryPiece\n+ save(): void\n+ loadAll(): void\n+ Remove(InventoryPiece): void}", style=filled, fillcolor=lightpink]; + + CustomerManager [label="{CustomerManager|+ CUSTOMERS: CustomerList\n- INSTANCE: CustomerManager|+ getInstance(): CustomerManager\n+ add(Customer): boolean\n- check(Customer): void\n+ findById(String): Customer\n+ findByEmail(String): Customer}", style=filled, fillcolor=lightpink]; + + TransactionManager [label="{TransactionManager|+ TRANSACTIONS: TransactionList\n- INSTANCE: TransactionManager|+ getInstance(): TransactionManager\n+ TransactRequest(Customer, InventoryList, Transaction): Transaction\n+ compute(Transaction, TransactionOperationEnum): void\n+ compute(Transaction): void\n+ complete(Transaction): void\n+ findByCustomerEmail(String): TransactionList\n+ findByTransactionId(String): TransactionList\n+ findByTransactionDate(ZonedDateTime): TransactionList\n+ remove(Transaction): void\n+ save(): void}", style=filled, fillcolor=lightpink]; - DataRepository [label="{DataRepository|- INSTANCE: DataRepository\l|+ getInstance(): DataRepository\l+ generateRandomID(int): String\l+ generateRandom10DigitID(): String\l+ WalkFileSystemTree(InventoryManager): void\l+ WalkFileSystemTree(CustomerManager): void\l+ WalkFileSystemTree(TransactionManager): void\l+ mapJsonToObjectList(String, Class): List\l}"]; + // Repository + DataRepository [label="{DataRepository|+ INSTANCE: DataRepository|+ getInstance(): DataRepository\n+ generateRandomID(int): String\n+ generateRandom10DigitID(): String\n+ WalkFileSystemTree(InventoryManager): void\n+ WalkFileSystemTree(CustomerManager): void\n+ WalkFileSystemTree(TransactionManager): void\n- serialize_deserialize(): void\n+ mapJsonToObjectList(String, Class\\): List\\}", style=filled, fillcolor=orange]; - // Exceptions - InvalidRecordDataException [label="{InvalidRecordDataException|+ InvalidRecordDataException(String)\l+ InvalidRecordDataException(String, Throwable)\l+ InvalidRecordDataException(Throwable)\l}"]; + // Exception Classes + InvalidArtOperationException [label="{InvalidArtOperationException|\\|+ InvalidArtOperationException(String)\n+ InvalidArtOperationException(String, Throwable)\n+ InvalidArtOperationException(Throwable)}", style=filled, fillcolor=tomato]; + + InvalidRecordDataException [label="{InvalidRecordDataException|\\|+ InvalidRecordDataException(String)\n+ InvalidRecordDataException(String, Throwable)\n+ InvalidRecordDataException(Throwable)}", style=filled, fillcolor=tomato]; + + InvalidTransactionException [label="{InvalidTransactionException|\\|+ InvalidTransactionException(String)\n+ InvalidTransactionException(String, Throwable)\n+ InvalidTransactionException(Throwable)}", style=filled, fillcolor=tomato]; + + InvalidTransOperationException [label="{InvalidTransOperationException|\\|+ InvalidTransOperationException(String)\n+ InvalidTransOperationException(String, Throwable)\n+ InvalidTransOperationException(Throwable)}", style=filled, fillcolor=tomato]; - InvalidArtOperationException [label="{InvalidArtOperationException|+ InvalidArtOperationException(String)\l+ InvalidArtOperationException(String, Throwable)\l+ InvalidArtOperationException(Throwable)\l}"]; - - InvalidTransactionException [label="{InvalidTransactionException|+ InvalidTransactionException(String)\l+ InvalidTransactionException(String, Throwable)\l+ InvalidTransactionException(Throwable)\l}"]; - - InvalidTransOperationException [label="{InvalidTransOperationException|+ InvalidTransOperationException(String)\l+ InvalidTransOperationException(String, Throwable)\l+ InvalidTransOperationException(Throwable)\l}"]; - - // Inheritance relationships + // Inheritance Relationships Drawing -> InventoryPiece [arrowhead=empty, label="extends"]; Painting -> InventoryPiece [arrowhead=empty, label="extends"]; Print -> InventoryPiece [arrowhead=empty, label="extends"]; Sculpture -> InventoryPiece [arrowhead=empty, label="extends"]; - CustomerList -> "ArrayList" [arrowhead=empty, label="extends"]; - InventoryList -> "ArrayList" [arrowhead=empty, label="extends"]; - TransactionList -> "ArrayList" [arrowhead=empty, label="extends"]; - - InvalidRecordDataException -> RuntimeException [arrowhead=empty, label="extends"]; - InvalidArtOperationException -> RuntimeException [arrowhead=empty, label="extends"]; - InvalidTransactionException -> RuntimeException [arrowhead=empty, label="extends"]; - InvalidTransOperationException -> RuntimeException [arrowhead=empty, label="extends"]; - // Associations - Customer -> Address [arrowhead=open, label="mailing"]; + InventoryPiece -> InventoryType [arrowhead=open, style=dashed, label="uses"]; + Customer -> Address [arrowhead=diamond, label="has"]; Transaction -> Address [arrowhead=open, label="shipToAddress"]; Transaction -> InventoryList [arrowhead=open, label="customerInventoryList"]; - CustomerManager -> CustomerList [arrowhead=open, label="CUSTOMERS"]; - InventoryManager -> InventoryList [arrowhead=open, label="INVENTORY"]; - TransactionManager -> TransactionList [arrowhead=open, label="TRANSACTIONS"]; - - InventoryPiece -> InventoryType [arrowhead=open, label="iventoryType"]; - - // Dependencies - CustomerManager -> InvalidRecordDataException [style=dashed, arrowhead=open, label="throws"]; - DataRepository -> InventoryManager [style=dashed, arrowhead=open]; - DataRepository -> CustomerManager [style=dashed, arrowhead=open]; - DataRepository -> TransactionManager [style=dashed, arrowhead=open]; - TransactionManager -> Customer [style=dashed, arrowhead=open]; - TransactionManager -> TransactionOperationEnum [style=dashed, arrowhead=open]; - - // Invisible nodes for layout - "ArrayList" [shape=plaintext, label=""]; - "ArrayList" [shape=plaintext, label=""]; - "ArrayList" [shape=plaintext, label=""]; - RuntimeException [shape=plaintext, label=""]; -} + // Manager to List relationships + InventoryManager -> InventoryList [arrowhead=diamond, label="INVENTORY"]; + CustomerManager -> CustomerList [arrowhead=diamond, label="CUSTOMERS"]; + TransactionManager -> TransactionList [arrowhead=diamond, label="TRANSACTIONS"]; + + // List contains relationships + InventoryList -> InventoryPiece [arrowhead=diamond, style=dashed, label="contains"]; + CustomerList -> Customer [arrowhead=diamond, style=dashed, label="contains"]; + TransactionList -> Transaction [arrowhead=diamond, style=dashed, label="contains"]; + + // Manager relationships + DataRepository -> InventoryManager [arrowhead=open, style=dashed, label="uses"]; + DataRepository -> CustomerManager [arrowhead=open, style=dashed, label="uses"]; + DataRepository -> TransactionManager [arrowhead=open, style=dashed, label="uses"]; + + TransactionManager -> TransactionOperationEnum [arrowhead=open, style=dashed, label="uses"]; + CustomerManager -> InvalidRecordDataException [arrowhead=open, style=dashed, label="throws"]; + + // Transaction relationships + TransactionManager -> Customer [arrowhead=open, style=dashed, label="uses"]; + TransactionManager -> InventoryList [arrowhead=open, style=dashed, label="uses"]; +} \ No newline at end of file diff --git a/uml/classdiagram.png b/uml/classdiagram.png new file mode 100644 index 0000000..2668d6f Binary files /dev/null and b/uml/classdiagram.png differ diff --git a/uml/classdiagram.svg b/uml/classdiagram.svg index 8089f2c..e648e68 100644 --- a/uml/classdiagram.svg +++ b/uml/classdiagram.svg @@ -1,504 +1,438 @@ - - + + - - - - - -Address - -+ street: String -+ city: String -+ state: String -+ zip: String - -+ getStreet(): String -+ setStreet(String): void -+ getCity(): String -+ setCity(String): void -+ getState(): String -+ setState(String): void -+ getZip(): String -+ setZip(String): void -+ hashCode(): int -+ equals(Object): boolean -+ toString(): String - - - - - -Customer - -# id: String -# updated: ZonedDateTime -- phone: String -- mailing: Address -- email: String -- nameFirst: String -- nameLast: String - -+ Customer() -+ Customer(String, String, String, String) -+ getId(): String -+ setId(String): void -+ getPhone(): String -+ setPhone(String): void -+ getMailing(): Address -+ setMailing(Address): void -+ getEmail(): String -+ setEmail(String): void -+ getNameFirst(): String -+ setNameFirst(String): void -+ getNameLast(): String -+ setNameLast(String): void - - - - - - -mailing - + - + - -«abstract» -InventoryPiece - -+ id: String -+ price: float -+ created: ZonedDateTime -+ title: String -+ description: String -+ Author: String -- iventoryType: InventoryType - -+ InventoryPiece() -+ InventoryPiece(InventoryType) -+ isArt(InventoryPiece): Boolean -+ getType(): String -+ getId(): String -+ setId(String): void -+ getPrice(): float -+ setPrice(float): void -+ getCreated(): ZonedDateTime -+ setCreated(ZonedDateTime): void -+ getTitle(): String -+ setTitle(String): void -+ getDescription(): String -+ setDescription(String): void -+ getAuthor(): String -+ setAuthor(String): void + +InventoryPiece +(abstract) + ++ id: String ++ price: float ++ created: ZonedDateTime ++ title: String ++ description: String ++ Author: String +- iventoryType: InventoryType + ++ getId(): String ++ setId(String): void ++ getPrice(): float ++ setPrice(float): void ++ getCreated(): ZonedDateTime ++ setCreated(ZonedDateTime): void ++ getTitle(): String ++ setTitle(String): void ++ getDescription(): String ++ setDescription(String): void ++ getAuthor(): String ++ setAuthor(String): void ++ isArt(InventoryPiece): Boolean ++ getType(): String - + - -«enumeration» -InventoryType - -PAINTING -DRAWING -PRINT -SCULPTURE + +InventoryType - + - - -iventoryType - - - - - -Transaction - -- id: String -- created: ZonedDateTime -- completed: ZonedDateTime -- customerId: String -- shipToAddress: Address -- customerInventoryList: InventoryList -- attributes: JsonArray - -+ Transaction() -+ getId(): String -+ setId(String): void -+ getCreated(): ZonedDateTime -+ setCreated(ZonedDateTime): void -+ getCompleted(): ZonedDateTime -+ setCompleted(ZonedDateTime): void - - - - - - -shipToAddress - - - - - -InventoryList - -+ InventoryList() - - - - - - -customerInventoryList + + +uses - + - -Drawing - -+ style: String -+ technique: String -+ category: String - -+ Drawing() + +Drawing + ++ style: String ++ technique: String ++ category: String + ++ Drawing() - - -extends + + +extends - + - -Painting - -- height: int -- width: int -- style: String -- technique: String -- category: String - -+ Painting() + +Painting + ++ height: int ++ width: int ++ style: String ++ technique: String ++ category: String + ++ Painting() - - -extends + + +extends - + - -Print - -- openEditionType: String -- category: String - -+ Print() -+ Print(String, String) -+ getOpenEditionType(): String -+ setOpenEditionType(String): void -+ getCategory(): String -+ setCategory(String): void + +Print + ++ openEditionType: String ++ category: String + ++ Print() ++ Print(String, String) ++ getOpenEditionType(): String ++ setOpenEditionType(String): void ++ getCategory(): String ++ setCategory(String): void - - -extends + + +extends - + - -Sculpture - -- material: String -- weight: float - -+ Sculpture() + +Sculpture + ++ material: String ++ weight: float + ++ Sculpture() - - -extends + + +extends - + - -«enumeration» -TransactionOperationEnum - -Completed -Draft -Pricing -Removed -Shipping + +TransactionOperationEnum + + + + + +Customer + +# id: String +# updated: ZonedDateTime +- phone: String +- mailing: Address +- email: String +- nameFirst: String +- nameLast: String + ++ Customer() ++ Customer(String, String, String, String) ++ getEmail(): String ++ getId(): String ++ setId(String): void ++ getPhone(): String ++ setPhone(String): void ++ getMailing(): Address ++ setMailing(Address): void ++ setEmail(String): void ++ getNameFirst(): String ++ setNameFirst(String): void ++ getNameLast(): String ++ setNameLast(String): void + + + + + +Address + +- street: String +- city: String +- state: String +- zip: String + ++ Address() ++ Address(String, String, String, String) ++ getStreet(): String ++ setStreet(String): void ++ getCity(): String ++ setCity(String): void ++ getState(): String ++ setState(String): void ++ getZip(): String ++ setZip(String): void ++ hashCode(): int ++ equals(Object): boolean ++ toString(): String + + + + + + +has + + + + + +Transaction + +- id: String +- created: ZonedDateTime +- completed: ZonedDateTime +- customerId: String +- shipToAddress: Address +- customerInventoryList: InventoryList +- attributes: JsonArray + ++ Transaction() ++ getId(): String ++ setId(String): void ++ getCreated(): ZonedDateTime ++ setCreated(ZonedDateTime): void ++ getCompleted(): ZonedDateTime ++ setCompleted(ZonedDateTime): void + + + + + + +shipToAddress + + + + + +InventoryList + + + + + + +customerInventoryList + + + + + + +contains - + - -CustomerList - -+ CustomerList() + +CustomerList - - + + - - - - - - -extends - - - - - - - - - - -extends + + +contains - -TransactionList - -+ TransactionList() -+ add(Transaction): boolean + +TransactionList - - + + + + +contains - - + + - - -extends + +InventoryManager + ++ INVENTORY: InventoryList +- INSTANCE: InventoryManager + + + + + + + +INVENTORY - + - -CustomerManager - -- INSTANCE: CustomerManager -+ CUSTOMERS: CustomerList - -+ getInstance(): CustomerManager -+ add(Customer): boolean -- check(Customer): void -+ findById(String): Customer -+ findByEmail(String): Customer + +CustomerManager + ++ CUSTOMERS: CustomerList +- INSTANCE: CustomerManager + ++ getInstance(): CustomerManager ++ add(Customer): boolean +- check(Customer): void ++ findById(String): Customer ++ findByEmail(String): Customer - + - - -CUSTOMERS + + +CUSTOMERS - + - -InvalidRecordDataException - -+ InvalidRecordDataException(String) -+ InvalidRecordDataException(String, Throwable) -+ InvalidRecordDataException(Throwable) + +InvalidRecordDataException + + ++ InvalidRecordDataException(String) ++ InvalidRecordDataException(String, Throwable) ++ InvalidRecordDataException(Throwable) - - -throws - - - - - -InventoryManager - -- INSTANCE: InventoryManager -+ INVENTORY: InventoryList - -+ getInstance(): InventoryManager -+ getArtPieceTypes(): Set -+ add(InventoryPiece): void -+ find(String): InventoryPiece -+ update(InventoryPiece): InventoryPiece -+ save(): void -+ loadAll(): void -+ Remove(InventoryPiece): void - - - - - - -INVENTORY + + +throws - -TransactionManager - -- INSTANCE: TransactionManager -+ TRANSACTIONS: TransactionList - -+ getInstance(): TransactionManager -+ TransactRequest(Customer, InventoryList, Transaction): Transaction -+ compute(Transaction, TransactionOperationEnum): void -+ compute(Transaction): void -+ complete(Transaction): void -+ findByCustomerEmail(String): TransactionList -+ findByTransactionId(String): TransactionList -+ findByTransactionDate(ZonedDateTime): TransactionList -+ remove(Transaction): void -+ save(): void - - - - - - + +TransactionManager + ++ TRANSACTIONS: TransactionList +- INSTANCE: TransactionManager + ++ getInstance(): TransactionManager ++ TransactRequest(Customer, InventoryList, Transaction): Transaction ++ compute(Transaction, TransactionOperationEnum): void ++ compute(Transaction): void ++ complete(Transaction): void ++ findByCustomerEmail(String): TransactionList ++ findByTransactionId(String): TransactionList ++ findByTransactionDate(ZonedDateTime): TransactionList ++ remove(Transaction): void ++ save(): void - + - - + + +uses + + + + + + +uses + + + + + + +uses - + - - -TRANSACTIONS + + +TRANSACTIONS - -DataRepository - -- INSTANCE: DataRepository - -+ getInstance(): DataRepository -+ generateRandomID(int): String -+ generateRandom10DigitID(): String -+ WalkFileSystemTree(InventoryManager): void -+ WalkFileSystemTree(CustomerManager): void -+ WalkFileSystemTree(TransactionManager): void -+ mapJsonToObjectList(String, Class): List - - - - - - + +DataRepository - + - - + + +uses + + + + + + +uses - + - - - - - - - - - - - - -extends + + +uses - + - -InvalidArtOperationException - -+ InvalidArtOperationException(String) -+ InvalidArtOperationException(String, Throwable) -+ InvalidArtOperationException(Throwable) - - - - - - -extends + +InvalidArtOperationException + + ++ InvalidArtOperationException(String) ++ InvalidArtOperationException(String, Throwable) ++ InvalidArtOperationException(Throwable) - -InvalidTransactionException - -+ InvalidTransactionException(String) -+ InvalidTransactionException(String, Throwable) -+ InvalidTransactionException(Throwable) - - - - - - -extends + +InvalidTransactionException + + ++ InvalidTransactionException(String) ++ InvalidTransactionException(String, Throwable) ++ InvalidTransactionException(Throwable) - -InvalidTransOperationException - -+ InvalidTransOperationException(String) -+ InvalidTransOperationException(String, Throwable) -+ InvalidTransOperationException(Throwable) - - - - - - -extends + +InvalidTransOperationException + + ++ InvalidTransOperationException(String) ++ InvalidTransOperationException(String, Throwable) ++ InvalidTransOperationException(Throwable) \ No newline at end of file