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

first_attempt #1283

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 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
9 changes: 0 additions & 9 deletions src/main/java/core/basesyntax/HelloWorld.java

This file was deleted.

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

import core.basesyntax.dao.FileReaderImpl;
import core.basesyntax.dao.FileReaderMy;
import core.basesyntax.dao.FileWriterImpl;
import core.basesyntax.dao.FileWriterMy;
import core.basesyntax.model.FruitTransaction;
import core.basesyntax.model.ReportGenerator;
import core.basesyntax.model.ReportGeneratorImpl;
import core.basesyntax.model.converter.DataConverter;
import core.basesyntax.model.converter.DataConverterImpl;
import core.basesyntax.model.handler.BalanceOperation;
import core.basesyntax.model.handler.OperationHandler;
import core.basesyntax.model.handler.PurchaseOperation;
import core.basesyntax.model.handler.ReturnOperation;
import core.basesyntax.model.handler.SupplyOperation;
import core.basesyntax.model.strategy.OperationStrategy;
import core.basesyntax.model.strategy.OperationStrategyImpl;
import core.basesyntax.service.ShopService;
import core.basesyntax.service.ShopServiceImpl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

private static final String REPORT_TO_READ = "src/main/resources/reportToRead.csv";
private static final String FINAL_REPORT = "src/main/resources/finalReport.csv";

public static void main(String[] args) {

FileReaderMy fileReader = new FileReaderImpl();
List<String> inputReport = fileReader.read(REPORT_TO_READ);

DataConverter dataConverter = new DataConverterImpl();
List<FruitTransaction> transactions = dataConverter.convertToTransaction(inputReport);

Map<FruitTransaction.Operation, OperationHandler> operationHandlers = new HashMap<>();
operationHandlers.put(FruitTransaction.Operation.BALANCE, new BalanceOperation());
operationHandlers.put(FruitTransaction.Operation.PURCHASE, new PurchaseOperation());
operationHandlers.put(FruitTransaction.Operation.RETURN, new ReturnOperation());
operationHandlers.put(FruitTransaction.Operation.SUPPLY, new SupplyOperation());
OperationStrategy operationStrategy = new OperationStrategyImpl(operationHandlers);

ShopService shopService = new ShopServiceImpl(operationStrategy);
Map<String, Integer> storage = shopService.process(transactions);

ReportGenerator reportGenerator = new ReportGeneratorImpl();
String resultingReport = reportGenerator.getReport(storage);

FileWriterMy fileWriter = new FileWriterImpl();
fileWriter.write(FINAL_REPORT,resultingReport);
}

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

import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FileReaderImpl implements FileReaderMy {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public class FileReaderImpl implements FileReaderMy {
public class CustomFileReaderImpl implements CustomFileReader {

public List<String> read(String fileName) {
List<String> lines = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new java.io.FileReader(fileName))) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
} catch (IOException e) {
throw new RuntimeException("Error reading file: " + fileName, e);
}
return lines;
}
}
7 changes: 7 additions & 0 deletions src/main/java/core/basesyntax/dao/FileReaderMy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package core.basesyntax.dao;

import java.util.List;

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

import java.io.BufferedWriter;
import java.io.IOException;

