From 731dd2b99146c2d0cba79e270ec1e3ece20694b5 Mon Sep 17 00:00:00 2001 From: Sherwin Price Date: Thu, 30 Oct 2025 10:51:23 -0400 Subject: [PATCH] updated --- Api/src/main/java/edu/inventorym/Api.java | 31 ++++-- Api/src/resources/db/customers.json | 11 +- Api/src/resources/db/inventory.json | 56 ++++++++++ .../edu/inventorym/model/CustomerManager.java | 25 +++-- .../edu/inventorym/model/DataRepository.java | 103 ++++++++---------- .../edu/inventorym/model/InventoryList.java | 6 + .../inventorym/model/InventoryManager.java | 12 +- .../java/edu/inventorym/model/Sculpture.java | 2 +- .../edu/inventorym/model/Transaction.java | 23 +++- .../inventorym/model/TransactionManager.java | 5 +- OOP Project 2 DescriptionArtManagement.docx | Bin 0 -> 22709 bytes 11 files changed, 182 insertions(+), 92 deletions(-) create mode 100644 Api/src/resources/db/inventory.json create mode 100644 OOP Project 2 DescriptionArtManagement.docx diff --git a/Api/src/main/java/edu/inventorym/Api.java b/Api/src/main/java/edu/inventorym/Api.java index 069fe59..54cbf64 100644 --- a/Api/src/main/java/edu/inventorym/Api.java +++ b/Api/src/main/java/edu/inventorym/Api.java @@ -43,10 +43,17 @@ public interface Api { InventoryManager.getInstance().add(make(new Sculpture())); InventoryManager.getInstance().add(make(new Sculpture())); - /* 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().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(); + } + /* * 2. Remove art object from the inventory */ @@ -59,6 +66,10 @@ public interface Api { /* * 3. Return a list of all art objects from inventory */ + System.out.println( "============= Inventory List ==============="); + imgr.INVENTORY.forEach(System.out::println); + System.out.println( "\n"); + CustomerManager cmgr = CustomerManager.getInstance(); Customer customer = cmgr.findByEmail("kate@museum.com"); InventoryList customerCart = new InventoryList(); @@ -68,7 +79,7 @@ public interface Api { /* * 3. Add a new transaction object to the list manager is handling */ - Transaction tran = tmgr.TransactRequest(customer, customerCart, new Transaction()); + Transaction tran = tmgr.TransactRequest(customer, customerCart); /* * 4. Calculate and return transaction price * 5. Complete transaction @@ -80,13 +91,13 @@ public interface Api { /* * 7. Format and return transaction data in print format */ - System.out.println( tran ); + System.out.println(tran); /* * 8. Retrieve and return transactions based on: * customer email */ TransactionList foundTrans = tmgr.findByCustomerEmail(customer.getEmail()); - /* + /* * transaction date */ foundTrans = tmgr.findByTransactionDate(tran.getCompleted()); @@ -99,7 +110,7 @@ public interface Api { */ foundTrans = tmgr.findByTransactionId(tran.getId()); - /* + /* * 9. Update inventory file(s) on local system */ InventoryManager.getInstance().save(); @@ -118,7 +129,7 @@ public interface Api { } static Painting make(Painting o) { - o.setTitle("Windy Rowing"); + o.setTitle("Walking by the beach."); o.setDescription("East Market Square find. Local Author."); o.setAuthor("Dave Janson"); o.setCreated(ZonedDateTime.now()); @@ -126,7 +137,7 @@ public interface Api { } static Print make(Print o) { - o.setTitle("Windy Rowing"); + o.setTitle("Different day same thing"); o.setDescription("East Market Square find. Local Author."); o.setAuthor("Dave Janson"); @@ -135,7 +146,7 @@ public interface Api { } static Sculpture make(Sculpture o) { - o.setTitle("Windy Rowing"); + o.setTitle("Jolly Romp"); o.setDescription("East Market Square find. Local Author."); o.setAuthor("Dave Janson"); diff --git a/Api/src/resources/db/customers.json b/Api/src/resources/db/customers.json index b95a5e3..f453b45 100644 --- a/Api/src/resources/db/customers.json +++ b/Api/src/resources/db/customers.json @@ -1,16 +1,23 @@ [ { "email": "kate@museum.com", - "id": "1039445606", + "id": "4659170390", "nameFirst": "Kate", "nameLast": "Demsey", "phone": "310-676-4844" }, { "email": "jim@homedeco.com", - "id": "4312148107", + "id": "3722574478", "nameFirst": "Jim", "nameLast": "Gumbly", "phone": "203-676-4844" + }, + { + "email": "evan@homedeco.com", + "id": "3611023109", + "nameFirst": "Evan", + "nameLast": "Hao", + "phone": "203-676-8943" } ] \ No newline at end of file diff --git a/Api/src/resources/db/inventory.json b/Api/src/resources/db/inventory.json new file mode 100644 index 0000000..c20e812 --- /dev/null +++ b/Api/src/resources/db/inventory.json @@ -0,0 +1,56 @@ +[ + { + "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/CustomerManager.java b/Model/src/main/java/edu/inventorym/model/CustomerManager.java index a6aa80f..5e6f476 100644 --- a/Model/src/main/java/edu/inventorym/model/CustomerManager.java +++ b/Model/src/main/java/edu/inventorym/model/CustomerManager.java @@ -4,10 +4,11 @@ */ package edu.inventorym.model; +import java.io.FileNotFoundException; import java.io.IOException; public class CustomerManager { - + final static CustomerManager INSTANCE = new CustomerManager(); public static CustomerManager getInstance() { @@ -16,28 +17,28 @@ public class CustomerManager { public CustomerList CUSTOMERS = new CustomerList(); - public boolean add(Customer c) throws InvalidRecordDataException{ + public boolean add(Customer c) throws InvalidRecordDataException { check(c); return CUSTOMERS.add(c); } - void check(Customer c) throws InvalidRecordDataException{ + void check(Customer c) throws InvalidRecordDataException { } - public Customer findById(String id){ + public Customer findById(String id) { return null; } - public Customer findByEmail(String email){ + public Customer findByEmail(String email) { for (Customer c : CUSTOMERS) { if (email.equalsIgnoreCase(c.getEmail())) { return c; } - } + } return null; } - + public void save() { try { DataRepository.write(this); @@ -46,13 +47,15 @@ public class CustomerManager { } } - public void load(){ + public void load() { try { - DataRepository.read(this); + DataRepository.WalkFileSystemTree(this); + } catch (FileNotFoundException e) { + System.out.println(String.format("CUSTOMERS: %s", e.getLocalizedMessage().toString())); } catch (IOException e) { e.printStackTrace(); - } catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); } - } + } } diff --git a/Model/src/main/java/edu/inventorym/model/DataRepository.java b/Model/src/main/java/edu/inventorym/model/DataRepository.java index 82867d7..44f6753 100644 --- a/Model/src/main/java/edu/inventorym/model/DataRepository.java +++ b/Model/src/main/java/edu/inventorym/model/DataRepository.java @@ -7,22 +7,20 @@ package edu.inventorym.model; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.nio.file.OpenOption; 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.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; @@ -51,10 +49,18 @@ public class DataRepository { return String.format("%010d", val2); } - public static void WalkFileSystemTree(final InventoryManager manager) throws IOException { + public static void WalkFileSystemTree(final InventoryManager manager) throws JsonException, IOException, Exception { + String dataRoot = getRepositoryConfig.getPath(); + dataRoot = dataRoot + "/inventory.json"; + Path path = Paths.get(dataRoot); + read(manager, path); } - public static void WalkFileSystemTree(final CustomerManager manager) throws IOException { + public static void WalkFileSystemTree(final CustomerManager manager) throws JsonException, IOException, Exception { + String dataRoot = getRepositoryConfig.getPath(); + dataRoot = dataRoot + "/customers.json"; + Path path = Paths.get(dataRoot); + read(manager, path); } public static void WalkFileSystemTree(final TransactionManager manager) throws IOException { @@ -77,48 +83,9 @@ public class DataRepository { } catch (Exception e) { e.printStackTrace(); } - - try { - // Configure pretty-printing and other settings - JsonbConfig config = new JsonbConfig() - .withFormatting(true); // Enable pretty-printing - Jsonb jsonb = JsonbBuilder.create(config); - - // Serialize using the custom configuration - String prettyJsonString = jsonb.toJson(new Drawing()); - - System.out.println("json string: " + prettyJsonString); - - } catch (Exception e) { - e.printStackTrace(); - } - - try { - List rpcs = new ArrayList(); - rpcs.add(new Drawing()); - rpcs.add(new Drawing()); - rpcs.add(new Drawing()); - - // Create Jsonb and serialize - Jsonb jsonb = JsonbBuilder.create(); - String result = jsonb.toJson(rpcs); - - // Deserialize back - rpcs = jsonb.fromJson(result, - new ArrayList() { - } - .getClass() - .getGenericSuperclass()); - - System.out.println(rpcs); - - } catch (Exception e) { - e.printStackTrace(); - } - } - public static List mapJsonToObjectList(String body, Class baseClass) throws Exception { + public static List mapJsonToObjectList(String body, Class baseClass) throws JsonException, Exception { try (var reader = Json.createReader(new StringReader(body)); Jsonb jsonb = JsonbBuilder.create()) { JsonArray jsonArray = reader.readArray(); @@ -126,16 +93,15 @@ public class DataRepository { return jsonArray.stream() .map(jsonValue -> jsonb.fromJson(jsonValue.toString(), baseClass)) .toList(); - } + } } - static void write(CustomerManager mgr) throws IOException{ + static void write(CustomerManager mgr) throws IOException { JsonbConfig config = new JsonbConfig() - .withFormatting(true); // Enable pretty-printing + .withFormatting(true); // Enable pretty-printing Jsonb jsonb = JsonbBuilder.create(config); String result = jsonb.toJson(mgr.CUSTOMERS); - String dataRoot = getRepositoryConfig.getPath(); dataRoot = dataRoot + "/customers.json"; Path path = Paths.get(dataRoot); @@ -143,27 +109,47 @@ public class DataRepository { writer.write(result); writer.flush(); } - } - public static void read(CustomerManager customerManager) throws IOException, Exception { + static void write(InventoryManager mgr) throws IOException { + JsonbConfig config = new JsonbConfig() + .withFormatting(true); // Enable pretty-printing + Jsonb jsonb = JsonbBuilder.create(config); + String result = jsonb.toJson(mgr.INVENTORY); + String dataRoot = getRepositoryConfig.getPath(); - dataRoot = dataRoot + "/customers.json"; + dataRoot = dataRoot + "/inventory.json"; Path path = Paths.get(dataRoot); + try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { + writer.write(result); + writer.flush(); + } + } + + private static void read(CustomerManager customerManager, Path path) throws Exception { String result; - try (BufferedReader in = new BufferedReader(new FileReader(path.toFile(), StandardCharsets.UTF_8))){ + try (BufferedReader in = new BufferedReader(new FileReader(path.toFile(), StandardCharsets.UTF_8))) { result = in.readAllAsString(); } - List customers = mapJsonToObjectList(result, Customer.class); -/* Jsonb jsonb = JsonbBuilder.create(); - CustomerList customers = jsonb.fromJson(result, new CustomerList() { } - .getClass() - .getGenericSuperclass()); */ + List customers = mapJsonToObjectList(result, Customer.class); + customerManager.CUSTOMERS.clear(); customerManager.CUSTOMERS.addAll(customers); } + private static void read(InventoryManager manager, Path path) throws JsonException, IOException, Exception { + String result; + try (BufferedReader in = new BufferedReader(new FileReader(path.toFile(), StandardCharsets.UTF_8))) { + result = in.readAllAsString(); + } + + List inventory = mapJsonToObjectList(result, InventoryPiece.class); + + manager.INVENTORY.clear(); + manager.INVENTORY.addAll(inventory); + } + public final static class getRepositoryConfig { public final static String getPath() { String home = System.getenv("HOME") != null ? System.getenv("HOME") @@ -172,5 +158,4 @@ public class DataRepository { } } - } diff --git a/Model/src/main/java/edu/inventorym/model/InventoryList.java b/Model/src/main/java/edu/inventorym/model/InventoryList.java index e1433e7..2e700c0 100644 --- a/Model/src/main/java/edu/inventorym/model/InventoryList.java +++ b/Model/src/main/java/edu/inventorym/model/InventoryList.java @@ -10,4 +10,10 @@ public class InventoryList extends ArrayList { public InventoryList() { super(); } + + @Override + public boolean add(InventoryPiece e) { + // TODO : check Uniqueness + return super.add(e); + } } diff --git a/Model/src/main/java/edu/inventorym/model/InventoryManager.java b/Model/src/main/java/edu/inventorym/model/InventoryManager.java index b0457a9..22fc8df 100644 --- a/Model/src/main/java/edu/inventorym/model/InventoryManager.java +++ b/Model/src/main/java/edu/inventorym/model/InventoryManager.java @@ -40,13 +40,17 @@ public class InventoryManager { } public void save() { + try { + DataRepository.write(this); + } catch (IOException e) { + e.printStackTrace(); + } } - public void loadAll() { + public void load() { try { - DataRepository.WalkFileSystemTree(INSTANCE); - } catch (IOException e) { - // TODO Auto-generated catch block + DataRepository.WalkFileSystemTree(this); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/Model/src/main/java/edu/inventorym/model/Sculpture.java b/Model/src/main/java/edu/inventorym/model/Sculpture.java index 9ee0448..b8145bb 100644 --- a/Model/src/main/java/edu/inventorym/model/Sculpture.java +++ b/Model/src/main/java/edu/inventorym/model/Sculpture.java @@ -7,7 +7,7 @@ package edu.inventorym.model; public class Sculpture extends InventoryPiece { String material; - float weight; + float weight = 1.0F; public Sculpture(float weight) { super(); diff --git a/Model/src/main/java/edu/inventorym/model/Transaction.java b/Model/src/main/java/edu/inventorym/model/Transaction.java index 277654b..2bf22a6 100644 --- a/Model/src/main/java/edu/inventorym/model/Transaction.java +++ b/Model/src/main/java/edu/inventorym/model/Transaction.java @@ -9,7 +9,7 @@ import java.time.ZonedDateTime; import jakarta.json.JsonArray; public class Transaction { - String id; + String id = DataRepository.generateRandomID(16); ZonedDateTime created = ZonedDateTime.now(); ZonedDateTime completed = null; String customerId; @@ -18,7 +18,13 @@ public class Transaction { float totalPrice = 0.0F; JsonArray attributes; - public Transaction() { + protected Transaction (final Customer customer, final InventoryList cart){ + this.customerId = customer.getId(); + this.customerInventoryList = new InventoryList(); + this.customerInventoryList.addAll(cart); + } + + protected Transaction() { } @@ -86,4 +92,17 @@ public class Transaction { this.customerId = id; } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("{ \"Transaction\":{"); + sb.append("\"id\": \"").append(id).append("\",\n"); + sb.append("\"created\": \"").append(created).append("\",\n"); + sb.append("\"completed\": ").append(completed).append(",\n"); + sb.append("\"customerId\": ").append(customerId).append(",\n"); + sb.append("\"totalPrice\": ").append(totalPrice); + sb.append("}}\n"); + return sb.toString(); + } + } diff --git a/Model/src/main/java/edu/inventorym/model/TransactionManager.java b/Model/src/main/java/edu/inventorym/model/TransactionManager.java index df2570a..324c2a6 100644 --- a/Model/src/main/java/edu/inventorym/model/TransactionManager.java +++ b/Model/src/main/java/edu/inventorym/model/TransactionManager.java @@ -16,10 +16,9 @@ public class TransactionManager { public TransactionList TRANSACTIONS = new TransactionList(); - public Transaction TransactRequest(Customer customer, InventoryList iPieces, Transaction transacted) { - transacted.setCustomerId(customer.getId()); + public Transaction TransactRequest(Customer customer, InventoryList iPieces) { + Transaction transacted = new Transaction(customer, iPieces); transacted.setShipToAddress(customer.getMailing()); - transacted.setCustomerInventoryList(iPieces); compute(transacted); return transacted; } diff --git a/OOP Project 2 DescriptionArtManagement.docx b/OOP Project 2 DescriptionArtManagement.docx new file mode 100644 index 0000000000000000000000000000000000000000..1fd3a7c4b472b375a1c4bfe6c241e2b5f87668ff GIT binary patch literal 22709 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