From 643bf23c0bbacb8a3edff3f32e396f2a3f7930f2 Mon Sep 17 00:00:00 2001 From: Daniel Poustka Date: Fri, 25 Dec 2020 20:47:39 +0100 Subject: [PATCH 1/8] Added channel and nodes parsing into main Small refactoring --- .../cvut/fel/sit/omo/foodchain/FoodChain.java | 51 +++++++++++++++---- .../omo/foodchain/factory/ProductFactory.java | 2 +- .../sit/omo/foodchain/product/Product.java | 38 ++++++++------ 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java index 334f130..2cfbb63 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java @@ -1,11 +1,12 @@ package cz.cvut.fel.sit.omo.foodchain; import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; -import cz.cvut.fel.sit.omo.foodchain.factory.ChannelFactory; import cz.cvut.fel.sit.omo.foodchain.factory.FactoryManager; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; import cz.cvut.fel.sit.omo.foodchain.parser.ConfigurationParser; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResult; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResultElement; +import cz.cvut.fel.sit.omo.foodchain.pool.ChannelPool; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; @@ -18,18 +19,31 @@ public class FoodChain private static FactoryManager factoryManager = new FactoryManager(); public static void main(String[] args) + { + parseChannels(); + parseNodes(); + } + + public static FactoryManager getFactoryManager() + { + return factoryManager; + } + + + // todo maybe some refactoring needed? + // add other entities + public static void parseChannels() { try { // parse channel configuration - ConfigurationParser.parseDocument("channels"); + ConfigurationParser.parseDocument("channels.xml"); ParserResult parserResult = ConfigurationParser.getElements("channels"); - //todo need getter for elemtens... List elements = parserResult.getElements(); for (ParserResultElement el : elements) { - ChannelBase c = getFactoryManager().getChannelFactoryInstance().makeChannel(el); - getFactoryManager().getPoolDatabaseInstance().getChannelPoolInstance().add(c); + ChannelBase res = getFactoryManager().getChannelFactoryInstance().makeChannel(el); + getFactoryManager().getPoolDatabaseInstance().getChannelPoolInstance().add(res); } } @@ -41,12 +55,29 @@ public class FoodChain { System.err.println(e.getMessage()); } - - } - - public static FactoryManager getFactoryManager() + public static void parseNodes() { - return factoryManager; + try + { + // parse channel configuration + ConfigurationParser.parseDocument("nodes.xml"); + ParserResult parserResult = ConfigurationParser.getElements("nodes"); + List elements = parserResult.getElements(); + for (ParserResultElement el : elements) + { + NodeBase res = getFactoryManager().getNodeFactoryInstance().makeNode(el); + getFactoryManager().getPoolDatabaseInstance().getNodePoolInstance().add(res); + } + + } + catch (ParserConfigurationException | SAXException | IOException e) + { + System.err.println(e.getMessage()); + } + catch (Exception e) + { + System.err.println(e.getMessage()); + } } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ProductFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ProductFactory.java index 4dcbfce..5d12278 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ProductFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ProductFactory.java @@ -21,7 +21,7 @@ public class ProductFactory String name = input.getAttribute("name"); ProductType productType = ProductType.valueOf(input.getChild("type")); //ProductState productState = ProductState.valueOf(input.getChild("state")); - int price = Integer.getInteger(input.getChild("price")); + double price = Double.parseDouble(input.getChild("price")); //p = new Product(name, price, productType, productState); p = new Product(name, productType, price); diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java index 6dafc88..2156d61 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java @@ -16,46 +16,46 @@ public class Product /** * Creates Product with default state AVAILABLE - * @param name name of product + * @param name name of product * @param productType type of product */ public Product(String name, ProductType productType) { this.name = name; - this.productType = productType; + this.productType = productType; this.productState = ProductState.AVAILABLE; this.money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(0).create(); } //TODO money int constructor - public Product(String name, ProductType productType, MonetaryAmount money) + public Product(String name, ProductType productType, Double money) { this.name = name; - this.productType = productType; + this.productType = productType; this.productState = ProductState.AVAILABLE; - this.money = money; + this.money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(money).create(); } /** * Creates Product - * @param name name of product - * @param productType type of product + * @param name name of product + * @param productType type of product * @param productState state of product */ public Product(String name, ProductType productType, ProductState productState) { this.name = name; - this.productType = productType; + this.productType = productType; this.productState = productState; this.money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(0).create(); } - public Product(String name, ProductType productType, ProductState productState, MonetaryAmount money) + public Product(String name, ProductType productType, ProductState productState, Double money) { this.name = name; - this.productType = productType; + this.productType = productType; this.productState = productState; - this.money = money; + this.money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(money).create(); } // "State machine methods" @@ -73,7 +73,7 @@ public class Product */ public void setStateToReadyForDispatch() { - if(this.productState.equals(ProductState.AVAILABLE)) + if (this.productState.equals(ProductState.AVAILABLE)) this.productState = ProductState.READY_FOR_DISPATCH; else throw new IllegalStateException("Cannot set state READY_FOR_DISPATCH. Product is not AVAILABLE!"); @@ -84,7 +84,7 @@ public class Product */ public void setStateToInTransit() { - if(this.productState.equals(ProductState.READY_FOR_DISPATCH)) + if (this.productState.equals(ProductState.READY_FOR_DISPATCH)) this.productState = ProductState.IN_TRANSIT; else throw new IllegalStateException("Cannot set state IN_TRANSIT. Product is not READY_FOR_DISPATCH!"); @@ -95,7 +95,7 @@ public class Product */ public void setStateToReadyForReception() { - if(this.productState.equals(ProductState.IN_TRANSIT)) + if (this.productState.equals(ProductState.IN_TRANSIT)) this.productState = ProductState.READY_FOR_RECEPTION; else throw new IllegalStateException("Cannot set state READY_FOR_RECEPTION. Product has not been in transit!"); @@ -145,7 +145,13 @@ public class Product this.currentOperation = currentOperation; } - public MonetaryAmount getMoney() { return money; } + public MonetaryAmount getMoney() + { + return money; + } - public void setMoney(MonetaryAmount money) { this.money = money; } + public void setMoney(MonetaryAmount money) + { + this.money = money; + } } From 22369d7b704196121604851396efc2e836c61394 Mon Sep 17 00:00:00 2001 From: Daniel Poustka Date: Sat, 26 Dec 2020 10:16:42 +0100 Subject: [PATCH 2/8] Fixed some stuff --- .../omo/foodchain/factory/NodeFactory.java | 42 +++++++++---------- .../sit/omo/foodchain/product/Product.java | 1 - 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java index 91a2c1a..15c2f16 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java @@ -25,14 +25,14 @@ public class NodeFactory NodeBase n = null; NodeType nodeType = null; String subsChannels = ""; - int startMoney = 0; + double startMoney = 0; try { nodeType = NodeType.valueOf(input.getAttribute("type")); subsChannels = input.getChild("subscribed_channels"); - startMoney = Integer.getInteger(input.getChild("money")); + startMoney = Double.parseDouble(input.getChild("money")); } catch (IllegalArgumentException e) { @@ -43,25 +43,25 @@ public class NodeFactory System.err.println("! Fatal error in NodeFactory: " + e.getMessage()); } -// switch (Objects.requireNonNull(nodeType)) -// { -// //TODO Money constructor -// case Farmer: -// n = new Farmer(startMoney); -// break; -// case Processor: -// n = new Processor(startMoney); -// break; -// case Distributor: -// n = new Distributor(startMoney); -// break; -// case Seller: -// n = new Seller(startMoney); -// break; -// case Customer: -// n = new Customer(startMoney); -// break; -// } + switch (Objects.requireNonNull(nodeType)) + { + //TODO Money constructor + case Farmer: + n = new Farmer(startMoney); + break; + case Processor: + n = new Processor(startMoney); + break; + case Distributor: + n = new Distributor(startMoney); + break; + case Seller: + n = new Seller(startMoney); + break; + case Customer: + n = new Customer(startMoney); + break; + } String[] subs = subsChannels.split(";"); //todo Node subscription to channels by parser data diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java index 2156d61..cc36755 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java @@ -27,7 +27,6 @@ public class Product this.money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(0).create(); } - //TODO money int constructor public Product(String name, ProductType productType, Double money) { this.name = name; From bd5c5f1a98c9796791c5b126e0dd8ae775466a98 Mon Sep 17 00:00:00 2001 From: Daniel Poustka Date: Sat, 26 Dec 2020 10:22:36 +0100 Subject: [PATCH 3/8] Fixed Node subscription --- .../cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java index 15c2f16..603da9f 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java @@ -1,9 +1,11 @@ package cz.cvut.fel.sit.omo.foodchain.factory; import cz.cvut.fel.sit.omo.foodchain.FoodChain; +import cz.cvut.fel.sit.omo.foodchain.channel.ChannelSubscriptionType; import cz.cvut.fel.sit.omo.foodchain.node.*; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResultElement; import cz.cvut.fel.sit.omo.foodchain.pool.ChannelPool; +import cz.cvut.fel.sit.omo.foodchain.product.ProductType; import java.util.Objects; @@ -68,8 +70,10 @@ public class NodeFactory for (String s : subs) { + String[] el = s.split(" "); + ChannelPool temp = FoodChain.getFactoryManager().getPoolDatabaseInstance().getChannelPoolInstance(); -// n.subscribeToChannel(temp.findByType(s)); //TODO String to enum + n.subscribeToChannel(temp.findByType(ProductType.valueOf(el[0])), ChannelSubscriptionType.valueOf(el[1])); } return n; From b77e9a690aae9727b4b602835730160deeef3d46 Mon Sep 17 00:00:00 2001 From: Daniel Poustka Date: Sat, 26 Dec 2020 10:30:22 +0100 Subject: [PATCH 4/8] Fixed startMoney for Nodes and Product --- .../cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java | 2 -- .../java/cz/cvut/fel/sit/omo/foodchain/node/Customer.java | 2 +- .../java/cz/cvut/fel/sit/omo/foodchain/node/Distributor.java | 2 +- src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Farmer.java | 2 +- .../java/cz/cvut/fel/sit/omo/foodchain/node/Processor.java | 2 +- src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Seller.java | 2 +- .../java/cz/cvut/fel/sit/omo/foodchain/product/Product.java | 4 ++-- 7 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java index 603da9f..63237ce 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java @@ -47,7 +47,6 @@ public class NodeFactory switch (Objects.requireNonNull(nodeType)) { - //TODO Money constructor case Farmer: n = new Farmer(startMoney); break; @@ -66,7 +65,6 @@ public class NodeFactory } String[] subs = subsChannels.split(";"); - //todo Node subscription to channels by parser data for (String s : subs) { diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Customer.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Customer.java index f483c42..c3776f8 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Customer.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Customer.java @@ -4,7 +4,7 @@ import java.util.Random; public class Customer extends BuyerNodeBase { - public Customer(int startMoney) { + public Customer(double startMoney) { super(); } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Distributor.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Distributor.java index c7d1c2b..890c577 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Distributor.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Distributor.java @@ -2,7 +2,7 @@ package cz.cvut.fel.sit.omo.foodchain.node; public class Distributor extends RetailerNodeBase { - public Distributor(int startMoney) { + public Distributor(double startMoney) { super(); } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Farmer.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Farmer.java index 77d60b4..aa36abe 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Farmer.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Farmer.java @@ -5,7 +5,7 @@ import cz.cvut.fel.sit.omo.foodchain.product.Product; public class Farmer extends SellerNodeBase { - public Farmer(int startMoney) { + public Farmer(double startMoney) { super(); } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Processor.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Processor.java index 7307eb9..a9cc92c 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Processor.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Processor.java @@ -2,7 +2,7 @@ package cz.cvut.fel.sit.omo.foodchain.node; public class Processor extends RetailerNodeBase { - public Processor(int startMoney) { + public Processor(double startMoney) { super(); } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Seller.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Seller.java index 8de5909..ec5fc21 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Seller.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/Seller.java @@ -2,7 +2,7 @@ package cz.cvut.fel.sit.omo.foodchain.node; public class Seller extends RetailerNodeBase { - public Seller(int startMoney) { + public Seller(double startMoney) { super(); } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java index a1017aa..8c3ff4f 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java @@ -27,7 +27,7 @@ public class Product this.money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(0).create(); } - public Product(String name, ProductType productType, Double money) + public Product(String name, ProductType productType, double money) { this.name = name; this.productType = productType; @@ -49,7 +49,7 @@ public class Product this.money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(0).create(); } - public Product(String name, ProductType productType, ProductState productState, Double money) + public Product(String name, ProductType productType, ProductState productState, double money) { this.name = name; this.productType = productType; From 01e43e20a77a064facbaaefd745a095c276410ff Mon Sep 17 00:00:00 2001 From: Daniel Poustka Date: Sat, 26 Dec 2020 10:35:53 +0100 Subject: [PATCH 5/8] Fixed path to config --- .../java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java index 2cfbb63..078bdfd 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java @@ -37,8 +37,8 @@ public class FoodChain try { // parse channel configuration - ConfigurationParser.parseDocument("channels.xml"); - ParserResult parserResult = ConfigurationParser.getElements("channels"); + ConfigurationParser.parseDocument("../conf/channels.xml"); + ParserResult parserResult = ConfigurationParser.getElements("channel"); List elements = parserResult.getElements(); for (ParserResultElement el : elements) { @@ -61,8 +61,8 @@ public class FoodChain try { // parse channel configuration - ConfigurationParser.parseDocument("nodes.xml"); - ParserResult parserResult = ConfigurationParser.getElements("nodes"); + ConfigurationParser.parseDocument("../conf/nodes.xml"); + ParserResult parserResult = ConfigurationParser.getElements("node"); List elements = parserResult.getElements(); for (ParserResultElement el : elements) { From cfbe22d6c11eb94cf83c3c0a42d9b33d5a7392f8 Mon Sep 17 00:00:00 2001 From: Daniel Poustka Date: Sat, 26 Dec 2020 11:09:59 +0100 Subject: [PATCH 6/8] Fixed config path --- src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java index 078bdfd..4e167a7 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java @@ -37,7 +37,7 @@ public class FoodChain try { // parse channel configuration - ConfigurationParser.parseDocument("../conf/channels.xml"); + ConfigurationParser.parseDocument("conf/channels.xml"); ParserResult parserResult = ConfigurationParser.getElements("channel"); List elements = parserResult.getElements(); for (ParserResultElement el : elements) @@ -54,6 +54,7 @@ public class FoodChain catch (Exception e) { System.err.println(e.getMessage()); + e.printStackTrace(); } } public static void parseNodes() @@ -61,7 +62,7 @@ public class FoodChain try { // parse channel configuration - ConfigurationParser.parseDocument("../conf/nodes.xml"); + ConfigurationParser.parseDocument("conf/nodes.xml"); ParserResult parserResult = ConfigurationParser.getElements("node"); List elements = parserResult.getElements(); for (ParserResultElement el : elements) From 0ba95a17283fc874377c628ff1dfc7c6de21afd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Musil?= Date: Sat, 26 Dec 2020 11:31:57 +0100 Subject: [PATCH 7/8] Improved object generation --- conf/channels.xml | 9 ++- conf/nodes.xml | 17 ++++-- conf/products.xml | 14 ++++- conf/scenarios.xml | 8 +++ pom.xml | 7 ++- .../cvut/fel/sit/omo/foodchain/FoodChain.java | 58 ++++++++++++++++--- .../omo/foodchain/factory/NodeFactory.java | 2 +- .../foodchain/factory/ScenarioFactory.java | 1 - .../foodchain/parser/ConfigurationParser.java | 13 ++++- .../foodchain/parser/ParserResultElement.java | 1 + .../fel/sit/omo/foodchain/pool/NodePool.java | 1 - .../fel/sit/omo/foodchain/util/Ticker.java | 8 +-- 12 files changed, 110 insertions(+), 29 deletions(-) diff --git a/conf/channels.xml b/conf/channels.xml index dfa0429..1df2af7 100644 --- a/conf/channels.xml +++ b/conf/channels.xml @@ -1,5 +1,12 @@ + + + + + ]> - + \ No newline at end of file diff --git a/conf/nodes.xml b/conf/nodes.xml index b5a2081..7f80ca2 100644 --- a/conf/nodes.xml +++ b/conf/nodes.xml @@ -1,18 +1,27 @@ + + + + + + + ]> 100 - MEET PURCHASE;VEGETABLE PURCHASE;FRUIT PURCHASE + MEAT PURCHASE;VEGETABLE PURCHASE;FRUIT PURCHASE 0 - MEET SALE_AND_PURCHASE;VEGETABLE SALE_AND_PURCHASE;FRUIT SALE_AND_PURCHASE + MEAT SALE_AND_PURCHASE;VEGETABLE SALE_AND_PURCHASE;FRUIT SALE_AND_PURCHASE 1500 - MEET SALE_AND_PURCHASE;VEGETABLE SALE_AND_PURCHASE;FRUIT SALE_AND_PURCHASE + MEAT SALE_AND_PURCHASE;VEGETABLE SALE_AND_PURCHASE;FRUIT SALE_AND_PURCHASE 250 - MEET SALE;VEGETABLE SALE;FRUIT SALE + MEAT SALE;VEGETABLE SALE;FRUIT SALE \ No newline at end of file diff --git a/conf/products.xml b/conf/products.xml index ac863d4..1767295 100644 --- a/conf/products.xml +++ b/conf/products.xml @@ -1,3 +1,11 @@ + + + + + + + ]> jablko @@ -31,17 +39,17 @@ vepřové - MEET + MEAT 20 hovězí - MEET + MEAT 50 kuřecí - MEET + MEAT 30 \ No newline at end of file diff --git a/conf/scenarios.xml b/conf/scenarios.xml index fb74da6..512516b 100644 --- a/conf/scenarios.xml +++ b/conf/scenarios.xml @@ -1,3 +1,11 @@ + + + + + + ]> diff --git a/pom.xml b/pom.xml index f855455..4da069c 100644 --- a/pom.xml +++ b/pom.xml @@ -9,9 +9,10 @@ 1.0-SNAPSHOT - javax.money - money-api - 1.0 + org.javamoney + moneta + 1.4.2 + pom diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java index 078bdfd..35e2baf 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java @@ -6,7 +6,8 @@ import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; import cz.cvut.fel.sit.omo.foodchain.parser.ConfigurationParser; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResult; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResultElement; -import cz.cvut.fel.sit.omo.foodchain.pool.ChannelPool; +import cz.cvut.fel.sit.omo.foodchain.product.Product; +import cz.cvut.fel.sit.omo.foodchain.scenario.Scenario; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; @@ -22,6 +23,11 @@ public class FoodChain { parseChannels(); parseNodes(); + parseProducts(); + parseScenarios(); + + getFactoryManager().getPoolDatabaseInstance().getChannelPoolInstance().findAll().stream().forEach(ch -> System.out.println(ch.getProductType())); + getFactoryManager().getPoolDatabaseInstance().getNodePoolInstance().findAll().stream().forEach(ch -> System.out.println(ch)); } public static FactoryManager getFactoryManager() @@ -29,7 +35,6 @@ public class FoodChain return factoryManager; } - // todo maybe some refactoring needed? // add other entities public static void parseChannels() @@ -37,7 +42,7 @@ public class FoodChain try { // parse channel configuration - ConfigurationParser.parseDocument("../conf/channels.xml"); + ConfigurationParser.parseDocument("conf/channels.xml"); ParserResult parserResult = ConfigurationParser.getElements("channel"); List elements = parserResult.getElements(); for (ParserResultElement el : elements) @@ -51,17 +56,14 @@ public class FoodChain { System.err.println(e.getMessage()); } - catch (Exception e) - { - System.err.println(e.getMessage()); - } } + public static void parseNodes() { try { // parse channel configuration - ConfigurationParser.parseDocument("../conf/nodes.xml"); + ConfigurationParser.parseDocument("conf/nodes.xml"); ParserResult parserResult = ConfigurationParser.getElements("node"); List elements = parserResult.getElements(); for (ParserResultElement el : elements) @@ -75,7 +77,45 @@ public class FoodChain { System.err.println(e.getMessage()); } - catch (Exception e) + } + + public static void parseProducts() + { + try + { + // parse channel configuration + ConfigurationParser.parseDocument("conf/products.xml"); + ParserResult parserResult = ConfigurationParser.getElements("product"); + List elements = parserResult.getElements(); + for (ParserResultElement el : elements) + { + Product res = getFactoryManager().getProductFactoryInstance().makeProduct(el); + getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().add(res); + } + + } + catch (ParserConfigurationException | SAXException | IOException e) + { + System.err.println(e.getMessage()); + } + } + + public static void parseScenarios() + { + try + { + // parse channel configuration + ConfigurationParser.parseDocument("conf/scenarios.xml"); + ParserResult parserResult = ConfigurationParser.getElements("scenario"); + List elements = parserResult.getElements(); + for (ParserResultElement el : elements) + { + Scenario res = getFactoryManager().getScenarioFactoryInstance().makeScenario(el); + getFactoryManager().getPoolDatabaseInstance().getScenarioPoolInstance().add(res); + } + + } + catch (ParserConfigurationException | SAXException | IOException e) { System.err.println(e.getMessage()); } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java index 63237ce..9940b75 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java @@ -33,7 +33,7 @@ public class NodeFactory { nodeType = NodeType.valueOf(input.getAttribute("type")); - subsChannels = input.getChild("subscribed_channels"); + subsChannels = input.getChild("channels"); startMoney = Double.parseDouble(input.getChild("money")); } catch (IllegalArgumentException e) diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java index 7dcb2a1..84f2c1b 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java @@ -21,7 +21,6 @@ public class ScenarioFactory { Scenario s = null; - return s; } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ConfigurationParser.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ConfigurationParser.java index cdcfb44..cb27b5a 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ConfigurationParser.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ConfigurationParser.java @@ -31,10 +31,19 @@ public class ConfigurationParser { Node tmpNode = elements.item(i); ParserResultElement element = new ParserResultElement(); for (int j = 0; j < tmpNode.getAttributes().getLength(); j++) { - element.addAttribute(tmpNode.getAttributes().item(i).getNodeName(), tmpNode.getAttributes().item(i).getTextContent()); + element + .addAttribute( + tmpNode + .getAttributes() + .item(j) + .getNodeName(), + tmpNode + .getAttributes() + .item(j) + .getTextContent()); } for (int j = 0; j < tmpNode.getChildNodes().getLength(); j++) { - element.addChild(tmpNode.getChildNodes().item(i).getNodeName(), tmpNode.getChildNodes().item(i).getTextContent()); + element.addChild(tmpNode.getChildNodes().item(j).getNodeName(), tmpNode.getChildNodes().item(j).getTextContent()); } resultList.addElement(element); } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResultElement.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResultElement.java index d7155e0..54afed5 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResultElement.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResultElement.java @@ -11,6 +11,7 @@ public class ParserResultElement { private Map children; public ParserResultElement() { + children = new HashMap<>(); attributes = new HashMap<>(); } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/NodePool.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/NodePool.java index 249a52d..07423b1 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/NodePool.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/NodePool.java @@ -3,5 +3,4 @@ package cz.cvut.fel.sit.omo.foodchain.pool; import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; public class NodePool extends PoolListBase { - //TODO Tomas Angelo } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Ticker.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Ticker.java index c802507..d61c75e 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Ticker.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Ticker.java @@ -12,10 +12,10 @@ public class Ticker { public static void start() { timer = new Timer(500, actionEvent -> { PoolDatabase db = FoodChain.getFactoryManager().getPoolDatabaseInstance(); - db.getChannelPoolInstance().findAll().forEach(ch -> ch.tick()); // change TTL of requirements - db.getNodePoolInstance().findAll().forEach(ch -> ch.tick()); // do next step in scenario - db.getProductPoolInstance().findAll().forEach(ch -> ch.tick()); // change duration of action - db.getScenarioPoolInstance().findAll().forEach(ch -> ch.tick()); // maybe unnecessary +// db.getChannelPoolInstance().findAll().forEach(ch -> ch.tick()); // change TTL of requirements +// db.getNodePoolInstance().findAll().forEach(ch -> ch.tick()); // do next step in scenario +// db.getProductPoolInstance().findAll().forEach(ch -> ch.tick()); // change duration of action +// db.getScenarioPoolInstance().findAll().forEach(ch -> ch.tick()); // maybe unnecessary }); timer.start(); } From 21f5d144063586f5905a2e5e04236d93c4fe8b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Musil?= Date: Sat, 26 Dec 2020 12:40:31 +0100 Subject: [PATCH 8/8] Implemented ScenarioFactory --- conf/scenarios.xml | 18 +++--- .../cvut/fel/sit/omo/foodchain/FoodChain.java | 5 ++ .../omo/foodchain/factory/NodeFactory.java | 2 +- .../omo/foodchain/factory/ProductFactory.java | 2 +- .../foodchain/factory/ScenarioFactory.java | 56 ++++++++++++++++++- .../scenario/GenerateProductStep.java | 12 +++- .../sit/omo/foodchain/scenario/Scenario.java | 4 ++ 7 files changed, 84 insertions(+), 15 deletions(-) diff --git a/conf/scenarios.xml b/conf/scenarios.xml index 512516b..b5434a5 100644 --- a/conf/scenarios.xml +++ b/conf/scenarios.xml @@ -9,15 +9,15 @@ - generate jablko - generate hovězí - generate hruška - generate rajče - generate paprika - generate kuřecí - generate vepřové - generate banán - generate okurka + generate + generate + generate + generate + generate + generate + generate + generate + generate \ No newline at end of file diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java index 35e2baf..c59dd82 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/FoodChain.java @@ -8,6 +8,7 @@ import cz.cvut.fel.sit.omo.foodchain.parser.ParserResult; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResultElement; import cz.cvut.fel.sit.omo.foodchain.product.Product; import cz.cvut.fel.sit.omo.foodchain.scenario.Scenario; +import cz.cvut.fel.sit.omo.foodchain.util.Ticker; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; @@ -26,8 +27,12 @@ public class FoodChain parseProducts(); parseScenarios(); + Ticker.start(); + getFactoryManager().getPoolDatabaseInstance().getChannelPoolInstance().findAll().stream().forEach(ch -> System.out.println(ch.getProductType())); getFactoryManager().getPoolDatabaseInstance().getNodePoolInstance().findAll().stream().forEach(ch -> System.out.println(ch)); + getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll().stream().forEach(ch -> System.out.println(ch.getProductType() + " " + ch.getName())); + getFactoryManager().getPoolDatabaseInstance().getScenarioPoolInstance().findAll().stream().forEach(ch -> ch.getSteps().stream().forEach(s -> System.out.println(s))); } public static FactoryManager getFactoryManager() diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java index 9940b75..281ecee 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/NodeFactory.java @@ -12,7 +12,7 @@ import java.util.Objects; public class NodeFactory { - private enum NodeType + enum NodeType { Farmer, Processor, Distributor, Seller, Customer; } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ProductFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ProductFactory.java index 5d12278..bea7941 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ProductFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ProductFactory.java @@ -18,7 +18,7 @@ public class ProductFactory Product p = null; try { - String name = input.getAttribute("name"); + String name = input.getChild("name"); ProductType productType = ProductType.valueOf(input.getChild("type")); //ProductState productState = ProductState.valueOf(input.getChild("state")); double price = Double.parseDouble(input.getChild("price")); diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java index 84f2c1b..a519bc7 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java @@ -2,16 +2,24 @@ package cz.cvut.fel.sit.omo.foodchain.factory; import cz.cvut.fel.sit.omo.foodchain.FoodChain; import cz.cvut.fel.sit.omo.foodchain.node.*; +import cz.cvut.fel.sit.omo.foodchain.operation.ProductOperationType; +import cz.cvut.fel.sit.omo.foodchain.operation.TransactionType; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResultElement; import cz.cvut.fel.sit.omo.foodchain.pool.ChannelPool; -import cz.cvut.fel.sit.omo.foodchain.scenario.Scenario; +import cz.cvut.fel.sit.omo.foodchain.product.Product; +import cz.cvut.fel.sit.omo.foodchain.product.ProductType; +import cz.cvut.fel.sit.omo.foodchain.scenario.*; import javax.money.Monetary; import javax.money.MonetaryAmount; +import java.util.Arrays; +import java.util.List; +import java.util.LinkedList; import java.util.Objects; public class ScenarioFactory { + /** * Creates Scenario based on input ParserResultElement * @param input data from Scenario is created @@ -20,6 +28,52 @@ public class ScenarioFactory public Scenario makeScenario(ParserResultElement input) { Scenario s = null; + NodeBase node = null; + + try + { + String nodeType = input.getAttribute("type"); + node = FoodChain.getFactoryManager().getPoolDatabaseInstance().getNodePoolInstance().findAll().stream() + .filter(ch -> ch.getClass().getSimpleName().equals(nodeType)).findFirst().orElse(null); + + String[] steps = Arrays.stream(input.getChild("steps").split("\n")).filter(st -> !st.strip().equals("")).toArray(String[]::new); + List scenarioSteps = new LinkedList<>(); + ScenarioStep scenarioStep = null; + for (String step : steps) { + String[] parts = step.strip().split(" "); + switch (parts[0]) { + case "generate": + scenarioStep = new GenerateProductStep((Farmer) node); + break; + case "consume": + scenarioStep = new ConsumeProductStep((Customer) node); + break; + case "doaction": + if (parts.length == 2) { + scenarioStep = new DoActionStep(node, ProductOperationType.valueOf(parts[1])); + } + else { + Product p = FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll().stream() + .filter(pr -> pr.getName().equals(parts[2])).findFirst().orElse(null); + scenarioStep = new DoActionStep(node, ProductOperationType.valueOf(parts[1]), p); + } + break; + case "sendreq": + scenarioStep = new SendRequirementStep(node, TransactionType.valueOf(parts[1]), ProductType.valueOf(parts[2]), parts[3]); + break; + } + scenarioSteps.add(scenarioStep); + } + s = new Scenario(scenarioSteps); + } + catch (IllegalArgumentException e) + { + System.err.println("! Wrong type of enum in ProductFactory: " + e); + } + catch (Exception e) + { + System.err.println("! Fatal error in ProductFactory: " + e); + } return s; } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/GenerateProductStep.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/GenerateProductStep.java index f5e595b..92b0655 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/GenerateProductStep.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/GenerateProductStep.java @@ -9,12 +9,18 @@ public class GenerateProductStep extends ScenarioStep { private final Farmer node; private final Product product; + private static int counter = 0; public GenerateProductStep(Farmer node) { this.node = node; - product = FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll() - .stream().findFirst().orElse(null); - FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().remove(product); + if (counter < FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll().size()) { + product = FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll().get(counter); + counter++; + } + else { + product = null; + System.err.println("Insufficient products in pool"); + } } @Override diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/Scenario.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/Scenario.java index 6c4137b..a521257 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/Scenario.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/Scenario.java @@ -23,4 +23,8 @@ public class Scenario { } stepIterator.next().execute(); } + + public List getSteps() { + return steps; + } }