From ca6d4ca71e348fc4aadae50077ea38c7d6cfc28d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Musil?= Date: Tue, 5 Jan 2021 14:37:26 +0100 Subject: [PATCH] Finished readme --- README.MD | 29 ++++++++++++++++-- .../cvut/fel/sit/omo/foodchain/FoodChain.java | 10 +++--- .../sit/omo/foodchain/node/base/NodeBase.java | 24 +++++++-------- .../sit/omo/foodchain/pool/PoolListBase.java | 2 +- {EAR diagrams => ŕesources}/FoodChain.eap | Bin 5 files changed, 45 insertions(+), 20 deletions(-) rename {EAR diagrams => ŕesources}/FoodChain.eap (100%) diff --git a/README.MD b/README.MD index be7b1a7..df0c28c 100644 --- a/README.MD +++ b/README.MD @@ -1,5 +1,17 @@ *** -Použité návrhové vzory: +**Funkční požadavky:** +- F1: package node +- F2: package operation +- F3: OperationBase / lastOperation +- F4: FoodChainReportVisitor +- F5: package channel +- F6: scénář double-spending-scenario.xml + kontrola při změně productState (konkr. změna na stav IN_REQUIREMENT) +- F7: lastOperation se nastavuje pouze v konstruktoru a není možné ji ji přepsat zpětně => nelze odsimulovat +- F8: Product => setStateTo...() +- F9: Requirement + NodeBase / update() +- F10: package reporting +*** +**Použité návrhové vzory:** - Facade - FactoryManager - Object pool - Skupina tříd v package pool - Simple factory - Skupina tříd v package factory @@ -9,5 +21,18 @@ Použité návrhové vzory: - Visitor - Skupina tříd použitá v reportingu - Singleton - Využit u poolů a factory - Builder - Report builder - +*** +**Nefunkční požadavky:** +- Aplikace nepožaduje autentizaci ani autorizaci. +- Do konzole se při každém ticku vypisují provedené úkony. Z toho pak vzniká PartiesReport. +- V systému není centrální autorita, jednotlivé nody na sebe nevidí a jediná třída přes kterou procházejí všechny transakce je SignatureManager, který je v tomto směru naprosto neutrální. Aplikace běží pouze v jednom threadu. +- Všechny proměnné jsou private nebo protected. Většina proměnných je final, abychom se vyhnuli např. změtným úpravám transakcí. +- SignatureManager přidává na transakce Signature, které následně i validuje. Node zahazuje (ukládá jako neplatné) všechny nevalidní transakce. +- Reporty se generují do stejnojmenných textových souborů. +- Konfigurace probíhá pomocí XML souborů (defaultně ve složce conf). +*** +**Požadované výstupy:** +- Diskrétní kroky jsou realizovány pomocí třídy Ticker resp. metody tick() na jednotlivých třídách. +- Diagramy jsou ve složce resources v souboru FoodChain.eap. BahavioralDiagram byl náš prvotní návrh a není aktuální. Ostatní reporty odpovídají realitě. +- Javadoc je ve složce resources v souboru FoodChain.html. *** \ 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 07fbd43..7daf53e 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 @@ -85,7 +85,7 @@ public class FoodChain * @param rootElementTag tag to be parsed * @return parser result */ - public static ParserResult parseDocument(String path, String rootElementTag) + private static ParserResult parseDocument(String path, String rootElementTag) { try { @@ -104,7 +104,7 @@ public class FoodChain * Parses channels. * @param path file path */ - public static void parseChannels(String path) + private static void parseChannels(String path) { ParserResult parserResult = parseDocument(path, "channel"); List elements = parserResult.getElements(); @@ -119,7 +119,7 @@ public class FoodChain * Parses nodes. * @param path file path */ - public static void parseNodes(String path) + private static void parseNodes(String path) { ParserResult parserResult = parseDocument(path, "node"); List elements = parserResult.getElements(); @@ -134,7 +134,7 @@ public class FoodChain * Parses products. * @param path file path */ - public static void parseProducts(String path) + private static void parseProducts(String path) { ParserResult parserResult = parseDocument(path, "product"); List elements = parserResult.getElements(); @@ -149,7 +149,7 @@ public class FoodChain * Parses scenarios. * @param path file path */ - public static void parseScenarios(String path) + private static void parseScenarios(String path) { ParserResult parserResult = parseDocument(path, "scenario"); List elements = parserResult.getElements(); diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/base/NodeBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/base/NodeBase.java index bf29898..3af2903 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/base/NodeBase.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/node/base/NodeBase.java @@ -57,7 +57,7 @@ public class NodeBase implements ChannelObserver { * @param product product to be sent * @param node receiver node */ - public void sendTransaction(Product product, NodeBase node) { + private void sendTransaction(Product product, NodeBase node) { try { Transaction transaction = new ProductTransaction(this, node, TransactionType.SALE, product); subscribedChannels.keySet().stream() @@ -76,7 +76,7 @@ public class NodeBase implements ChannelObserver { * @param node receiver node * @param prevTransaction previous product transaction */ - public void sendTransaction(MonetaryAmount amount, NodeBase node, ProductTransaction prevTransaction) { + private void sendTransaction(MonetaryAmount amount, NodeBase node, ProductTransaction prevTransaction) { try { Transaction transaction = new FinancialTransaction(this, node, TransactionType.PURCHASE, amount, prevTransaction); subscribedChannels.keySet().stream() @@ -92,7 +92,7 @@ public class NodeBase implements ChannelObserver { * * @param transaction transaction to be received */ - public void receiveTransaction(Transaction transaction) { + private void receiveTransaction(Transaction transaction) { try { receiveTransaction((ProductTransaction) transaction); } catch (Exception e) { @@ -109,7 +109,7 @@ public class NodeBase implements ChannelObserver { * * @param transaction transaction to be received */ - public void receiveTransaction(ProductTransaction transaction) { + private void receiveTransaction(ProductTransaction transaction) { if (validateSignature(transaction)) { transaction.getProduct().setStateToReadyForReception(); transaction.endTransaction(); @@ -123,7 +123,7 @@ public class NodeBase implements ChannelObserver { * * @param transaction transaction to be received */ - public void receiveTransaction(FinancialTransaction transaction) { + private void receiveTransaction(FinancialTransaction transaction) { if (validateSignature(transaction)) transaction.endTransaction(); else refuseTransaction(transaction); } @@ -134,7 +134,7 @@ public class NodeBase implements ChannelObserver { * * @param transaction */ - public void refuseTransaction(Transaction transaction) { + private void refuseTransaction(Transaction transaction) { transaction.endTransaction(); refusedTransactions.add(transaction); } @@ -142,7 +142,7 @@ public class NodeBase implements ChannelObserver { /** * Receives all transactions for this node. */ - public void receiveTransactions() { + private void receiveTransactions() { subscribedChannels.keySet().forEach(ch -> ch.getTransactions(this).forEach(t -> { receiveTransaction(t); ch.disposeOf(t); @@ -187,7 +187,7 @@ public class NodeBase implements ChannelObserver { * @param req requirement to be accepted * @throws InsufficientResourcesException if product is unavailable */ - public void acceptRequirement(Requirement req) throws InsufficientResourcesException { + private void acceptRequirement(Requirement req) throws InsufficientResourcesException { LOGGER.log(Level.INFO, this.nodeType.toString() + " accepted " + req.toString()); if (req.getTransactionType() == TransactionType.SALE) { createRequirement(TransactionType.PURCHASE, req.getProductType(), req.getProductName(), req.getPrice()); @@ -296,7 +296,7 @@ public class NodeBase implements ChannelObserver { * @param transaction transaction to be validated * @return signature is valid */ - public boolean validateSignature(Transaction transaction) { + private boolean validateSignature(Transaction transaction) { return SignatureManager.validateSignature(transaction); } @@ -306,7 +306,7 @@ public class NodeBase implements ChannelObserver { * @param req requirement * @return creator is valid */ - boolean senderPurchaserCheck(Requirement req) { + private boolean senderPurchaserCheck(Requirement req) { NodeType creatorType = req.getCreator().nodeType; return !req.getCreator().equals(this) && @@ -321,7 +321,7 @@ public class NodeBase implements ChannelObserver { * @param channel channel * @return requirement type corresponds with channel subscription type */ - boolean transactionSubscriptionCheck(Requirement requirement, ChannelBase channel) { + private boolean transactionSubscriptionCheck(Requirement requirement, ChannelBase channel) { switch (subscribedChannels.get(channel)) { case SALE: return requirement.getTransactionType() == TransactionType.SALE; @@ -340,7 +340,7 @@ public class NodeBase implements ChannelObserver { * @param req requirement * @return product is available or node has enough money */ - boolean requirementCheck(Requirement req) { + private boolean requirementCheck(Requirement req) { Product product = storage.getProduct(req.getProductName(), req.getProductType()); return (req.getTransactionType() == TransactionType.SALE && money.isGreaterThanOrEqualTo(req.getPrice())) || (req.getTransactionType() == TransactionType.PURCHASE && product != null && 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 b7536d4..0cb044d 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 @@ -8,7 +8,7 @@ import java.util.List; * @param pool type */ public abstract class PoolListBase { - List pool; + protected List pool; public PoolListBase() { pool = new LinkedList(); diff --git a/EAR diagrams/FoodChain.eap b/ŕesources/FoodChain.eap similarity index 100% rename from EAR diagrams/FoodChain.eap rename to ŕesources/FoodChain.eap