Skip to content
Open
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
74 changes: 74 additions & 0 deletions src/coffeeMachine/CoffeeMachine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package coffeeMachine;

import coffeeMachine.engine.CoffeeEngine;
import coffeeMachine.engine.CoffeeEngineStateFormatter;
import coffeeMachine.engine.Display;
import coffeeMachine.state.MachineState;

/**
* Coffee machine able to handle input and contains engine state.
*/
public class CoffeeMachine {

private static final String INVITATION_STRING = "Write action (buy, fill, take, remaining, exit): ";
private static final String BUY_INVITATION = "\nWhat do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: ";

private final CoffeeEngine coffeeEngine;
private final CoffeeEngineStateFormatter stateFormatter;
private final Display display;

private MachineState machineState;
private boolean terminated;

public CoffeeMachine(CoffeeEngine coffeeEngine, Display display) {
this.coffeeEngine = coffeeEngine;
this.display = display;
this.machineState = MachineState.defaultState();
this.stateFormatter = new CoffeeEngineStateFormatter(coffeeEngine);
}

public void process(String input) {
machineState.processRequest(input, this);
}

public void setMachineState(MachineState machineState) {
this.machineState = machineState;
}

public boolean isTerminated() {
return terminated;
}

public void showOnDisplay(String message) {
display.displayMessage(message);
}

public void withdrawMoney() {
showOnDisplay(stateFormatter.printWithdraw());
coffeeEngine.setMoney(0);
}

public void terminate() {
terminated = true;
}

public void displayInvitation() {
showOnDisplay(INVITATION_STRING);
}

public void displayState() {
showOnDisplay(stateFormatter.printState());
}

public CoffeeEngine getEngine() {
return coffeeEngine;
}

public void triggerBuyProcess() {
showOnDisplay(BUY_INVITATION);
}

public void triggerFillProcess() {
showOnDisplay("Write how many ml of water do you want to add: ");
}
}
23 changes: 20 additions & 3 deletions src/coffeeMachine/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,24 @@
package coffeeMachine;

