diff --git a/conf/scenarios.xml b/conf/scenarios.xml index b5434a5..5ab9512 100644 --- a/conf/scenarios.xml +++ b/conf/scenarios.xml @@ -20,4 +20,10 @@ generate + + + pass + sendreq PURCHASE FRUIT jablko + + \ 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 c59dd82..47e3d15 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 @@ -27,12 +27,13 @@ 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))); - 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))); + Ticker.start(); + while (Ticker.getTimer().isRunning()); } public static FactoryManager getFactoryManager() diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java index f01b857..4860f9c 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java @@ -6,9 +6,8 @@ import cz.cvut.fel.sit.omo.foodchain.requirement.Requirement; import cz.cvut.fel.sit.omo.foodchain.util.ChannelObserver; import cz.cvut.fel.sit.omo.foodchain.util.Observable; -import java.util.PriorityQueue; -import java.util.Queue; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public abstract class ChannelBase implements Observable { protected ProductType productType; @@ -19,15 +18,17 @@ public abstract class ChannelBase implements Observable { public ChannelBase(ProductType type) { - this.requirements = new PriorityQueue<>(); - this.transactions = new PriorityQueue<>(); + this.requirements = new LinkedList<>(); + this.transactions = new LinkedList<>(); + this.subscribers = new HashSet<>(); this.productType = type; } public ChannelBase() { - this.requirements = new PriorityQueue<>(); - this.transactions = new PriorityQueue<>(); + this.requirements = new LinkedList<>(); + this.transactions = new LinkedList<>(); + this.subscribers = new HashSet<>(); this.productType = ProductType.OTHER; } @@ -48,12 +49,18 @@ public abstract class ChannelBase implements Observable { public void addRequirement(Requirement requirement) { this.requirements.add(requirement); + } + + public boolean tick() { + requirements.forEach(Requirement::tick); + requirements = requirements.stream().filter(r -> r.getTTL() > 0).collect(Collectors.toCollection(LinkedList::new)); notifyAllObservers(); + return requirements.size() != 0; } @Override public void notifyAllObservers(){ - subscribers.forEach(subscriber -> subscriber.update(requirements.peek())); + subscribers.forEach(subscriber -> requirements.forEach(subscriber::update)); } @Override 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 a519bc7..df7e8cf 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 @@ -61,6 +61,9 @@ public class ScenarioFactory case "sendreq": scenarioStep = new SendRequirementStep(node, TransactionType.valueOf(parts[1]), ProductType.valueOf(parts[2]), parts[3]); break; + case "pass": + scenarioStep = new PassStep(); + break; } scenarioSteps.add(scenarioStep); } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/NodeBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/NodeBase.java index 6daf216..09f6bd2 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/NodeBase.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/NodeBase.java @@ -11,7 +11,6 @@ import cz.cvut.fel.sit.omo.foodchain.signature.SignatureManager; import cz.cvut.fel.sit.omo.foodchain.util.ChannelObserver; import org.javamoney.moneta.Money; -import javax.money.Monetary; import javax.money.MonetaryAmount; import java.util.HashMap; import java.util.LinkedList; @@ -24,19 +23,19 @@ public class NodeBase implements ChannelObserver { private final List products; private final MonetaryAmount money; - private final List refusedTranslations; + private final List refusedTransactions; public NodeBase() { subscribedChannels = new HashMap<>(); products = new LinkedList<>(); - refusedTranslations = new LinkedList<>(); + refusedTransactions = new LinkedList<>(); money = Money.of(0, "USD"); } public NodeBase(double m) { subscribedChannels = new HashMap<>(); products = new LinkedList<>(); - refusedTranslations = new LinkedList<>(); + refusedTransactions = new LinkedList<>(); money = Money.of(m, "USD"); } @@ -71,7 +70,7 @@ public class NodeBase implements ChannelObserver { public void refuseTransaction(Transaction transaction) { transaction.endTransaction(); - refusedTranslations.add(transaction); //TODO maybe need more work on it + refusedTransactions.add(transaction); //TODO maybe need more work on it } public Transaction readNextTransaction(ChannelBase channel) { @@ -89,12 +88,13 @@ public class NodeBase implements ChannelObserver { } public void acceptRequirement(Requirement requirement) { - + System.out.println(this.getClass().getSimpleName() + " accepted " + requirement.toString()); } public void subscribeToChannel(ChannelBase channel, ChannelSubscriptionType type) { subscribedChannels.put(channel, type); + channel.attach(this); } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/Action.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/Action.java index 61ad99c..6a48dd1 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/Action.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/Action.java @@ -25,9 +25,13 @@ public class Action extends OperationBase { product.setStateToAvailable(); } - public void tick() { - if (duration == 0) endAction(); + public boolean tick() { + if (duration == 0) { + endAction(); + return false; + } else duration--; + return true; } public OperationBase getLastOperation() { diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/Transaction.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/Transaction.java index d181fd0..9b2e668 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/Transaction.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/Transaction.java @@ -15,6 +15,7 @@ public abstract class Transaction extends OperationBase { transactionType = type; nodeReceiver = receiver; signature = SignatureManager.signTransaction(this); + System.out.println(toString()); } public void endTransaction() { @@ -32,4 +33,14 @@ public abstract class Transaction extends OperationBase { public NodeBase getNodeReceiver() { return nodeReceiver; } + + @Override + public String toString() { + return "Transaction{" + + "transactionType=" + transactionType + + ", signature=" + (signature != null) + + ", nodeCreator=" + getNodeCreator().getClass().getSimpleName() + + ", nodeReceiver=" + nodeReceiver.getClass().getSimpleName() + + '}'; + } } 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 4269371..e09d225 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 @@ -1,5 +1,6 @@ package cz.cvut.fel.sit.omo.foodchain.product; +import cz.cvut.fel.sit.omo.foodchain.operation.Action; import cz.cvut.fel.sit.omo.foodchain.operation.OperationBase; import org.javamoney.moneta.Money; @@ -58,6 +59,15 @@ public class Product this.money = Money.of(m, "USD"); } + public boolean tick() { + try { + return ((Action) currentOperation).tick(); + } + catch (Exception e) { + return false; + } + } + // "State machine methods" /** diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/requirement/Requirement.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/requirement/Requirement.java index 0528bbc..48c536a 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/requirement/Requirement.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/requirement/Requirement.java @@ -17,7 +17,8 @@ public class Requirement { this.transactionType = transactionType; this.productType = productType; this.productName = productName; - TTL = 2; + TTL = 3; + System.out.println(toString()); } public void tick() { @@ -43,4 +44,15 @@ public class Requirement { public int getTTL() { return TTL; } + + @Override + public String toString() { + return "Requirement{" + + "creator=" + creator.getClass().getSimpleName() + + ", transactionType=" + transactionType + + ", productType=" + productType + + ", productName='" + productName + '\'' + + ", TTL=" + TTL + + '}'; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/PassStep.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/PassStep.java new file mode 100644 index 0000000..7d678e2 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/PassStep.java @@ -0,0 +1,7 @@ +package cz.cvut.fel.sit.omo.foodchain.scenario; + +public class PassStep extends ScenarioStep { + + @Override + void execute() {} +} 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 a521257..c7e3063 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 @@ -17,11 +17,17 @@ public class Scenario { stepIterator = steps.listIterator(0); } - void execute() { + boolean execute() { if (!stepIterator.hasNext()) { - stepIterator = steps.listIterator(0); + // stepIterator = steps.listIterator(0); + return false; } stepIterator.next().execute(); + return true; + } + + public boolean tick() { + return execute(); } public List getSteps() { 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 d61c75e..7fbf1c6 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 @@ -1,7 +1,10 @@ package cz.cvut.fel.sit.omo.foodchain.util; import cz.cvut.fel.sit.omo.foodchain.FoodChain; +import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; import cz.cvut.fel.sit.omo.foodchain.pool.PoolDatabase; +import cz.cvut.fel.sit.omo.foodchain.product.Product; +import cz.cvut.fel.sit.omo.foodchain.scenario.Scenario; import javax.swing.*; @@ -11,11 +14,13 @@ public class Ticker { public static void start() { timer = new Timer(500, actionEvent -> { + System.out.println("tick"); 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 + boolean productBool = db.getProductPoolInstance().findAll().stream().filter(Product::tick).count() == 0; // change duration of action + boolean scenarioBool = db.getScenarioPoolInstance().findAll().stream().filter(Scenario::tick).count() == 0; // do next step in scenario + boolean channelBool = db.getChannelPoolInstance().findAll().stream().filter(ChannelBase::tick).count() == 0; // change TTL of requirements +// db.getNodePoolInstance().findAll().forEach(n -> n.tick()); // maybe unnecessary + if (channelBool && productBool && scenarioBool) stop(); }); timer.start(); } @@ -23,4 +28,6 @@ public class Ticker { public static void stop() { timer.stop(); } + + public static Timer getTimer() { return timer; } }