Files
004_comission/_resources/it114105/itp4507/Assignment/19-20/src/Command.java
louiscklaw 6c60a73f30 update,
2025-01-31 19:15:17 +08:00

424 lines
13 KiB
Java

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author jerrykwok
*/
public abstract class Command {
public abstract boolean execute();
}
interface UndoAllowCommand {
public void redo();
public void undo();
}
class AddProductCommand extends Command implements UndoAllowCommand {
private ArrayList productList;
private Scanner input;
CoffeeProduct coffeeProduct;
public AddProductCommand(Scanner input, ArrayList productList) {
this.input = input;
this.productList = productList;
}
@Override
public boolean execute() {
System.out.println("Enter Coffee type (cc=Coffee Candy/cp=Coffee Powder):");
String type = input.nextLine();
switch (type) {
case "cc":
System.out.println("Enter product id, name, number of candy and calories per candy:");
String ccValue = input.nextLine();
String[] ccParameters = ccValue.split(", ");
if(ccParameters.length==1)
ccParameters = ccValue.split(",");
if (ccParameters.length != 4) {
System.out.println("Invalid parameter length");
return false;
}
try {
System.out.println();
int productId = Integer.parseInt(ccParameters[0]);
String name = ccParameters[1];
int noOfCandy = Integer.parseInt(ccParameters[2]);
int caloriesPerCandy = Integer.parseInt(ccParameters[3]);
if (checkProducrID(productList, productId)) {
System.out.println("The id: " + productId + "is already exist");
return false;
}
coffeeProduct = creatCoffeeProduct(name, productId, noOfCandy, caloriesPerCandy);
} catch (NumberFormatException e) {
System.out.println("Invalid parameter: productID, Number of candy and Calories must be Integer");
return false;
}
break;
case "cp":
System.out.println("Enter product Id , name and weight(g):");
String cpValue = input.nextLine();
String[] cpParameters = cpValue.split(", ");
if(cpParameters.length==1)
cpParameters = cpValue.split(",");
if (cpParameters.length != 3) {
System.out.println("Invalid parameter length");
return false;
}
try {
int productId = Integer.parseInt(cpParameters[0]);
String name = cpParameters[1];
int wegiht = Integer.parseInt(cpParameters[2]);
if (checkProducrID(productList, productId)) {
System.out.println("The id: " + productId + "is already exist");
return false;
}
coffeeProduct = creatCoffeeProduct(name, productId, wegiht);
} catch (NumberFormatException e) {
System.out.println("Invalid parameter: productID, Number of candy and Calories must be Integer");
return false;
}
break;
default:
System.out.println("Invalid Coffee Prodcut Type");
return false;
}
productList.add(coffeeProduct);
System.out.println("New product record created.\n");
return true;
}
@Override
public void redo() {
productList.add(coffeeProduct);
}
@Override
public void undo() {
productList.remove(coffeeProduct);
}
public static CoffeeProduct creatCoffeeProduct(String name, int productID, int noOfCandy, int caloriesPerCandy) {
return new CoffeeCandy(name, productID, noOfCandy, caloriesPerCandy);
}
public static CoffeeProduct creatCoffeeProduct(String name, int productID, int wegiht) {
return new CoffeeProwder(name, productID, wegiht);
}
public boolean checkProducrID(ArrayList<CoffeeProduct> productList, int id) {
boolean invalid = false;
for (CoffeeProduct product : productList) {
if (product.getProductID() == id) {
return true;
}
}
return false;
}
@Override
public String toString() {
return "Add " + coffeeProduct.getProductID() +" " + coffeeProduct.getName();
}
}
class ViewProductCommand extends Command {
private ArrayList<CoffeeProduct> productList;
private Scanner input;
public ViewProductCommand(Scanner input, ArrayList productList) {
this.input = input;
this.productList = productList;
}
@Override
public boolean execute() {
System.out.println("Enter product Id. (* to show all):");
String id = input.nextLine();
System.out.println("");
if (id.equals("*")) {
System.out.println("Coffee Product information");
System.out.println("ID\tName\t\t\t\tQuantity\tOther Info");
for (CoffeeProduct product : productList) {
System.out.println(product.printList());
}
} else {
try {
int productId = Integer.parseInt(id);
System.out.println("Product information");
boolean succe = false;
for (CoffeeProduct product : productList) {
if (product.getProductID() == productId) {
System.out.println(product);
succe = true;
break;
}
}
if (!succe) {
System.out.println("Not this ID: " + productId + " Product");
}
} catch (NumberFormatException e) {
System.out.println("Invalid id, id must be integer only");
return false;
}
}
return true;
}
}
class CollectProductCommand extends Command implements UndoAllowCommand {
private ArrayList<CoffeeProduct> productList;
private Scanner input;
private StateManager state;
private CoffeeProduct coffeeProduct;
private int productQty;
public CollectProductCommand(Scanner input, ArrayList<CoffeeProduct> productList, StateManager state) {
this.productList = productList;
this.input = input;
this.state = state;
}
@Override
public boolean execute() {
int productId;
try {
System.out.println("Enter product id:");
String id = input.nextLine();
productId = Integer.parseInt(id);
} catch (NumberFormatException e) {
System.out.println("Invalid id, id must be integer only");
return false;
}
try {
System.out.println("Quantity to receive:");
String qty = input.nextLine();
productQty = Integer.parseInt(qty);
} catch (NumberFormatException e) {
System.out.println("Invalid Quantity, Quantity must be integer only");
return false;
}
boolean invalid = true;
for (CoffeeProduct product : productList) {
if (product.getProductID() == productId) {
coffeeProduct = product;
state.getCaretaker().saveCoffeeProduct(product.saveMemento());
product.setQty(product.getQty() + productQty);
System.out.println("Received " + productQty + " packs of " + product.getName() + ". Current quantity is " + product.getQty() + ".");
invalid = false;
break;
}
}
if (invalid) {
System.out.println("No such Coffee Product");
return false;
}
return true;
}
@Override
public void redo() {
state.getCaretaker().redo();
}
@Override
public void undo() {
state.getCaretaker().undo();
}
public String toString(){
return "Received " + productQty + " " +coffeeProduct.getName() + " ("+coffeeProduct.getProductID()+")";
}
}
class SendCoffeeProductCommand extends Command implements UndoAllowCommand {
private ArrayList<CoffeeProduct> productList;
private Scanner input;
private StateManager state;
private CoffeeProduct coffeeProduct;
private int shipQty;
public SendCoffeeProductCommand(Scanner input, ArrayList<CoffeeProduct> productList, StateManager state) {
this.productList = productList;
this.input = input;
this.state = state;
}
@Override
public boolean execute() {
int productId;
try {
System.out.println("Enter product id:");
String id = input.nextLine();
productId = Integer.parseInt(id);
} catch (NumberFormatException e) {
System.out.println("Invalid id, id must be integer only");
return false;
}
try {
System.out.println("Quantity to ship:");
String qty = input.nextLine();
shipQty = Integer.parseInt(qty);
} catch (NumberFormatException e) {
System.out.println("Invalid Quantity, Quantity must be integer only");
return false;
}
boolean succe = true;
for (CoffeeProduct product : productList) {
if (product.getProductID() == productId) {
if ((product.getQty() - shipQty) < 0) {
System.out.println("Invalid quantity (current balance is less than required quantity). Try again!!!");
return false;
}
coffeeProduct = product;
state.getCaretaker().saveCoffeeProduct(product.saveMemento());
product.setQty(product.getQty() - shipQty);
System.out.println("Shipped " + shipQty +" packs of Premium Coffee Candy. Current quantity is "+ product.getQty()+".");
succe = false;
break;
}
}
if (succe) {
System.out.println("No such Coffee Product");
return false;
}
return true;
}
@Override
public void redo() {
state.getCaretaker().redo();
}
@Override
public void undo() {
state.getCaretaker().undo();
}
public String toString(){
return "Shipped " + shipQty + " " + coffeeProduct.getName() + " (" + coffeeProduct.getProductID()+ ")";
}
}
class UndoLastCommand extends Command {
private StateManager state;
public UndoLastCommand(StateManager state) {
this.state = state;
}
@Override
public boolean execute() {
if (state.getUndoList().isEmpty()) {
System.out.println("Nothing to undo");
} else {
Stack<UndoAllowCommand> UndoList = state.getUndoList();
UndoAllowCommand undoCmd = UndoList.pop();
state.getRedoList().push(undoCmd);
undoCmd.undo();
System.out.println("undo completed.");
}
return true;
}
}
class RedoLastCommand extends Command {
private StateManager state;
public RedoLastCommand(StateManager state) {
this.state = state;
}
@Override
public boolean execute() {
if (state.getRedoList().isEmpty()) {
System.out.println("Nothing to Redo");
} else {
Stack<UndoAllowCommand> redoList = state.getRedoList();
UndoAllowCommand redoCmd = redoList.pop();
state.getUndoList().push(redoCmd);
redoCmd.redo();
System.out.println("Redo completed.");
}
return true;
}
}
class ViewUndoRedoListCommand extends Command {
private StateManager state;
public ViewUndoRedoListCommand(StateManager state) {
this.state = state;
}
@Override
public boolean execute() {
System.out.println("Undo List:");
if (state.getUndoList().isEmpty()) {
System.out.println("Empty");
} else {
state.getUndoList().forEach(System.out::println);
}
System.out.println();
System.out.println("Redo List:");
if (state.getRedoList().isEmpty()) {
System.out.println("Empty");
} else {
state.getRedoList().forEach(System.out::println);
}
return true;
}
}
class ExitCommand extends Command {
@Override
public boolean execute() {
System.out.println("Thanks for using Coffee Inventory Management System!!");
System.exit(0);
return true;
}
}