public class Main {
public static void main(String[] args) {
System.out.print("Hello world!");
import coffeeMachine.engine.CoffeeEngine;
import coffeeMachine.engine.Display;
import coffeeMachine.engine.StdIoDisplay;
import java.util.*;

/**
* Coffee machine runner attached to stdin/stdout.
*/
class Main {

public static void main(String[] args) {
try (Scanner sc = new Scanner(System.in)) {
CoffeeEngine coffeeEngine = new CoffeeEngine(400, 540, 120, 9, 550);
Display display = new StdIoDisplay();
CoffeeMachine coffeeMachine = new CoffeeMachine(coffeeEngine, display);
coffeeMachine.displayInvitation();
while (!coffeeMachine.isTerminated()) {
coffeeMachine.process(sc.nextLine());
}
}
}
}
8 changes: 8 additions & 0 deletions src/coffeeMachine/beverages/Beverage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package coffeeMachine.beverages;

public interface Beverage {

String SUCCESS_MESSAGE = "I have enough resources, making you a coffee!\n\n";

String serve();
}
8 changes: 8 additions & 0 deletions src/coffeeMachine/beverages/BeverageFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package coffeeMachine.beverages;

import coffeeMachine.engine.CoffeeEngine;

public interface BeverageFactory {

Beverage selectBeverage(String option, CoffeeEngine engine);
}
42 changes: 42 additions & 0 deletions src/coffeeMachine/beverages/Capuccino.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package coffeeMachine.beverages;

import coffeeMachine.engine.CoffeeEngine;
import coffeeMachine.engine.CoffeeEngineStateFormatter;

public class Capuccino implements Beverage {

private static final int WATER_NEEDED = 200;
private static final int COFFEE_NEEDED = 12;
private static final int MILK_NEEDED = 100;
private static final int CUPS_NEEDED = 1;
private static final int COST_OF_BEVERAGE = 6;

private final CoffeeEngineStateFormatter formatter;
private final CoffeeEngine engine;

public Capuccino(CoffeeEngine engine) {
this.engine = engine;
this.formatter = new CoffeeEngineStateFormatter(engine);
}

@Override
public String serve() {
if (isEnoughResources()) {
engine.setWater(engine.getWater() - WATER_NEEDED);
engine.setMilk(engine.getMilk() - MILK_NEEDED);
engine.setCoffee(engine.getCoffee() - COFFEE_NEEDED);
engine.setCups(engine.getCups() - CUPS_NEEDED);
engine.setMoney(engine.getMoney() + COST_OF_BEVERAGE);
return SUCCESS_MESSAGE;
} else {
return formatter
.printResoucesNotInRange(WATER_NEEDED, MILK_NEEDED, COFFEE_NEEDED, CUPS_NEEDED);
}
}

private boolean isEnoughResources() {
return engine.getWater() - WATER_NEEDED >= 0 && engine.getCoffee() - COFFEE_NEEDED >= 0
&& engine.getMilk() - MILK_NEEDED >= 0
&& engine.getCups() - CUPS_NEEDED >= 0;
}
}
40 changes: 40 additions & 0 deletions src/coffeeMachine/beverages/Espresso.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package coffeeMachine.beverages;

import coffeeMachine.engine.CoffeeEngine;
import coffeeMachine.engine.CoffeeEngineStateFormatter;

public class Espresso implements Beverage {

private static final int WATER_NEEDED = 250;
private static final int COFFEE_NEEDED = 16;
private static final int CUPS_NEEDED = 1;
private static final int COST_OF_BEVERAGE = 4;

private final CoffeeEngineStateFormatter formatter;

private CoffeeEngine engine;

public Espresso(CoffeeEngine engine) {
this.engine = engine;
this.formatter = new CoffeeEngineStateFormatter(engine);
}

@Override
public String serve() {
if (isEnoughResources()) {
engine.setWater(engine.getWater() - WATER_NEEDED);
engine.setCoffee(engine.getCoffee() - COFFEE_NEEDED);
engine.setCups(engine.getCups() - CUPS_NEEDED);
engine.setMoney(engine.getMoney() + COST_OF_BEVERAGE);
return SUCCESS_MESSAGE;
} else {
return formatter
.printResoucesNotInRange(WATER_NEEDED, 0, COFFEE_NEEDED, CUPS_NEEDED);
}
}

private boolean isEnoughResources() {
return engine.getWater() - WATER_NEEDED >= 0 && engine.getCoffee() - COFFEE_NEEDED >= 0
&& engine.getCups() - CUPS_NEEDED >= 0;
}
}
42 changes: 42 additions & 0 deletions src/coffeeMachine/beverages/Latte.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package coffeeMachine.beverages;

import coffeeMachine.engine.CoffeeEngine;
import coffeeMachine.engine.CoffeeEngineStateFormatter;

public class Latte implements Beverage {

private static final int WATER_NEEDED = 350;
private static final int COFFEE_NEEDED = 20;
private static final int MILK_NEEDED = 75;
private static final int CUPS_NEEDED = 1;
private static final int COST_OF_BEVERAGE = 7;

private final CoffeeEngineStateFormatter formatter;
private final CoffeeEngine engine;

public Latte(CoffeeEngine engine) {
this.engine = engine;
this.formatter = new CoffeeEngineStateFormatter(engine);
}

@Override
public String serve() {
if (isEnoughResources()) {
engine.setWater(engine.getWater() - WATER_NEEDED);
engine.setMilk(engine.getMilk() - MILK_NEEDED);
engine.setCoffee(engine.getCoffee() - COFFEE_NEEDED);
engine.setCups(engine.getCups() - CUPS_NEEDED);
engine.setMoney(engine.getMoney() + COST_OF_BEVERAGE);
return SUCCESS_MESSAGE;
} else {
return formatter
.printResoucesNotInRange(WATER_NEEDED, MILK_NEEDED, COFFEE_NEEDED, CUPS_NEEDED);
}
}

private boolean isEnoughResources() {
return engine.getWater() - WATER_NEEDED >= 0 && engine.getCoffee() - COFFEE_NEEDED >= 0
&& engine.getMilk() - MILK_NEEDED >= 0
&& engine.getCups() - CUPS_NEEDED >= 0;
}
}
20 changes: 20 additions & 0 deletions src/coffeeMachine/beverages/StandartBeverages.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package coffeeMachine.beverages;

import coffeeMachine.engine.CoffeeEngine;

public enum StandartBeverages implements BeverageFactory {
Factory {
@Override
public Beverage selectBeverage(String option, CoffeeEngine engine) {
switch (option) {
case "1":
return new Espresso(engine);
case "2":
return new Latte(engine);
case "3":
return new Capuccino(engine);
}
return null;
}
}
}
59 changes: 59 additions & 0 deletions src/coffeeMachine/engine/CoffeeEngine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package coffeeMachine.engine;


public class CoffeeEngine {

private int water;
private int milk;
private int coffee;
private int cups;
private int money;

public CoffeeEngine(int water, int milk, int coffee, int cups, int money) {
this.water = water;
this.milk = milk;
this.coffee = coffee;
this.cups = cups;
this.money = money;
}

public int getWater() {
return water;
}

public void setWater(int water) {
this.water = water;
}

public int getMilk() {
return milk;
}

public void setMilk(int milk) {
this.milk = milk;
}

public int getCoffee() {
return coffee;
}

public void setCoffee(int coffee) {
this.coffee = coffee;
}

public int getCups() {
return cups;
}

public void setCups(int cups) {
this.cups = cups;
}

public int getMoney() {
return money;
}

public void setMoney(int money) {
this.money = money;
}
}
51 changes: 51 additions & 0 deletions src/coffeeMachine/engine/CoffeeEngineStateFormatter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package coffeeMachine.engine;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

public class CoffeeEngineStateFormatter {

private CoffeeEngine coffeeEngine;

public CoffeeEngineStateFormatter(CoffeeEngine coffeeEngine) {
this.coffeeEngine = coffeeEngine;
}

public String printState() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream stringWriter = new PrintStream(out);
stringWriter.printf("\nThe coffee machine has:\n");
stringWriter.printf("%d of water\n", coffeeEngine.getWater());
stringWriter.printf("%d of milk\n", coffeeEngine.getMilk());
stringWriter.printf("%d of coffee beans\n", coffeeEngine.getCoffee());
stringWriter.printf("%d of disposable cups\n", coffeeEngine.getCups());
stringWriter.printf("%d of money\n\n", coffeeEngine.getMoney());
return new String(out.toByteArray());
}

public String printWithdraw() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream stringWriter = new PrintStream(out);
stringWriter.printf("\nI gave you $%d\n\n", coffeeEngine.getMoney());
return new String(out.toByteArray());
}

public String printResoucesNotInRange(int water, int milk, int coffee, int cups) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream stringWriter = new PrintStream(out);
if (coffeeEngine.getWater() - water < 0) {
stringWriter.printf("Sorry, not enough water!\n");
}
if (coffeeEngine.getMilk() - milk < 0) {
stringWriter.printf("Sorry, not enough milk!\n");
}
if (coffeeEngine.getCoffee() - coffee < 0) {
stringWriter.printf("Sorry, not enough coffee beans!\n");
}
if (coffeeEngine.getCups() - cups < 0) {
stringWriter.printf("Sorry, not enough cups!\n");
}
stringWriter.printf("\n");
return new String(out.toByteArray());
}
}
6 changes: 6 additions & 0 deletions src/coffeeMachine/engine/Display.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package coffeeMachine.engine;

public interface Display {

void displayMessage(String message);
}
9 changes: 9 additions & 0 deletions src/coffeeMachine/engine/StdIoDisplay.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package coffeeMachine.engine;

public class StdIoDisplay implements Display {

@Override
public void displayMessage(String message) {
System.out.printf(message);
}
}
Loading