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..b5434a5 100644 --- a/conf/scenarios.xml +++ b/conf/scenarios.xml @@ -1,15 +1,23 @@ + + + + + + ]> - 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 334f130..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 @@ -1,11 +1,14 @@ 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.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; @@ -18,18 +21,39 @@ public class FoodChain private static FactoryManager factoryManager = new FactoryManager(); public static void main(String[] args) + { + parseChannels(); + parseNodes(); + 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() + { + return factoryManager; + } + + // todo maybe some refactoring needed? + // add other entities + public static void parseChannels() { try { // parse channel configuration - ConfigurationParser.parseDocument("channels"); - ParserResult parserResult = ConfigurationParser.getElements("channels"); - //todo need getter for elemtens... + ConfigurationParser.parseDocument("conf/channels.xml"); + ParserResult parserResult = ConfigurationParser.getElements("channel"); 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); } } @@ -37,16 +61,68 @@ public class FoodChain { System.err.println(e.getMessage()); } - catch (Exception e) + } + + public static void parseNodes() + { + try + { + // parse channel configuration + ConfigurationParser.parseDocument("conf/nodes.xml"); + ParserResult parserResult = ConfigurationParser.getElements("node"); + 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()); } - - } - public static FactoryManager getFactoryManager() + public static void parseProducts() { - return factoryManager; + 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 a2e1f7a..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 @@ -1,16 +1,18 @@ 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; public class NodeFactory { - private enum NodeType + enum NodeType { Farmer, Processor, Distributor, Seller, Customer; } @@ -25,14 +27,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")); + subsChannels = input.getChild("channels"); + startMoney = Double.parseDouble(input.getChild("money")); } catch (IllegalArgumentException e) { @@ -63,12 +65,13 @@ public class NodeFactory } String[] subs = subsChannels.split(";"); - //todo Node subscription to channels by parser data 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; 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..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,10 +18,10 @@ 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")); - 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/factory/ScenarioFactory.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/factory/ScenarioFactory.java index 7dcb2a1..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,7 +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/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/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/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; + } } 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(); }