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; + } }