Implemented ScenarioFactory

This commit is contained in:
Tomáš Musil 2020-12-26 12:40:31 +01:00
parent e58392f5be
commit 21f5d14406
7 changed files with 84 additions and 15 deletions

View File

@ -9,15 +9,15 @@
<scenarios> <scenarios>
<scenario type="Farmer"> <scenario type="Farmer">
<steps> <steps>
generate jablko generate
generate hovězí generate
generate hruška generate
generate rajče generate
generate paprika generate
generate kuřecí generate
generate vepřové generate
generate banán generate
generate okurka generate
</steps> </steps>
</scenario> </scenario>
</scenarios> </scenarios>

View File

@ -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.parser.ParserResultElement;
import cz.cvut.fel.sit.omo.foodchain.product.Product; 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.scenario.Scenario;
import cz.cvut.fel.sit.omo.foodchain.util.Ticker;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
@ -26,8 +27,12 @@ public class FoodChain
parseProducts(); parseProducts();
parseScenarios(); parseScenarios();
Ticker.start();
getFactoryManager().getPoolDatabaseInstance().getChannelPoolInstance().findAll().stream().forEach(ch -> System.out.println(ch.getProductType())); 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().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() public static FactoryManager getFactoryManager()

View File

@ -12,7 +12,7 @@ import java.util.Objects;
public class NodeFactory public class NodeFactory
{ {
private enum NodeType enum NodeType
{ {
Farmer, Processor, Distributor, Seller, Customer; Farmer, Processor, Distributor, Seller, Customer;
} }

View File

@ -18,7 +18,7 @@ public class ProductFactory
Product p = null; Product p = null;
try try
{ {
String name = input.getAttribute("name"); String name = input.getChild("name");
ProductType productType = ProductType.valueOf(input.getChild("type")); ProductType productType = ProductType.valueOf(input.getChild("type"));
//ProductState productState = ProductState.valueOf(input.getChild("state")); //ProductState productState = ProductState.valueOf(input.getChild("state"));
double price = Double.parseDouble(input.getChild("price")); double price = Double.parseDouble(input.getChild("price"));

View File

@ -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.FoodChain;
import cz.cvut.fel.sit.omo.foodchain.node.*; 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.parser.ParserResultElement;
import cz.cvut.fel.sit.omo.foodchain.pool.ChannelPool; 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.Monetary;
import javax.money.MonetaryAmount; import javax.money.MonetaryAmount;
import java.util.Arrays;
import java.util.List;
import java.util.LinkedList;
import java.util.Objects; import java.util.Objects;
public class ScenarioFactory public class ScenarioFactory
{ {
/** /**
* Creates Scenario based on input ParserResultElement * Creates Scenario based on input ParserResultElement
* @param input data from Scenario is created * @param input data from Scenario is created
@ -20,6 +28,52 @@ public class ScenarioFactory
public Scenario makeScenario(ParserResultElement input) public Scenario makeScenario(ParserResultElement input)
{ {
Scenario s = null; 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<ScenarioStep> 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; return s;
} }

View File

@ -9,12 +9,18 @@ public class GenerateProductStep extends ScenarioStep {
private final Farmer node; private final Farmer node;
private final Product product; private final Product product;
private static int counter = 0;
public GenerateProductStep(Farmer node) { public GenerateProductStep(Farmer node) {
this.node = node; this.node = node;
product = FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll() if (counter < FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll().size()) {
.stream().findFirst().orElse(null); product = FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll().get(counter);
FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().remove(product); counter++;
}
else {
product = null;
System.err.println("Insufficient products in pool");
}
} }
@Override @Override

View File

@ -23,4 +23,8 @@ public class Scenario {
} }
stepIterator.next().execute(); stepIterator.next().execute();
} }
public List<ScenarioStep> getSteps() {
return steps;
}
} }