diff options
Diffstat (limited to 'Week9/src/com/camilstaps/shop/Shell.java')
-rw-r--r-- | Week9/src/com/camilstaps/shop/Shell.java | 476 |
1 files changed, 0 insertions, 476 deletions
diff --git a/Week9/src/com/camilstaps/shop/Shell.java b/Week9/src/com/camilstaps/shop/Shell.java deleted file mode 100644 index 7939963..0000000 --- a/Week9/src/com/camilstaps/shop/Shell.java +++ /dev/null @@ -1,476 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Set; -import java.util.regex.Pattern; - -/** - * Executing commands and providing output, using a UserInteraction and acting - * on a Database. - * @author Camil Staps, s4498062 - */ -public class Shell { - - /** - * The Database to work with - */ - private final Database database; - /** - * The UserInteraction to use - */ - private final UserInteraction ui; - - /** - * The current User, if logged in - */ - private User user; - - public Shell(UserInteraction userInteraction) { - this.database = Database.getInstance(); - this.ui = userInteraction; - } - - /** - * Request commands, execute them, and show the results - */ - public void run() { - while (true) { - Command command = ui.getCommand(); - try { - Method method = getClass().getMethod("exec" + command.getCommand().substring(0,1).toUpperCase() + command.getCommand().substring(1)); - method.invoke(this); - - if (command.getCommand().equalsIgnoreCase("exit")) { - return; - } - } catch (NoSuchMethodException ex) { - ui.putStringln("Failure: no such command"); - } catch (InvocationTargetException ex) { - ui.putStringln("Failure: " + ex.getCause().toString()); - } catch (SecurityException | IllegalAccessException | IllegalArgumentException ex) { - ui.putStringln("Failure: unknown error"); - } - } - } - - /** - * Require that the visitor logs in - * @throws com.camilstaps.shop.Shell.LoginRequiredException if the visitor fails to login - * @throws ItemNotFoundException if the visitor tries to login with a non-existing User number - */ - public void requireLogin() throws LoginRequiredException, ItemNotFoundException { - if (user == null) { - ui.putStringln("You must login first."); - - try { - execLogin(); - } catch (InputRequiredException ex) { - } - - if (user == null) { - throw new LoginRequiredException(); - } - } - } - - /** - * Require that an administrator is logged in - * @throws com.camilstaps.shop.Shell.AdminRequiredException if the visitor fails to login, or is not an administrator - * @throws ItemNotFoundException if the visitor tries to login with a non-existing User number - */ - public void requireAdmin() throws AdminRequiredException, ItemNotFoundException { - if (user == null || !user.isAdmin()) { - ui.putStringln("You must login as an administrator first."); - - try { - execLogin(); - } catch (InputRequiredException ex) { - } - - if (user == null || !user.isAdmin()) { - throw new AdminRequiredException(); - } - } - } - - /** - * Command: add an article - * @throws DuplicateEntryException - * @throws InputRequiredException - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - */ - public void execAddArticle() throws DuplicateEntryException, InputRequiredException, LoginRequiredException, ItemNotFoundException { - requireLogin(); - - String name = ui.getRequiredString("Name: "); - Category category = ui.getCategory(); - float price = ui.getFloat("Price: "); - - Article a = new Article(user, name, category, price); - database.addItem(a); - } - - /** - * Command: set the article description - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - * @throws InputRequiredException - */ - public void execSetArticleDescription() throws LoginRequiredException, ItemNotFoundException, InputRequiredException { - requireLogin(); - - Article a; - if (user.isAdmin()) { - a = ui.getArticle(); - } else { - a = ui.getArticle(user); - } - - a.setDescription(ui.getRequiredString("Description: ")); - } - - /** - * Command: set the multimedia linked to an article - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - * @throws InputRequiredException - */ - public void execSetArticleMultimedia() throws LoginRequiredException, ItemNotFoundException, InputRequiredException { - requireLogin(); - - Article a; - if (user.isAdmin()) { - a = ui.getArticle(); - } else { - a = ui.getArticle(user); - } - - a.setMultimedia(new File(ui.getRequiredString("Multimedia: "))); - } - - /** - * Command: remove an article - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - * @throws InputRequiredException - */ - public void execRemoveArticle() throws LoginRequiredException, ItemNotFoundException, InputRequiredException { - requireLogin(); - - Article a; - if (user.isAdmin()) { - a = ui.getArticle(); - } else { - a = ui.getArticle(user); - } - - database.removeItem(a); - } - - /** - * Command: show a list of articles - */ - public void execListArticles() { - for (Article a : database.getArticles()) { - ui.putStringln(a.toString()); - } - } - - /** - * Command: search for an article - */ - public void execSearchArticle() { - String regex = ui.getString("Keywords: "); - for (Article a : database.searchArticle(Pattern.compile(regex))) { - ui.putStringln(a.toString()); - } - } - - /** - * Command: show detailed data about an article - * @throws InputRequiredException - * @throws ItemNotFoundException - */ - public void execShowArticle() throws InputRequiredException, ItemNotFoundException { - Article a = ui.getArticle(); - ui.putStringln(a.toString()); - if (a.getDescription() != null) { - ui.putStringln(a.getDescription()); - } - File multimedia = a.getMultimedia(); - if (multimedia != null) { - ui.putStringln("Multimedia: " + multimedia.getPath()); - } - if (user != null && user.isAdmin()) { - ui.putStringln("User: " + a.getOwner().toString(true)); - } - } - - /** - * Command: add a category - * @throws DuplicateEntryException - * @throws InputRequiredException - * @throws com.camilstaps.shop.Shell.AdminRequiredException - * @throws ItemNotFoundException - */ - public void execAddCategory() throws DuplicateEntryException, InputRequiredException, AdminRequiredException, ItemNotFoundException { - requireAdmin(); - - String name = ui.getRequiredString("Name: "); - database.addItem(new Category(name)); - } - - /** - * Command: list categories - */ - public void execListCategories() { - for (String c : database.getCategoryNames()) { - ui.putStringln(c); - } - } - - /** - * Command: list users - * Administrators see a more detailed list - */ - public void execListUsers() { - for (User u : database.getUsers()) { - ui.putStringln(u.toString(user != null && user.isAdmin())); - } - } - - /** - * Command: register a new user - * @throws DuplicateEntryException - * @throws InputRequiredException - */ - public void execRegister() throws DuplicateEntryException, InputRequiredException { - boolean addAsAdmin = false; - - if (database.getUsers().isEmpty()) { - addAsAdmin = true; - ui.putStringln("This is the first user and will therefore be added as administrator."); - } else if (user != null && user.isAdmin()) { - addAsAdmin = ui.getBoolean("Add user as administrator"); - } - - String nr = ui.getRequiredString("Number: "); - String email = ui.getRequiredString("Email: "); - - User u = new User(nr, email, addAsAdmin); - - String password = u.setRandomPassword(); - ui.putStringln("Password: " + password); - - database.addItem(u); - } - - /** - * Command: login - * @throws InputRequiredException - * @throws ItemNotFoundException - */ - public void execLogin() throws InputRequiredException, ItemNotFoundException { - if (user != null) { - ui.putStringln("You are already logged in."); - return; - } - - User u = ui.getUser(); - String pw = ui.getRequiredString("Password: "); - - if (!u.verify(pw)) { - ui.putStringln("Failed to login."); - return; - } - - if (u.isBlocked()) { - ui.putStringln("You are blocked."); - return; - } - - user = u; - } - - /** - * Command: logout - */ - public void execLogout() { - user = null; - } - - /** - * Command: add an article to the cart - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - * @throws InputRequiredException - */ - public void execAddToCart() throws LoginRequiredException, ItemNotFoundException, InputRequiredException { - requireLogin(); - - user.getCart().add(ui.getArticle()); - } - - /** - * Command: remove an article from the cart - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - */ - public void execRemoveFromCart() throws LoginRequiredException, ItemNotFoundException { - requireLogin(); - - user.getCart().remove(ui.getArticle(user.getCart().getArticles())); - } - - /** - * Command: list articles in the cart - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - */ - public void execListCart() throws LoginRequiredException, ItemNotFoundException { - requireLogin(); - - for (Article a : user.getCart().getArticles()) { - ui.putStringln(a.toString()); - } - - ui.putStringln("Total value: " + user.getCart().getTotalAmount()); - } - - /** - * Command: remove all articles from the cart - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - */ - public void execClearCart() throws LoginRequiredException, ItemNotFoundException { - requireLogin(); - - if (ui.getBoolean("Are you sure?")) user.getCart().reset(); - } - - /** - * Command: checkout (create an Order using the current Cart) - * @throws ItemNotFoundException - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws DuplicateEntryException - */ - public void execCheckout() throws ItemNotFoundException, LoginRequiredException, DuplicateEntryException { - requireLogin(); - - if (user.getCart().getArticles().isEmpty()) { - throw new ItemNotFoundException(); - } - - ui.putStringln("By checking out, you agree to pay the total amount."); - if (!ui.getBoolean("Do you agree?")) - return; - - Order order = new Order(user); - database.addItem(order); - - ui.putStringln("Your order has been added as " + order.toString()); - } - - /** - * Command: list orders - * @throws ItemNotFoundException - * @throws com.camilstaps.shop.Shell.LoginRequiredException - */ - public void execListOrders() throws ItemNotFoundException, LoginRequiredException { - requireLogin(); - - Set<Order> orders; - if (user.isAdmin()) { - orders = database.getOrders(); - } else { - orders = user.getOrders(); - } - for (Order o : orders) { - ui.putStringln(o.toString()); - } - } - - /** - * Command: show detailed information about an order - * @throws com.camilstaps.shop.Shell.LoginRequiredException - * @throws ItemNotFoundException - * @throws InputRequiredException - */ - public void execShowOrder() throws LoginRequiredException, ItemNotFoundException, InputRequiredException { - requireLogin(); - - Order o; - if (user.isAdmin()) { - o = ui.getOrder(); - } else { - o = ui.getOrder(user); - } - ui.putStringln(o.toString()); - for (Article a : o.getArticles()) { - ui.putStringln(" " + a.toString()); - } - ui.putStringln("Total amount: " + o.getTotalAmount()); - ui.putStringln("Paid: " + (o.isPaid() ? "yes" : "no")); - } - - /** - * Command: set the paid status of an Order to true - * @throws com.camilstaps.shop.Shell.AdminRequiredException - * @throws ItemNotFoundException - * @throws InputRequiredException - */ - public void execSetOrderPaid() throws AdminRequiredException, ItemNotFoundException, InputRequiredException { - requireAdmin(); - ui.getOrder().setPaid(true); - } - - /** - * Command: block a user - * @throws InputRequiredException - * @throws ItemNotFoundException - * @throws com.camilstaps.shop.Shell.AdminRequiredException - */ - public void execBlockUser() throws InputRequiredException, ItemNotFoundException, AdminRequiredException { - requireAdmin(); - ui.getUser().setBlocked(true); - } - - /** - * Command: unblock a user - * @throws InputRequiredException - * @throws ItemNotFoundException - * @throws com.camilstaps.shop.Shell.AdminRequiredException - */ - public void execUnblockUser() throws InputRequiredException, ItemNotFoundException, AdminRequiredException { - requireAdmin(); - ui.getUser().setBlocked(false); - } - - /** - * Command: save the database - */ - public void execExit() { - database.write(); - } - - /** - * This Exception is thrown when the visitor is required to login, but fails - */ - private class LoginRequiredException extends Exception { - } - - /** - * This Exception is thrown when the visitor is required to login as an administrator, but fails - */ - private class AdminRequiredException extends Exception { - } - -} |