public class FileWriterImpl implements FileWriterMy {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the same

@Override
public void write(String fileName,String info) {
try (BufferedWriter bufferedWriter = new BufferedWriter(new java.io.FileWriter(fileName))) {
bufferedWriter.write(info);
} catch (IOException e) {
throw new RuntimeException("Impossible to write in this file " + fileName, e);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
throw new RuntimeException("Impossible to write in this file " + fileName, e);
throw new RuntimeException("Can’t write file with path: " + fileName, e);

Make the message more formal

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

public interface FileWriterMy {
void write(String fileName,String info);
}
52 changes: 52 additions & 0 deletions src/main/java/core/basesyntax/model/FruitTransaction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package core.basesyntax.model;

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

public FruitTransaction(Operation operation, String fruit, int quantity) {
this.operation = operation;
this.fruit = fruit;
this.quantity = quantity;
}

public Operation getOperation() {
return this.operation;
}

public String getFruit() {
return this.fruit;
}

public int getQuantity() {
return this.quantity;
}

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

private final String code;

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

public String getCode() {
return this.code;
}

public static Operation fromCode(String code) {
for (Operation operation : values()) {
if (operation.getCode().equals(code)) {
return operation;
}
}

throw new IllegalArgumentException("No enum constant with code " + code);
}
}
}
7 changes: 7 additions & 0 deletions src/main/java/core/basesyntax/model/ReportGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package core.basesyntax.model;

import java.util.Map;

public interface ReportGenerator {
String getReport(Map<String, Integer> storage);
}
19 changes: 19 additions & 0 deletions src/main/java/core/basesyntax/model/ReportGeneratorImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package core.basesyntax.model;

import java.util.Map;
import java.util.StringJoiner;

public class ReportGeneratorImpl implements ReportGenerator {

@Override
public String getReport(Map<String, Integer> storage) {
StringJoiner report = new StringJoiner("\n");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

better use System.lineseparator()

report.add("fruit,quantity");

for (Map.Entry<String, Integer> entry : storage.entrySet()) {
report.add(entry.getKey() + "," + entry.getValue());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make header and separator constant fields

}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change

return report.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package core.basesyntax.model.converter;

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

public interface DataConverter {
List<FruitTransaction> convertToTransaction(List<String> inputReport);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package core.basesyntax.model.converter;

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

public class DataConverterImpl implements DataConverter {
@Override
public List<FruitTransaction> convertToTransaction(List<String> inputReport) {
List<FruitTransaction> transactions = new ArrayList<>();

inputReport.stream()
.skip(1L)
.map(line -> line.split(","))

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make separator constant field

.filter(parts -> parts.length == 3)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you should throw an exception for invalid data

.map(parts -> new FruitTransaction(
FruitTransaction.Operation.fromCode(parts[0]),
parts[1],
Integer.parseInt(parts[2])
))
.forEach(transactions::add);

return transactions;
}
}
11 changes: 11 additions & 0 deletions src/main/java/core/basesyntax/model/handler/BalanceOperation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package core.basesyntax.model.handler;

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

public class BalanceOperation implements OperationHandler {
@Override
public void handle(Map<String, Integer> storage, FruitTransaction transaction) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Storage imitates real databases. So create a Storage class with a public static map

storage.put(transaction.getFruit(), transaction.getQuantity());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public void handle(Map<String, Integer> storage, FruitTransaction transaction) {
storage.put(transaction.getFruit(), transaction.getQuantity());
public void handle(FruitTransaction transaction) {
Storage.storage.put(transaction.getFruit(), transaction.getQuantity());

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package core.basesyntax.model.handler;

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

public interface OperationHandler {
void handle(Map<String, Integer> storage, FruitTransaction transaction);
}
17 changes: 17 additions & 0 deletions src/main/java/core/basesyntax/model/handler/PurchaseOperation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package core.basesyntax.model.handler;

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

public class PurchaseOperation implements OperationHandler {
@Override
public void handle(Map<String, Integer> storage, FruitTransaction transaction) {
int currentBalance = storage.getOrDefault(transaction.getFruit(), 0);
int newBalance = currentBalance - transaction.getQuantity();

if (newBalance < 0) {
throw new RuntimeException("Insufficient balance for fruit: " + transaction.getFruit());
}
storage.put(transaction.getFruit(), newBalance);
}
}
12 changes: 12 additions & 0 deletions src/main/java/core/basesyntax/model/handler/ReturnOperation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package core.basesyntax.model.handler;

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

public class ReturnOperation implements OperationHandler {
@Override
public void handle(Map<String, Integer> storage, FruitTransaction transaction) {
storage.put(transaction.getFruit(),
storage.getOrDefault(transaction.getFruit(), 0) + transaction.getQuantity());
}
}
12 changes: 12 additions & 0 deletions src/main/java/core/basesyntax/model/handler/SupplyOperation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package core.basesyntax.model.handler;

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

public class SupplyOperation implements OperationHandler {
@Override
public void handle(Map<String, Integer> storage, FruitTransaction transaction) {
storage.put(transaction.getFruit(),
storage.getOrDefault(transaction.getFruit(), 0) + transaction.getQuantity());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package core.basesyntax.model.strategy;

import core.basesyntax.model.FruitTransaction;
import core.basesyntax.model.handler.OperationHandler;

public interface OperationStrategy {
OperationHandler getOperationHandler(FruitTransaction.Operation operation);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package core.basesyntax.model.strategy;

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

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

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

@Override
public OperationHandler getOperationHandler(FruitTransaction.Operation operation) {
return operationHandlers.get(operation);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

better check that strategy return handler

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

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

public interface ShopService {
Map<String, Integer> process(List<FruitTransaction> fruitTransactionList);
}
27 changes: 27 additions & 0 deletions src/main/java/core/basesyntax/service/ShopServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package core.basesyntax.service;

import core.basesyntax.model.FruitTransaction;
import core.basesyntax.model.strategy.OperationStrategy;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ShopServiceImpl implements ShopService {
private final OperationStrategy operationStrategy;

public ShopServiceImpl(OperationStrategy operationStrategy) {
this.operationStrategy = operationStrategy;
}

@Override
public Map<String, Integer> process(List<FruitTransaction> transactions) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public Map<String, Integer> process(List<FruitTransaction> transactions) {
public void process(List<FruitTransaction> transactions) {

use Storage

Map<String, Integer> storage = new HashMap<>();

for (FruitTransaction transaction : transactions) {
operationStrategy.getOperationHandler(transaction
.getOperation()).handle(storage, transaction);
}

return storage;
}
}
3 changes: 3 additions & 0 deletions src/main/resources/finalReport.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fruit,quantity
banana,152
apple,90
9 changes: 9 additions & 0 deletions src/main/resources/reportToRead.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
type,fruit,quantity
b,banana,20
b,apple,100
s,banana,100
p,banana,13
r,apple,10
p,apple,20
p,banana,5
s,banana,50
Loading