From bdcab34d66a187f7dee7bf0b885e99a8b2510e32 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 08:58:32 +0000 Subject: [PATCH 01/17] GitHub Classroom Feedback --- .github/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/.keep diff --git a/.github/.keep b/.github/.keep new file mode 100644 index 00000000..e69de29b From baa14eb1ffd66d8930f39a3663074b96ca5af50a Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 08:58:32 +0000 Subject: [PATCH 02/17] Setting up GitHub Classroom Feedback From fc4ad1d0278e800b053b2188dd11fca0a7342a42 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Mon, 20 Oct 2025 08:44:58 +0200 Subject: [PATCH 03/17] Initial Commit --- src/main/java/com/example/Category.java | 31 +++++++ .../java/com/example/ElectronicsProduct.java | 24 +++++ src/main/java/com/example/FoodProduct.java | 48 ++++++++++ src/main/java/com/example/Perishable.java | 26 ++++++ src/main/java/com/example/Perishables.java | 13 +++ src/main/java/com/example/Product.java | 37 ++++++++ src/main/java/com/example/Shippable.java | 8 ++ src/main/java/com/example/Warehouse.java | 90 +++++++++++++++++++ .../java/com/example/WarehouseAnalyzer.java | 3 + 9 files changed, 280 insertions(+) create mode 100644 src/main/java/com/example/Category.java create mode 100644 src/main/java/com/example/ElectronicsProduct.java create mode 100644 src/main/java/com/example/FoodProduct.java create mode 100644 src/main/java/com/example/Perishable.java create mode 100644 src/main/java/com/example/Perishables.java create mode 100644 src/main/java/com/example/Product.java create mode 100644 src/main/java/com/example/Shippable.java create mode 100644 src/main/java/com/example/Warehouse.java diff --git a/src/main/java/com/example/Category.java b/src/main/java/com/example/Category.java new file mode 100644 index 00000000..d20d772c --- /dev/null +++ b/src/main/java/com/example/Category.java @@ -0,0 +1,31 @@ +package com.example; + +public class Category { + static String name; + + private Category(String categoryName) { + + } + + public static Category of(String name) { + if (name == null || name.isEmpty()) { + throw new IllegalArgumentException("Category name cannot be null or empty"); + } + name = name; + + name = name.substring(0, 1).toUpperCase() + + name.substring(1).toLowerCase(); + + return new Category(name); + + } + + public String getName() { + return name; + } + +} + +/* +Cache/flyweight: return the same instance for the same normalized name. + */ diff --git a/src/main/java/com/example/ElectronicsProduct.java b/src/main/java/com/example/ElectronicsProduct.java new file mode 100644 index 00000000..9b0fb3b8 --- /dev/null +++ b/src/main/java/com/example/ElectronicsProduct.java @@ -0,0 +1,24 @@ +package com.example; + +import java.math.BigDecimal; +import java.util.UUID; + +public class ElectronicsProduct extends Product { + public ElectronicsProduct(UUID id, String name, Category category, BigDecimal price, int warranty, BigDecimal weight) { + } + + @Override + public String productDetails() { + return ""; + } + + @Override + public BigDecimal getPrice() { + return null; + } + + @Override + public UUID uuid() { + return null; + } +} diff --git a/src/main/java/com/example/FoodProduct.java b/src/main/java/com/example/FoodProduct.java new file mode 100644 index 00000000..e6ed6b1a --- /dev/null +++ b/src/main/java/com/example/FoodProduct.java @@ -0,0 +1,48 @@ +package com.example; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.UUID; + +public class FoodProduct extends Product implements Perishables, Shippable { + public LocalDate expirationDate; + public BigDecimal weight; + + public FoodProduct(UUID id, String name, Category category, BigDecimal price, LocalDate expirationDate, BigDecimal weight) { + + } + + + @Override + public BigDecimal getPrice() { + return null; + } + + @Override + public UUID uuid() { + return null; + } + + @Override + public String productDetails() { + return ""; + } + + @Override + public double weight() { + return 0; + } + + @Override + public BigDecimal calculateShippingCost() { + return null; + } +} + +/* +Implements Perishable and Shippable. +Fields: LocalDate expirationDate, BigDecimal weight (kg). +Validations: negative price -> IllegalArgumentException("Price cannot be negative."); negative weight -> IllegalArgumentException("Weight cannot be negative."). +productDetails() should look like: "Food: Milk, Expires: 2025-12-24". +Shipping rule: cost = weight * 50. + */ \ No newline at end of file diff --git a/src/main/java/com/example/Perishable.java b/src/main/java/com/example/Perishable.java new file mode 100644 index 00000000..e31cc191 --- /dev/null +++ b/src/main/java/com/example/Perishable.java @@ -0,0 +1,26 @@ +package com.example; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.UUID; + +public class Perishable extends Product{ + public LocalDate expirationDate() { + return LocalDate.now(); + } + + @Override + public String productDetails() { + return ""; + } + + @Override + public BigDecimal getPrice() { + return null; + } + + @Override + public UUID uuid() { + return null; + } +} diff --git a/src/main/java/com/example/Perishables.java b/src/main/java/com/example/Perishables.java new file mode 100644 index 00000000..6e5151c1 --- /dev/null +++ b/src/main/java/com/example/Perishables.java @@ -0,0 +1,13 @@ +package com.example; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.UUID; + +public interface Perishables { + LocalDate expirationDate = null; + public BigDecimal getPrice(); + + + UUID uuid(); +} diff --git a/src/main/java/com/example/Product.java b/src/main/java/com/example/Product.java new file mode 100644 index 00000000..50adde73 --- /dev/null +++ b/src/main/java/com/example/Product.java @@ -0,0 +1,37 @@ +package com.example; + +import java.math.BigDecimal; +import java.util.UUID; + + + +public abstract class Product implements Perishables { + UUID uuid; + String name; + Category category; + BigDecimal price; + + + public BigDecimal price() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public UUID uuid() { + return uuid; + } + + public String name() { + return name; + } + + public Category category() { + return category; + } + + public abstract String productDetails(); + +} diff --git a/src/main/java/com/example/Shippable.java b/src/main/java/com/example/Shippable.java new file mode 100644 index 00000000..eb9fd2c4 --- /dev/null +++ b/src/main/java/com/example/Shippable.java @@ -0,0 +1,8 @@ +package com.example; + +import java.math.BigDecimal; + +public interface Shippable { + double weight(); + BigDecimal calculateShippingCost(); +} diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java new file mode 100644 index 00000000..9a69d95f --- /dev/null +++ b/src/main/java/com/example/Warehouse.java @@ -0,0 +1,90 @@ +package com.example; + +import java.math.BigDecimal; +import java.util.*; + +public class Warehouse { + List products; + List shippables; + + private static Warehouse single_instance = null; + public String instanceName; + + public List getProducts(){ + return products; + } + + public List shippableProducts() { + return shippables; + } + + public void clearProducts(){ + products.clear(); + } + + public boolean isEmpty(){ + return products.isEmpty(); + } + + public void addProduct(Product product){ + products.add(product); + } + + public void remove(UUID id){ + for(Product product : products){ + if (product.uuid == id) + products.remove(product); + } + } + + public Optional getProductById(UUID id){ + var temp = products.stream() + .filter(product -> product.uuid == id) + .findFirst() + .isEmpty(); + + if(temp){ + return Optional.empty(); + } else { + return Optional.empty(); + } + } + + public static synchronized Warehouse getInstance(String string) { + if (single_instance == null) { + single_instance = new Warehouse(); + } + return single_instance; + } + + + public Map getProductsGroupedByCategories() { + if(products == null || products.isEmpty()){ + return Collections.emptyMap(); + } + return Collections.emptyMap(); + } + + public void updateProductPrice(UUID id, BigDecimal newPrice){ + for(Product product : products){ + if (product.uuid == id){ + + } + } + } + + public List expiredProducts() { + return null; + } +} + +/* +getInstance(String name) returns the same instance per unique name. +addProduct(Product): throw IllegalArgumentException("Product cannot be null.") if null. +getProducts(): return an unmodifiable copy. +getProductById(UUID): return Optional. +updateProductPrice(UUID, BigDecimal): when not found, throw NoSuchElementException("Product not found with id: "). Also track changed products in getChangedProducts(). +expiredProducts(): return List that are expired. +shippableProducts(): return List from stored products. +remove(UUID): remove the matching product if present. + */ diff --git a/src/main/java/com/example/WarehouseAnalyzer.java b/src/main/java/com/example/WarehouseAnalyzer.java index 1779fc33..f975c517 100644 --- a/src/main/java/com/example/WarehouseAnalyzer.java +++ b/src/main/java/com/example/WarehouseAnalyzer.java @@ -145,6 +145,9 @@ public Map calculateWeightedAveragePriceByCategory() { * @param standardDeviations threshold in standard deviations (e.g., 2.0) * @return list of products considered outliers */ + + //Denna är fel *********************** + public List findPriceOutliers(double standardDeviations) { List products = warehouse.getProducts(); int n = products.size(); From d7da0be11e299f5c516327986e0d349fed2715ee Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Mon, 20 Oct 2025 10:58:14 +0200 Subject: [PATCH 04/17] Constructed Category --- src/main/java/com/example/Category.java | 28 ++++++++++++++----------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/Category.java b/src/main/java/com/example/Category.java index d20d772c..e326bbf4 100644 --- a/src/main/java/com/example/Category.java +++ b/src/main/java/com/example/Category.java @@ -1,31 +1,35 @@ package com.example; +import java.util.HashMap; + public class Category { - static String name; + public String name; + static HashMap categories = new HashMap(); private Category(String categoryName) { + name = categoryName; + + name = name.substring(0, 1).toUpperCase() + + name.substring(1).toLowerCase(); } public static Category of(String name) { - if (name == null || name.isEmpty()) { - throw new IllegalArgumentException("Category name cannot be null or empty"); - } - name = name; + if (name == null) { + throw new IllegalArgumentException("Category name can't be null"); + } else if (name.isBlank()) + throw new IllegalArgumentException("Category name can't be blank"); - name = name.substring(0, 1).toUpperCase() - + name.substring(1).toLowerCase(); + if (categories.containsKey(name)) + return categories.get(name); - return new Category(name); + categories.put(name, new Category(name)); + return categories.get(name); } public String getName() { return name; } - } -/* -Cache/flyweight: return the same instance for the same normalized name. - */ From d654187f9aea6570b86bbb8b3970890516345e7f Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:06:51 +0200 Subject: [PATCH 05/17] Constructed ElectronicsProduct and added supers --- .../java/com/example/ElectronicsProduct.java | 16 ++++++++++++++++ src/main/java/com/example/FoodProduct.java | 1 + src/main/java/com/example/Perishable.java | 4 ++++ src/main/java/com/example/Product.java | 7 +++++++ 4 files changed, 28 insertions(+) diff --git a/src/main/java/com/example/ElectronicsProduct.java b/src/main/java/com/example/ElectronicsProduct.java index 9b0fb3b8..72868d99 100644 --- a/src/main/java/com/example/ElectronicsProduct.java +++ b/src/main/java/com/example/ElectronicsProduct.java @@ -3,8 +3,24 @@ import java.math.BigDecimal; import java.util.UUID; +/* +Implements Shippable. +productDetails() should look like: "Electronics: Laptop, Warranty: 24 months". +Shipping rule: base 79, add 49 if weight > 5.0 kg. + */ + public class ElectronicsProduct extends Product { + int warrantyMonths; + BigDecimal weight; + + public ElectronicsProduct(UUID id, String name, Category category, BigDecimal price, int warranty, BigDecimal weight) { + super(id, name, category, price); + this.warrantyMonths = warranty; + if (warrantyMonths < 0) + throw new IllegalArgumentException("Warranty months cannot be negative."); + this.weight = weight; + } @Override diff --git a/src/main/java/com/example/FoodProduct.java b/src/main/java/com/example/FoodProduct.java index e6ed6b1a..8407e7ad 100644 --- a/src/main/java/com/example/FoodProduct.java +++ b/src/main/java/com/example/FoodProduct.java @@ -9,6 +9,7 @@ public class FoodProduct extends Product implements Perishables, Shippable { public BigDecimal weight; public FoodProduct(UUID id, String name, Category category, BigDecimal price, LocalDate expirationDate, BigDecimal weight) { + super(id, name, category, price); } diff --git a/src/main/java/com/example/Perishable.java b/src/main/java/com/example/Perishable.java index e31cc191..b4bf7ef3 100644 --- a/src/main/java/com/example/Perishable.java +++ b/src/main/java/com/example/Perishable.java @@ -5,6 +5,10 @@ import java.util.UUID; public class Perishable extends Product{ + public Perishable(UUID uuid, String name, Category category, BigDecimal price) { + super(uuid, name, category, price); + } + public LocalDate expirationDate() { return LocalDate.now(); } diff --git a/src/main/java/com/example/Product.java b/src/main/java/com/example/Product.java index 50adde73..97529423 100644 --- a/src/main/java/com/example/Product.java +++ b/src/main/java/com/example/Product.java @@ -11,6 +11,13 @@ public abstract class Product implements Perishables { Category category; BigDecimal price; + public Product(UUID uuid, String name, Category category, BigDecimal price) { + this.uuid = uuid; + this.name = name; + this.category = category; + this.price = price; + } + public BigDecimal price() { return price; From f2054b2084712289db2819087bdbb8cd2d960701 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Mon, 20 Oct 2025 12:38:39 +0200 Subject: [PATCH 06/17] Fully Constructed FoodProduct --- src/main/java/com/example/FoodProduct.java | 24 +++++++++------------- src/main/java/com/example/Product.java | 3 +++ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/FoodProduct.java b/src/main/java/com/example/FoodProduct.java index 8407e7ad..3647fa0e 100644 --- a/src/main/java/com/example/FoodProduct.java +++ b/src/main/java/com/example/FoodProduct.java @@ -10,40 +10,36 @@ public class FoodProduct extends Product implements Perishables, Shippable { public FoodProduct(UUID id, String name, Category category, BigDecimal price, LocalDate expirationDate, BigDecimal weight) { super(id, name, category, price); + this.expirationDate = expirationDate; + if (weight.compareTo(BigDecimal.ZERO) < 0) + throw new IllegalArgumentException("Weight cannot be negative."); + this.weight = weight; } @Override public BigDecimal getPrice() { - return null; + return price; } @Override public UUID uuid() { - return null; + return uuid; } @Override public String productDetails() { - return ""; + return "Food: " + category + ", Expires: " + expirationDate; } @Override public double weight() { - return 0; + return weight.doubleValue(); } @Override public BigDecimal calculateShippingCost() { - return null; + return weight.multiply(BigDecimal.valueOf(50)); } -} - -/* -Implements Perishable and Shippable. -Fields: LocalDate expirationDate, BigDecimal weight (kg). -Validations: negative price -> IllegalArgumentException("Price cannot be negative."); negative weight -> IllegalArgumentException("Weight cannot be negative."). -productDetails() should look like: "Food: Milk, Expires: 2025-12-24". -Shipping rule: cost = weight * 50. - */ \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/com/example/Product.java b/src/main/java/com/example/Product.java index 97529423..b80505f4 100644 --- a/src/main/java/com/example/Product.java +++ b/src/main/java/com/example/Product.java @@ -15,6 +15,9 @@ public Product(UUID uuid, String name, Category category, BigDecimal price) { this.uuid = uuid; this.name = name; this.category = category; + if(price.compareTo(BigDecimal.ZERO) < 0) + throw new IllegalArgumentException("Price cannot be negative."); + this.price = price; } From f20a2fd44a9d8ecdd19f6080528fc8b8666c843c Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Tue, 21 Oct 2025 09:08:30 +0200 Subject: [PATCH 07/17] Added simpleton constructor for Warehouse --- src/main/java/com/example/Warehouse.java | 60 +++++++++++++++--------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index 9a69d95f..28299deb 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -4,11 +4,16 @@ import java.util.*; public class Warehouse { - List products; - List shippables; - - private static Warehouse single_instance = null; - public String instanceName; + List products = new ArrayList<>(); + List shippables = new ArrayList<>(); + List perishables = new ArrayList<>(); + static HashMap warehouses = new HashMap<>(); + + private Warehouse() { + this.products = new ArrayList<>(); + this.shippables = new ArrayList<>(); + this.perishables = new ArrayList<>(); + } public List getProducts(){ return products; @@ -27,6 +32,8 @@ public boolean isEmpty(){ } public void addProduct(Product product){ + if (product == null) + throw new IllegalArgumentException("Product cannot be null."); products.add(product); } @@ -38,23 +45,28 @@ public void remove(UUID id){ } public Optional getProductById(UUID id){ - var temp = products.stream() - .filter(product -> product.uuid == id) - .findFirst() - .isEmpty(); - - if(temp){ - return Optional.empty(); - } else { + if (products.isEmpty()) return Optional.empty(); - } + + return products.stream() + .filter(p -> p.uuid == id) + .findFirst(); + + } public static synchronized Warehouse getInstance(String string) { - if (single_instance == null) { - single_instance = new Warehouse(); - } - return single_instance; + if (!warehouses.containsKey(string)) { + warehouses.put(string, new Warehouse()); + return warehouses.get(string); + }else + return warehouses.get(string); + } + + public static synchronized Warehouse getInstance() { + if(!warehouses.containsKey("default")) + warehouses.put("default", new Warehouse()); + return warehouses.get("default"); } @@ -66,11 +78,15 @@ public Map getProductsGroupedByCategories() { } public void updateProductPrice(UUID id, BigDecimal newPrice){ - for(Product product : products){ - if (product.uuid == id){ - } - } + var product = getProductById(id); + + if(product.isPresent()) + product.get().setPrice(newPrice); + else + throw new NoSuchElementException("Product not found with id:" + id); + + } public List expiredProducts() { From 9a884661d366eb1c436ecf9d4280ab447a25fee8 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Tue, 21 Oct 2025 12:35:11 +0200 Subject: [PATCH 08/17] Propperly implimented getProductsGroupedByCategories for Warehouse, still minor bug --- src/main/java/com/example/Warehouse.java | 26 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index 28299deb..5b4e77b6 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -13,6 +13,7 @@ private Warehouse() { this.products = new ArrayList<>(); this.shippables = new ArrayList<>(); this.perishables = new ArrayList<>(); + } public List getProducts(){ @@ -38,10 +39,7 @@ public void addProduct(Product product){ } public void remove(UUID id){ - for(Product product : products){ - if (product.uuid == id) - products.remove(product); - } + products.removeIf(product -> product.uuid == id); } public Optional getProductById(UUID id){ @@ -70,11 +68,27 @@ public static synchronized Warehouse getInstance() { } - public Map getProductsGroupedByCategories() { + public Map> getProductsGroupedByCategories() { if(products == null || products.isEmpty()){ return Collections.emptyMap(); } - return Collections.emptyMap(); + + HashMap> result = new HashMap<>(); + + var tempMap = Category.categories.entrySet(); + + for(var category : tempMap){ + List tempList = new ArrayList<>(); + + products.stream() + .filter(element -> element.category.equals(category.getValue())) + .forEach(tempList::add); + + result.put(category.getValue(), tempList); + } + + return result; + } public void updateProductPrice(UUID id, BigDecimal newPrice){ From 3290fa0a9b44e0fc1eb3fa07f3c526aef50b0ad8 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:28:10 +0200 Subject: [PATCH 09/17] Added clearing of the Category cashe clearing products, correctly formated productDetails in FoodProduct and ElectronicsProduct --- src/main/java/com/example/Category.java | 4 ++++ src/main/java/com/example/ElectronicsProduct.java | 2 +- src/main/java/com/example/FoodProduct.java | 2 +- src/main/java/com/example/Warehouse.java | 7 +++++-- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/Category.java b/src/main/java/com/example/Category.java index e326bbf4..2fa3d54d 100644 --- a/src/main/java/com/example/Category.java +++ b/src/main/java/com/example/Category.java @@ -28,6 +28,10 @@ public static Category of(String name) { } + public void clear(){ + categories.clear(); + } + public String getName() { return name; } diff --git a/src/main/java/com/example/ElectronicsProduct.java b/src/main/java/com/example/ElectronicsProduct.java index 72868d99..d62c5451 100644 --- a/src/main/java/com/example/ElectronicsProduct.java +++ b/src/main/java/com/example/ElectronicsProduct.java @@ -25,7 +25,7 @@ public ElectronicsProduct(UUID id, String name, Category category, BigDecimal pr @Override public String productDetails() { - return ""; + return "Electronics: " + name + ", Warranty: " + warrantyMonths + " months"; } @Override diff --git a/src/main/java/com/example/FoodProduct.java b/src/main/java/com/example/FoodProduct.java index 3647fa0e..6d74c26e 100644 --- a/src/main/java/com/example/FoodProduct.java +++ b/src/main/java/com/example/FoodProduct.java @@ -30,7 +30,7 @@ public UUID uuid() { @Override public String productDetails() { - return "Food: " + category + ", Expires: " + expirationDate; + return "Food: " + name + ", Expires: " + expirationDate; } @Override diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index 5b4e77b6..2e0161de 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -17,7 +17,7 @@ private Warehouse() { } public List getProducts(){ - return products; + return Collections.unmodifiableList(products); } public List shippableProducts() { @@ -26,6 +26,7 @@ public List shippableProducts() { public void clearProducts(){ products.clear(); + Category.categories.clear(); } public boolean isEmpty(){ @@ -35,7 +36,10 @@ public boolean isEmpty(){ public void addProduct(Product product){ if (product == null) throw new IllegalArgumentException("Product cannot be null."); + if (getProductById(product.uuid).isPresent()) + throw new IllegalArgumentException("Product with that id already exists, use updateProduct for updates."); products.add(product); + } public void remove(UUID id){ @@ -67,7 +71,6 @@ public static synchronized Warehouse getInstance() { return warehouses.get("default"); } - public Map> getProductsGroupedByCategories() { if(products == null || products.isEmpty()){ return Collections.emptyMap(); From 15a56b8aeafe5c16b1627757248b0d4ea5d9bedb Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Tue, 21 Oct 2025 15:01:30 +0200 Subject: [PATCH 10/17] Fixed the Perishable and Shippable interface --- .../java/com/example/ElectronicsProduct.java | 19 ++++++++---- src/main/java/com/example/FoodProduct.java | 11 +++---- src/main/java/com/example/Perishable.java | 26 ++++------------ .../java/com/example/Perishableclass.java | 30 +++++++++++++++++++ src/main/java/com/example/Perishables.java | 13 -------- src/main/java/com/example/Product.java | 2 +- src/main/java/com/example/Shippable.java | 1 + src/main/java/com/example/Warehouse.java | 11 +++++-- 8 files changed, 66 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/example/Perishableclass.java delete mode 100644 src/main/java/com/example/Perishables.java diff --git a/src/main/java/com/example/ElectronicsProduct.java b/src/main/java/com/example/ElectronicsProduct.java index d62c5451..8171a704 100644 --- a/src/main/java/com/example/ElectronicsProduct.java +++ b/src/main/java/com/example/ElectronicsProduct.java @@ -5,13 +5,14 @@ /* Implements Shippable. -productDetails() should look like: "Electronics: Laptop, Warranty: 24 months". Shipping rule: base 79, add 49 if weight > 5.0 kg. */ -public class ElectronicsProduct extends Product { +public class ElectronicsProduct extends Product implements Shippable { int warrantyMonths; BigDecimal weight; + BigDecimal basePrice = BigDecimal.valueOf(79); + BigDecimal addPrice = BigDecimal.valueOf(49); public ElectronicsProduct(UUID id, String name, Category category, BigDecimal price, int warranty, BigDecimal weight) { @@ -29,12 +30,20 @@ public String productDetails() { } @Override - public BigDecimal getPrice() { + public UUID uuid() { return null; } @Override - public UUID uuid() { - return null; + public double weight() { + return weight.doubleValue(); + } + + @Override + public BigDecimal calculateShippingCost() { + if(weight.intValue() >= 5) + return basePrice.add(addPrice); + else + return basePrice; } } diff --git a/src/main/java/com/example/FoodProduct.java b/src/main/java/com/example/FoodProduct.java index 6d74c26e..d03028cc 100644 --- a/src/main/java/com/example/FoodProduct.java +++ b/src/main/java/com/example/FoodProduct.java @@ -4,7 +4,7 @@ import java.time.LocalDate; import java.util.UUID; -public class FoodProduct extends Product implements Perishables, Shippable { +public class FoodProduct extends Product implements Perishable, Shippable { public LocalDate expirationDate; public BigDecimal weight; @@ -18,16 +18,17 @@ public FoodProduct(UUID id, String name, Category category, BigDecimal price, Lo } - @Override - public BigDecimal getPrice() { - return price; - } @Override public UUID uuid() { return uuid; } + @Override + public LocalDate expirationDate() { + return expirationDate; + } + @Override public String productDetails() { return "Food: " + name + ", Expires: " + expirationDate; diff --git a/src/main/java/com/example/Perishable.java b/src/main/java/com/example/Perishable.java index b4bf7ef3..ab44bf71 100644 --- a/src/main/java/com/example/Perishable.java +++ b/src/main/java/com/example/Perishable.java @@ -1,30 +1,14 @@ package com.example; -import java.math.BigDecimal; import java.time.LocalDate; import java.util.UUID; -public class Perishable extends Product{ - public Perishable(UUID uuid, String name, Category category, BigDecimal price) { - super(uuid, name, category, price); - } - - public LocalDate expirationDate() { - return LocalDate.now(); - } +interface Perishable { + UUID uuid(); + LocalDate expirationDate(); - @Override - public String productDetails() { - return ""; + default Boolean isExpired(Perishable perishable) { + return LocalDate.now().isAfter(perishable.expirationDate()); } - @Override - public BigDecimal getPrice() { - return null; - } - - @Override - public UUID uuid() { - return null; - } } diff --git a/src/main/java/com/example/Perishableclass.java b/src/main/java/com/example/Perishableclass.java new file mode 100644 index 00000000..e120cc59 --- /dev/null +++ b/src/main/java/com/example/Perishableclass.java @@ -0,0 +1,30 @@ +//package com.example; +// +//import java.math.BigDecimal; +//import java.time.LocalDate; +//import java.util.UUID; +// +//public class Perishable extends Product{ +// public Perishable(UUID uuid, String name, Category category, BigDecimal price) { +// super(uuid, name, category, price); +// } +// +// public LocalDate expirationDate() { +// return LocalDate.now(); +// } +// +// @Override +// public String productDetails() { +// return ""; +// } +// +// @Override +// public BigDecimal getPrice() { +// return null; +// } +// +// @Override +// public UUID uuid() { +// return null; +// } +//} diff --git a/src/main/java/com/example/Perishables.java b/src/main/java/com/example/Perishables.java deleted file mode 100644 index 6e5151c1..00000000 --- a/src/main/java/com/example/Perishables.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.UUID; - -public interface Perishables { - LocalDate expirationDate = null; - public BigDecimal getPrice(); - - - UUID uuid(); -} diff --git a/src/main/java/com/example/Product.java b/src/main/java/com/example/Product.java index b80505f4..79f517ba 100644 --- a/src/main/java/com/example/Product.java +++ b/src/main/java/com/example/Product.java @@ -5,7 +5,7 @@ -public abstract class Product implements Perishables { +public abstract class Product { UUID uuid; String name; Category category; diff --git a/src/main/java/com/example/Shippable.java b/src/main/java/com/example/Shippable.java index eb9fd2c4..fdd04729 100644 --- a/src/main/java/com/example/Shippable.java +++ b/src/main/java/com/example/Shippable.java @@ -5,4 +5,5 @@ public interface Shippable { double weight(); BigDecimal calculateShippingCost(); + } diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index 2e0161de..5f3b93dd 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -7,6 +7,7 @@ public class Warehouse { List products = new ArrayList<>(); List shippables = new ArrayList<>(); List perishables = new ArrayList<>(); + List expired = new ArrayList<>(); static HashMap warehouses = new HashMap<>(); private Warehouse() { @@ -27,6 +28,7 @@ public List shippableProducts() { public void clearProducts(){ products.clear(); Category.categories.clear(); + shippables.clear(); } public boolean isEmpty(){ @@ -39,7 +41,10 @@ public void addProduct(Product product){ if (getProductById(product.uuid).isPresent()) throw new IllegalArgumentException("Product with that id already exists, use updateProduct for updates."); products.add(product); - + if(product instanceof Shippable) + shippables.add((Shippable) product); + if(product instanceof Perishable) + perishables.add((Perishable) product); } public void remove(UUID id){ @@ -107,7 +112,9 @@ public void updateProductPrice(UUID id, BigDecimal newPrice){ } public List expiredProducts() { - return null; + return perishables.stream() + .filter(perishable -> perishable.isExpired(perishable)) + .toList(); } } From fa78ea3c008ce77433ce126b8bad1d75dfaa717c Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Tue, 21 Oct 2025 15:05:07 +0200 Subject: [PATCH 11/17] Cleaned up redundancies. --- src/main/java/com/example/Category.java | 6 +----- src/main/java/com/example/FoodProduct.java | 7 ------- src/main/java/com/example/Perishable.java | 2 -- src/main/java/com/example/Warehouse.java | 12 +++++------- 4 files changed, 6 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/example/Category.java b/src/main/java/com/example/Category.java index 2fa3d54d..8d3b83e4 100644 --- a/src/main/java/com/example/Category.java +++ b/src/main/java/com/example/Category.java @@ -4,7 +4,7 @@ public class Category { public String name; - static HashMap categories = new HashMap(); + static HashMap categories = new HashMap<>(); private Category(String categoryName) { name = categoryName; @@ -28,10 +28,6 @@ public static Category of(String name) { } - public void clear(){ - categories.clear(); - } - public String getName() { return name; } diff --git a/src/main/java/com/example/FoodProduct.java b/src/main/java/com/example/FoodProduct.java index d03028cc..17478094 100644 --- a/src/main/java/com/example/FoodProduct.java +++ b/src/main/java/com/example/FoodProduct.java @@ -17,13 +17,6 @@ public FoodProduct(UUID id, String name, Category category, BigDecimal price, Lo } - - - @Override - public UUID uuid() { - return uuid; - } - @Override public LocalDate expirationDate() { return expirationDate; diff --git a/src/main/java/com/example/Perishable.java b/src/main/java/com/example/Perishable.java index ab44bf71..aa87b378 100644 --- a/src/main/java/com/example/Perishable.java +++ b/src/main/java/com/example/Perishable.java @@ -1,10 +1,8 @@ package com.example; import java.time.LocalDate; -import java.util.UUID; interface Perishable { - UUID uuid(); LocalDate expirationDate(); default Boolean isExpired(Perishable perishable) { diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index 5f3b93dd..11256752 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -4,10 +4,9 @@ import java.util.*; public class Warehouse { - List products = new ArrayList<>(); - List shippables = new ArrayList<>(); - List perishables = new ArrayList<>(); - List expired = new ArrayList<>(); + List products; + List shippables; + List perishables; static HashMap warehouses = new HashMap<>(); private Warehouse() { @@ -65,9 +64,8 @@ public Optional getProductById(UUID id){ public static synchronized Warehouse getInstance(String string) { if (!warehouses.containsKey(string)) { warehouses.put(string, new Warehouse()); - return warehouses.get(string); - }else - return warehouses.get(string); + } + return warehouses.get(string); } public static synchronized Warehouse getInstance() { From ea7a98a54e0731309856e70b49458d7d08b5a7df Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Thu, 23 Oct 2025 10:52:22 +0200 Subject: [PATCH 12/17] Changed products from a list to a hashmap --- .../java/com/example/ElectronicsProduct.java | 9 ++++---- src/main/java/com/example/Warehouse.java | 22 ++++++++----------- .../java/com/example/WarehouseAnalyzer.java | 1 - 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/example/ElectronicsProduct.java b/src/main/java/com/example/ElectronicsProduct.java index 8171a704..d4bc8e15 100644 --- a/src/main/java/com/example/ElectronicsProduct.java +++ b/src/main/java/com/example/ElectronicsProduct.java @@ -24,14 +24,13 @@ public ElectronicsProduct(UUID id, String name, Category category, BigDecimal pr } - @Override - public String productDetails() { - return "Electronics: " + name + ", Warranty: " + warrantyMonths + " months"; + public int getWarrantyMonths() { + return warrantyMonths; } @Override - public UUID uuid() { - return null; + public String productDetails() { + return "Electronics: " + name + ", Warranty: " + warrantyMonths + " months"; } @Override diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index 11256752..b9061e02 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -4,20 +4,19 @@ import java.util.*; public class Warehouse { - List products; + HashMap products; List shippables; List perishables; static HashMap warehouses = new HashMap<>(); private Warehouse() { - this.products = new ArrayList<>(); + this.products = new HashMap<>(); this.shippables = new ArrayList<>(); this.perishables = new ArrayList<>(); - } public List getProducts(){ - return Collections.unmodifiableList(products); + return List.copyOf(products.values()); } public List shippableProducts() { @@ -28,6 +27,7 @@ public void clearProducts(){ products.clear(); Category.categories.clear(); shippables.clear(); + perishables.clear(); } public boolean isEmpty(){ @@ -39,7 +39,7 @@ public void addProduct(Product product){ throw new IllegalArgumentException("Product cannot be null."); if (getProductById(product.uuid).isPresent()) throw new IllegalArgumentException("Product with that id already exists, use updateProduct for updates."); - products.add(product); + products.put(product.uuid, product); if(product instanceof Shippable) shippables.add((Shippable) product); if(product instanceof Perishable) @@ -47,18 +47,13 @@ public void addProduct(Product product){ } public void remove(UUID id){ - products.removeIf(product -> product.uuid == id); + products.remove(id); } public Optional getProductById(UUID id){ if (products.isEmpty()) return Optional.empty(); - - return products.stream() - .filter(p -> p.uuid == id) - .findFirst(); - - + return (Optional.ofNullable(products.get(id))); } public static synchronized Warehouse getInstance(String string) { @@ -82,11 +77,12 @@ public Map> getProductsGroupedByCategories() { HashMap> result = new HashMap<>(); var tempMap = Category.categories.entrySet(); + var productsList = new ArrayList<>(products.values()); for(var category : tempMap){ List tempList = new ArrayList<>(); - products.stream() + productsList.stream() .filter(element -> element.category.equals(category.getValue())) .forEach(tempList::add); diff --git a/src/main/java/com/example/WarehouseAnalyzer.java b/src/main/java/com/example/WarehouseAnalyzer.java index f975c517..b6b67a32 100644 --- a/src/main/java/com/example/WarehouseAnalyzer.java +++ b/src/main/java/com/example/WarehouseAnalyzer.java @@ -146,7 +146,6 @@ public Map calculateWeightedAveragePriceByCategory() { * @return list of products considered outliers */ - //Denna är fel *********************** public List findPriceOutliers(double standardDeviations) { List products = warehouse.getProducts(); From a758d09b8cb9bdc844d256dfbb2b60e8e5ae3bc9 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Thu, 23 Oct 2025 11:24:29 +0200 Subject: [PATCH 13/17] Added getChangedProducts to track changed product prices --- .../java/com/example/Perishableclass.java | 30 ------------------- src/main/java/com/example/Warehouse.java | 13 ++++++-- 2 files changed, 10 insertions(+), 33 deletions(-) delete mode 100644 src/main/java/com/example/Perishableclass.java diff --git a/src/main/java/com/example/Perishableclass.java b/src/main/java/com/example/Perishableclass.java deleted file mode 100644 index e120cc59..00000000 --- a/src/main/java/com/example/Perishableclass.java +++ /dev/null @@ -1,30 +0,0 @@ -//package com.example; -// -//import java.math.BigDecimal; -//import java.time.LocalDate; -//import java.util.UUID; -// -//public class Perishable extends Product{ -// public Perishable(UUID uuid, String name, Category category, BigDecimal price) { -// super(uuid, name, category, price); -// } -// -// public LocalDate expirationDate() { -// return LocalDate.now(); -// } -// -// @Override -// public String productDetails() { -// return ""; -// } -// -// @Override -// public BigDecimal getPrice() { -// return null; -// } -// -// @Override -// public UUID uuid() { -// return null; -// } -//} diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index b9061e02..54213228 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -1,6 +1,7 @@ package com.example; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.*; public class Warehouse { @@ -8,6 +9,7 @@ public class Warehouse { List shippables; List perishables; static HashMap warehouses = new HashMap<>(); + HashMap, HashMap> changedProducts = new HashMap<>(); private Warehouse() { this.products = new HashMap<>(); @@ -94,15 +96,20 @@ public Map> getProductsGroupedByCategories() { } public void updateProductPrice(UUID id, BigDecimal newPrice){ - var product = getProductById(id); - - if(product.isPresent()) + if(product.isPresent()) { + var tempMap = new HashMap(); + tempMap.put(LocalDateTime.now(), product.get().price); + changedProducts.put(product, tempMap); product.get().setPrice(newPrice); + } else throw new NoSuchElementException("Product not found with id:" + id); + } + public Map, HashMap> getChangedProducts(){ + return changedProducts; } public List expiredProducts() { From f2ecb2a0ce3a35caa2fd6176840e40ef04d0f0e7 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Thu, 23 Oct 2025 11:29:19 +0200 Subject: [PATCH 14/17] Fixed calculateShippingCost in ElectronicsProduct --- src/main/java/com/example/ElectronicsProduct.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/ElectronicsProduct.java b/src/main/java/com/example/ElectronicsProduct.java index d4bc8e15..d52f5be8 100644 --- a/src/main/java/com/example/ElectronicsProduct.java +++ b/src/main/java/com/example/ElectronicsProduct.java @@ -40,9 +40,8 @@ public double weight() { @Override public BigDecimal calculateShippingCost() { - if(weight.intValue() >= 5) - return basePrice.add(addPrice); - else - return basePrice; + return (weight.compareTo(BigDecimal.valueOf(5.0)) >= 0) + ? basePrice.add(addPrice) + : basePrice; } } From 61e66b0871d23e6f85f9e1dac8b19c31e8486242 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Thu, 23 Oct 2025 11:31:21 +0200 Subject: [PATCH 15/17] Simplified isExpired in Perishable --- src/main/java/com/example/Perishable.java | 4 ++-- src/main/java/com/example/Warehouse.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/Perishable.java b/src/main/java/com/example/Perishable.java index aa87b378..09cefc58 100644 --- a/src/main/java/com/example/Perishable.java +++ b/src/main/java/com/example/Perishable.java @@ -5,8 +5,8 @@ interface Perishable { LocalDate expirationDate(); - default Boolean isExpired(Perishable perishable) { - return LocalDate.now().isAfter(perishable.expirationDate()); + default boolean isExpired() { + return LocalDate.now().isAfter(expirationDate()); } } diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index 54213228..290a3f28 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -114,7 +114,7 @@ public Map, HashMap> getChangedProd public List expiredProducts() { return perishables.stream() - .filter(perishable -> perishable.isExpired(perishable)) + .filter(Perishable::isExpired) .toList(); } } From 52c512237367a868067494cbd9f6677c61de3ff3 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Thu, 23 Oct 2025 13:09:15 +0200 Subject: [PATCH 16/17] Reconstructed findPriceOutliers with IQR --- .../java/com/example/WarehouseAnalyzer.java | 46 +++++++++++++------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/WarehouseAnalyzer.java b/src/main/java/com/example/WarehouseAnalyzer.java index b6b67a32..54349ac5 100644 --- a/src/main/java/com/example/WarehouseAnalyzer.java +++ b/src/main/java/com/example/WarehouseAnalyzer.java @@ -148,25 +148,43 @@ public Map calculateWeightedAveragePriceByCategory() { public List findPriceOutliers(double standardDeviations) { - List products = warehouse.getProducts(); - int n = products.size(); - if (n == 0) return List.of(); - double sum = products.stream().map(Product::price).mapToDouble(bd -> bd.doubleValue()).sum(); - double mean = sum / n; - double variance = products.stream() + List productList = warehouse.getProducts(); + List products = productList.stream() .map(Product::price) - .mapToDouble(bd -> Math.pow(bd.doubleValue() - mean, 2)) - .sum() / n; - double std = Math.sqrt(variance); - double threshold = standardDeviations * std; + .sorted() + .toList(); + + var Q1 = getPercentile(products, 25); + var Q3 = getPercentile(products, 75); + + var IQR = Q3.doubleValue()-Q1.doubleValue(); + var lowRange = Q1.doubleValue()-standardDeviations*IQR; + var highRange = Q3.doubleValue()+standardDeviations*IQR; + List outliers = new ArrayList<>(); - for (Product p : products) { - double diff = Math.abs(p.price().doubleValue() - mean); - if (diff > threshold) outliers.add(p); + for(Product p : productList){ + if((p.price.doubleValue()>highRange) || (p.price.doubleValue()> T getPercentile(Collection input, double percentile) { + if (input == null || input.isEmpty()) { + throw new IllegalArgumentException("The input dataset cannot be null or empty."); + } + if (percentile < 0 || percentile > 100) { + throw new IllegalArgumentException("Percentile must be between 0 and 100 inclusive."); + } + List sortedList = input.stream() + .sorted() + .collect(Collectors.toList()); + + int rank = percentile == 0 ? 1 : (int) Math.ceil(percentile / 100.0 * input.size()); + return sortedList.get(rank - 1); + } + /** * Groups all shippable products into ShippingGroup buckets such that each group's total weight * does not exceed the provided maximum. The goal is to minimize the number of groups and/or total From 6757f3c2ce31f832c99580680852216a42c8e709 Mon Sep 17 00:00:00 2001 From: Samuel Fjellet <229708690+Samuel-Fjellet@users.noreply.github.com> Date: Thu, 23 Oct 2025 13:28:09 +0200 Subject: [PATCH 17/17] Final cleanup --- src/main/java/com/example/Category.java | 5 ---- .../java/com/example/ElectronicsProduct.java | 7 ------ src/main/java/com/example/FoodProduct.java | 1 - src/main/java/com/example/Perishable.java | 2 -- src/main/java/com/example/Product.java | 5 ---- src/main/java/com/example/Shippable.java | 3 +-- src/main/java/com/example/Warehouse.java | 23 +++---------------- 7 files changed, 4 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/example/Category.java b/src/main/java/com/example/Category.java index 8d3b83e4..6b9632f7 100644 --- a/src/main/java/com/example/Category.java +++ b/src/main/java/com/example/Category.java @@ -8,10 +8,8 @@ public class Category { private Category(String categoryName) { name = categoryName; - name = name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase(); - } public static Category of(String name) { @@ -19,13 +17,10 @@ public static Category of(String name) { throw new IllegalArgumentException("Category name can't be null"); } else if (name.isBlank()) throw new IllegalArgumentException("Category name can't be blank"); - if (categories.containsKey(name)) return categories.get(name); - categories.put(name, new Category(name)); return categories.get(name); - } public String getName() { diff --git a/src/main/java/com/example/ElectronicsProduct.java b/src/main/java/com/example/ElectronicsProduct.java index d52f5be8..17d36747 100644 --- a/src/main/java/com/example/ElectronicsProduct.java +++ b/src/main/java/com/example/ElectronicsProduct.java @@ -3,25 +3,18 @@ import java.math.BigDecimal; import java.util.UUID; -/* -Implements Shippable. -Shipping rule: base 79, add 49 if weight > 5.0 kg. - */ - public class ElectronicsProduct extends Product implements Shippable { int warrantyMonths; BigDecimal weight; BigDecimal basePrice = BigDecimal.valueOf(79); BigDecimal addPrice = BigDecimal.valueOf(49); - public ElectronicsProduct(UUID id, String name, Category category, BigDecimal price, int warranty, BigDecimal weight) { super(id, name, category, price); this.warrantyMonths = warranty; if (warrantyMonths < 0) throw new IllegalArgumentException("Warranty months cannot be negative."); this.weight = weight; - } public int getWarrantyMonths() { diff --git a/src/main/java/com/example/FoodProduct.java b/src/main/java/com/example/FoodProduct.java index 17478094..c50b8f3a 100644 --- a/src/main/java/com/example/FoodProduct.java +++ b/src/main/java/com/example/FoodProduct.java @@ -14,7 +14,6 @@ public FoodProduct(UUID id, String name, Category category, BigDecimal price, Lo if (weight.compareTo(BigDecimal.ZERO) < 0) throw new IllegalArgumentException("Weight cannot be negative."); this.weight = weight; - } @Override diff --git a/src/main/java/com/example/Perishable.java b/src/main/java/com/example/Perishable.java index 09cefc58..adeba099 100644 --- a/src/main/java/com/example/Perishable.java +++ b/src/main/java/com/example/Perishable.java @@ -4,9 +4,7 @@ interface Perishable { LocalDate expirationDate(); - default boolean isExpired() { return LocalDate.now().isAfter(expirationDate()); } - } diff --git a/src/main/java/com/example/Product.java b/src/main/java/com/example/Product.java index 79f517ba..ba422d27 100644 --- a/src/main/java/com/example/Product.java +++ b/src/main/java/com/example/Product.java @@ -3,8 +3,6 @@ import java.math.BigDecimal; import java.util.UUID; - - public abstract class Product { UUID uuid; String name; @@ -17,11 +15,9 @@ public Product(UUID uuid, String name, Category category, BigDecimal price) { this.category = category; if(price.compareTo(BigDecimal.ZERO) < 0) throw new IllegalArgumentException("Price cannot be negative."); - this.price = price; } - public BigDecimal price() { return price; } @@ -43,5 +39,4 @@ public Category category() { } public abstract String productDetails(); - } diff --git a/src/main/java/com/example/Shippable.java b/src/main/java/com/example/Shippable.java index fdd04729..6b1b2e49 100644 --- a/src/main/java/com/example/Shippable.java +++ b/src/main/java/com/example/Shippable.java @@ -3,7 +3,6 @@ import java.math.BigDecimal; public interface Shippable { - double weight(); BigDecimal calculateShippingCost(); - + double weight(); } diff --git a/src/main/java/com/example/Warehouse.java b/src/main/java/com/example/Warehouse.java index 290a3f28..33e6a417 100644 --- a/src/main/java/com/example/Warehouse.java +++ b/src/main/java/com/example/Warehouse.java @@ -5,16 +5,17 @@ import java.util.*; public class Warehouse { + static HashMap warehouses = new HashMap<>(); HashMap products; List shippables; List perishables; - static HashMap warehouses = new HashMap<>(); - HashMap, HashMap> changedProducts = new HashMap<>(); + HashMap, HashMap> changedProducts; private Warehouse() { this.products = new HashMap<>(); this.shippables = new ArrayList<>(); this.perishables = new ArrayList<>(); + this.changedProducts = new HashMap<>(); } public List getProducts(){ @@ -75,24 +76,17 @@ public Map> getProductsGroupedByCategories() { if(products == null || products.isEmpty()){ return Collections.emptyMap(); } - HashMap> result = new HashMap<>(); - var tempMap = Category.categories.entrySet(); var productsList = new ArrayList<>(products.values()); - for(var category : tempMap){ List tempList = new ArrayList<>(); - productsList.stream() .filter(element -> element.category.equals(category.getValue())) .forEach(tempList::add); - result.put(category.getValue(), tempList); } - return result; - } public void updateProductPrice(UUID id, BigDecimal newPrice){ @@ -105,7 +99,6 @@ public void updateProductPrice(UUID id, BigDecimal newPrice){ } else throw new NoSuchElementException("Product not found with id:" + id); - } public Map, HashMap> getChangedProducts(){ @@ -119,13 +112,3 @@ public List expiredProducts() { } } -/* -getInstance(String name) returns the same instance per unique name. -addProduct(Product): throw IllegalArgumentException("Product cannot be null.") if null. -getProducts(): return an unmodifiable copy. -getProductById(UUID): return Optional. -updateProductPrice(UUID, BigDecimal): when not found, throw NoSuchElementException("Product not found with id: "). Also track changed products in getChangedProducts(). -expiredProducts(): return List that are expired. -shippableProducts(): return List from stored products. -remove(UUID): remove the matching product if present. - */