Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

jv-fruit-shop-tests HW solution #822

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ Example:
```java
@Test
public void getReport_Ok() {
Storage.storage.put(...); // put fruits directly to the storage
Storage.storage.put(...); // putToDb fruits directly to the storage
String expected = "your expected result here";
String actual = fruitService.getReport();
Assert.assertEquals(expected, actual);
Expand Down
7 changes: 0 additions & 7 deletions src/main/java/core/basesyntax/HelloWorld.java

This file was deleted.

47 changes: 47 additions & 0 deletions src/main/java/core/basesyntax/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package core.basesyntax;

import core.basesyntax.model.FruitTransaction;
import core.basesyntax.service.impl.FileParserServiceImpl;
import core.basesyntax.service.impl.FileReaderServiceImpl;
import core.basesyntax.service.impl.FileWriterServiceImpl;
import core.basesyntax.service.impl.ReportGeneratorServiceImpl;
import core.basesyntax.strategy.OperationHandler;
import core.basesyntax.strategy.OperationStrategy;
import core.basesyntax.strategy.OperationStrategyImpl;
import core.basesyntax.strategy.impl.BalanceOperationHandler;
import core.basesyntax.strategy.impl.PurchaseOperationHandler;
import core.basesyntax.strategy.impl.ReturnOperationHandler;
import core.basesyntax.strategy.impl.SupplyOperationHandler;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Feel free to remove this class and create your own.
*/
public class Main {
private static final String INPUT_FILE = "src/main/resources/input.csv";
private static final String REPORT_FILE = "src/main/resources/report.csv";

public static void main(String[] args) {
List<String> dataFromFile = new FileReaderServiceImpl().read(INPUT_FILE);
final List<FruitTransaction> fruitTransactions = new FileParserServiceImpl()
.parse(dataFromFile);
Map<FruitTransaction.Operation, OperationHandler> operationHandlerMap = new HashMap<>();
OperationStrategy strategy = new OperationStrategyImpl(operationHandlerMap);
operationHandlerMap.put(FruitTransaction.Operation.BALANCE,
new BalanceOperationHandler());
operationHandlerMap.put(FruitTransaction.Operation.SUPPLY,
new SupplyOperationHandler());
operationHandlerMap.put(FruitTransaction.Operation.PURCHASE,
new PurchaseOperationHandler());
operationHandlerMap.put(FruitTransaction.Operation.RETURN,
new ReturnOperationHandler());
for (FruitTransaction fruitTransaction : fruitTransactions) {
OperationHandler handler = strategy.getHandler(fruitTransaction.getOperation());
handler.getTransaction(fruitTransaction);
new FileWriterServiceImpl().write(REPORT_FILE,
new ReportGeneratorServiceImpl().generate());
}
}
}
9 changes: 9 additions & 0 deletions src/main/java/core/basesyntax/dao/FruitDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package core.basesyntax.dao;

public interface FruitDao {
void putToDb(String fruit, Integer quantity);

void retrieve(String fruit, Integer quantity);

Integer getQuantity(String fruit);
}
28 changes: 28 additions & 0 deletions src/main/java/core/basesyntax/dao/FruitDaoImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package core.basesyntax.dao;

import core.basesyntax.db.Storage;

public class FruitDaoImpl implements FruitDao {
@Override
public void putToDb(String fruit, Integer quantity) {
int oldQuantity = Storage.fruits.getOrDefault(fruit, 0);
Storage.fruits.put(fruit, oldQuantity + quantity);
}

@Override
public void retrieve(String fruit, Integer quantity) {
int oldQuantity = Storage.fruits.getOrDefault(fruit, 0);
int newQuantity = oldQuantity - quantity;
if (newQuantity < 0) {
throw new IllegalStateException(fruit
+ " is currently not in stock,"
+ " Come back later!");
}
Storage.fruits.put(fruit, newQuantity);
}

@Override
public Integer getQuantity(String fruit) {
return Storage.fruits.getOrDefault(fruit, 0);
}
}
8 changes: 8 additions & 0 deletions src/main/java/core/basesyntax/db/Storage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package core.basesyntax.db;

import java.util.HashMap;
import java.util.Map;

public class Storage {
public static final Map<String, Integer> fruits = new HashMap<>();
}
54 changes: 54 additions & 0 deletions src/main/java/core/basesyntax/model/FruitTransaction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package core.basesyntax.model;

public class FruitTransaction {
private Operation operation;
private String fruit;
private int quantity;

public Operation getOperation() {
return operation;
}

public void setOperation(Operation operation) {
this.operation = operation;
}

public String getFruit() {
return fruit;
}

public void setFruit(String fruit) {
this.fruit = fruit;
}

public int getQuantity() {
return quantity;
}

public void setQuantity(int quantity) {
this.quantity = quantity;
}

public enum Operation {
BALANCE("b"),
SUPPLY("s"),
PURCHASE("p"),
RETURN("r");

private final String stringOption;

Operation(String code) {
this.stringOption = code;
}

public static Operation getCode(String inputCode) {
for (Operation operationType : Operation.values()) {
if (operationType.stringOption.equals(inputCode)) {
return operationType;
}
}
throw new RuntimeException("There is no such option: " + inputCode
+ ", select from existing ones");
}
}
}
8 changes: 8 additions & 0 deletions src/main/java/core/basesyntax/service/FileParserService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package core.basesyntax.service;

import core.basesyntax.model.FruitTransaction;
import java.util.List;

public interface FileParserService {
List<FruitTransaction> parse(List<String> data);
}
7 changes: 7 additions & 0 deletions src/main/java/core/basesyntax/service/FileReaderService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package core.basesyntax.service;

import java.util.List;

public interface FileReaderService {
List<String> read(String fileName);
}
5 changes: 5 additions & 0 deletions src/main/java/core/basesyntax/service/FileWriterService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package core.basesyntax.service;

public interface FileWriterService {
void write(String fileName, String data);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package core.basesyntax.service;

public interface ReportGeneratorService {
String generate();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package core.basesyntax.service.impl;

import core.basesyntax.model.FruitTransaction;
import core.basesyntax.service.FileParserService;
import java.util.ArrayList;
import java.util.List;

public class FileParserServiceImpl implements FileParserService {
public static final int OPERATION_INDEX = 0;
public static final int FRUIT_INDEX = 1;
public static final int AMOUNT_INDEX = 2;
public static final String SEPARATOR = ",";

@Override
public List<FruitTransaction> parse(List<String> data) {
List<FruitTransaction> transactions = new ArrayList<>();
for (String string : data) {
FruitTransaction fruitTransaction = new FruitTransaction();
String[] splitted = string.split(SEPARATOR);
String operationCode = splitted[OPERATION_INDEX];
FruitTransaction.Operation operation = FruitTransaction
.Operation.getCode(operationCode);
fruitTransaction.setOperation(operation);
fruitTransaction.setFruit(splitted[FRUIT_INDEX]);
fruitTransaction.setQuantity(Integer.parseInt(splitted[AMOUNT_INDEX]));
transactions.add(fruitTransaction);
}
return transactions;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package core.basesyntax.service.impl;

import core.basesyntax.service.FileReaderService;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

public class FileReaderServiceImpl implements FileReaderService {
@Override
public List<String> read(String fileName) {
Path filePath = Path.of(fileName);
try {
return Files.readAllLines(filePath);
} catch (IOException e) {
throw new RuntimeException("Can't find file by path: " + filePath, e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package core.basesyntax.service.impl;

import core.basesyntax.service.FileWriterService;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterServiceImpl implements FileWriterService {
@Override
public void write(String fileName, String data) {
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(fileName))) {
bufferedWriter.write(data);
} catch (IOException e) {
throw new RuntimeException("Can't right to the file: " + fileName, e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package core.basesyntax.service.impl;

import core.basesyntax.db.Storage;
import core.basesyntax.service.ReportGeneratorService;
import java.util.Map;

public class ReportGeneratorServiceImpl implements ReportGeneratorService {
private static final String SEPARATOR = ",";

@Override
public String generate() {
StringBuilder reportBuilder = new StringBuilder("fruit,quantity")
.append(System.lineSeparator());
if (Storage.fruits.isEmpty()) {
return reportBuilder.toString();
}
for (Map.Entry<String, Integer> entry : Storage.fruits.entrySet()) {
reportBuilder.append(entry.getKey())
.append(SEPARATOR)
.append(entry.getValue())
.append(System.lineSeparator());
}
return reportBuilder.toString();
}
}
7 changes: 7 additions & 0 deletions src/main/java/core/basesyntax/strategy/OperationHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package core.basesyntax.strategy;

import core.basesyntax.model.FruitTransaction;

public interface OperationHandler {
void getTransaction(FruitTransaction transaction);
}
7 changes: 7 additions & 0 deletions src/main/java/core/basesyntax/strategy/OperationStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package core.basesyntax.strategy;

import core.basesyntax.model.FruitTransaction;

public interface OperationStrategy {
OperationHandler getHandler(FruitTransaction.Operation operation);
}
18 changes: 18 additions & 0 deletions src/main/java/core/basesyntax/strategy/OperationStrategyImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package core.basesyntax.strategy;

import core.basesyntax.model.FruitTransaction;
import java.util.Map;

public class OperationStrategyImpl implements OperationStrategy {
private final Map<FruitTransaction.Operation, OperationHandler> strategyMap;

public OperationStrategyImpl(Map<FruitTransaction.Operation,
OperationHandler> strategyMap) {
this.strategyMap = strategyMap;
}

@Override
public OperationHandler getHandler(FruitTransaction.Operation operation) {
return strategyMap.get(operation);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package core.basesyntax.strategy.impl;

import core.basesyntax.db.Storage;
import core.basesyntax.model.FruitTransaction;
import core.basesyntax.strategy.OperationHandler;

public class BalanceOperationHandler implements OperationHandler {

@Override
public void getTransaction(FruitTransaction transaction) {
if (transaction.getQuantity() < 0) {
throw new IllegalStateException("Balance can't be negative!");
}
Storage.fruits.put(transaction.getFruit(), transaction.getQuantity());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package core.basesyntax.strategy.impl;

import core.basesyntax.dao.FruitDao;
import core.basesyntax.dao.FruitDaoImpl;
import core.basesyntax.model.FruitTransaction;
import core.basesyntax.strategy.OperationHandler;

public class PurchaseOperationHandler implements OperationHandler {
private static final FruitDao fruitDao = new FruitDaoImpl();

@Override
public void getTransaction(FruitTransaction transaction) {
fruitDao.retrieve(transaction.getFruit(), transaction.getQuantity());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package core.basesyntax.strategy.impl;

import core.basesyntax.dao.FruitDao;
import core.basesyntax.dao.FruitDaoImpl;
import core.basesyntax.model.FruitTransaction;
import core.basesyntax.strategy.OperationHandler;

public class ReturnOperationHandler implements OperationHandler {
private static final FruitDao fruitDao = new FruitDaoImpl();

@Override
public void getTransaction(FruitTransaction transaction) {
fruitDao.putToDb(transaction.getFruit(), transaction.getQuantity());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package core.basesyntax.strategy.impl;

import core.basesyntax.dao.FruitDao;
import core.basesyntax.dao.FruitDaoImpl;
import core.basesyntax.model.FruitTransaction;
import core.basesyntax.strategy.OperationHandler;

public class SupplyOperationHandler implements OperationHandler {
private static final FruitDao fruitDao = new FruitDaoImpl();

@Override
public void getTransaction(FruitTransaction transaction) {
fruitDao.putToDb(transaction.getFruit(), transaction.getQuantity());
}
}
Loading
Loading