diff --git a/conf/scenarios.xml b/conf/scenarios.xml
index 5849fe1..2c43e9d 100644
--- a/conf/scenarios.xml
+++ b/conf/scenarios.xml
@@ -19,7 +19,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 798b7ed..07fbd43 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.ReportLogger;
import cz.cvut.fel.sit.omo.foodchain.util.Ticker;
@@ -67,6 +68,10 @@ public class FoodChain
{
;
}
+
+ ReportingManager reportingManager = new ReportingManager();
+
+ System.out.println(reportingManager.generateReport());
}
public static FactoryManager getFactoryManager()
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 53f9db2..416c15d 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
@@ -4,6 +4,7 @@ import cz.cvut.fel.sit.omo.foodchain.node.base.NodeBase;
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.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;
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 f3e7404..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
@@ -8,6 +8,7 @@ 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.SignatureManager;
import cz.cvut.fel.sit.omo.foodchain.util.ChannelObserver;
@@ -52,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 {
@@ -69,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) {
@@ -86,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());
}
}
@@ -104,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) {
@@ -112,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) {
@@ -128,6 +131,7 @@ public class NodeBase implements ChannelObserver {
/**
* Adds transaction to refused transactions.
+ *
* @param transaction
*/
public void refuseTransaction(Transaction transaction) {
@@ -139,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
@@ -154,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");
}
@@ -163,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");
}
@@ -177,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
*/
@@ -184,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);
@@ -208,6 +214,7 @@ public class NodeBase implements ChannelObserver {
/**
* Removes channel from subscribed channels.
+ *
* @param channel
*/
public void unsubscribeFromChannel(ChannelBase channel) {
@@ -217,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);
}
@@ -246,16 +253,37 @@ public class NodeBase implements ChannelObserver {
return money;
}
+
+ public Map getSubscribedChannels() {
+ return subscribedChannels;
+ }
+
+ public List getRefusedTransactions() {
+ return refusedTransactions;
+ }
+
+ public NodeType getAllowedSeller() {
+ return allowedSeller;
+ }
+
+ public NodeType getAllowedPurchaser() {
+ return allowedPurchaser;
+ }
+
+
/**
* Adds amount to current assets
+ *
* @param m amount to be added
*/
+
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) {
@@ -264,6 +292,7 @@ public class NodeBase implements ChannelObserver {
/**
* Validates signature on transaction.
+ *
* @param transaction transaction to be validated
* @return signature is valid
*/
@@ -273,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
*/
@@ -286,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) {
@@ -305,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
*/
@@ -317,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) {
@@ -352,4 +385,8 @@ public class NodeBase implements ChannelObserver {
this.price = price;
}
}
+
+ 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 d78ff8f..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
@@ -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;
@@ -15,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");
@@ -48,4 +49,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/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 f5342e7..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
@@ -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;
import java.util.logging.Level;
@@ -12,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();
@@ -39,10 +38,6 @@ public class ProductTransaction extends Transaction {
product.setStateToAvailable();
}
- public OperationBase getLastOperation() {
- return lastOperation;
- }
-
public Product getProduct() {
return product;
}
@@ -57,4 +52,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 631ef9b..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
@@ -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;
@@ -13,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);
@@ -48,4 +49,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/product/Product.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/product/Product.java
index c55d9f5..ef24907 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;
/**
@@ -150,4 +150,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/FoodChainReportVisitor.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/FoodChainReportVisitor.java
new file mode 100644
index 0000000..656a165
--- /dev/null
+++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/FoodChainReportVisitor.java
@@ -0,0 +1,35 @@
+package cz.cvut.fel.sit.omo.foodchain.reporting;
+
+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;
+
+public class FoodChainReportVisitor implements ReportTextVisitor {
+ @Override
+ public String visit(NodeBase node) {
+ 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;
+ }
+
+ @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
new file mode 100644
index 0000000..6773028
--- /dev/null
+++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/PartiesReportVisitor.java
@@ -0,0 +1,77 @@
+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.*;
+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) {
+ 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) {
+ 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) {
+ 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) {
+ 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/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/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..62d2531
--- /dev/null
+++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportTextVisitor.java
@@ -0,0 +1,41 @@
+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.*;
+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);
+
+ String visit(Product product);
+
+ 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/ReportingManager.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/reporting/ReportingManager.java
index 408290d..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,4 +1,34 @@
package cz.cvut.fel.sit.omo.foodchain.reporting;
+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(generateReport());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ public String generateReport(){
+ ReportBuilder reportBuilder = new ReportBuilder();
+
+ 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..e948c0c
--- /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.*;
+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(Product product) {
+ return null;
+ }
+
+ @Override
+ public String visit(ProductTransaction transaction) {
+ return null;
+ }
+
+ @Override
+ public String visit(FinancialTransaction transaction) {
+ return null;
+ }
+
+ @Override
+ public String visit(Action action) {
+ return null;
+ }
+
+}