From fa4ea75a21f2d649a98c8aecc0ed43da1fdd63b1 Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Mon, 4 Jan 2021 15:51:13 +0100 Subject: [PATCH] Implemented parties report --- .../sit/omo/foodchain/node/base/NodeBase.java | 75 +++++++++++-------- .../sit/omo/foodchain/operation/Action.java | 13 ++-- .../operation/FinancialTransaction.java | 2 +- .../foodchain/operation/OperationBase.java | 15 +++- .../operation/ProductTransaction.java | 8 +- .../omo/foodchain/operation/Transaction.java | 4 +- .../reporting/FoodChainReportVisitor.java | 8 +- .../reporting/PartiesReportVisitor.java | 60 +++++++++++++-- .../reporting/ReportTextVisitor.java | 28 ++++++- .../SecurityReportReportVisitor.java | 9 ++- 10 files changed, 159 insertions(+), 63 deletions(-) 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 97d34b5..bf29898 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 @@ -53,8 +53,9 @@ public class NodeBase implements ChannelObserver { /** * Sends product transaction to node through a channel based on its type. + * * @param product product to be sent - * @param node receiver node + * @param node receiver node */ public void sendTransaction(Product product, NodeBase node) { try { @@ -70,8 +71,9 @@ public class NodeBase implements ChannelObserver { /** * Sends financial transaction to node through a channel based on previous transaction type. - * @param amount amount to be sent - * @param node receiver node + * + * @param amount amount to be sent + * @param node receiver node * @param prevTransaction previous product transaction */ public void sendTransaction(MonetaryAmount amount, NodeBase node, ProductTransaction prevTransaction) { @@ -87,17 +89,16 @@ public class NodeBase implements ChannelObserver { /** * Receives (processes) transaction. + * * @param transaction transaction to be received */ public void receiveTransaction(Transaction transaction) { try { receiveTransaction((ProductTransaction) transaction); - } - catch (Exception e) { + } catch (Exception e) { try { receiveTransaction((FinancialTransaction) transaction); - } - catch (Exception ex) { + } catch (Exception ex) { LOGGER.log(Level.WARNING, e.getMessage()); } } @@ -105,6 +106,7 @@ public class NodeBase implements ChannelObserver { /** * Receives (validates) product transaction and sends financial transaction as response. + * * @param transaction transaction to be received */ public void receiveTransaction(ProductTransaction transaction) { @@ -113,12 +115,12 @@ public class NodeBase implements ChannelObserver { transaction.endTransaction(); sendTransaction(transaction.getProduct().getPrice(), transaction.getNodeCreator(), transaction); - } - else refuseTransaction(transaction); + } else refuseTransaction(transaction); } /** * Receives (validates) financial transaction. + * * @param transaction transaction to be received */ public void receiveTransaction(FinancialTransaction transaction) { @@ -129,6 +131,7 @@ public class NodeBase implements ChannelObserver { /** * Adds transaction to refused transactions. + * * @param transaction */ public void refuseTransaction(Transaction transaction) { @@ -140,11 +143,15 @@ public class NodeBase implements ChannelObserver { * Receives all transactions for this node. */ public void receiveTransactions() { - subscribedChannels.keySet().forEach(ch -> ch.getTransactions(this).forEach(t -> {receiveTransaction(t); ch.disposeOf(t);})); + subscribedChannels.keySet().forEach(ch -> ch.getTransactions(this).forEach(t -> { + receiveTransaction(t); + ch.disposeOf(t); + })); } /** * Creates requirement based on data provided. + * * @param tType transaction type * @param pType product type * @param pName product name @@ -155,8 +162,7 @@ public class NodeBase implements ChannelObserver { if (price == null) { try { price = storage.getProduct(pName, pType).getPrice(); - } - catch (NullPointerException e) { + } catch (NullPointerException e) { refusedRequirements.add(new RefusedRequirement(tType, pType, pName, price)); throw new InsufficientResourcesException("product unavailable"); } @@ -164,8 +170,7 @@ public class NodeBase implements ChannelObserver { if (tType == TransactionType.SALE) { try { storage.getProduct(pName, pType).setStateToInRequirement(); - } - catch (NullPointerException | IllegalStateException e) { + } catch (NullPointerException | IllegalStateException e) { refusedRequirements.add(new RefusedRequirement(tType, pType, pName, price)); throw new InsufficientResourcesException("product unavailable"); } @@ -178,6 +183,7 @@ public class NodeBase implements ChannelObserver { /** * Accepts requirement and creates response. + * * @param req requirement to be accepted * @throws InsufficientResourcesException if product is unavailable */ @@ -185,21 +191,20 @@ public class NodeBase implements ChannelObserver { LOGGER.log(Level.INFO, this.nodeType.toString() + " accepted " + req.toString()); if (req.getTransactionType() == TransactionType.SALE) { createRequirement(TransactionType.PURCHASE, req.getProductType(), req.getProductName(), req.getPrice()); - } - else { + } else { if (req.getPrice().isGreaterThanOrEqualTo(storage.getProduct(req.getProductName(), req.getProductType()).getPrice().multiply(0.9))) { storage.getProduct(req.getProductName(), req.getProductType()).setPrice(req.getPrice()); sendTransaction(storage.getProduct(req.getProductName(), req.getProductType()), req.getCreator()); - } - else createRequirement(TransactionType.SALE, req.getProductType(), req.getProductName(), req.getPrice()); + } else createRequirement(TransactionType.SALE, req.getProductType(), req.getProductName(), req.getPrice()); } } /** * Adds channel to subscribed channels with correct type. + * * @param channel channel to be subscribed - * @param type type of subscription + * @param type type of subscription */ public void subscribeToChannel(ChannelBase channel, ChannelSubscriptionType type) { subscribedChannels.put(channel, type); @@ -209,6 +214,7 @@ public class NodeBase implements ChannelObserver { /** * Removes channel from subscribed channels. + * * @param channel */ public void unsubscribeFromChannel(ChannelBase channel) { @@ -218,20 +224,20 @@ public class NodeBase implements ChannelObserver { /** * Proceed specific type of action on provided product if its possible. (Propagated to its storage). - * @param action type of product operation to do + * + * @param action type of product operation to do * @param product product to proceed */ - public void doAction(ProductOperationType action, Product product) throws IllegalCallerException - { - this.storage.doAction(action,product); + public void doAction(ProductOperationType action, Product product) throws IllegalCallerException { + this.storage.doAction(action, product); } /** * Calls specific ProductOperation on each product in stock (Propagated to its storage). + * * @param action ProductOperationType */ - public void doAction(ProductOperationType action) - { + public void doAction(ProductOperationType action) { this.storage.doAction(action); } @@ -247,7 +253,7 @@ public class NodeBase implements ChannelObserver { return money; } -<<<<<<< HEAD + public Map getSubscribedChannels() { return subscribedChannels; } @@ -264,18 +270,20 @@ public class NodeBase implements ChannelObserver { return allowedPurchaser; } -======= + /** * Adds amount to current assets + * * @param m amount to be added */ ->>>>>>> develop + public void addMoney(MonetaryAmount m) { this.money = this.money.add(m); } /** * Subtracts amount from current assets. + * * @param m amount to be subtracted */ public void subtractMoney(MonetaryAmount m) { @@ -284,6 +292,7 @@ public class NodeBase implements ChannelObserver { /** * Validates signature on transaction. + * * @param transaction transaction to be validated * @return signature is valid */ @@ -293,6 +302,7 @@ public class NodeBase implements ChannelObserver { /** * Checks if requirement creator is an allowed purchaser or allowed seller. + * * @param req requirement * @return creator is valid */ @@ -306,8 +316,9 @@ public class NodeBase implements ChannelObserver { /** * Checks if requirement type corresponds with channel subscription type. + * * @param requirement requirement - * @param channel channel + * @param channel channel * @return requirement type corresponds with channel subscription type */ boolean transactionSubscriptionCheck(Requirement requirement, ChannelBase channel) { @@ -325,6 +336,7 @@ public class NodeBase implements ChannelObserver { /** * Chacks if product is available or if node has enough money + * * @param req requirement * @return product is available or node has enough money */ @@ -337,8 +349,9 @@ public class NodeBase implements ChannelObserver { /** * Chacks incomming requirement. + * * @param requirement requirement - * @param channel channel + * @param channel channel */ @Override public void update(Requirement requirement, ChannelBase channel) { @@ -373,7 +386,7 @@ public class NodeBase implements ChannelObserver { } } - public String accept(ReportTextVisitor visitor){ + public String accept(ReportTextVisitor visitor) { return visitor.visit(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 2b56162..ae4e061 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 @@ -2,6 +2,7 @@ package cz.cvut.fel.sit.omo.foodchain.operation; import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase; import cz.cvut.fel.sit.omo.foodchain.product.Product; +import cz.cvut.fel.sit.omo.foodchain.reporting.ReportTextVisitor; import java.util.logging.Level; import java.util.logging.Logger; @@ -10,16 +11,14 @@ import java.util.logging.Logger; * Operation for processing products in storage */ 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); + super(node, product.getCurrentOperation()); this.product = product; this.type = type; - lastOperation = product.getCurrentOperation(); duration = type.getDuration(); product.setCurrentOperation(this); product.setStateToInAction(); @@ -48,10 +47,6 @@ public class Action extends OperationBase { return true; } - public OperationBase getLastOperation() { - return lastOperation; - } - public Product getProduct() { return product; } @@ -68,4 +63,8 @@ public class Action extends OperationBase { ", duration=" + duration + '}'; } + + public String accept(ReportTextVisitor visitor) { + return visitor.visit(this); + } } 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 f3c823a..5b05015 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 @@ -16,7 +16,7 @@ public class FinancialTransaction extends Transaction { private final ProductTransaction transactionPaid; public FinancialTransaction(NodeBase creator, NodeBase receiver, TransactionType type, MonetaryAmount amount, ProductTransaction transactionPaid) throws InsufficientResourcesException { - super(creator, receiver, type); + super(creator, receiver, type, transactionPaid); this.amount = amount; this.transactionPaid = transactionPaid; if (creator.getMoney().isLessThan(amount)) throw new InsufficientResourcesException("not enough money"); 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 7f80bb4..a7ca445 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,7 +1,8 @@ package cz.cvut.fel.sit.omo.foodchain.operation; -import cz.cvut.fel.sit.omo.foodchain.factory.ScenarioFactory; import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.reporting.PartiesReportVisitor; +import cz.cvut.fel.sit.omo.foodchain.reporting.ReportTextVisitor; import java.time.LocalDateTime; import java.util.logging.Logger; @@ -17,9 +18,11 @@ public abstract class OperationBase { private LocalDateTime timeEnd; private final NodeBase nodeCreator; + private final OperationBase lastOperation; - OperationBase(NodeBase node) { + OperationBase(NodeBase node, OperationBase lastOperation) { nodeCreator = node; + this.lastOperation = lastOperation; timeStart = LocalDateTime.now(); } @@ -38,4 +41,12 @@ public abstract class OperationBase { public NodeBase getNodeCreator() { return nodeCreator; } + + public OperationBase getLastOperation() { + return lastOperation; + } + + public String accept(ReportTextVisitor reportVisitor){ + return reportVisitor.visit(this); + } } 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 da02790..503e20a 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 @@ -13,15 +13,13 @@ import java.util.logging.Level; */ 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) throws InsufficientResourcesException { - super(creator, receiver, transactionType); + super(creator, receiver, transactionType, product.getCurrentOperation()); this.product = product; type = null; - lastOperation = product.getCurrentOperation(); if (product == null || product.getProductState() != ProductState.IN_REQUIREMENT) throw new InsufficientResourcesException("product unavailable"); product.setCurrentOperation(this); product.setStateToReadyForDispatch(); @@ -40,10 +38,6 @@ public class ProductTransaction extends Transaction { product.setStateToAvailable(); } - public OperationBase getLastOperation() { - return lastOperation; - } - public Product getProduct() { return product; } 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 36ab3f8..7985a63 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 @@ -14,8 +14,8 @@ public abstract class Transaction extends OperationBase { private final Signature signature; private final NodeBase nodeReceiver; - Transaction(NodeBase creator, NodeBase receiver, TransactionType type) { - super(creator); + Transaction(NodeBase creator, NodeBase receiver, TransactionType type, OperationBase lastOperation) { + super(creator, lastOperation); transactionType = type; nodeReceiver = receiver; signature = SignatureManager.signTransaction(this); diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/FoodChainReportVisitor.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/FoodChainReportVisitor.java index 5f25802..656a165 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/FoodChainReportVisitor.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/FoodChainReportVisitor.java @@ -1,7 +1,7 @@ package cz.cvut.fel.sit.omo.foodchain.reporting; -import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase; +import cz.cvut.fel.sit.omo.foodchain.operation.Action; import cz.cvut.fel.sit.omo.foodchain.operation.FinancialTransaction; import cz.cvut.fel.sit.omo.foodchain.operation.ProductTransaction; import cz.cvut.fel.sit.omo.foodchain.product.Product; @@ -15,6 +15,7 @@ public class FoodChainReportVisitor implements ReportTextVisitor { @Override public String visit(Product product) { return null; + } @Override @@ -26,4 +27,9 @@ public class FoodChainReportVisitor implements ReportTextVisitor { public String visit(FinancialTransaction transaction) { return null; } + + @Override + public String visit(Action action) { + return null; + } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/PartiesReportVisitor.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/PartiesReportVisitor.java index 5e7a73d..6773028 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/PartiesReportVisitor.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/PartiesReportVisitor.java @@ -2,28 +2,76 @@ package cz.cvut.fel.sit.omo.foodchain.reporting; import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase; -import cz.cvut.fel.sit.omo.foodchain.operation.FinancialTransaction; -import cz.cvut.fel.sit.omo.foodchain.operation.ProductTransaction; +import cz.cvut.fel.sit.omo.foodchain.operation.*; import cz.cvut.fel.sit.omo.foodchain.product.Product; +import java.util.LinkedList; +import java.util.List; + public class PartiesReportVisitor implements ReportTextVisitor { + private NodeBase current; @Override public String visit(NodeBase node) { - return null; + current = node; + StringBuilder builder = new StringBuilder(); + + builder.append("------NODE------").append(ln) + .append("Node type: ").append(node.getNodeType()).append(ln) + .append("Allowed seller: ").append(node.getAllowedSeller()).append(ln) + .append("Allowed purchaser: ").append(node.getAllowedPurchaser()).append(ln) + .append("Product sold and purchased, action provided: ").append(ln); + + + db.getProductPoolInstance().findAll().forEach(p -> builder.append(p.accept(this))); + builder.append(ln); + + return builder.toString(); } @Override public String visit(Product product) { - return null; + if (current == null) return ""; + StringBuilder builder = new StringBuilder(); + List operations = new LinkedList<>(); + + OperationBase operation = product.getCurrentOperation(); + while (operation != null){ + operations.add(operation); + operation = operation.getLastOperation(); + } + + operations.forEach(o -> builder.append(o.accept(this))); + if (builder.toString().equals("")) return ""; + builder.append(ln); + + return builder.toString(); } @Override public String visit(ProductTransaction transaction) { - return null; + if (transaction.getNodeCreator() == current) + return "Sell " + transaction.getProduct().getName() + ln; + else if (transaction.getNodeReceiver() == current) + return "Get " + transaction.getProduct().getName() + ln; + + return ""; } @Override public String visit(FinancialTransaction transaction) { - return null; + if (transaction.getNodeCreator() == current) + return "Send " + transaction.getAmount() + ln; + else if (transaction.getNodeReceiver() == current) + return "Get " + transaction.getAmount() + ln; + + return ""; + } + + @Override + public String visit(Action action) { + if (action.getNodeCreator() == current) + return "Action " + action.getType() + " with " + action.getProduct().getName() + ln; + + return ""; } } diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextVisitor.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextVisitor.java index 679da3c..62d2531 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextVisitor.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextVisitor.java @@ -1,15 +1,15 @@ package cz.cvut.fel.sit.omo.foodchain.reporting; +import cz.cvut.fel.sit.omo.foodchain.FoodChain; import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase; -import cz.cvut.fel.sit.omo.foodchain.operation.FinancialTransaction; -import cz.cvut.fel.sit.omo.foodchain.operation.OperationBase; -import cz.cvut.fel.sit.omo.foodchain.operation.ProductTransaction; -import cz.cvut.fel.sit.omo.foodchain.operation.Transaction; +import cz.cvut.fel.sit.omo.foodchain.operation.*; +import cz.cvut.fel.sit.omo.foodchain.pool.PoolDatabase; import cz.cvut.fel.sit.omo.foodchain.product.Product; public interface ReportTextVisitor { String ln = System.lineSeparator(); + PoolDatabase db = FoodChain.getFactoryManager().getPoolDatabaseInstance(); String visit(NodeBase node); @@ -18,4 +18,24 @@ public interface ReportTextVisitor { String visit(ProductTransaction transaction); String visit(FinancialTransaction transaction); + + String visit(Action action); + + default String visit(OperationBase operationBase){ + try + { + return visit((Action) operationBase); + } catch (ClassCastException e){ + return visit((Transaction) operationBase); + } + } + + default String visit(Transaction transaction){ + try + { + return visit((ProductTransaction) transaction); + } catch (ClassCastException e){ + return visit((FinancialTransaction) transaction); + } + } } \ No newline at end of file diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/SecurityReportReportVisitor.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/SecurityReportReportVisitor.java index 0cc8718..e948c0c 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/SecurityReportReportVisitor.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/SecurityReportReportVisitor.java @@ -2,8 +2,7 @@ package cz.cvut.fel.sit.omo.foodchain.reporting; import cz.cvut.fel.sit.omo.foodchain.channel.ChannelBase; import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase; -import cz.cvut.fel.sit.omo.foodchain.operation.FinancialTransaction; -import cz.cvut.fel.sit.omo.foodchain.operation.ProductTransaction; +import cz.cvut.fel.sit.omo.foodchain.operation.*; import cz.cvut.fel.sit.omo.foodchain.product.Product; public class SecurityReportReportVisitor implements ReportTextVisitor { @@ -26,4 +25,10 @@ public class SecurityReportReportVisitor implements ReportTextVisitor { public String visit(FinancialTransaction transaction) { return null; } + + @Override + public String visit(Action action) { + return null; + } + }