From 5426ffcf02f6162ca2a18e889619b1025907da66 Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Sun, 27 Dec 2020 11:13:17 +0100 Subject: [PATCH 1/7] Prepare visitor and objects for reporting --- .../omo/foodchain/channel/ChannelBase.java | 5 +++ .../sit/omo/foodchain/node/base/NodeBase.java | 6 +++- .../sit/omo/foodchain/product/Product.java | 6 +++- .../reporting/ReportTextFileVisitor.java | 19 ----------- .../reporting/ReportTextVisitor.java | 22 ++++++++++++ .../foodchain/reporting/ReportingManager.java | 34 +++++++++++++++++++ 6 files changed, 71 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextFileVisitor.java create mode 100644 src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextVisitor.java 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 0f0b984..975ec21 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 @@ -3,6 +3,7 @@ package cz.cvut.fel.sit.omo.foodchain.channel; import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase; import cz.cvut.fel.sit.omo.foodchain.operation.Transaction; import cz.cvut.fel.sit.omo.foodchain.product.ProductType; +import cz.cvut.fel.sit.omo.foodchain.reporting.ReportTextVisitor; 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; @@ -98,4 +99,8 @@ public abstract class ChannelBase implements Observable { public ProductType getProductType() { return productType; } + + public String accept(ReportTextVisitor visitor){ + return visitor.visit(this); + } } 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 7490577..7f90131 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 @@ -7,8 +7,8 @@ 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.ProductState; import cz.cvut.fel.sit.omo.foodchain.product.ProductType; +import cz.cvut.fel.sit.omo.foodchain.reporting.ReportTextVisitor; 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 org.javamoney.moneta.Money; @@ -226,4 +226,8 @@ public class NodeBase implements ChannelObserver { receiveTransactions(); System.out.println(this.getClass().getSimpleName() + ": " + money.getNumber()); } + + public String accept(ReportTextVisitor visitor){ + return visitor.visit(this); + } } 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 b60b3cc..df6a3a5 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 @@ -2,9 +2,9 @@ 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 cz.cvut.fel.sit.omo.foodchain.reporting.ReportTextVisitor; import org.javamoney.moneta.Money; -import javax.money.Monetary; import javax.money.MonetaryAmount; public class Product @@ -158,4 +158,8 @@ public class Product public MonetaryAmount getPrice() { return price; } public void setPrice(MonetaryAmount price) { this.price = price; } + + public String accept(ReportTextVisitor visitor){ + return visitor.visit(this); + } } 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 deleted file mode 100644 index 353a3d5..0000000 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextFileVisitor.java +++ /dev/null @@ -1,19 +0,0 @@ -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.OperationBase; - -public class ReportTextFileVisitor { - public void visit(NodeBase node){ - - } - - public void visit(OperationBase operationBase){ - - } - - public void visit(ChannelBase channel){ - - } -} 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 new file mode 100644 index 0000000..b5c3ae0 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextVisitor.java @@ -0,0 +1,22 @@ +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.OperationBase; +import cz.cvut.fel.sit.omo.foodchain.product.Product; + +public class ReportTextVisitor { + public String visit(NodeBase node){ + + return null; + } + + public String visit(ChannelBase channel){ + + return null; + } + + public String visit(Product product){ + return null; + } +} \ No newline at end of file diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java index 408290d..33e0d78 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java @@ -1,4 +1,38 @@ package cz.cvut.fel.sit.omo.foodchain.reporting; +import cz.cvut.fel.sit.omo.foodchain.FoodChain; +import cz.cvut.fel.sit.omo.foodchain.pool.PoolDatabase; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.FileAlreadyExistsException; + public class ReportingManager { + + public void createFileTextReport(String pathname) { + File reportFile = new File(pathname); + try { + FileWriter fileWriter = new FileWriter(reportFile); + if (!reportFile.createNewFile()) { + throw new FileAlreadyExistsException(pathname); + } + fileWriter.write(acceptAllObjects()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + public String acceptAllObjects(){ + ReportTextVisitor visitor = new ReportTextVisitor(); + PoolDatabase db = FoodChain.getFactoryManager().getPoolDatabaseInstance(); + StringBuilder string = new StringBuilder(); + + db.getChannelPoolInstance().findAll().forEach(ch -> string.append(ch.accept(visitor))); + db.getNodePoolInstance().findAll().forEach(n-> string.append(n.accept(visitor))); + db.getProductPoolInstance().findAll().forEach(p -> string.append(p.accept(visitor))); + + return string.toString(); + } } From 7f5dace71839f09ddf99c0634f49c693971ea619 Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Sun, 27 Dec 2020 17:20:00 +0100 Subject: [PATCH 2/7] Start implimentating report on Node --- .../sit/omo/foodchain/node/base/NodeBase.java | 20 ++++++++++++++++ .../operation/FinancialTransaction.java | 6 +++++ .../operation/ProductTransaction.java | 6 +++++ .../omo/foodchain/operation/Transaction.java | 3 +++ .../reporting/ReportTextVisitor.java | 24 +++++++++++++++++-- 5 files changed, 57 insertions(+), 2 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 7f90131..45f8e00 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 @@ -175,6 +175,26 @@ public class NodeBase implements ChannelObserver { return money; } + public Map getSubscribedChannels() { + return subscribedChannels; + } + + public List getProducts() { + return products; + } + + public List getRefusedTransactions() { + return refusedTransactions; + } + + public NodeType getAllowedSeller() { + return allowedSeller; + } + + public NodeType getAllowedPurchaser() { + return allowedPurchaser; + } + public void addMoney(MonetaryAmount m) { this.money = this.money.add(m); } 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 bbcc732..d870043 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,6 +1,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.reporting.ReportTextVisitor; import javax.money.MonetaryAmount; import javax.naming.InsufficientResourcesException; @@ -40,4 +41,9 @@ public class FinancialTransaction extends Transaction { ", transactionPaid=" + transactionPaid + '}'; } + + @Override + public String accept(ReportTextVisitor visitor) { + return visitor.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 640ca63..c081341 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 @@ -3,6 +3,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.product.ProductState; +import cz.cvut.fel.sit.omo.foodchain.reporting.ReportTextVisitor; import javax.naming.InsufficientResourcesException; @@ -49,4 +50,9 @@ public class ProductTransaction extends Transaction { "product=" + product.getName() + '}'; } + + @Override + public String accept(ReportTextVisitor visitor) { + return visitor.visit(this); + } } 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 2deba2a..fa945d6 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,6 +1,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.reporting.ReportTextVisitor; import cz.cvut.fel.sit.omo.foodchain.signature.Signature; import cz.cvut.fel.sit.omo.foodchain.signature.SignatureManager; @@ -42,4 +43,6 @@ public abstract class Transaction extends OperationBase { ", nodeReceiver=" + nodeReceiver.getClass().getSimpleName() + '}'; } + + public abstract String accept(ReportTextVisitor visitor); } 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 b5c3ae0..9cd0815 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 @@ -2,13 +2,25 @@ 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.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.product.Product; public class ReportTextVisitor { - public String visit(NodeBase node){ + private static final String ln = System.lineSeparator(); - return null; + public String visit(NodeBase node){ + StringBuilder result = new StringBuilder(); + result.append("Node info: ").append(ln) + .append("Allowed seller: ").append(node.getAllowedSeller()).append(ln) + .append("Allowed purchaser: ").append(node.getAllowedPurchaser()).append(ln) + .append("Money: ").append(node.getMoney()).append(ln) + .append("Refused transactions: "); + node.getRefusedTransactions().forEach(tr -> result.append(tr.accept(this))); + + return result.toString(); } public String visit(ChannelBase channel){ @@ -19,4 +31,12 @@ public class ReportTextVisitor { public String visit(Product product){ return null; } + + public String visit(ProductTransaction transaction){ + return null; + } + + public String visit(FinancialTransaction transaction){ + return null; + } } \ No newline at end of file From fadc4732a97c01b045d65a786f3dc74a87c4889d Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Sun, 27 Dec 2020 19:01:40 +0100 Subject: [PATCH 3/7] [Draft] Work on visitors (need some renovation) --- conf/scenarios.xml | 1 - .../cvut/fel/sit/omo/foodchain/FoodChain.java | 5 ++++ .../sit/omo/foodchain/node/base/NodeBase.java | 4 +++ .../reporting/ReportTextVisitor.java | 29 ++++++++++--------- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/conf/scenarios.xml b/conf/scenarios.xml index d08dd00..6f78563 100644 --- a/conf/scenarios.xml +++ b/conf/scenarios.xml @@ -18,7 +18,6 @@ pass generate - pass sell FRUIT jablko 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 d5e7717..e69f752 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 @@ -7,6 +7,7 @@ import cz.cvut.fel.sit.omo.foodchain.parser.ConfigurationParser; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResult; import cz.cvut.fel.sit.omo.foodchain.parser.ParserResultElement; import cz.cvut.fel.sit.omo.foodchain.product.Product; +import cz.cvut.fel.sit.omo.foodchain.reporting.ReportingManager; import cz.cvut.fel.sit.omo.foodchain.scenario.Scenario; import cz.cvut.fel.sit.omo.foodchain.util.Ticker; import org.xml.sax.SAXException; @@ -34,6 +35,10 @@ public class FoodChain Ticker.start(); while (Ticker.getTimer().isRunning()); + + ReportingManager reportingManager = new ReportingManager(); + + System.out.println(reportingManager.acceptAllObjects()); } public static FactoryManager getFactoryManager() 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 dd8fbca..59ceb27 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 @@ -205,6 +205,10 @@ public class NodeBase implements ChannelObserver { return money; } + public NodeType getNodeType() { + return nodeType; + } + public Map getSubscribedChannels() { return subscribedChannels; } 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 9cd0815..da76e51 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 @@ -11,32 +11,33 @@ import cz.cvut.fel.sit.omo.foodchain.product.Product; public class ReportTextVisitor { private static final String ln = System.lineSeparator(); - public String visit(NodeBase node){ + public String visit(NodeBase node) { StringBuilder result = new StringBuilder(); - result.append("Node info: ").append(ln) - .append("Allowed seller: ").append(node.getAllowedSeller()).append(ln) - .append("Allowed purchaser: ").append(node.getAllowedPurchaser()).append(ln) - .append("Money: ").append(node.getMoney()).append(ln) - .append("Refused transactions: "); + result.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("Money: ").append(node.getMoney()).append(ln) + .append("Refused transactions: "); node.getRefusedTransactions().forEach(tr -> result.append(tr.accept(this))); + result.append(ln).append(ln); return result.toString(); } - public String visit(ChannelBase channel){ + public String visit(ChannelBase channel) { - return null; + return ""; } - public String visit(Product product){ - return null; + public String visit(Product product) { + return ""; } - public String visit(ProductTransaction transaction){ - return null; + public String visit(ProductTransaction transaction) { + return ""; } - public String visit(FinancialTransaction transaction){ - return null; + public String visit(FinancialTransaction transaction) { + return ""; } } \ No newline at end of file From 79d7afecc53c2b67539c070dd750aee90dbd90db Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Sun, 3 Jan 2021 12:22:33 +0100 Subject: [PATCH 4/7] [Draft] Recononstruct Reporting for 3 types of Visitors, add ReportBuilder --- .../cvut/fel/sit/omo/foodchain/FoodChain.java | 2 +- .../sit/omo/foodchain/node/base/NodeBase.java | 8 ---- .../foodchain/operation/OperationBase.java | 2 +- .../reporting/FoodChainReportVisitor.java | 34 ++++++++++++++ .../reporting/PartiesReportVisitor.java | 34 ++++++++++++++ .../foodchain/reporting/ReportBuilder.java | 47 +++++++++++++++++++ .../reporting/ReportTextVisitor.java | 34 +++----------- .../foodchain/reporting/ReportingManager.java | 22 ++++----- .../SecurityReportReportVisitor.java | 34 ++++++++++++++ 9 files changed, 167 insertions(+), 50 deletions(-) create mode 100644 src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/FoodChainReportVisitor.java create mode 100644 src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/PartiesReportVisitor.java create mode 100644 src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportBuilder.java create mode 100644 src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/SecurityReportReportVisitor.java 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 126eb10..98dad3f 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 @@ -38,7 +38,7 @@ public class FoodChain ReportingManager reportingManager = new ReportingManager(); - System.out.println(reportingManager.acceptAllObjects()); + System.out.println(reportingManager.generateReport()); } public static FactoryManager getFactoryManager() 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 84d3526..4556850 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 @@ -196,18 +196,10 @@ public class NodeBase implements ChannelObserver { return money; } - public NodeType getNodeType() { - return nodeType; - } - public Map getSubscribedChannels() { return subscribedChannels; } - public List getProducts() { - return products; - } - public List getRefusedTransactions() { return refusedTransactions; } 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 c2d1587..73611ee 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 @@ -4,7 +4,7 @@ import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase; import java.time.LocalDateTime; -public class OperationBase { +public abstract class OperationBase { private final LocalDateTime timeStart; private LocalDateTime timeEnd; 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 new file mode 100644 index 0000000..4e0b4f8 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/FoodChainReportVisitor.java @@ -0,0 +1,34 @@ +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.product.Product; + +public class FoodChainReportVisitor implements ReportTextVisitor { + @Override + public String visit(NodeBase node) { + return null; + } + + @Override + public String visit(ChannelBase channel) { + return null; + } + + @Override + public String visit(Product product) { + return null; + } + + @Override + public String visit(ProductTransaction transaction) { + return null; + } + + @Override + public String visit(FinancialTransaction transaction) { + 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 new file mode 100644 index 0000000..7ee747d --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/PartiesReportVisitor.java @@ -0,0 +1,34 @@ +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.product.Product; + +public class PartiesReportVisitor implements ReportTextVisitor { + @Override + public String visit(NodeBase node) { + return null; + } + + @Override + public String visit(ChannelBase channel) { + return null; + } + + @Override + public String visit(Product product) { + return null; + } + + @Override + public String visit(ProductTransaction transaction) { + return null; + } + + @Override + public String visit(FinancialTransaction transaction) { + return null; + } +} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportBuilder.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportBuilder.java new file mode 100644 index 0000000..a900ad9 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportBuilder.java @@ -0,0 +1,47 @@ +package cz.cvut.fel.sit.omo.foodchain.reporting; + +import cz.cvut.fel.sit.omo.foodchain.FoodChain; +import cz.cvut.fel.sit.omo.foodchain.pool.PoolDatabase; + +public class ReportBuilder { + private final StringBuilder report; + private final PoolDatabase db; + + public ReportBuilder(){ + report = new StringBuilder(); + db = FoodChain.getFactoryManager().getPoolDatabaseInstance(); + } + + public ReportBuilder addPartiesReport(){ + ReportTextVisitor reportVisitor = new PartiesReportVisitor(); + + db.getNodePoolInstance().findAll().forEach(n -> report.append(reportVisitor.visit(n))); + + return this; + } + + public ReportBuilder addFoodChainReport(){ + ReportTextVisitor reportVisitor = new FoodChainReportVisitor(); + + db.getProductPoolInstance().findAll().forEach(p -> report.append(reportVisitor.visit(p))); + + return this; + } + + public ReportBuilder addSecurityReport(){ + ReportTextVisitor reportVisitor = new FoodChainReportVisitor(); + + db.getNodePoolInstance().findAll().forEach(n -> report.append(reportVisitor.visit(n))); + + return this; + } + + public ReportBuilder addTransactionReport(){ + //TODO + return this; + } + + public String build(){ + return report.toString(); + } +} 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 da76e51..309b215 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 @@ -8,36 +8,16 @@ 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.product.Product; -public class ReportTextVisitor { - private static final String ln = System.lineSeparator(); +public interface ReportTextVisitor { + String ln = System.lineSeparator(); - public String visit(NodeBase node) { - StringBuilder result = new StringBuilder(); - result.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("Money: ").append(node.getMoney()).append(ln) - .append("Refused transactions: "); - node.getRefusedTransactions().forEach(tr -> result.append(tr.accept(this))); - result.append(ln).append(ln); + String visit(NodeBase node); - return result.toString(); - } + String visit(ChannelBase channel); - public String visit(ChannelBase channel) { + String visit(Product product); - return ""; - } + String visit(ProductTransaction transaction); - public String visit(Product product) { - return ""; - } - - public String visit(ProductTransaction transaction) { - return ""; - } - - public String visit(FinancialTransaction transaction) { - return ""; - } + String visit(FinancialTransaction transaction); } \ No newline at end of file diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java index 33e0d78..78bc905 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java @@ -1,8 +1,5 @@ package cz.cvut.fel.sit.omo.foodchain.reporting; -import cz.cvut.fel.sit.omo.foodchain.FoodChain; -import cz.cvut.fel.sit.omo.foodchain.pool.PoolDatabase; - import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -17,22 +14,21 @@ public class ReportingManager { if (!reportFile.createNewFile()) { throw new FileAlreadyExistsException(pathname); } - fileWriter.write(acceptAllObjects()); + fileWriter.write(generateReport()); } catch (IOException e) { e.printStackTrace(); } } - public String acceptAllObjects(){ - ReportTextVisitor visitor = new ReportTextVisitor(); - PoolDatabase db = FoodChain.getFactoryManager().getPoolDatabaseInstance(); - StringBuilder string = new StringBuilder(); + public String generateReport(){ + ReportBuilder reportBuilder = new ReportBuilder(); - db.getChannelPoolInstance().findAll().forEach(ch -> string.append(ch.accept(visitor))); - db.getNodePoolInstance().findAll().forEach(n-> string.append(n.accept(visitor))); - db.getProductPoolInstance().findAll().forEach(p -> string.append(p.accept(visitor))); - - return string.toString(); + return reportBuilder + .addPartiesReport() + .addFoodChainReport() + .addSecurityReport() + .addTransactionReport() + .build(); } } 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 new file mode 100644 index 0000000..dc3c560 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/SecurityReportReportVisitor.java @@ -0,0 +1,34 @@ +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.product.Product; + +public class SecurityReportReportVisitor implements ReportTextVisitor { + @Override + public String visit(NodeBase node) { + return null; + } + + @Override + public String visit(ChannelBase channel) { + return null; + } + + @Override + public String visit(Product product) { + return null; + } + + @Override + public String visit(ProductTransaction transaction) { + return null; + } + + @Override + public String visit(FinancialTransaction transaction) { + return null; + } +} From 0b240ab2963578f5080dd0179d9184f958db8d63 Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Sun, 3 Jan 2021 12:42:55 +0100 Subject: [PATCH 5/7] Remove unnecessary visit on Channel --- .../cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java | 4 ---- .../sit/omo/foodchain/reporting/FoodChainReportVisitor.java | 5 ----- .../sit/omo/foodchain/reporting/PartiesReportVisitor.java | 5 ----- .../fel/sit/omo/foodchain/reporting/ReportTextVisitor.java | 2 -- 4 files changed, 16 deletions(-) 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 731433e..7e9077d 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 @@ -107,8 +107,4 @@ public abstract class ChannelBase implements Observable { public ProductType getProductType() { return productType; } - - public String accept(ReportTextVisitor visitor){ - return visitor.visit(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 4e0b4f8..5f25802 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 @@ -12,11 +12,6 @@ public class FoodChainReportVisitor implements ReportTextVisitor { return null; } - @Override - public String visit(ChannelBase channel) { - return null; - } - @Override public String visit(Product product) { 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 7ee747d..5e7a73d 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 @@ -12,11 +12,6 @@ public class PartiesReportVisitor implements ReportTextVisitor { return null; } - @Override - public String visit(ChannelBase channel) { - return null; - } - @Override public String visit(Product product) { return null; 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 309b215..679da3c 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 @@ -13,8 +13,6 @@ public interface ReportTextVisitor { String visit(NodeBase node); - String visit(ChannelBase channel); - String visit(Product product); String visit(ProductTransaction transaction); From fa825c70e3c74dd99225ef7fff97a3bb14b915bb Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Sun, 3 Jan 2021 16:16:16 +0100 Subject: [PATCH 6/7] Delete forgotten visit --- .../omo/foodchain/reporting/SecurityReportReportVisitor.java | 5 ----- 1 file changed, 5 deletions(-) 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 dc3c560..0cc8718 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 @@ -12,11 +12,6 @@ public class SecurityReportReportVisitor implements ReportTextVisitor { return null; } - @Override - public String visit(ChannelBase channel) { - return null; - } - @Override public String visit(Product product) { return null; From fa4ea75a21f2d649a98c8aecc0ed43da1fdd63b1 Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Mon, 4 Jan 2021 15:51:13 +0100 Subject: [PATCH 7/7] 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; + } + }