Skip to content

Commit

Permalink
Merge pull request #156 from samuelory/Samuel-V2.3
Browse files Browse the repository at this point in the history
Adding Colour Selection to add and remove flowers
  • Loading branch information
samuelory committed Apr 9, 2024
2 parents fe1c5fd + a547efd commit cf19688
Show file tree
Hide file tree
Showing 12 changed files with 482 additions and 126 deletions.
57 changes: 39 additions & 18 deletions src/main/java/florizz/command/AddFlowerCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
public class AddFlowerCommand extends Command{
private static Logger logger = Logger.getLogger(AddFlowerCommand.class.getName());
private String flowerName;
private Flower.Colour colour;
private boolean hasColour = false;
private Integer quantity;
private String bouquetName;
private boolean enableUi;
Expand All @@ -22,7 +24,15 @@ public AddFlowerCommand(String flowerName, int quantity, String bouquetName, boo
this.bouquetName = bouquetName;
this.enableUi = enableUi;
}

public AddFlowerCommand(String flowerName, Flower.Colour colour,
int quantity, String bouquetName, boolean enableUi) {
this.flowerName = flowerName;
this.colour = colour;
this.quantity = quantity;
this.bouquetName = bouquetName;
this.enableUi = enableUi;
this.hasColour = true;
}
@Override
public boolean execute(ArrayList<Bouquet> bouquetList, Ui ui) throws FlorizzException {
logger.entering(AddFlowerCommand.class.getName(), "execute");
Expand All @@ -39,28 +49,39 @@ public boolean execute(ArrayList<Bouquet> bouquetList, Ui ui) throws FlorizzExce
throw new FlorizzException("No such bouquet is found.");
}

boolean doesFlowerExist = false;
Flower flowerToBeAdded = new Flower();
for (int i = 0; !doesFlowerExist && i < FlowerDictionary.size(); i++) {
if (FlowerDictionary.get(i).getFlowerName().toLowerCase().equals(flowerName)) {
//TODO should be extracted to its own function getFlower(String name, String colour)
flowerToBeAdded = FlowerDictionary.get(i);
doesFlowerExist = true;
}
}
ArrayList<Flower> matchingFlowers = FlowerDictionary.filterByName(flowerName);

if (!doesFlowerExist) {
throw new FlorizzException("Mentioned flower is not in our database." + System.lineSeparator() +
"Check available flowers: `flower` " + System.lineSeparator() +
"Add custom flowers: {{TO BE DONE}}");
}
if (hasColour){
ArrayList<Flower> matchedFlowerAndColour = FlowerDictionary.filterByColour(matchingFlowers, colour);
if (!matchedFlowerAndColour.isEmpty()){
bouquetToAddFlower.addFlower(matchedFlowerAndColour.get(0),this.quantity);
if (enableUi) {
ui.printAddFlowerSuccess(bouquetList, flowerName, quantity, bouquetName);
}
} else {
throw new FlorizzException("This flower does not exist in that colour. " +
"Type info <flower> to view all available colours for this flower");
}
} else if (matchingFlowers.size()==1){
bouquetToAddFlower.addFlower(matchingFlowers.get(0), this.quantity);
if (enableUi) {
ui.printAddFlowerSuccess(bouquetList, flowerName, quantity, bouquetName);
}
} else {
Flower flowerToAdd = ui.chooseColour(matchingFlowers, flowerName);
if (!flowerToAdd.getFlowerName().isBlank()){
bouquetToAddFlower.addFlower(flowerToAdd, this.quantity);
if (enableUi) {
ui.printAddFlowerSuccess(bouquetList, flowerName, quantity, bouquetName);
}
} else {
ui.printCancelCommand();
}

bouquetToAddFlower.addFlower(flowerToBeAdded, this.quantity);
if (enableUi) {
ui.printAddFlowerSuccess(bouquetList, flowerName, quantity, bouquetName);
}

logger.exiting(AddFlowerCommand.class.getName(), "execute");
return true;
}

}
49 changes: 33 additions & 16 deletions src/main/java/florizz/command/RemoveFlowerCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,22 @@ public class RemoveFlowerCommand extends Command {
private String flowerName;
private Integer quantity;
private String bouquetName;
private Flower.Colour colour;
private boolean hasColour = false;

public RemoveFlowerCommand(String flowerName, int quantity, String bouquetName) {
this.flowerName = flowerName;
this.quantity = quantity;
this.bouquetName = bouquetName;
}

public RemoveFlowerCommand(String flowerName, Flower.Colour colour, int quantity, String bouquetName) {
this.flowerName = flowerName;
this.quantity = quantity;
this.bouquetName = bouquetName;
this.colour = colour;
hasColour = true;
}
@Override
public boolean execute(ArrayList<Bouquet> bouquetList, Ui ui) throws FlorizzException {
logger.entering(RemoveFlowerCommand.class.getName(), "execute");
Expand All @@ -39,28 +48,36 @@ public boolean execute(ArrayList<Bouquet> bouquetList, Ui ui) throws FlorizzExce
"Create a bouquet by using 'new <bouquetName>`");
}

