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..7da3e5d 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; + public static void main(String[] args) { } + + public static FactoryManager getFactoryManager() { + return factoryManager; + } } 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 872a434..ede1db0 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 @@ -6,24 +6,30 @@ 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 javax.money.MonetaryAmount; import java.util.LinkedList; import java.util.List; -public class NodeBase { +public class NodeBase implements ChannelObserver { private final List subscribedChannels; private final List products; + private MonetaryAmount money; - public NodeBase(){ + private final List refusedTranslations; + + public NodeBase() { subscribedChannels = new LinkedList<>(); products = new LinkedList<>(); + refusedTranslations = new LinkedList<>(); } public void sendTransaction(Product product, NodeBase node) { - Transaction transaction = new ProductTransaction(this, node, TransactionType.SALE, product); //TODO wrong constructor + Transaction transaction = new ProductTransaction(this, node, TransactionType.SALE, product); subscribedChannels.stream() .filter(ch -> ch.getProductType().equals(product.getProductType())) @@ -31,8 +37,12 @@ public class NodeBase { } - public void sendTransaction(MonetaryAmount amount, NodeBase node) { + public void sendTransaction(MonetaryAmount amount, NodeBase node, ProductTransaction prevTransaction) { + Transaction transaction = new FinancialTransaction(this, node, TransactionType.PURCHASE, amount, prevTransaction); + subscribedChannels.stream() + .filter(ch -> ch.getProductType().equals(prevTransaction.getProduct().getProductType())) + .findAny().ifPresent(channel -> channel.addTransaction(transaction)); } @@ -46,26 +56,18 @@ public class NodeBase { } - public void refuseTransaction(ProductTransaction transaction) { - + public void refuseTransaction(Transaction transaction) { + transaction.endTransaction(); + refusedTranslations.add(transaction); //TODO maybe need more work on it } - - public void refuseTransaction(FinancialTransaction transaction) { - - } - - //TODO another way to read transaction - public Transaction readNextTransaction(ChannelBase channel) { + + return channel.getNextTransaction(); } - public Requirement readNextRequirement(ChannelBase channel) { - return channel.getNextRequirement(); - } - public void acceptRequirement(Requirement requirement) { @@ -83,7 +85,7 @@ public class NodeBase { public void doAction(ProductOperationType action, Product product) { - //create new action + Action actionProcess = new Action(this, product); } @@ -93,26 +95,32 @@ public class NodeBase { public void storeProduct(Product product) { - + this.products.add(product); } public void storeProducts(List products) { - + this.products.addAll(products); } 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 Signature generateSignature(Transaction transaction) { - return null; + return SignatureManager.signTransaction(transaction); } - public boolean validateSignature(Signature signature) { - return false; + public boolean validateSignature(Transaction transaction) { + return SignatureManager.validateSignature(transaction); + } + + @Override + public void update(Requirement requirement) { + if (!requirement.getCreator().equals(this)) + acceptRequirement(requirement); } } 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 2f93457..97d989b 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 @@ -8,21 +8,28 @@ public class Action extends OperationBase { private final OperationBase lastOperation; private final Product product; private final ProductOperationType type; + private int duration; - Action(NodeBase node, Product product) { + Action(NodeBase node, Product product, ProductOperationType type) { super(node); this.product = product; - type = null; + this.type = type; lastOperation = product.getCurrentOperation(); + duration = type.getDuration(); product.setCurrentOperation(this); product.setStateToReadyForDispatch(); } - public void endAction() { + private void endAction() { this.setTimeEnd(); product.setStateToAvailable(); } + public void tick() { + if (duration == 0) endAction(); + else duration--; + } + public OperationBase getLastOperation() { return lastOperation; } 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 d498393..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 @@ -9,7 +9,7 @@ public class FinancialTransaction extends Transaction { private final MonetaryAmount amount; private final ProductTransaction transactionPaid; - FinancialTransaction(NodeBase creator, NodeBase receiver, TransactionType type, MonetaryAmount amount, ProductTransaction transactionPaid) { + public FinancialTransaction(NodeBase creator, NodeBase receiver, TransactionType type, MonetaryAmount amount, ProductTransaction transactionPaid) { super(creator, receiver, type); this.amount = amount; this.transactionPaid = transactionPaid; 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/parser/ConfigurationParser.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ConfigurationParser.java index 7ab23ab..f1298fd 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 tmp_node = elements.item(i); + ParserResultElement element = new ParserResultElement(); + for (int j = 0; j < tmp_node.getAttributes().getLength(); j++) { + element.addAttribute(tmp_node.getAttributes().item(i).getNodeName(), tmp_node.getAttributes().item(i).getTextContent()); + } + for (int j = 0; j < tmp_node.getChildNodes().getLength(); j++) { + element.addChild(tmp_node.getChildNodes().item(i).getNodeName(), tmp_node.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..20e8ead --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/parser/ParserResult.java @@ -0,0 +1,18 @@ +package cz.cvut.fel.sit.omo.foodchain.parser; + +import org.w3c.dom.Element; + +import java.util.LinkedList; + +public class ParserResult { + + private LinkedList elements; + + public ParserResult() { + elements = new LinkedList<>(); + } + + public void addElement(ParserResultElement element) { + elements.add(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 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/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 07423b1..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 @@ -3,4 +3,5 @@ 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/pool/PoolListBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/pool/PoolListBase.java index 48f9ce8..1448b1c 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 @@ -4,7 +4,7 @@ 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() { 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..b750380 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,40 @@ 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 int TTL; + + public Requirement(NodeBase creator, TransactionType transactionType, ProductType productType) { + this.creator = creator; + this.transactionType = transactionType; + this.productType = productType; + TTL = 2; + } + + public void tick() { + TTL--; + } + + public NodeBase getCreator() { + return creator; + } + + public TransactionType getTransactionType() { + return transactionType; + } + + public ProductType getProductType() { + return productType; + } + + public int getTTL() { + return TTL; + } } 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(); + } +}