diff --git a/conf/channels.xml b/conf/channels.xml new file mode 100644 index 0000000..dfa0429 --- /dev/null +++ b/conf/channels.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/conf/nodes.xml b/conf/nodes.xml new file mode 100644 index 0000000..b5a2081 --- /dev/null +++ b/conf/nodes.xml @@ -0,0 +1,18 @@ + + + 100 + MEET PURCHASE;VEGETABLE PURCHASE;FRUIT PURCHASE + + + 0 + MEET SALE_AND_PURCHASE;VEGETABLE SALE_AND_PURCHASE;FRUIT SALE_AND_PURCHASE + + + 1500 + MEET SALE_AND_PURCHASE;VEGETABLE SALE_AND_PURCHASE;FRUIT SALE_AND_PURCHASE + + + 250 + MEET SALE;VEGETABLE SALE;FRUIT SALE + + \ No newline at end of file diff --git a/conf/products.xml b/conf/products.xml new file mode 100644 index 0000000..ac863d4 --- /dev/null +++ b/conf/products.xml @@ -0,0 +1,47 @@ + + + jablko + FRUIT + 5 + + + hruška + FRUIT + 7 + + + banán + FRUIT + 10 + + + okurka + VEGETABLE + 3 + + + paprika + VEGETABLE + 5 + + + rajče + VEGETABLE + 3 + + + vepřové + MEET + 20 + + + hovězí + MEET + 50 + + + kuřecí + MEET + 30 + + \ No newline at end of file diff --git a/conf/scenarios.xml b/conf/scenarios.xml new file mode 100644 index 0000000..fb74da6 --- /dev/null +++ b/conf/scenarios.xml @@ -0,0 +1,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 + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3d4b7a9..f855455 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,13 @@ cz.cvut.fel.sit.omo.foodchain FoodChain 1.0-SNAPSHOT + + + javax.money + money-api + 1.0 + + 12 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 585f276..d80104b 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,7 +1,16 @@ package cz.cvut.fel.sit.omo.foodchain; +import cz.cvut.fel.sit.omo.foodchain.factory.FactoryManager; + public class FoodChain { + + private static FactoryManager factoryManager = new FactoryManager(); + public static void main(String[] args) { } + + public static FactoryManager getFactoryManager() { + return factoryManager; + } } 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 7039ffe..f01b857 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 @@ -10,7 +10,7 @@ import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; -public abstract class ChannelBase implements IChannel, Observable { +public abstract class ChannelBase implements Observable { protected ProductType productType; protected Queue requirements; protected Queue transactions; @@ -31,13 +31,11 @@ public abstract class ChannelBase implements IChannel, Observable { this.productType = ProductType.OTHER; } - @Override public Queue getTransactions() { return this.transactions; } - @Override public Queue getCurrentRequirements() { return this.requirements; @@ -47,7 +45,6 @@ public abstract class ChannelBase implements IChannel, Observable { * Adds new requirement to the requirement Queue * @param requirement requirement */ - @Override public void addRequirement(Requirement requirement) { this.requirements.add(requirement); @@ -73,7 +70,6 @@ public abstract class ChannelBase implements IChannel, Observable { * Adds new transaction to the transaction Queue * @param transaction transaction */ - @Override public void addTransaction(Transaction transaction) { this.transactions.add(transaction); @@ -86,4 +82,8 @@ public abstract class ChannelBase implements IChannel, Observable { { this.requirements.clear(); } + + public ProductType getProductType() { + return productType; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelSubscriptionType.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelSubscriptionType.java new file mode 100644 index 0000000..dca4809 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelSubscriptionType.java @@ -0,0 +1,6 @@ +package cz.cvut.fel.sit.omo.foodchain.channel; + +public enum ChannelSubscriptionType { + + SALE, PURCHASE, SALE_AND_PURCHASE +} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/IChannel.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/IChannel.java deleted file mode 100644 index c15e2f7..0000000 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/IChannel.java +++ /dev/null @@ -1,22 +0,0 @@ -package cz.cvut.fel.sit.omo.foodchain.channel; - -import cz.cvut.fel.sit.omo.foodchain.operation.Transaction; -import cz.cvut.fel.sit.omo.foodchain.requirement.Requirement; - -import java.util.Queue; - -public interface IChannel -{ - //TODO Daniel - - //Transaction getNextTransaction(); - Queue getTransactions(); - - //public Requirement getNextRequirement(); - Queue getCurrentRequirements(); - - void addRequirement(Requirement requirement); - - void addTransaction(Transaction transaction); - -} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/BuyerNodeBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/BuyerNodeBase.java index 91caca6..70d5d56 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/BuyerNodeBase.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/BuyerNodeBase.java @@ -3,13 +3,9 @@ package cz.cvut.fel.sit.omo.foodchain.node; import cz.cvut.fel.sit.omo.foodchain.product.Product; public class BuyerNodeBase extends NodeBase implements IBuyerNode { - @Override - public void sellProduct(Product product) { - - } @Override - public void addMargin(Product product) { + public void buyProduct(Product product) { } } 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 8d66686..33bbb85 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 @@ -1,4 +1,11 @@ package cz.cvut.fel.sit.omo.foodchain.node; +import java.util.Random; + public class Customer extends BuyerNodeBase { + + public void consumeProduct() { + int i = new Random().nextInt(getStorage().size()); + getStorage().remove(i); + } } 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 fd34065..44064a4 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 @@ -1,4 +1,12 @@ package cz.cvut.fel.sit.omo.foodchain.node; +import cz.cvut.fel.sit.omo.foodchain.operation.TransactionType; +import cz.cvut.fel.sit.omo.foodchain.product.Product; + public class Farmer extends SellerNodeBase { + + public void generateProduct(Product product) { + storeProduct(product); + createRequirement(TransactionType.SALE, product.getProductType(), product.getName()); + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/IBuyerNode.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/IBuyerNode.java index cc8f592..48a1176 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/IBuyerNode.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/IBuyerNode.java @@ -4,7 +4,5 @@ import cz.cvut.fel.sit.omo.foodchain.product.Product; public interface IBuyerNode { - void sellProduct(Product product); - - void addMargin(Product product); + void buyProduct(Product product); } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/INode.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/INode.java deleted file mode 100644 index 7ef03d5..0000000 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/INode.java +++ /dev/null @@ -1,43 +0,0 @@ -package cz.cvut.fel.sit.omo.foodchain.node; - -import cz.cvut.fel.sit.omo.foodchain.channel.IChannel; -import cz.cvut.fel.sit.omo.foodchain.operation.Action; -import cz.cvut.fel.sit.omo.foodchain.operation.Transaction; -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.requirement.Requirement; -import cz.cvut.fel.sit.omo.foodchain.signature.Signature; - -import java.awt.*; - -public interface INode { - void sendTransaction(Product product, INode INode); - - void receiveTransaction(Transaction transaction); - - void refuseTransaction(Transaction transaction); - - Transaction readNextTransaction(IChannel channel); - - Requirement readNextRequirement(IChannel channel); - - void acceptRequirement(Requirement requirement); - - void subscribeToChannel(IChannel channel); - - void unsubscribeFromChannel(IChannel channel); - - void doAction(Action action, Product product); - - void doAction(Action action); - - void storeProduct(Product product); - - void storeProducts(List products); - - Product getProductFromStorage(String name, ProductType type); - - Signature generateSignature(Transaction transaction); - - boolean validateSignature(Signature signature); -} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/ISellerNode.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/ISellerNode.java index 1f0c21e..a63b91e 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/ISellerNode.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/ISellerNode.java @@ -4,5 +4,7 @@ import cz.cvut.fel.sit.omo.foodchain.product.Product; public interface ISellerNode { - void buyProduct(Product product); + void sellProduct(Product product); + + void addMargin(Product product); } 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 2c6e46a..68d05b1 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 @@ -1,88 +1,147 @@ package cz.cvut.fel.sit.omo.foodchain.node; -import cz.cvut.fel.sit.omo.foodchain.channel.IChannel; -import cz.cvut.fel.sit.omo.foodchain.operation.Action; -import cz.cvut.fel.sit.omo.foodchain.operation.Transaction; +import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; +import cz.cvut.fel.sit.omo.foodchain.channel.ChannelSubscriptionType; +import cz.cvut.fel.sit.omo.foodchain.operation.*; 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.requirement.Requirement; import cz.cvut.fel.sit.omo.foodchain.signature.Signature; +import cz.cvut.fel.sit.omo.foodchain.signature.SignatureManager; +import cz.cvut.fel.sit.omo.foodchain.util.ChannelObserver; -import java.awt.*; +import javax.money.Monetary; +import javax.money.MonetaryAmount; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; -public class NodeBase implements INode { - @Override - public void sendTransaction(Product product, INode node) { + +public class NodeBase implements ChannelObserver { + private final Map subscribedChannels; + private final List products; + private MonetaryAmount money; + + private final List refusedTranslations; + + public NodeBase() { + subscribedChannels = new HashMap<>(); + products = new LinkedList<>(); + refusedTranslations = new LinkedList<>(); + money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(0).create(); + } + + public NodeBase(int m) { + subscribedChannels = new HashMap<>(); + products = new LinkedList<>(); + refusedTranslations = new LinkedList<>(); + money = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(m).create(); + } + + + public void sendTransaction(Product product, NodeBase node) { + Transaction transaction = new ProductTransaction(this, node, TransactionType.SALE, product); + + subscribedChannels.keySet().stream() + .filter(ch -> ch.getProductType().equals(product.getProductType())) + .findAny().ifPresent(channel -> channel.addTransaction(transaction)); + } + + + public void sendTransaction(MonetaryAmount amount, NodeBase node, ProductTransaction prevTransaction) { + Transaction transaction = new FinancialTransaction(this, node, TransactionType.PURCHASE, amount, prevTransaction); + + subscribedChannels.keySet().stream() + .filter(ch -> ch.getProductType().equals(prevTransaction.getProduct().getProductType())) + .findAny().ifPresent(channel -> channel.addTransaction(transaction)); + } + + + public void receiveTransaction(ProductTransaction transaction) { } - @Override - public void receiveTransaction(Transaction transaction) { + + public void receiveTransaction(FinancialTransaction transaction) { } - @Override + public void refuseTransaction(Transaction transaction) { - + transaction.endTransaction(); + refusedTranslations.add(transaction); //TODO maybe need more work on it } - @Override - public Transaction readNextTransaction(IChannel channel) { - return null; + public Transaction readNextTransaction(ChannelBase channel) { + + + return channel.getNextTransaction(); } - @Override - public Requirement readNextRequirement(IChannel channel) { - return null; + + public void createRequirement(TransactionType tType, ProductType pType, String pName) { + Requirement req = new Requirement(this, tType, pType, pName); + subscribedChannels.keySet().stream() + .filter(ch -> ch.getProductType().equals(pType)) + .findAny().ifPresent(channel -> channel.addRequirement(req)); } - @Override public void acceptRequirement(Requirement requirement) { } - @Override - public void subscribeToChannel(IChannel channel) { + public void subscribeToChannel(ChannelBase channel, ChannelSubscriptionType type) { + subscribedChannels.put(channel, type); } - @Override - public void unsubscribeFromChannel(IChannel channel) { + public void unsubscribeFromChannel(ChannelBase channel) { + subscribedChannels.remove(channel); } - @Override - public void doAction(Action action, Product product) { + public void doAction(ProductOperationType action, Product product) { + Action actionProcess = new Action(this, product, action); } - @Override - public void doAction(Action action) { + public void doAction(ProductOperationType action) { + //create new action } - @Override + public void storeProduct(Product product) { - + this.products.add(product); } - @Override - public void storeProducts(List products) { + public void storeProducts(List products) { + this.products.addAll(products); } - @Override + public Product getProductFromStorage(String name, ProductType type) { - return null; + return products.stream().filter(ch -> ch.getProductType() == type && ch.getName().equals(name)).findFirst().orElse(null); + } + + public List getStorage() { + return products; } - @Override public Signature generateSignature(Transaction transaction) { - return null; + return SignatureManager.signTransaction(transaction); + } + + + public boolean validateSignature(Transaction transaction) { + return SignatureManager.validateSignature(transaction); } @Override - public boolean validateSignature(Signature signature) { - return false; + public void update(Requirement requirement) { + if (!requirement.getCreator().equals(this)) + acceptRequirement(requirement); } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/SellerNodeBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/SellerNodeBase.java index 59abda2..9a8c8d9 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/SellerNodeBase.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/SellerNodeBase.java @@ -4,7 +4,12 @@ import cz.cvut.fel.sit.omo.foodchain.product.Product; public class SellerNodeBase extends NodeBase implements ISellerNode { @Override - public void buyProduct(Product product) { + public void sellProduct(Product product) { + + } + + @Override + public void addMargin(Product product) { } } 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 248b9fc..61ad99c 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 @@ -1,4 +1,44 @@ package cz.cvut.fel.sit.omo.foodchain.operation; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.product.Product; + public class Action extends OperationBase { + + private final OperationBase lastOperation; + private final Product product; + private final ProductOperationType type; + private int duration; + + public Action(NodeBase node, Product product, ProductOperationType type) { + super(node); + this.product = product; + this.type = type; + lastOperation = product.getCurrentOperation(); + duration = type.getDuration(); + product.setCurrentOperation(this); + product.setStateToReadyForDispatch(); + } + + private void endAction() { + this.setTimeEnd(); + product.setStateToAvailable(); + } + + public void tick() { + if (duration == 0) endAction(); + else duration--; + } + + public OperationBase getLastOperation() { + return lastOperation; + } + + public Product getProduct() { + return product; + } + + public ProductOperationType getType() { + return type; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/FinancialTransaction.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/FinancialTransaction.java index 2f1a40a..a2a9128 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/FinancialTransaction.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/FinancialTransaction.java @@ -1,4 +1,25 @@ package cz.cvut.fel.sit.omo.foodchain.operation; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; + +import javax.money.MonetaryAmount; + public class FinancialTransaction extends Transaction { + + private final MonetaryAmount amount; + private final ProductTransaction transactionPaid; + + public FinancialTransaction(NodeBase creator, NodeBase receiver, TransactionType type, MonetaryAmount amount, ProductTransaction transactionPaid) { + super(creator, receiver, type); + this.amount = amount; + this.transactionPaid = transactionPaid; + } + + public MonetaryAmount getAmount() { + return amount; + } + + public ProductTransaction getTransactionPaid() { + return transactionPaid; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/IOperation.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/IOperation.java deleted file mode 100644 index 9abe7d6..0000000 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/IOperation.java +++ /dev/null @@ -1,4 +0,0 @@ -package cz.cvut.fel.sit.omo.foodchain.operation; - -public interface IOperation { -} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/OperationBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/OperationBase.java index 6e9403b..12dd4b3 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/OperationBase.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/OperationBase.java @@ -1,5 +1,34 @@ package cz.cvut.fel.sit.omo.foodchain.operation; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; + +import java.time.LocalDateTime; + public class OperationBase { - IOperation lastOperation; + + private final LocalDateTime timeStart; + private LocalDateTime timeEnd; + + private final NodeBase nodeCreator; + + OperationBase(NodeBase node) { + nodeCreator = node; + timeStart = LocalDateTime.now(); + } + + public LocalDateTime getTimeStart() { + return timeStart; + } + + public LocalDateTime getTimeEnd() { + return timeEnd; + } + + public void setTimeEnd() { + this.timeEnd = LocalDateTime.now(); + } + + public NodeBase getNodeCreator() { + return nodeCreator; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/ProductOperationType.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/ProductOperationType.java index 4664286..030ce8f 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/ProductOperationType.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/ProductOperationType.java @@ -1,4 +1,22 @@ package cz.cvut.fel.sit.omo.foodchain.operation; public enum ProductOperationType { + + STORE_MEAT(10, -8); + + private final int duration; + private final int temperature; + + ProductOperationType(int duration, int temperature) { + this.duration = duration; + this.temperature = temperature; + } + + public int getDuration() { + return duration; + } + + public int getTemperature() { + return temperature; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/ProductTransaction.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/ProductTransaction.java index a062539..ab70adc 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/ProductTransaction.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/ProductTransaction.java @@ -1,4 +1,38 @@ package cz.cvut.fel.sit.omo.foodchain.operation; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.product.Product; + public class ProductTransaction extends Transaction { + + private final OperationBase lastOperation; + private final Product product; + private final ProductOperationType type; + + public ProductTransaction(NodeBase creator, NodeBase receiver, TransactionType transactionType, Product product) { + super(creator, receiver, transactionType); + this.product = product; + type = null; + lastOperation = product.getCurrentOperation(); + product.setCurrentOperation(this); + product.setStateToReadyForDispatch(); + } + + @Override + public void endTransaction() { + super.endTransaction(); + product.setStateToAvailable(); + } + + public OperationBase getLastOperation() { + return lastOperation; + } + + public Product getProduct() { + return product; + } + + public ProductOperationType getType() { + return type; + } } 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 51db3b5..d181fd0 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 @@ -1,4 +1,35 @@ package cz.cvut.fel.sit.omo.foodchain.operation; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.signature.Signature; +import cz.cvut.fel.sit.omo.foodchain.signature.SignatureManager; + public abstract class Transaction extends OperationBase { + + private final TransactionType transactionType; + private final Signature signature; + private final NodeBase nodeReceiver; + + Transaction(NodeBase creator, NodeBase receiver, TransactionType type) { + super(creator); + transactionType = type; + nodeReceiver = receiver; + signature = SignatureManager.signTransaction(this); + } + + public void endTransaction() { + this.setTimeEnd(); + } + + public TransactionType getTransactionType() { + return transactionType; + } + + public Signature getSignature() { + return signature; + } + + public NodeBase getNodeReceiver() { + return nodeReceiver; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/TransactionType.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/TransactionType.java index eabd591..3323eae 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/TransactionType.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/operation/TransactionType.java @@ -1,4 +1,6 @@ package cz.cvut.fel.sit.omo.foodchain.operation; public enum TransactionType { + + SALE, PURCHASE } 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 7ab23ab..cdcfb44 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 @@ -1,4 +1,43 @@ package cz.cvut.fel.sit.omo.foodchain.parser; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.io.IOException; + public class ConfigurationParser { + + private static Document activeDocument; + + public static void parseDocument(String name) throws ParserConfigurationException, IOException, SAXException { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(true); + factory.setIgnoringElementContentWhitespace(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + File file = new File(name); + activeDocument = builder.parse(file); + } + + public static ParserResult getElements(String tag) { + NodeList elements = activeDocument.getElementsByTagName(tag); + ParserResult resultList = new ParserResult(); + for (int i = 0; i < elements.getLength(); i++) { + 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()); + } + for (int j = 0; j < tmpNode.getChildNodes().getLength(); j++) { + element.addChild(tmpNode.getChildNodes().item(i).getNodeName(), tmpNode.getChildNodes().item(i).getTextContent()); + } + resultList.addElement(element); + } + return resultList; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResult.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResult.java new file mode 100644 index 0000000..d048d64 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResult.java @@ -0,0 +1,22 @@ +package cz.cvut.fel.sit.omo.foodchain.parser; + +import java.util.LinkedList; +import java.util.List; + +public class ParserResult { + + private final List elements; + + public ParserResult() { + elements = new LinkedList<>(); + } + + public void addElement(ParserResultElement element) { + elements.add(element); + } + + public List getElements() { + return elements; + } + +} 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 new file mode 100644 index 0000000..d7155e0 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResultElement.java @@ -0,0 +1,56 @@ +package cz.cvut.fel.sit.omo.foodchain.parser; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; + +public class ParserResultElement { + + private String name; + private Map attributes; + private Map children; + + public ParserResultElement() { + attributes = new HashMap<>(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + public void addAttribute(String key, String value) { + attributes.put(key, value); + } + + public String getAttribute(String key) { + return attributes.get(key); + } + + public Map getChildren() { + return children; + } + + public void setChildren(Map children) { + this.children = children; + } + + public void addChild(String key, String value) { + children.put(key, value); + } + + public String getChild(String key) { + return children.get(key); + } +} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/ChannelPool.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/ChannelPool.java index 8419126..2595ef7 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/ChannelPool.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/ChannelPool.java @@ -1,6 +1,11 @@ package cz.cvut.fel.sit.omo.foodchain.pool; -import cz.cvut.fel.sit.omo.foodchain.channel.IChannel; +import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; +import cz.cvut.fel.sit.omo.foodchain.product.ProductType; -public class ChannelPool extends PoolListBase { +public class ChannelPool extends PoolListBase { + + public ChannelBase findByType(ProductType type) { + return findAll().stream().filter(ch -> ch.getProductType().equals(type)).findFirst().orElse(null); + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/IPool.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/IPool.java deleted file mode 100644 index e91f2bf..0000000 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/IPool.java +++ /dev/null @@ -1,15 +0,0 @@ -package cz.cvut.fel.sit.omo.foodchain.pool; - -import java.util.Collection; - -public interface IPool { - Collection findAll(); - - void add(T element); - - void remove(T element); - - void clear(); - - boolean contains(T element); -} 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 b66bbce..249a52d 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 @@ -1,6 +1,7 @@ package cz.cvut.fel.sit.omo.foodchain.pool; -import cz.cvut.fel.sit.omo.foodchain.node.INode; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; -public class NodePool extends PoolListBase { +public class NodePool extends PoolListBase { + //TODO Tomas Angelo } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/PoolListBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/PoolListBase.java index 48f9ce8..4ec242b 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/PoolListBase.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/PoolListBase.java @@ -1,17 +1,16 @@ package cz.cvut.fel.sit.omo.foodchain.pool; -import java.util.Collection; import java.util.LinkedList; import java.util.List; -public abstract class PoolListBase implements IPool { +public abstract class PoolListBase { List pool; public PoolListBase() { pool = new LinkedList(); } - public Collection findAll() { + public List findAll() { return pool; } 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 3d21dd0..7da8113 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,6 +1,5 @@ package cz.cvut.fel.sit.omo.foodchain.product; -import cz.cvut.fel.sit.omo.foodchain.operation.IOperation; import cz.cvut.fel.sit.omo.foodchain.operation.OperationBase; public class Product diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextFileVisitor.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextFileVisitor.java index c18d209..2ffc478 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextFileVisitor.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextFileVisitor.java @@ -1,19 +1,19 @@ package cz.cvut.fel.sit.omo.foodchain.reporting; -import cz.cvut.fel.sit.omo.foodchain.channel.IChannel; -import cz.cvut.fel.sit.omo.foodchain.node.INode; -import cz.cvut.fel.sit.omo.foodchain.operation.IOperation; +import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.operation.OperationBase; public class ReportTextFileVisitor { - public void visit(INode node){ + public void visit(NodeBase node){ } - public void visit(IOperation operationBase){ + public void visit(OperationBase operationBase){ } - public void visit(IChannel channel){ + public void visit(ChannelBase channel){ } } 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 7446f9c..0528bbc 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 @@ -1,4 +1,46 @@ package cz.cvut.fel.sit.omo.foodchain.requirement; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.operation.TransactionType; +import cz.cvut.fel.sit.omo.foodchain.product.ProductType; + public class Requirement { + + private final NodeBase creator; + private final TransactionType transactionType; + private final ProductType productType; + private final String productName; + private int TTL; + + public Requirement(NodeBase creator, TransactionType transactionType, ProductType productType, String productName) { + this.creator = creator; + this.transactionType = transactionType; + this.productType = productType; + this.productName = productName; + TTL = 2; + } + + public void tick() { + TTL--; + } + + public NodeBase getCreator() { + return creator; + } + + public TransactionType getTransactionType() { + return transactionType; + } + + public ProductType getProductType() { + return productType; + } + + public String getProductName() { + return productName; + } + + public int getTTL() { + return TTL; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/ConsumeProductStep.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/ConsumeProductStep.java new file mode 100644 index 0000000..ab8161f --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/ConsumeProductStep.java @@ -0,0 +1,17 @@ +package cz.cvut.fel.sit.omo.foodchain.scenario; + +import cz.cvut.fel.sit.omo.foodchain.node.Customer; + +public class ConsumeProductStep extends ScenarioStep { + + private Customer node; + + public ConsumeProductStep(Customer node) { + this.node = node; + } + + @Override + void execute() { + node.consumeProduct(); + } +} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/DoActionStep.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/DoActionStep.java new file mode 100644 index 0000000..ad41b28 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/DoActionStep.java @@ -0,0 +1,32 @@ +package cz.cvut.fel.sit.omo.foodchain.scenario; + +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.operation.ProductOperationType; +import cz.cvut.fel.sit.omo.foodchain.product.Product; + +public class DoActionStep extends ScenarioStep { + private final NodeBase nodeBase; + private final ProductOperationType productOperationType; + private final Product product; + + public DoActionStep(NodeBase node, ProductOperationType productOperationType, Product product){ + this.nodeBase = node; + this.productOperationType = productOperationType; + this.product = product; + } + + public DoActionStep(NodeBase node, ProductOperationType productOperationType){ + this(node, productOperationType, null); + } + + + @Override + void execute() { + if (product != null){ + nodeBase.doAction(productOperationType, product); + } + else { + nodeBase.doAction(productOperationType); + } + } +} 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 new file mode 100644 index 0000000..8db7187 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/GenerateProductStep.java @@ -0,0 +1,24 @@ +package cz.cvut.fel.sit.omo.foodchain.scenario; + +import cz.cvut.fel.sit.omo.foodchain.FoodChain; +import cz.cvut.fel.sit.omo.foodchain.node.Farmer; +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.product.Product; + +public class GenerateProductStep extends ScenarioStep { + + private Farmer node; + private Product product; + + public GenerateProductStep(Farmer node) { + this.node = node; + product = FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().findAll() + .stream().findFirst().orElse(null); + FoodChain.getFactoryManager().getPoolDatabaseInstance().getProductPoolInstance().remove(product); + } + + @Override + void execute() { + node.generateProduct(product); + } +} 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 ddbb4a9..6c4137b 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 @@ -1,4 +1,26 @@ package cz.cvut.fel.sit.omo.foodchain.scenario; +import java.util.Iterator; +import java.util.List; + public class Scenario { + List steps; + Iterator stepIterator; + + public Scenario() { + //steps = //TODO init + stepIterator = steps.listIterator(0); + } + + public Scenario(List steps) { + this.steps = steps; + stepIterator = steps.listIterator(0); + } + + void execute() { + if (!stepIterator.hasNext()) { + stepIterator = steps.listIterator(0); + } + stepIterator.next().execute(); + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/ScenarioStep.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/ScenarioStep.java new file mode 100644 index 0000000..d1050e4 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/ScenarioStep.java @@ -0,0 +1,5 @@ +package cz.cvut.fel.sit.omo.foodchain.scenario; + +public abstract class ScenarioStep { + abstract void execute(); +} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/SendRequirementStep.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/SendRequirementStep.java new file mode 100644 index 0000000..cd5eb5c --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/scenario/SendRequirementStep.java @@ -0,0 +1,24 @@ +package cz.cvut.fel.sit.omo.foodchain.scenario; + +import cz.cvut.fel.sit.omo.foodchain.node.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.operation.TransactionType; +import cz.cvut.fel.sit.omo.foodchain.product.ProductType; + +public class SendRequirementStep extends ScenarioStep { + private final NodeBase node; + private final TransactionType tType; + private final ProductType pType; + private final String pName; + + public SendRequirementStep(NodeBase node, TransactionType tType, ProductType pType, String pName) { + this.node = node; + this.tType = tType; + this.pType = pType; + this.pName = pName; + } + + @Override + void execute() { + node.createRequirement(tType, pType, pName); + } +} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/signature/Signature.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/signature/Signature.java index 935fe3a..865981c 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/signature/Signature.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/signature/Signature.java @@ -1,4 +1,39 @@ package cz.cvut.fel.sit.omo.foodchain.signature; +import cz.cvut.fel.sit.omo.foodchain.operation.Transaction; + +import java.time.LocalDateTime; +import java.util.UUID; + public class Signature { + + private final String managerCode; + private final Transaction transaction; + private final LocalDateTime signedDate; + private final UUID uuid; + + public Signature(String code, Transaction transaction) { + managerCode = code; + this.transaction = transaction; + signedDate = LocalDateTime.now(); + uuid = UUID.randomUUID(); + } + + public Transaction getTransaction(String code) { + if (code.equals(managerCode)) + return transaction; + return null; + } + + public LocalDateTime getSignedDate(String code) { + if (code.equals(managerCode)) + return signedDate; + return null; + } + + public UUID getUuid(String code) { + if (code.equals(managerCode)) + return uuid; + return null; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/signature/SignatureManager.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/signature/SignatureManager.java index b9f94b5..233468c 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/signature/SignatureManager.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/signature/SignatureManager.java @@ -1,4 +1,17 @@ package cz.cvut.fel.sit.omo.foodchain.signature; +import cz.cvut.fel.sit.omo.foodchain.operation.Transaction; + public class SignatureManager { + + private static final String MANAGER_CODE = "iW91AJWNOCmX1pbpLlW0"; + + public static Signature signTransaction(Transaction transaction) { + return new Signature(MANAGER_CODE, transaction); + } + + public static boolean validateSignature(Transaction transaction) { + return transaction.equals(transaction.getSignature().getTransaction(MANAGER_CODE)) + && transaction.getSignature().getUuid(MANAGER_CODE).equals(transaction.getSignature().getTransaction(MANAGER_CODE).getSignature().getUuid(MANAGER_CODE)); + } } 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 new file mode 100644 index 0000000..c802507 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Ticker.java @@ -0,0 +1,26 @@ +package cz.cvut.fel.sit.omo.foodchain.util; + +import cz.cvut.fel.sit.omo.foodchain.FoodChain; +import cz.cvut.fel.sit.omo.foodchain.pool.PoolDatabase; + +import javax.swing.*; + +public class Ticker { + + private static Timer timer; + + 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 + }); + timer.start(); + } + + public static void stop() { + timer.stop(); + } +}