From f81d6ebd0ed2238f3e0e41d241a917740c75bb50 Mon Sep 17 00:00:00 2001 From: Sherwin Price Date: Thu, 30 Oct 2025 13:13:30 -0400 Subject: [PATCH] updates --- Api/src/main/java/edu/inventorym/Api.java | 35 ++++--- Api/src/resources/db/inventory.json | 56 ----------- .../edu/inventorym/model/DataRepository.java | 37 ++++++- .../inventorym/model/InventoryManager.java | 7 +- uml/classdiagram3.dot | 99 +++++++++++++++++++ 5 files changed, 161 insertions(+), 73 deletions(-) delete mode 100644 Api/src/resources/db/inventory.json create mode 100644 uml/classdiagram3.dot diff --git a/Api/src/main/java/edu/inventorym/Api.java b/Api/src/main/java/edu/inventorym/Api.java index 54cbf64..a41cccf 100644 --- a/Api/src/main/java/edu/inventorym/Api.java +++ b/Api/src/main/java/edu/inventorym/Api.java @@ -34,22 +34,25 @@ public interface Api { * is not already in the inventory before adding */ - /* Add Inventory */ - - InventoryManager.getInstance().add(make(new Drawing())); - InventoryManager.getInstance().add(make(new Print())); - InventoryManager.getInstance().add(make(new Painting())); - InventoryManager.getInstance().add(make(new Sculpture())); - InventoryManager.getInstance().add(make(new Sculpture())); - InventoryManager.getInstance().add(make(new Sculpture())); - + /* Inventory pieces */ + InventoryManager.getInstance().load(); + if (InventoryManager.getInstance().INVENTORY.isEmpty()) { + /* Add Inventory */ + InventoryManager.getInstance().add(make(new Drawing())); + InventoryManager.getInstance().add(make(new Print())); + InventoryManager.getInstance().add(make(new Painting())); + InventoryManager.getInstance().add(make(new Sculpture())); + InventoryManager.getInstance().add(make(new Sculpture())); + InventoryManager.getInstance().add(make(new Sculpture())); + } + /* Customers */ CustomerManager.getInstance().load(); if (CustomerManager.getInstance().CUSTOMERS.isEmpty()) { /* Add Customer */ CustomerManager.getInstance().add(new Customer("Kate", "Demsey", "310-676-4844", "kate@museum.com")); CustomerManager.getInstance().add(new Customer("Jim", "Gumbly", "203-676-4844", "jim@homedeco.com")); CustomerManager.getInstance().add(new Customer("Evan", "Hao", "203-676-8943", "evan@homedeco.com")); - + /* Update Customer List */ CustomerManager.getInstance().save(); } @@ -62,17 +65,25 @@ public interface Api { InventoryPiece art = imgr.INVENTORY.getLast(); InventoryPiece piece = imgr.find(art.getId()); imgr.Remove(piece); + imgr.save(); System.out.println(String.format("Removed 1 Art Pieces from INVENTORY: count %d", imgr.INVENTORY.size())); /* * 3. Return a list of all art objects from inventory */ - System.out.println( "============= Inventory List ==============="); + System.out.println("============= Inventory List ==============="); imgr.INVENTORY.forEach(System.out::println); - System.out.println( "\n"); + System.out.println("\n"); + + if (imgr.INVENTORY.isEmpty()) { + System.out.println(String.format("%s: No Inventoried Art Piecies Available !!!. ", Api.class)); + return; + } CustomerManager cmgr = CustomerManager.getInstance(); Customer customer = cmgr.findByEmail("kate@museum.com"); InventoryList customerCart = new InventoryList(); + customerCart.add(imgr.INVENTORY.getFirst()); + customerCart.add(imgr.INVENTORY.getLast()); TransactionManager tmgr = TransactionManager.getInstance(); diff --git a/Api/src/resources/db/inventory.json b/Api/src/resources/db/inventory.json deleted file mode 100644 index c20e812..0000000 --- a/Api/src/resources/db/inventory.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "Author": "Dave Janson", - "author": "Dave Janson", - "created": "2025-10-30T10:47:09.3038539-04:00[America/New_York]", - "description": "East Market Square find. Local Author.", - "id": "4187213045", - "price": 10.99, - "title": "Windy Rowing", - "type": "DRAWING" - }, - { - "Author": "Dave Janson", - "author": "Dave Janson", - "created": "2025-10-30T10:47:13.3647577-04:00[America/New_York]", - "description": "East Market Square find. Local Author.", - "id": "3284384487", - "price": 10.99, - "title": "Different day same thing", - "type": "PRINT" - }, - { - "Author": "Dave Janson", - "author": "Dave Janson", - "created": "2025-10-30T10:47:14.3174866-04:00[America/New_York]", - "description": "East Market Square find. Local Author.", - "id": "3420570978", - "price": 10.99, - "title": "Walking by the beach.", - "type": "PAINTING", - "height": 0, - "width": 0 - }, - { - "Author": "Dave Janson", - "author": "Dave Janson", - "created": "2025-10-30T10:47:14.9196999-04:00[America/New_York]", - "description": "East Market Square find. Local Author.", - "id": "4652544628", - "price": 10.99, - "title": "Jolly Romp", - "type": "SCULPTURE", - "weight": 1.0 - }, - { - "Author": "Dave Janson", - "author": "Dave Janson", - "created": "2025-10-30T10:47:15.4510495-04:00[America/New_York]", - "description": "East Market Square find. Local Author.", - "id": "3160354998", - "price": 10.99, - "title": "Jolly Romp", - "type": "SCULPTURE", - "weight": 1.0 - } -] \ No newline at end of file diff --git a/Model/src/main/java/edu/inventorym/model/DataRepository.java b/Model/src/main/java/edu/inventorym/model/DataRepository.java index 44f6753..d3a50d5 100644 --- a/Model/src/main/java/edu/inventorym/model/DataRepository.java +++ b/Model/src/main/java/edu/inventorym/model/DataRepository.java @@ -15,12 +15,15 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.SecureRandom; +import java.util.ArrayList; import java.util.Base64; import java.util.List; import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonException; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; @@ -144,10 +147,38 @@ public class DataRepository { result = in.readAllAsString(); } - List inventory = mapJsonToObjectList(result, InventoryPiece.class); + List inventory; - manager.INVENTORY.clear(); - manager.INVENTORY.addAll(inventory); + try (var reader = Json.createReader(new StringReader(result)); + Jsonb jsonb = JsonbBuilder.create()) { + JsonArray jsonArray = reader.readArray(); + + inventory = new ArrayList(); + + jsonArray.forEach(item -> { + try { + switch (item.asJsonObject().getString("type")) { + case "DRAWING": + inventory.add(jsonb.fromJson(item.toString(), Drawing.class)); + break; + case "PAINTING": + inventory.add(jsonb.fromJson(item.toString(), Painting.class)); + break; + case "PRINT": + inventory.add(jsonb.fromJson(item.toString(), Print.class)); + break; + case "SCULPTURE": + inventory.add(jsonb.fromJson(item.toString(), Sculpture.class)); + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + }); + + manager.INVENTORY.clear(); + manager.INVENTORY.addAll(inventory); + } } public final static class getRepositoryConfig { diff --git a/Model/src/main/java/edu/inventorym/model/InventoryManager.java b/Model/src/main/java/edu/inventorym/model/InventoryManager.java index 22fc8df..2559b2c 100644 --- a/Model/src/main/java/edu/inventorym/model/InventoryManager.java +++ b/Model/src/main/java/edu/inventorym/model/InventoryManager.java @@ -4,6 +4,7 @@ */ package edu.inventorym.model; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.EnumSet; import java.util.Set; @@ -31,7 +32,7 @@ public class InventoryManager { return iv; } } - + return null; } @@ -50,13 +51,15 @@ public class InventoryManager { public void load() { try { DataRepository.WalkFileSystemTree(this); + } catch (FileNotFoundException e) { + System.out.println(String.format("INVENTORY: %s", e.getLocalizedMessage().toString())); } catch (Exception e) { e.printStackTrace(); } } public InventoryPiece Remove(InventoryPiece iPiece) { - int i = INVENTORY.indexOf(iPiece); + int i = INVENTORY.indexOf(iPiece); return INVENTORY.remove(i); }; diff --git a/uml/classdiagram3.dot b/uml/classdiagram3.dot new file mode 100644 index 0000000..82d239c --- /dev/null +++ b/uml/classdiagram3.dot @@ -0,0 +1,99 @@ +digraph InventoryManagementSystem { + rankdir=TB; + 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}"]; + + 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(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|+ InventoryPiece()\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+ «abstract» computePrice(): float\l}"]; + + Drawing [label="{Drawing|+ style: String\l+ technique: String\l+ category: String\l|+ Drawing()\l+ computePrice(): float\l}"]; + + Painting [label="{Painting|- height: int\l- width: int\l- style: String\l- technique: String\l- category: String\l|+ Painting()\l+ Painting(int, int)\l+ getHeight(): int\l+ setHeight(int): void\l+ getWidth(): int\l+ setWidth(int): void\l+ getStyle(): String\l+ setStyle(String): void\l+ getTechnique(): String\l+ setTechnique(String): void\l+ getCategory(): String\l+ setCategory(String): void\l+ computePrice(): float\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+ computePrice(): float\l}"]; + + Sculpture [label="{Sculpture|- material: String\l- weight: float\l|+ Sculpture()\l+ Sculpture(float)\l+ getMaterial(): String\l+ setMaterial(String): void\l+ getWeight(): float\l+ setWeight(float): void\l+ computePrice(): float\l}"]; + + Transaction [label="{Transaction|- id: String\l- created: ZonedDateTime\l- completed: ZonedDateTime\l- customerId: String\l- shipToAddress: Address\l- customerInventoryList: InventoryList\l- totalPrice: float\l- attributes: JsonArray\l|# Transaction(Customer, InventoryList)\l# Transaction()\l+ getId(): String\l+ setId(String): void\l+ getCreated(): ZonedDateTime\l+ setCreated(ZonedDateTime): void\l+ getCompleted(): ZonedDateTime\l+ setCompleted(ZonedDateTime): void\l+ getCustomerId(): String\l+ setCustomerId(String): void\l+ getShipToAddress(): Address\l+ setShipToAddress(Address): void\l+ getCustomerInventoryList(): InventoryList\l+ setCustomerInventoryList(InventoryList): void\l+ getTotalPrice(): float\l+ setTotalPrice(float): void\l+ getAttributes(): JsonArray\l+ setAttributes(JsonArray): void\l+ toString(): String\l}"]; + + // Collection Classes + CustomerList [label="{CustomerList|+ CustomerList()\l}"]; + InventoryList [label="{InventoryList|+ InventoryList()\l+ add(InventoryPiece): boolean\l}"]; + TransactionList [label="{TransactionList|+ TransactionList()\l+ add(Transaction): boolean\l}"]; + + // Manager Classes + CustomerManager [label="{«singleton»\lCustomerManager|- 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+ save(): void\l+ load(): void\l}"]; + + InventoryManager [label="{«singleton»\lInventoryManager|- INSTANCE: InventoryManager\l+ INVENTORY: InventoryList\l|+ getInstance(): InventoryManager\l+ add(InventoryPiece): void\l+ find(String): InventoryPiece\l+ update(InventoryPiece): InventoryPiece\l+ Remove(InventoryPiece): InventoryPiece\l+ save(): void\l+ load(): void\l}"]; + + TransactionManager [label="{«singleton»\lTransactionManager|- INSTANCE: TransactionManager\l+ TRANSACTIONS: TransactionList\l|+ getInstance(): TransactionManager\l+ TransactRequest(Customer, InventoryList): Transaction\l+ complete(Transaction): void\l+ compute(Transaction): void\l+ findByCustomerEmail(String): TransactionList\l+ findByTransactionId(String): TransactionList\l+ findByTransactionDate(ZonedDateTime): TransactionList\l+ remove(Transaction): void\l+ save(): void\l}"]; + + DataRepository [label="{«singleton»\lDataRepository|- 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- write(CustomerManager): void\l- write(InventoryManager): void\l- read(CustomerManager, Path): void\l- read(InventoryManager, Path): void\l}"]; + + // Exception Classes + InvalidArtOperationException [label="{«exception»\lInvalidArtOperationException|+ InvalidArtOperationException(String)\l+ InvalidArtOperationException(String, Throwable)\l+ InvalidArtOperationException(Throwable)\l}"]; + + InvalidRecordDataException [label="{«exception»\lInvalidRecordDataException|+ InvalidRecordDataException(String)\l+ InvalidRecordDataException(String, Throwable)\l+ InvalidRecordDataException(Throwable)\l}"]; + + InvalidTransactionException [label="{«exception»\lInvalidTransactionException|+ InvalidTransactionException(String)\l+ InvalidTransactionException(String, Throwable)\l+ InvalidTransactionException(Throwable)\l}"]; + + InvalidTransOperationException [label="{«exception»\lInvalidTransOperationException|+ InvalidTransOperationException(String)\l+ InvalidTransOperationException(String, Throwable)\l+ InvalidTransOperationException(Throwable)\l}"]; + + // 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 -> Customer [arrowhead=diamond, label="contains"]; + InventoryList -> InventoryPiece [arrowhead=diamond, label="contains"]; + TransactionList -> Transaction [arrowhead=diamond, label="contains"]; + + // Composition/Association Relationships + Customer -> Address [arrowhead=diamond, label="has"]; + Transaction -> Address [arrowhead=diamond, label="has"]; + Transaction -> InventoryList [arrowhead=diamond, label="has"]; + + // Manager Relationships + CustomerManager -> CustomerList [arrowhead=diamond, label="manages"]; + InventoryManager -> InventoryList [arrowhead=diamond, label="manages"]; + TransactionManager -> TransactionList [arrowhead=diamond, label="manages"]; + + // Dependencies + CustomerManager -> DataRepository [arrowhead=vee, style=dashed, label="uses"]; + InventoryManager -> DataRepository [arrowhead=vee, style=dashed, label="uses"]; + TransactionManager -> Customer [arrowhead=vee, style=dashed, label="uses"]; + TransactionManager -> InventoryList [arrowhead=vee, style=dashed, label="uses"]; + Customer -> DataRepository [arrowhead=vee, style=dashed, label="uses"]; + InventoryPiece -> DataRepository [arrowhead=vee, style=dashed, label="uses"]; + Transaction -> DataRepository [arrowhead=vee, style=dashed, label="uses"]; + + // Exception Usage + CustomerManager -> InvalidRecordDataException [arrowhead=vee, style=dashed, label="throws"]; + subgraph cluster_exceptions { + label="Exception Classes"; + style=filled; + color=lightyellow; + InvalidArtOperationException; InvalidRecordDataException; InvalidTransactionException; InvalidTransOperationException; + } + + // Subgraphs for organization + subgraph cluster_model { + label="Model Classes"; + style=filled; + color=lightgrey; + Address; Customer; InventoryPiece; Drawing; Painting; Print; Sculpture; Transaction; + } + + subgraph cluster_managers { + label="Manager Classes (Singletons)"; + style=filled; + color=lightgreen; + CustomerManager; InventoryManager; TransactionManager; DataRepository; CustomerList; InventoryList; TransactionList; + } + +} \ No newline at end of file