From 3238d4e95b4eb7088fa5fc93985c9f207888e7fb Mon Sep 17 00:00:00 2001 From: Tefaier Date: Sun, 10 Dec 2023 11:02:56 +0300 Subject: [PATCH 01/22] Initial files setup --- .../java/HW/models/DefaultIOOperations.java | 21 +++++++ src/main/java/HW/models/basket/Basket.java | 33 +++++++++++ .../HW/models/basket/BasketRepository.java | 10 ++++ .../basket/BasketRepositoryInMemory.java | 42 +++++++++++++ .../HW/models/parser/CommandParserTXT.java | 59 +++++++++++++++++++ 5 files changed, 165 insertions(+) create mode 100644 src/main/java/HW/models/DefaultIOOperations.java create mode 100644 src/main/java/HW/models/basket/Basket.java create mode 100644 src/main/java/HW/models/basket/BasketRepository.java create mode 100644 src/main/java/HW/models/basket/BasketRepositoryInMemory.java create mode 100644 src/main/java/HW/models/parser/CommandParserTXT.java diff --git a/src/main/java/HW/models/DefaultIOOperations.java b/src/main/java/HW/models/DefaultIOOperations.java new file mode 100644 index 0000000..52393b0 --- /dev/null +++ b/src/main/java/HW/models/DefaultIOOperations.java @@ -0,0 +1,21 @@ +package HW.models; + +import java.io.IOException; +import java.net.URL; +import java.nio.file.Path; + +public class DefaultIOOperations { + public static String getPath(String path) throws IOException { + if (Path.of(path).isAbsolute()) { + return path; + } + + URL resource; + if ((resource = DefaultIOOperations.class.getClassLoader().getResource(path)) != null) { + return resource.getPath(); + } else if ((resource = DefaultIOOperations.class.getResource(path)) != null) { + return resource.getPath(); + } + throw new IOException("Can't find file by path: " + path); + } +} diff --git a/src/main/java/HW/models/basket/Basket.java b/src/main/java/HW/models/basket/Basket.java new file mode 100644 index 0000000..ddce0f9 --- /dev/null +++ b/src/main/java/HW/models/basket/Basket.java @@ -0,0 +1,33 @@ +package HW.models.basket; + +import HW.models.enums.Product; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class Basket { + private ConcurrentHashMap products = new ConcurrentHashMap<>(); + + public void alterContent (Product product, float change) { + synchronized (product) { + if (products.containsKey(product)) { + float newValue = products.get(product) + change; + if (newValue < 0) { + throw new IllegalArgumentException("Basket content can't be negative"); + } + products.put(product, newValue); + } else { + products.put(product, change); + } + } + } + + public void clearBasket () { + products.clear(); + } + + public Map getProducts () { + return Map.copyOf(products); + } +} diff --git a/src/main/java/HW/models/basket/BasketRepository.java b/src/main/java/HW/models/basket/BasketRepository.java new file mode 100644 index 0000000..1dcae37 --- /dev/null +++ b/src/main/java/HW/models/basket/BasketRepository.java @@ -0,0 +1,10 @@ +package HW.models.basket; + +import HW.models.enums.Product; + +import java.util.function.Predicate; + +public interface BasketRepository { + void changeBasketContent (long id, Product product, float change); + void tryOrderBasket (long id); +} diff --git a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java new file mode 100644 index 0000000..014fd53 --- /dev/null +++ b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java @@ -0,0 +1,42 @@ +package HW.models.basket; + +import HW.models.enums.Product; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Logger; + +public class BasketRepositoryInMemory implements BasketRepository{ + private static final Logger logger = Logger.getLogger(BasketRepositoryInMemory.class.getSimpleName()); + private final ConcurrentHashMap baskets = new ConcurrentHashMap<>(); + // private final Sclad; + + @Override + public void changeBasketContent(long id, Product product, float change) { + logger.info("Basket with id " + id + " was changed: product->" + product.name() + " change->" + change); + synchronized (Long.valueOf(id)) { + if (!baskets.containsKey(id)) { + baskets.put(id, new Basket()); + } + try { + baskets.get(id).alterContent(product, change); + } catch (IllegalArgumentException e) { + logger.info("Change to basket with id " + id + " wasn't made"); + } + } + } + + @Override + public void tryOrderBasket(long id) { + logger.info("Basket with id " + id + " was ordered"); + synchronized (Long.valueOf(id)) { + try { + // baskets.get(id).getProducts(); + // request to sklad + baskets.get(id).clearBasket(); + } catch (RuntimeException e) { + logger.info("Basket with id " + id + " was ordered but failed!"); + } + } + } +} diff --git a/src/main/java/HW/models/parser/CommandParserTXT.java b/src/main/java/HW/models/parser/CommandParserTXT.java new file mode 100644 index 0000000..ed11774 --- /dev/null +++ b/src/main/java/HW/models/parser/CommandParserTXT.java @@ -0,0 +1,59 @@ +package HW.models.parser; + +import HW.models.DefaultIOOperations; +import HW.models.basket.BasketRepository; +import HW.models.enums.Product; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Logger; + +public class CommandParserTXT { + private static final Logger logger = Logger.getLogger(CommandParserTXT.class.getSimpleName()); + private final String sourcePath; + private final BasketRepository basketRepository; + private final BufferedReader reader; + + public CommandParserTXT(String sourcePath, BasketRepository basketRepository) throws IOException { + this.basketRepository = basketRepository; + if (!sourcePath.contains(".txt")) { + throw new IllegalArgumentException("File for CommandParserTXT has to be of type txt"); + } + this.sourcePath = sourcePath; + this.reader = new BufferedReader(new FileReader(DefaultIOOperations.getPath(sourcePath))); + } + + public boolean applyNextCommand () throws IOException { + String newLine = reader.readLine(); + if (newLine == null) { + return false; + } + applyCommand(newLine); + return true; + } + + public void applyAllCommands () throws IOException { + reader.lines().forEachOrdered(this::applyCommand); + reader.close(); + } + + private void applyCommand (String command) { + String[] parts = command.split(" "); + if (parts[0].equalsIgnoreCase("get")) { + try { + long id = Long.parseLong(parts[1]); + Product product = Product.valueOf(parts[2]); + float change = Float.parseFloat(parts[3]); + basketRepository.changeBasketContent(id, product, change); + } catch (IllegalArgumentException e) { + logger.info("Unknown product: " + parts[2]); + } + } else if (parts[0].equalsIgnoreCase("order")) { + long id = Long.parseLong(parts[1]); + basketRepository.tryOrderBasket(id); + } else { + logger.info("Unknown command: " + parts[0]); + } + } +} From 31ef7b5b6f9acbd057d60fc60eacac4ae4f69a24 Mon Sep 17 00:00:00 2001 From: Tefaier Date: Mon, 11 Dec 2023 13:07:11 +0300 Subject: [PATCH 02/22] Added tiny txt and main file for run testing --- src/main/java/HW/models/Main.java | 20 ++++++++++++++++++++ src/main/resources/commands/list1.txt | 1 + 2 files changed, 21 insertions(+) create mode 100644 src/main/java/HW/models/Main.java create mode 100644 src/main/resources/commands/list1.txt diff --git a/src/main/java/HW/models/Main.java b/src/main/java/HW/models/Main.java new file mode 100644 index 0000000..0207cd2 --- /dev/null +++ b/src/main/java/HW/models/Main.java @@ -0,0 +1,20 @@ +package HW.models; + +import HW.models.basket.BasketRepository; +import HW.models.basket.BasketRepositoryInMemory; +import HW.models.parser.CommandParserTXT; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + BasketRepository basketRepository = new BasketRepositoryInMemory(); + String path = "commands/list1.txt"; + try { + CommandParserTXT parser = new CommandParserTXT(path, basketRepository); + parser.applyAllCommands(); + } catch (IOException e) { + System.out.println("Failed while executing commands from txt file: " + e.getMessage()); + } + } +} diff --git a/src/main/resources/commands/list1.txt b/src/main/resources/commands/list1.txt new file mode 100644 index 0000000..fbd46d9 --- /dev/null +++ b/src/main/resources/commands/list1.txt @@ -0,0 +1 @@ +get 1 Water 10 \ No newline at end of file From 6a9119edd86a853045eaa5a15af92cbb50900d69 Mon Sep 17 00:00:00 2001 From: Tefaier Date: Thu, 14 Dec 2023 12:36:00 +0300 Subject: [PATCH 03/22] Some changes Added new command --- src/main/java/HW/models/Main.java | 5 ++++- src/main/java/HW/models/basket/Basket.java | 20 +++++++++---------- .../HW/models/basket/BasketRepository.java | 3 +-- .../basket/BasketRepositoryInMemory.java | 12 +++++++++-- .../HW/models/parser/CommandParserTXT.java | 3 +++ 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/main/java/HW/models/Main.java b/src/main/java/HW/models/Main.java index 0207cd2..2d216c7 100644 --- a/src/main/java/HW/models/Main.java +++ b/src/main/java/HW/models/Main.java @@ -5,8 +5,11 @@ import HW.models.parser.CommandParserTXT; import java.io.IOException; +import java.util.logging.Logger; public class Main { + private static final Logger logger = Logger.getLogger(Main.class.getSimpleName()); + public static void main(String[] args) { BasketRepository basketRepository = new BasketRepositoryInMemory(); String path = "commands/list1.txt"; @@ -14,7 +17,7 @@ public static void main(String[] args) { CommandParserTXT parser = new CommandParserTXT(path, basketRepository); parser.applyAllCommands(); } catch (IOException e) { - System.out.println("Failed while executing commands from txt file: " + e.getMessage()); + logger.warning("Failed while executing commands from txt file: " + e.getMessage()); } } } diff --git a/src/main/java/HW/models/basket/Basket.java b/src/main/java/HW/models/basket/Basket.java index ddce0f9..4386685 100644 --- a/src/main/java/HW/models/basket/Basket.java +++ b/src/main/java/HW/models/basket/Basket.java @@ -9,21 +9,19 @@ public class Basket { private ConcurrentHashMap products = new ConcurrentHashMap<>(); - public void alterContent (Product product, float change) { - synchronized (product) { - if (products.containsKey(product)) { - float newValue = products.get(product) + change; - if (newValue < 0) { - throw new IllegalArgumentException("Basket content can't be negative"); - } - products.put(product, newValue); - } else { - products.put(product, change); + public synchronized void alterContent (Product product, float change) { + if (products.containsKey(product)) { + float newValue = products.get(product) + change; + if (newValue < 0) { + throw new IllegalArgumentException("Basket content can't be negative"); } + products.put(product, newValue); + } else { + products.put(product, change); } } - public void clearBasket () { + public synchronized void clearBasket () { products.clear(); } diff --git a/src/main/java/HW/models/basket/BasketRepository.java b/src/main/java/HW/models/basket/BasketRepository.java index 1dcae37..008949c 100644 --- a/src/main/java/HW/models/basket/BasketRepository.java +++ b/src/main/java/HW/models/basket/BasketRepository.java @@ -2,9 +2,8 @@ import HW.models.enums.Product; -import java.util.function.Predicate; - public interface BasketRepository { void changeBasketContent (long id, Product product, float change); void tryOrderBasket (long id); + void removeBasket(long id); } diff --git a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java index 014fd53..6de9516 100644 --- a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java +++ b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java @@ -13,8 +13,8 @@ public class BasketRepositoryInMemory implements BasketRepository{ @Override public void changeBasketContent(long id, Product product, float change) { - logger.info("Basket with id " + id + " was changed: product->" + product.name() + " change->" + change); synchronized (Long.valueOf(id)) { + logger.info("Basket with id " + id + " was changed: product->" + product.displayName + " change->" + change + " " + product.unitName); if (!baskets.containsKey(id)) { baskets.put(id, new Basket()); } @@ -28,8 +28,8 @@ public void changeBasketContent(long id, Product product, float change) { @Override public void tryOrderBasket(long id) { - logger.info("Basket with id " + id + " was ordered"); synchronized (Long.valueOf(id)) { + logger.info("Basket with id " + id + " was ordered"); try { // baskets.get(id).getProducts(); // request to sklad @@ -39,4 +39,12 @@ public void tryOrderBasket(long id) { } } } + + @Override + public void removeBasket(long id) { + synchronized (Long.valueOf(id)) { + logger.info("Basket with id " + id + " was removed"); + baskets.remove(id); + } + } } diff --git a/src/main/java/HW/models/parser/CommandParserTXT.java b/src/main/java/HW/models/parser/CommandParserTXT.java index ed11774..4c54a57 100644 --- a/src/main/java/HW/models/parser/CommandParserTXT.java +++ b/src/main/java/HW/models/parser/CommandParserTXT.java @@ -52,6 +52,9 @@ private void applyCommand (String command) { } else if (parts[0].equalsIgnoreCase("order")) { long id = Long.parseLong(parts[1]); basketRepository.tryOrderBasket(id); + } else if (parts[0].equalsIgnoreCase("remove")) { + long id = Long.parseLong(parts[1]); + basketRepository.removeBasket(id); } else { logger.info("Unknown command: " + parts[0]); } From a0a798b6179f6bd45775aaafc7b3225b0da749fb Mon Sep 17 00:00:00 2001 From: Tefaier Date: Mon, 18 Dec 2023 15:43:16 +0300 Subject: [PATCH 04/22] Added command to parser Altered list of commands --- .../java/HW/models/parser/CommandParserTXT.java | 2 +- src/main/resources/commands/list1.txt | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/HW/models/parser/CommandParserTXT.java b/src/main/java/HW/models/parser/CommandParserTXT.java index 4c54a57..fc25eb0 100644 --- a/src/main/java/HW/models/parser/CommandParserTXT.java +++ b/src/main/java/HW/models/parser/CommandParserTXT.java @@ -21,7 +21,7 @@ public CommandParserTXT(String sourcePath, BasketRepository basketRepository) th throw new IllegalArgumentException("File for CommandParserTXT has to be of type txt"); } this.sourcePath = sourcePath; - this.reader = new BufferedReader(new FileReader(DefaultIOOperations.getPath(sourcePath))); + this.reader = new BufferedReader(new FileReader(DefaultIOOperations.getPath(this.sourcePath))); } public boolean applyNextCommand () throws IOException { diff --git a/src/main/resources/commands/list1.txt b/src/main/resources/commands/list1.txt index fbd46d9..08395d1 100644 --- a/src/main/resources/commands/list1.txt +++ b/src/main/resources/commands/list1.txt @@ -1 +1,16 @@ -get 1 Water 10 \ No newline at end of file +get 1 Water 10 +get 1 Bread 20 +get 2 Flour 5 +get 3 Water 7 +order 1 +get 2 Bread 1000 +remove 2 +get 2 Flour 3 +order 2 +order 3 +get 1 Water 5 +order 1 +get 4 Flour 1 +remove 4 +get 2 Bread 2 +order 2 \ No newline at end of file From 4ee4f26c01537de8703beaed5a559a1a814d31f2 Mon Sep 17 00:00:00 2001 From: Tefaier Date: Wed, 20 Dec 2023 21:31:11 +0300 Subject: [PATCH 05/22] Added view method for BasketRepository --- src/main/java/HW/models/basket/Basket.java | 13 +++++++++++++ .../java/HW/models/basket/BasketRepository.java | 4 ++++ .../HW/models/basket/BasketRepositoryInMemory.java | 9 +++++++++ 3 files changed, 26 insertions(+) diff --git a/src/main/java/HW/models/basket/Basket.java b/src/main/java/HW/models/basket/Basket.java index 4386685..909e0e6 100644 --- a/src/main/java/HW/models/basket/Basket.java +++ b/src/main/java/HW/models/basket/Basket.java @@ -9,6 +9,15 @@ public class Basket { private ConcurrentHashMap products = new ConcurrentHashMap<>(); + public Basket (Map products) { + this.products = new ConcurrentHashMap<>(); + this.products.putAll(products); + } + + public Basket () { + this.products = new ConcurrentHashMap<>(); + } + public synchronized void alterContent (Product product, float change) { if (products.containsKey(product)) { float newValue = products.get(product) + change; @@ -28,4 +37,8 @@ public synchronized void clearBasket () { public Map getProducts () { return Map.copyOf(products); } + + public Basket getCopy() { + return new Basket(getProducts()); + } } diff --git a/src/main/java/HW/models/basket/BasketRepository.java b/src/main/java/HW/models/basket/BasketRepository.java index 008949c..e3cb7a4 100644 --- a/src/main/java/HW/models/basket/BasketRepository.java +++ b/src/main/java/HW/models/basket/BasketRepository.java @@ -2,8 +2,12 @@ import HW.models.enums.Product; +import java.util.HashMap; +import java.util.Map; + public interface BasketRepository { void changeBasketContent (long id, Product product, float change); void tryOrderBasket (long id); void removeBasket(long id); + Map getContent(); } diff --git a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java index 6de9516..536eac9 100644 --- a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java +++ b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java @@ -2,9 +2,11 @@ import HW.models.enums.Product; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; +import java.util.stream.Collectors; public class BasketRepositoryInMemory implements BasketRepository{ private static final Logger logger = Logger.getLogger(BasketRepositoryInMemory.class.getSimpleName()); @@ -47,4 +49,11 @@ public void removeBasket(long id) { baskets.remove(id); } } + + @Override + public Map getContent() { + return baskets.entrySet().stream() + .map(entry -> Map.entry(entry.getKey(), entry.getValue().getCopy())) + .collect(Collectors.toMap(val -> val.getKey(), val -> val.getValue())); + } } From 8cbe66ab2296eb36a82786d10fa0392f8b9d396e Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 17:46:47 +0300 Subject: [PATCH 06/22] Update Main.java --- src/main/java/HW/models/Main.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/HW/models/Main.java b/src/main/java/HW/models/Main.java index 2d216c7..d68e5f0 100644 --- a/src/main/java/HW/models/Main.java +++ b/src/main/java/HW/models/Main.java @@ -1,17 +1,25 @@ package HW.models; -import HW.models.basket.BasketRepository; import HW.models.basket.BasketRepositoryInMemory; +import HW.models.enums.Product; import HW.models.parser.CommandParserTXT; +import HW.models.storage.Storage; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import java.util.logging.Logger; public class Main { private static final Logger logger = Logger.getLogger(Main.class.getSimpleName()); public static void main(String[] args) { - BasketRepository basketRepository = new BasketRepositoryInMemory(); + Map storageContent = new HashMap(); + storageContent.put(Product.Bread, 100f); + storageContent.put(Product.Flour, 100f); + storageContent.put(Product.Water, 100f); + Storage storage = new Storage(storageContent); + BasketRepository basketRepository = new BasketRepositoryInMemory(storage); String path = "commands/list1.txt"; try { CommandParserTXT parser = new CommandParserTXT(path, basketRepository); From 1ac8f22e0ed865d25364965b370204cbf0deaffc Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 17:47:10 +0300 Subject: [PATCH 07/22] Add files via upload --- src/main/java/HW/models/storage/Storage.java | 37 +++++++++++++++++++ .../storage/UnavailablePurchaseException.java | 10 +++++ 2 files changed, 47 insertions(+) create mode 100644 src/main/java/HW/models/storage/Storage.java create mode 100644 src/main/java/HW/models/storage/UnavailablePurchaseException.java diff --git a/src/main/java/HW/models/storage/Storage.java b/src/main/java/HW/models/storage/Storage.java new file mode 100644 index 0000000..92c3684 --- /dev/null +++ b/src/main/java/HW/models/storage/Storage.java @@ -0,0 +1,37 @@ +package HW.models.storage; + +import HW.models.enums.Product; + +import java.util.HashMap; +import java.util.Map; + +public class Storage{ + private Map content; + + public Storage() { + this.content = new HashMap(); + } + + public Storage(Map content) { + this.content = content; + } + + public synchronized void takeAway(Map basketContent) + throws UnavailablePurchaseException { + for (Product product : basketContent.keySet()) { + if (this.content.containsKey(product)) { + if (this.content.get(product) < basketContent.get(product)) { + throw new UnavailablePurchaseException("Shortage of product!", + product + " не в наличии или его недостаточно для осуществления заказа"); + } + } else { + throw new UnavailablePurchaseException("Unavailable product!", + product + " не хранится на складе"); + } + } + + for (Product product : basketContent.keySet()) { + this.content.put(product, this.content.get(product) - basketContent.get(product)); + } + } +} diff --git a/src/main/java/HW/models/storage/UnavailablePurchaseException.java b/src/main/java/HW/models/storage/UnavailablePurchaseException.java new file mode 100644 index 0000000..d1c3ee8 --- /dev/null +++ b/src/main/java/HW/models/storage/UnavailablePurchaseException.java @@ -0,0 +1,10 @@ +package HW.models.storage; + +public class UnavailablePurchaseException extends RuntimeException{ + public final String reasonDescription; + + public UnavailablePurchaseException(String message, String reasonDescription) { + super(message); + this.reasonDescription = reasonDescription; + } +} From f8449ed1070dd5da94c2c5426ff49053445fcff8 Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 17:49:22 +0300 Subject: [PATCH 08/22] Update BasketRepositoryInMemory.java --- .../HW/models/basket/BasketRepositoryInMemory.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java index 536eac9..9138488 100644 --- a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java +++ b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java @@ -11,7 +11,11 @@ public class BasketRepositoryInMemory implements BasketRepository{ private static final Logger logger = Logger.getLogger(BasketRepositoryInMemory.class.getSimpleName()); private final ConcurrentHashMap baskets = new ConcurrentHashMap<>(); - // private final Sclad; + private final Storage storage; + + public BasketRepositoryInMemory(Storage storage) { + this.storage = storage; + } @Override public void changeBasketContent(long id, Product product, float change) { @@ -33,8 +37,8 @@ public void tryOrderBasket(long id) { synchronized (Long.valueOf(id)) { logger.info("Basket with id " + id + " was ordered"); try { - // baskets.get(id).getProducts(); - // request to sklad + Map basketContent = baskets.get(id).getProducts(); + this.storage.takeAway(basketContent); baskets.get(id).clearBasket(); } catch (RuntimeException e) { logger.info("Basket with id " + id + " was ordered but failed!"); From 2e26adfbd616a1dcf788afa044479fe002155505 Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 17:53:28 +0300 Subject: [PATCH 09/22] Update BasketRepositoryInMemory.java --- src/main/java/HW/models/basket/BasketRepositoryInMemory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java index 9138488..e695595 100644 --- a/src/main/java/HW/models/basket/BasketRepositoryInMemory.java +++ b/src/main/java/HW/models/basket/BasketRepositoryInMemory.java @@ -1,6 +1,7 @@ package HW.models.basket; import HW.models.enums.Product; +import HW.models.storage.Storage; import java.util.HashMap; import java.util.Map; From 8f7239a4fd21c63ba6e9074af4e1988501a6c0df Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 17:55:20 +0300 Subject: [PATCH 10/22] Update Main.java --- src/main/java/HW/models/Main.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/HW/models/Main.java b/src/main/java/HW/models/Main.java index d68e5f0..91071c1 100644 --- a/src/main/java/HW/models/Main.java +++ b/src/main/java/HW/models/Main.java @@ -1,5 +1,6 @@ package HW.models; +import HW.models.basket.BasketRepository; import HW.models.basket.BasketRepositoryInMemory; import HW.models.enums.Product; import HW.models.parser.CommandParserTXT; From 223204f152fdb50a5a59601a361687fc2a033ba4 Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 17:56:26 +0300 Subject: [PATCH 11/22] Update Main.java --- src/main/java/HW/models/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/HW/models/Main.java b/src/main/java/HW/models/Main.java index 91071c1..f49b5d4 100644 --- a/src/main/java/HW/models/Main.java +++ b/src/main/java/HW/models/Main.java @@ -15,7 +15,7 @@ public class Main { private static final Logger logger = Logger.getLogger(Main.class.getSimpleName()); public static void main(String[] args) { - Map storageContent = new HashMap(); + Map storageContent = new HashMap<>(); storageContent.put(Product.Bread, 100f); storageContent.put(Product.Flour, 100f); storageContent.put(Product.Water, 100f); From 6e838f1d9f2d39e25cc96167d25877d1b93282e7 Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:07:41 +0300 Subject: [PATCH 12/22] Add files via upload --- .../models/parser/CommandParserTXTTest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/test/java/HW/models/parser/CommandParserTXTTest.java diff --git a/src/test/java/HW/models/parser/CommandParserTXTTest.java b/src/test/java/HW/models/parser/CommandParserTXTTest.java new file mode 100644 index 0000000..5b17750 --- /dev/null +++ b/src/test/java/HW/models/parser/CommandParserTXTTest.java @@ -0,0 +1,69 @@ +package HW.models.parser; + +import HW.models.basket.Basket; +import HW.models.basket.BasketRepository; +import HW.models.basket.BasketRepositoryInMemory; +import HW.models.enums.Product; +import HW.models.storage.Storage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class CommandParserTXTTest { + Map storageContent; + Storage storage; + BasketRepository basketRepository; + + @BeforeEach + public void setUp() { + this.storageContent = new HashMap<>(); + this.storageContent.put(Product.Bread, 10f); + this.storageContent.put(Product.Water, 5f); + this.storage = new Storage(storageContent); + this.basketRepository = new BasketRepositoryInMemory(this.storage); + } + + @Test + public void testIllegalOrders() { + // На складе недостаточно воды и нет муки. Корзина 3 не была создана. + String path = "commands/testIllegal.txt"; + try { + CommandParserTXT parser = new CommandParserTXT(path, this.basketRepository); + parser.applyAllCommands(); + Map storageContent = this.storage.getContent(); + Map baskets = this.basketRepository.getContent(); + // Тразакции не совершены. Корзины сохранились в памяти неизменными в изначальном количестве. + assertEquals(10f, storageContent.get(Product.Bread)); + assertEquals(5f, storageContent.get(Product.Water)); + assertEquals(2, baskets.size()); + assertEquals(5, baskets.get(1l).getProducts().get(Product.Bread)); + assertEquals(8, baskets.get(1l).getProducts().get(Product.Water)); + assertEquals(4, baskets.get(2l).getProducts().get(Product.Flour)); + } catch (IOException e) {} + } + + @Test + public void testOverall() { + String path = "commands/testOverall.txt"; + // Заказ второй корзины уменьшает количество воды ниже требований первой. Заказ третьей прошёл + try { + CommandParserTXT parser = new CommandParserTXT(path, this.basketRepository); + parser.applyAllCommands(); + Map storageContent = this.storage.getContent(); + Map baskets = this.basketRepository.getContent(); + // Корзины 2 и 3 заказаны и опустошены. Корзина один не была заказана и сохранилась в памяти. + assertEquals(6f, storageContent.get(Product.Bread)); + assertEquals(1f, storageContent.get(Product.Water)); + assertEquals(3, baskets.size()); + assertEquals(0, baskets.get(2l).getProducts().size()); + assertEquals(0, baskets.get(3l).getProducts().size()); + assertEquals(2f, baskets.get(1l).getProducts().get(Product.Water)); + assertEquals(8f, baskets.get(1l).getProducts().get(Product.Bread)); + } catch (IOException e) {} + } +} \ No newline at end of file From 81bd3806885302bef76a124fc1a7567a80bc06c1 Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:12:13 +0300 Subject: [PATCH 13/22] Add files via upload --- src/main/resources/commands/testIllegal.txt | 6 ++++++ src/main/resources/commands/testOverall.txt | 7 +++++++ 2 files changed, 13 insertions(+) create mode 100644 src/main/resources/commands/testIllegal.txt create mode 100644 src/main/resources/commands/testOverall.txt diff --git a/src/main/resources/commands/testIllegal.txt b/src/main/resources/commands/testIllegal.txt new file mode 100644 index 0000000..dd07b0c --- /dev/null +++ b/src/main/resources/commands/testIllegal.txt @@ -0,0 +1,6 @@ +get 1 Water 8 +get 1 Bread 5 +order 1 +get 2 Flour 4 +order 2 +order 3 \ No newline at end of file diff --git a/src/main/resources/commands/testOverall.txt b/src/main/resources/commands/testOverall.txt new file mode 100644 index 0000000..b3dea12 --- /dev/null +++ b/src/main/resources/commands/testOverall.txt @@ -0,0 +1,7 @@ +get 1 Water 2 +get 1 Bread 8 +get 2 Water 4 +order 2 +order 1 +get 3 Bread 4 +order 3 \ No newline at end of file From 3c7f15ea7ef0c9685095d8a11361efe177064efb Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:14:47 +0300 Subject: [PATCH 14/22] Update CommandParserTXTTest.java --- src/test/java/HW/models/parser/CommandParserTXTTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/HW/models/parser/CommandParserTXTTest.java b/src/test/java/HW/models/parser/CommandParserTXTTest.java index 5b17750..0c36428 100644 --- a/src/test/java/HW/models/parser/CommandParserTXTTest.java +++ b/src/test/java/HW/models/parser/CommandParserTXTTest.java @@ -37,7 +37,7 @@ public void testIllegalOrders() { parser.applyAllCommands(); Map storageContent = this.storage.getContent(); Map baskets = this.basketRepository.getContent(); - // Тразакции не совершены. Корзины сохранились в памяти неизменными в изначальном количестве. + // Заказы не совершены. Корзины сохранились в памяти неизменными в изначальном количестве. assertEquals(10f, storageContent.get(Product.Bread)); assertEquals(5f, storageContent.get(Product.Water)); assertEquals(2, baskets.size()); @@ -50,7 +50,7 @@ public void testIllegalOrders() { @Test public void testOverall() { String path = "commands/testOverall.txt"; - // Заказ второй корзины уменьшает количество воды ниже требований первой. Заказ третьей прошёл + // Заказ второй корзины уменьшает количество воды ниже требований первой. Заказ третьей прошёл. try { CommandParserTXT parser = new CommandParserTXT(path, this.basketRepository); parser.applyAllCommands(); @@ -66,4 +66,4 @@ public void testOverall() { assertEquals(8f, baskets.get(1l).getProducts().get(Product.Bread)); } catch (IOException e) {} } -} \ No newline at end of file +} From db30e94c5bd71c980d468811afa20c81a1d4bd97 Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:22:22 +0300 Subject: [PATCH 15/22] Add files via upload --- .../HW/models/parser/CommandParserTXTTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/HW/models/parser/CommandParserTXTTest.java b/src/test/java/HW/models/parser/CommandParserTXTTest.java index 0c36428..b2e025f 100644 --- a/src/test/java/HW/models/parser/CommandParserTXTTest.java +++ b/src/test/java/HW/models/parser/CommandParserTXTTest.java @@ -37,7 +37,7 @@ public void testIllegalOrders() { parser.applyAllCommands(); Map storageContent = this.storage.getContent(); Map baskets = this.basketRepository.getContent(); - // Заказы не совершены. Корзины сохранились в памяти неизменными в изначальном количестве. + // Тразакции не совершены. Корзины сохранились в памяти неизменными в изначальном количестве. assertEquals(10f, storageContent.get(Product.Bread)); assertEquals(5f, storageContent.get(Product.Water)); assertEquals(2, baskets.size()); @@ -50,20 +50,20 @@ public void testIllegalOrders() { @Test public void testOverall() { String path = "commands/testOverall.txt"; - // Заказ второй корзины уменьшает количество воды ниже требований первой. Заказ третьей прошёл. + // Заказ второй корзины уменьшает количество воды ниже требований первой. Заказ третьей прошёл, корзина удалена. try { CommandParserTXT parser = new CommandParserTXT(path, this.basketRepository); parser.applyAllCommands(); Map storageContent = this.storage.getContent(); Map baskets = this.basketRepository.getContent(); - // Корзины 2 и 3 заказаны и опустошены. Корзина один не была заказана и сохранилась в памяти. - assertEquals(6f, storageContent.get(Product.Bread)); - assertEquals(1f, storageContent.get(Product.Water)); - assertEquals(3, baskets.size()); + // Корзины 2 и 3 заказаны и опустошены, причём третья удалена из памяти. Корзина один не была заказана и сохранилась в памяти. + assertEquals(4f, storageContent.get(Product.Bread)); + assertEquals(0.5f, storageContent.get(Product.Water)); + assertEquals(2, baskets.size()); + assertEquals(false, baskets.containsKey(3)); assertEquals(0, baskets.get(2l).getProducts().size()); - assertEquals(0, baskets.get(3l).getProducts().size()); assertEquals(2f, baskets.get(1l).getProducts().get(Product.Water)); assertEquals(8f, baskets.get(1l).getProducts().get(Product.Bread)); } catch (IOException e) {} } -} +} \ No newline at end of file From 261c6a3cc18a75f29f75850f8c197f5dd9eca4ab Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:23:57 +0300 Subject: [PATCH 16/22] Update CommandParserTXTTest.java --- src/test/java/HW/models/parser/CommandParserTXTTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/HW/models/parser/CommandParserTXTTest.java b/src/test/java/HW/models/parser/CommandParserTXTTest.java index b2e025f..e75d0e8 100644 --- a/src/test/java/HW/models/parser/CommandParserTXTTest.java +++ b/src/test/java/HW/models/parser/CommandParserTXTTest.java @@ -56,7 +56,8 @@ public void testOverall() { parser.applyAllCommands(); Map storageContent = this.storage.getContent(); Map baskets = this.basketRepository.getContent(); - // Корзины 2 и 3 заказаны и опустошены, причём третья удалена из памяти. Корзина один не была заказана и сохранилась в памяти. + // Корзины 2 и 3 заказаны и опустошены, причём третья удалена из памяти, а вторую заказали дважды. + // Корзина один не была заказана и сохранилась в памяти. assertEquals(4f, storageContent.get(Product.Bread)); assertEquals(0.5f, storageContent.get(Product.Water)); assertEquals(2, baskets.size()); @@ -66,4 +67,4 @@ public void testOverall() { assertEquals(8f, baskets.get(1l).getProducts().get(Product.Bread)); } catch (IOException e) {} } -} \ No newline at end of file +} From 0c64d08927e7663b0c471ec324b44e3ad2333bfe Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:24:24 +0300 Subject: [PATCH 17/22] Update testOverall.txt --- src/main/resources/commands/testOverall.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/resources/commands/testOverall.txt b/src/main/resources/commands/testOverall.txt index b3dea12..3dbc90f 100644 --- a/src/main/resources/commands/testOverall.txt +++ b/src/main/resources/commands/testOverall.txt @@ -4,4 +4,11 @@ get 2 Water 4 order 2 order 1 get 3 Bread 4 -order 3 \ No newline at end of file +order 3 +remove 3 +get 2 Water 7 +get 2 Bread 9 +remove 2 +get 2 Water 0.5 +get 2 Bread 2 +order 2 From 24b9ea1d2c254022bf826f5b22056e717d6e8e8c Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:25:08 +0300 Subject: [PATCH 18/22] Update testOverall.txt --- src/main/resources/commands/testOverall.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/commands/testOverall.txt b/src/main/resources/commands/testOverall.txt index 3dbc90f..eeaeca1 100644 --- a/src/main/resources/commands/testOverall.txt +++ b/src/main/resources/commands/testOverall.txt @@ -6,9 +6,10 @@ order 1 get 3 Bread 4 order 3 remove 3 -get 2 Water 7 +get 4 Water 7 get 2 Bread 9 remove 2 +remove 4 get 2 Water 0.5 get 2 Bread 2 order 2 From f32d51faa6baf9b54c5aac62c66dc0cf2977b72d Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:25:50 +0300 Subject: [PATCH 19/22] Update CommandParserTXTTest.java --- src/test/java/HW/models/parser/CommandParserTXTTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/test/java/HW/models/parser/CommandParserTXTTest.java b/src/test/java/HW/models/parser/CommandParserTXTTest.java index e75d0e8..fc5fe08 100644 --- a/src/test/java/HW/models/parser/CommandParserTXTTest.java +++ b/src/test/java/HW/models/parser/CommandParserTXTTest.java @@ -30,7 +30,6 @@ public void setUp() { @Test public void testIllegalOrders() { - // На складе недостаточно воды и нет муки. Корзина 3 не была создана. String path = "commands/testIllegal.txt"; try { CommandParserTXT parser = new CommandParserTXT(path, this.basketRepository); @@ -50,14 +49,11 @@ public void testIllegalOrders() { @Test public void testOverall() { String path = "commands/testOverall.txt"; - // Заказ второй корзины уменьшает количество воды ниже требований первой. Заказ третьей прошёл, корзина удалена. try { CommandParserTXT parser = new CommandParserTXT(path, this.basketRepository); parser.applyAllCommands(); Map storageContent = this.storage.getContent(); Map baskets = this.basketRepository.getContent(); - // Корзины 2 и 3 заказаны и опустошены, причём третья удалена из памяти, а вторую заказали дважды. - // Корзина один не была заказана и сохранилась в памяти. assertEquals(4f, storageContent.get(Product.Bread)); assertEquals(0.5f, storageContent.get(Product.Water)); assertEquals(2, baskets.size()); From 88d635f548319c5b8b39342e56b1a85665c4fb9a Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:28:40 +0300 Subject: [PATCH 20/22] Add files via upload --- src/test/java/HW/models/parser/CommandParserTXTTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/HW/models/parser/CommandParserTXTTest.java b/src/test/java/HW/models/parser/CommandParserTXTTest.java index fc5fe08..b3527bd 100644 --- a/src/test/java/HW/models/parser/CommandParserTXTTest.java +++ b/src/test/java/HW/models/parser/CommandParserTXTTest.java @@ -30,6 +30,7 @@ public void setUp() { @Test public void testIllegalOrders() { + // На складе недостаточно воды и нет муки. Корзина 3 не была создана. String path = "commands/testIllegal.txt"; try { CommandParserTXT parser = new CommandParserTXT(path, this.basketRepository); @@ -49,18 +50,21 @@ public void testIllegalOrders() { @Test public void testOverall() { String path = "commands/testOverall.txt"; + // Заказ второй корзины уменьшает количество воды ниже требований первой. Заказ третьей прошёл, корзина удалена. try { CommandParserTXT parser = new CommandParserTXT(path, this.basketRepository); parser.applyAllCommands(); Map storageContent = this.storage.getContent(); Map baskets = this.basketRepository.getContent(); + // Корзины 2 и 3 заказаны и опустошены, причём третья удалена из памяти. Корзина один не была заказана и сохранилась в памяти. assertEquals(4f, storageContent.get(Product.Bread)); assertEquals(0.5f, storageContent.get(Product.Water)); - assertEquals(2, baskets.size()); + assertEquals(3, baskets.size()); assertEquals(false, baskets.containsKey(3)); assertEquals(0, baskets.get(2l).getProducts().size()); assertEquals(2f, baskets.get(1l).getProducts().get(Product.Water)); assertEquals(8f, baskets.get(1l).getProducts().get(Product.Bread)); + assertEquals(2f, baskets.get(5l).getProducts().get(Product.Bread)); } catch (IOException e) {} } -} +} \ No newline at end of file From 68c6b345a50d6b919e85c056d887e4b0accb4206 Mon Sep 17 00:00:00 2001 From: PaulVBelo <144692494+PaulVBelo@users.noreply.github.com> Date: Thu, 21 Dec 2023 19:29:56 +0300 Subject: [PATCH 21/22] Add files via upload --- src/main/resources/commands/testOverall.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/commands/testOverall.txt b/src/main/resources/commands/testOverall.txt index eeaeca1..11529cd 100644 --- a/src/main/resources/commands/testOverall.txt +++ b/src/main/resources/commands/testOverall.txt @@ -6,10 +6,10 @@ order 1 get 3 Bread 4 order 3 remove 3 -get 4 Water 7 +get 2 Water 7 get 2 Bread 9 remove 2 -remove 4 get 2 Water 0.5 get 2 Bread 2 order 2 +get 5 Bread 2 \ No newline at end of file From 7d19b63f4753e439f6f4cf5da0acf158c4d85ea2 Mon Sep 17 00:00:00 2001 From: Tefaier Date: Thu, 21 Dec 2023 20:45:44 +0300 Subject: [PATCH 22/22] added getContent method to storage --- src/main/java/HW/models/storage/Storage.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/HW/models/storage/Storage.java b/src/main/java/HW/models/storage/Storage.java index 92c3684..73abe46 100644 --- a/src/main/java/HW/models/storage/Storage.java +++ b/src/main/java/HW/models/storage/Storage.java @@ -1,5 +1,6 @@ package HW.models.storage; +import HW.models.basket.Basket; import HW.models.enums.Product; import java.util.HashMap; @@ -34,4 +35,8 @@ public synchronized void takeAway(Map basketContent) this.content.put(product, this.content.get(product) - basketContent.get(product)); } } + + public synchronized Map getContent() { + return Map.copyOf(content); + } }