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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 literal 0 HcmV?d00001