boolean doesFlowerExist = false;
Flower flowerToBeAdded = new Flower();
for (int i = 0; !doesFlowerExist && i < FlowerDictionary.size(); i++) {
if (FlowerDictionary.get(i).getFlowerName().toLowerCase().equals(flowerName)) {
flowerToBeAdded = FlowerDictionary.get(i);
doesFlowerExist = true;
}
}
ArrayList<Flower> matchingFlowers = FlowerDictionary.filterByName(
bouquetToRemoveFlower.getFlowerList(), flowerName);

if (!doesFlowerExist) {
throw new FlorizzException("Mentioned flower is not in our database." + System.lineSeparator() +
"Check available flowers: `flower` " + System.lineSeparator() +
"Add custom flowers: {{TO BE DONE}}");
}
if (hasColour){
ArrayList<Flower> matchedFlowerAndColour = FlowerDictionary.filterByColour(matchingFlowers, colour);
if (!matchedFlowerAndColour.isEmpty()){
bouquetToRemoveFlower.removeFlower(matchedFlowerAndColour.get(0),this.quantity);
ui.printRemoveFlowerSuccess(bouquetList, flowerName, quantity, bouquetName);
} else {
throw new FlorizzException("This bouquet does not contain that colour" +
"Type mybouquets to view all your bouquets.");
}
} else if (matchingFlowers.size()==1){
bouquetToRemoveFlower.removeFlower(matchingFlowers.get(0), this.quantity);
ui.printAddFlowerSuccess(bouquetList, flowerName, quantity, bouquetName);

if (bouquetToRemoveFlower.removeFlower(flowerToBeAdded, this.quantity)) {
ui.printRemoveFlowerSuccess(bouquetList, flowerName, quantity, bouquetName);
} else {
ui.printRemoveFlowerUnsuccessful(bouquetList, flowerName, bouquetName);
Flower flowerToRemove = ui.chooseColour(matchingFlowers, flowerName);
if (!flowerToRemove.getFlowerName().isBlank()){
bouquetToRemoveFlower.removeFlower(flowerToRemove, this.quantity);
ui.printRemoveFlowerSuccess(bouquetList, flowerName, quantity, bouquetName);
} else {
ui.printCancelCommand();
}

}

logger.exiting(RemoveFlowerCommand.class.getName(), "execute");
return true;
}


}
15 changes: 14 additions & 1 deletion src/main/java/florizz/core/FlowerDictionary.java
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,20 @@ public static ArrayList<Flower> filterByOccasion(Flower.Occasion occasion) {
public static ArrayList<Flower> filterByName(String name) throws FlorizzException {
ArrayList<Flower> filteredFlowers = new ArrayList<>();
for (Flower flower : flowerDict) {
if (flower.getFlowerName().contains(name)) {
if (flower.getFlowerName().toLowerCase().contains(name.toLowerCase())) {
filteredFlowers.add(flower);
}
}
if (filteredFlowers.isEmpty()) {
throw new FlorizzException("Flower name is unidentified.");
}
return filteredFlowers;
}

public static ArrayList<Flower> filterByName(ArrayList<Flower> listOfFlowers, String name) throws FlorizzException {
ArrayList<Flower> filteredFlowers = new ArrayList<>();
for (Flower flower : listOfFlowers) {
if (flower.getFlowerName().toLowerCase().contains(name.toLowerCase())) {
filteredFlowers.add(flower);
}
}
Expand Down
61 changes: 49 additions & 12 deletions src/main/java/florizz/core/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import florizz.command.NextCommand;
import florizz.command.RecommendCommand;
import florizz.objects.Bouquet;
import florizz.objects.Flower;

import java.util.logging.Level;
import java.util.logging.Logger;
Expand All @@ -28,13 +29,17 @@
public class Parser {
private static Logger logger = Logger.getLogger(Florizz.class.getName());
// prefixes to parse input
private static final String COLOUR = "/c";
private static final String QUANTITY = "/q";
private static final String ADD_FLOWER_PREFIX = "/to";
private static final String REMOVE_FLOWER_PREFIX = "/from";

// regex
private static final String ADD_FLOWER_REGEX = "(.+)/q(\\s*)(\\d+)(\\s*)/to(.+)";

private static final String ADD_FLOWER_AND_COLOUR_REGEX = "(.+)/c(\\s*)(.+)(\\s*)/q(\\s*)(\\d+)(\\s*)/to(.+)";
private static final String REMOVE_FLOWER_REGEX = "(.+)/q(\\s*)(\\d+)(\\s*)/from(.+)";
private static final String REMOVE_FLOWER_AND_COLOUR_REGEX = "(.+)/c(\\s*)(.+)(\\s*)/q(\\s*)(\\d+)(\\s*)/from(.+)";
private static final String PARSE_OCCASION_REGEX = "^\\s*[A-Za-z]+(?:\\s+[A-Za-z]+)?\\s*$";
private static final String PARSE_COLOUR_REGEX = "^\\s*[A-Za-z]+(?:\\s+[A-Za-z]+)?\\s*$";
private static final String SAVE_BOUQUET_REGEX = "^\\s*(yes|no)\\s*$";
Expand Down Expand Up @@ -110,39 +115,42 @@ public static Command parse (String input, boolean enableUi) throws FlorizzExcep
*/
public static String[] commandHandler(String input) throws FlorizzException {
String[] outputs = new String[2];
String trimmedInput = input.trim();
int firstWhitespace = trimmedInput.indexOf(" ");
int firstWhitespace = input.indexOf(" ");

if (firstWhitespace != -1) {
outputs[0] = FuzzyLogic.detectItem(trimmedInput.substring(0,firstWhitespace).toLowerCase());
outputs[0] = FuzzyLogic.detectItem(input.substring(0,firstWhitespace).toLowerCase());
switch (outputs[0]) {
case ("save"):
case ("delete"): // Fallthrough
case ("new"):
outputs[1] = trimmedInput.substring(firstWhitespace).trim();
outputs[1] = input.substring(firstWhitespace).trim();
break;
case ("remove"): // Fallthrough
case ("add"):
String[] arguments = new String[2];
String trimmedArgument = trimmedInput.substring(firstWhitespace).trim();
String trimmedArgument = input.substring(firstWhitespace).trim();
int secondWhitespace = trimmedArgument.indexOf(" ");
if (secondWhitespace < 0 && outputs[0].equals("remove")){
throw new FlorizzException("Incorrect usage of remove." +
" Correct format: remove <flowerName> /q <quantity> /from <bouquetName>");
" Correct format: remove <flowerName> " +
"/c <flowerColour> (optional) " +
"/q <quantity> /from <bouquetName>");
} else if (secondWhitespace < 0 && outputs[0].equals("add")) {
throw new FlorizzException("Incorrect usage of add." +
" Correct format: add <flowerName> /q <quantity> /to <bouquetName>");
" Correct format: add <flowerName> " +
"/c <flowerColour> (optional) " +
"/q <quantity> /to <bouquetName>");
}
arguments[0] = FuzzyLogic.detectItem(trimmedArgument.substring(0,secondWhitespace));
arguments[1] = trimmedArgument.substring(secondWhitespace).trim();
outputs[1] = arguments[0] + " " + arguments[1];
break;
default:
outputs[1] = FuzzyLogic.detectItem(trimmedInput.substring(firstWhitespace).trim());
outputs[1] = FuzzyLogic.detectItem(input.substring(firstWhitespace).trim());
break;
}
} else {
outputs[0] = FuzzyLogic.detectItem(trimmedInput.toLowerCase());
outputs[0] = FuzzyLogic.detectItem(input.toLowerCase());
}

if (firstWhitespace == -1 && (outputs[0].equals("save"))) {
Expand Down Expand Up @@ -210,6 +218,7 @@ private static FlowerCommand handleFlowerCommand(String[] input) {
* @throws FlorizzException If the input does not match the required format.
*/
private static AddFlowerCommand handleAddFlower(String argument, boolean enableUi) throws FlorizzException {
boolean includeColour = false;
if (argument == null) {
throw new FlorizzException("No argument detected! " +
"Please use the correct format of 'add <flowerName> /q <quantity> /to <bouquetName>");
Expand All @@ -220,6 +229,9 @@ private static AddFlowerCommand handleAddFlower(String argument, boolean enableU
"Please use the correct format of 'add <flowerName> /q <quantity> /to <bouquetName>");
}

if (argument.matches(ADD_FLOWER_AND_COLOUR_REGEX)){
includeColour = true;
}
// [WARNING] might need to check for extra slash k

int prefixIndex = argument.indexOf(ADD_FLOWER_PREFIX);
Expand All @@ -230,7 +242,18 @@ private static AddFlowerCommand handleAddFlower(String argument, boolean enableU
// [WARNING] might need to check if it's a valid integer
int quantity = Integer.parseInt(quantityString);
String bouquetName = removePrefix(argument.substring(prefixIndex), ADD_FLOWER_PREFIX).trim();

if (includeColour){
int colourIndex = argument.indexOf(COLOUR);
try{
flowerName = argument.substring(0,colourIndex).trim();
String colourString = removePrefix(argument.substring(colourIndex, quantityIndex), COLOUR).trim();
Flower.Colour colourToAdd = Flower.stringToColour(colourString);
return new AddFlowerCommand(flowerName, colourToAdd, quantity, bouquetName, enableUi);
} catch( IllegalArgumentException error){
throw new FlorizzException("Tried to add a non recognised colour" +
"Type 'flowers' to view all the currently available flowers and their colours.");
}
}
return new AddFlowerCommand(flowerName, quantity, bouquetName, enableUi);
}

Expand All @@ -241,6 +264,7 @@ private static AddFlowerCommand handleAddFlower(String argument, boolean enableU
* @throws FlorizzException If the input does not match the required format.
*/
private static RemoveFlowerCommand handleRemoveFlower(String argument) throws FlorizzException {
boolean includeColour = false;
if (argument == null) {
throw new FlorizzException("No argument detected! " +
"Please use the correct format of 'remove <flowerName> /q <quantity> /from <bouquetName>");
Expand All @@ -250,7 +274,9 @@ private static RemoveFlowerCommand handleRemoveFlower(String argument) throws Fl
throw new FlorizzException("Incorrect format detected! " +
"Please use the correct format of 'remove <flowerName> /q <quantity> /from <bouquetName>");
}

if (argument.matches(REMOVE_FLOWER_AND_COLOUR_REGEX)){
includeColour = true;
}
// [WARNING] might need to check for extra slash k

int prefixIndex = argument.indexOf(REMOVE_FLOWER_PREFIX);
Expand All @@ -261,7 +287,18 @@ private static RemoveFlowerCommand handleRemoveFlower(String argument) throws Fl
// [WARNING] might need to check if it's a valid integer
int quantity = Integer.parseInt(quantityString);
String bouquetName = removePrefix(argument.substring(prefixIndex), REMOVE_FLOWER_PREFIX).trim();

if (includeColour){
int colourIndex = argument.indexOf(COLOUR);
try{
flowerName = argument.substring(0,colourIndex).trim();
String colourString = removePrefix(argument.substring(colourIndex, quantityIndex), COLOUR).trim();
Flower.Colour colourToAdd = Flower.stringToColour(colourString);
return new RemoveFlowerCommand(flowerName, colourToAdd, quantity, bouquetName);
} catch(IllegalArgumentException error){
throw new FlorizzException("Tried to add a non recognised colour" +
"Type 'flowers' to view all the currently available flowers and their colours.");
}
}
return new RemoveFlowerCommand(flowerName, quantity, bouquetName);
}

Expand Down
Loading

0 comments on commit cf19688

Please sign in to comment.