diff options
| author | Camil Staps | 2015-04-18 13:44:44 +0200 | 
|---|---|---|
| committer | Camil Staps | 2015-04-18 13:44:44 +0200 | 
| commit | 6a44b074f0169a1b0f9e92347af929c5e471746e (patch) | |
| tree | ae5663fe7c69881bf4ecfedbef99c2505f8ec964 /Week9/src/com/camilstaps/shop | |
| parent | Added copyright to docs (diff) | |
Reorganised projects
Diffstat (limited to 'Week9/src/com/camilstaps/shop')
| -rw-r--r-- | Week9/src/com/camilstaps/shop/Article.java | 89 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/CLIInteraction.java | 94 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/Cart.java | 67 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/Category.java | 28 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/Command.java | 25 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/Database.java | 393 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/DatabaseItem.java | 15 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/DuplicateEntryException.java | 18 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/InputRequiredException.java | 13 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/ItemNotFoundException.java | 14 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/Order.java | 67 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/Shell.java | 476 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/Shop.java | 23 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/User.java | 143 | ||||
| -rw-r--r-- | Week9/src/com/camilstaps/shop/UserInteraction.java | 198 | 
15 files changed, 0 insertions, 1663 deletions
| diff --git a/Week9/src/com/camilstaps/shop/Article.java b/Week9/src/com/camilstaps/shop/Article.java deleted file mode 100644 index d22a323..0000000 --- a/Week9/src/com/camilstaps/shop/Article.java +++ /dev/null @@ -1,89 +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; - -/** - * An Article in the webshop - * @author Camil Staps, s4498062 - */ -public class Article extends DatabaseItem { - -    /** -     * Basic data about the article -     */ -    private final String name; -    private String description; -    private final Category category; -    private File multimedia; -    private final float price; -     -    /** -     * The owner who added the article -     */ -    private final User owner; - -    /** -     * Straightforwardly creating a new article -     * @param user -     * @param name -     * @param category -     * @param price -     */ -    public Article(User user, String name, Category category, float price) { -        this.owner = user; -        this.name = name; -        this.category = category; -        this.price = price; -    } -     -    public User getOwner() { -        return owner; -    } -     -    public String getName() { -        return name; -    } -     -    public String getDescription() { -        return description; -    } -     -    public Category getCategory() { -        return category; -    } -     -    public File getMultimedia() { -        return multimedia; -    } -     -    public float getPrice() { -        return price; -    } - -    /** -     * Set a new description -     * @param description -     */ -    public void setDescription(String description) { -        this.description = description; -    } - -    /** -     * Set multimedia -     * @param multimedia -     */ -    public void setMultimedia(File multimedia) { -        this.multimedia = multimedia; -    } -     -    @Override -    public String toString() { -        return name + " (" + category.getName() + "): " + Float.toString(price); -    } - -}
\ No newline at end of file diff --git a/Week9/src/com/camilstaps/shop/CLIInteraction.java b/Week9/src/com/camilstaps/shop/CLIInteraction.java deleted file mode 100644 index cbf59ab..0000000 --- a/Week9/src/com/camilstaps/shop/CLIInteraction.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -import java.io.InputStream; -import java.io.PrintStream; -import java.util.InputMismatchException; -import java.util.Scanner; - -/** - * Command Line Interface Interaction - * @author Camil Staps, s4498062 - */ -public class CLIInteraction extends UserInteraction { -     -    private final Scanner in; -    private final PrintStream out; -     -    /** -     * Default is stdin and stdout -     */ -    public CLIInteraction() { -        this(System.in, System.out); -    } -     -    /** -     * CLI interaction with custom input and outputstream -     * @param is -     * @param ps  -     */ -    public CLIInteraction(InputStream is, PrintStream ps) { -        in = new Scanner(is); -        out = ps; -    } - -    @Override -    String getString() { -        return in.nextLine(); -    } - -    @Override -    public int getChoice(String question, String[] options) { -        out.println(question); -        int i = 1; -        for (String option : options) { -            out.println("  " + (i++) + " : " + option); -        } -        int selection = 0; -        boolean read = false; -        do { -            if (read) { -                out.println("Invalid option. Try again:"); -            } -            try { -                selection = in.nextInt(); -            } catch (InputMismatchException ex) { -            } -            in.nextLine(); -            read = true; -        } while (selection < 1 || selection > options.length); -        return selection - 1; -    } - -    @Override -    void putString(String string) { -        out.print(string); -    } - -    @Override -    Command getCommand() { -        putString("► "); -        return new Command(getString()); -    } - -    @Override -    float getFloat() { -        float result = in.nextFloat(); -        in.nextLine(); -        return result; -    } - -    @Override -    boolean getBoolean() { -        putString(" (yes/no) "); -        String result; -        do { -            result = in.nextLine(); -        } while (!result.equalsIgnoreCase("yes") && !result.equalsIgnoreCase("no")); -        return result.equalsIgnoreCase("yes"); -    } -}
\ No newline at end of file diff --git a/Week9/src/com/camilstaps/shop/Cart.java b/Week9/src/com/camilstaps/shop/Cart.java deleted file mode 100644 index 74f6ccd..0000000 --- a/Week9/src/com/camilstaps/shop/Cart.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; - -/** - * A Cart holds the articles a User is planning to buy. - * @author Camil Staps, s4498062 - */ -public class Cart implements Serializable { -     -    private final Set<Article> articles = new HashSet<>(); -     -    public Set<Article> getArticles() { -        return articles; -    } - -    /** -     * Get the total price of all articles -     * @return  -     */ -    public float getTotalAmount() { -        float result = 0; -        for (Article a : articles) { -            result += a.getPrice(); -        } -        return result; -    } - -    /** -     * Add a new article -     * @param article -     */ -    public void add(Article article) { -        Database.getInstance().removeItem(article); -        articles.add(article); -    } - -    /** -     * Remove an article (and put it back in the database) -     * @param article -     */ -    public void remove(Article article) { -        articles.remove(article); -        try { -            Database.getInstance().addItem(article); -        } catch (DuplicateEntryException ex) { -        } -    } -     -    /** -     * Remove all articles in the manner of remove() -     * @see self#remove -     */ -    public void reset() { -        for (Article a : articles) { -            remove(a); -        } -    } - -}
\ No newline at end of file diff --git a/Week9/src/com/camilstaps/shop/Category.java b/Week9/src/com/camilstaps/shop/Category.java deleted file mode 100644 index 05c247c..0000000 --- a/Week9/src/com/camilstaps/shop/Category.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -/** - * A Category for Articles - * @author Camil Staps, s4498062 - */ -public class Category extends DatabaseItem { - -    private final String name; - -    /** -     * Create a new Category -     * @param name -     */ -    public Category(String name) { -        this.name = name; -    } -     -    public String getName() { -        return name; -    } - -}
\ No newline at end of file diff --git a/Week9/src/com/camilstaps/shop/Command.java b/Week9/src/com/camilstaps/shop/Command.java deleted file mode 100644 index b4694c0..0000000 --- a/Week9/src/com/camilstaps/shop/Command.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -/** - * A Command is something that can be executed by a normal visitor, a User or an Administrator. - * The current version only holds one string as command, but later versions could include arguments. - * @author Camil Staps, s4498062 - */ -public class Command { -     -    private final String command; -     -    public Command(String command) { -        this.command = command; -    } -     -    public String getCommand() { -        return command; -    } -     -} diff --git a/Week9/src/com/camilstaps/shop/Database.java b/Week9/src/com/camilstaps/shop/Database.java deleted file mode 100644 index 8344bca..0000000 --- a/Week9/src/com/camilstaps/shop/Database.java +++ /dev/null @@ -1,393 +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.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Pattern; - -/** - * The Shop database - * @author Camil Staps, s4498062 - */ -public class Database { -     -    /** -     * This is a singleton -     */ -    private static Database instance; - -    /** -     * Keep the database in working memory during runtime -     */ -    private Set<User> users; -    private Set<Article> articles; -    private Set<Category> categories; -    private Set<Order> orders; -     -    /** -     * Files to store the database -     * Considering backups, it's nicer to have different objects stored in  -     * different files, so that if the Orders file breaks, we still have the -     * Users, etc. -     */ -    private final File FILE_DB = new File("./db"); -    private final File FILE_USERS = new File("./db/users.db"); -    private final File FILE_ARTICLES = new File("./db/articles.db"); -    private final File FILE_CATEGORIES = new File("./db/categories.db"); -    private final File FILE_ORDERS = new File("./db/orders.db"); -     -    /** -     * Don't use this constructor. This is a singleton: use getInstance() instead. -     * @see self#getInstance() -     */ -    public Database() { -        if (!FILE_DB.exists()) -            FILE_DB.mkdir(); -         -        readUsers(); -        readArticles(); -        readCategories(); -        readOrders(); -    } - -    /** -     * Get an instance of the database. This is a singleton. -     * @return the database -     */ -    public static Database getInstance() { -        if (instance == null) { -            instance = new Database(); -        } -        return instance; -    } - -    /** -     * Add an item to the database -     * @param item the item -     * @throws com.camilstaps.shop.DuplicateEntryException -     * @throws ClassCastException if the item to remove is not a DatabaseItem -     */ -    public void addItem(DatabaseItem item) throws DuplicateEntryException { -        if (item instanceof User) { -            if (isUserExists(((User) item).getNr())) { -                throw new DuplicateEntryException(); -            } -            users.add((User) item); -        } else if (item instanceof Article) { -            if (isArticleExists(((Article) item).getName())) { -                throw new DuplicateEntryException(); -            } -            articles.add((Article) item); -        } else if (item instanceof Category) { -            if (isCategoryExists(((Category) item).getName())) { -                throw new DuplicateEntryException(); -            } -            categories.add((Category) item); -        } else if (item instanceof Order) { -            orders.add((Order) item); -        } else { -            throw new ClassCastException(); -        } -    } - -    /** -     * Remove an item from the database -     * @param item the item to remove -     * @throws ClassCastException if the item to remove is not a DatabaseItem -     */ -    public void removeItem(DatabaseItem item) { -        if (item instanceof User) { -            users.remove((User) item); -        } else if (item instanceof Article) { -            articles.remove((Article) item); -        } else if (item instanceof Category) { -            categories.remove((Category) item); -        } else if (item instanceof Order) { -            orders.remove((Order) item); -        } else { -            throw new ClassCastException(); -        } -    } -     -    /** -     * Save the database to the filesystem. -     * @return true on success, false on failure -     */ -    public boolean write() { -        return writeUsers() && writeArticles() && writeCategories() && writeOrders(); -    } -     -    /** -     * Check if there exists a user with a certain U/S-number -     * @param nr -     * @return  -     */ -    public boolean isUserExists(String nr) { -        for (User user : users) { -            if (user.getNr().equals(nr)) { -                return true; -            } -        } -        return false; -    } -     -    /** -     * Check if an article with a name exists -     * @param name -     * @return  -     */ -    public boolean isArticleExists(String name) { -        for (Article article : articles) { -            if (article.getName().equals(name)) { -                return true; -            } -        } -        return false; -    } -     -    /** -     * Check if a category with a name exists -     * @param name -     * @return  -     */ -    public boolean isCategoryExists(String name) { -        for (Category category : categories) { -            if (category.getName().equals(name)) { -                return true; -            } -        } -        return false; -    } -     -    /** -     * Get the set of users -     * @return  -     */ -    public Set<User> getUsers() { -        return users; -    } -     -    /** -     * Get the set of articles -     * @return  -     */ -    public Set<Article> getArticles() { -        return articles; -    } -     -    /** -     * Get the set of categories -     * @return  -     */ -    public Set<Category> getCategories() { -        return categories; -    } -     -    /** -     * Get an array of the names of the categories -     * @return  -     */ -    public String[] getCategoryNames() { -        String[] categoryNames = new String[categories.size()]; -        int i = 0; -        for (Category c : categories) { -            categoryNames[i++] = c.getName(); -        } -        return categoryNames; -    } -     -    /** -     * Get the set of orders -     * @return  -     */ -    public Set<Order> getOrders() { -        return orders; -    } -     -    /** -     * Get the set of articles of which the name or description matches a regular expression -     * @param p the regular expression -     * @return  -     */ -    public Set<Article> searchArticle(Pattern p) { -        Set<Article> result = new HashSet<>(); -        for (Article a : articles) { -            if (p.matcher(a.getName()).find() || p.matcher(a.getDescription()).find()) { -                result.add(a); -            } -        } -        return result; -    } -     -    /** -     * Get a user by his number -     * @param number -     * @return  -     * @throws com.camilstaps.shop.ItemNotFoundException  -     */ -    public User getUser(String number) throws ItemNotFoundException { -        for (User u : users) { -            if (u.getNr().equals(number)) { -                return u; -            } -        } -        throw new ItemNotFoundException(); -    } -     -    /** -     * Get an article by its name -     * @param name -     * @return -     * @throws ItemNotFoundException  -     */ -    public Article getArticle(String name) throws ItemNotFoundException { -        for (Article a : articles) { -            if (a.getName().equals(name)) { -                return a; -            } -        } -        throw new ItemNotFoundException(); -    } -     -    /** -     * Get a category by a name -     * @param name -     * @return  -     */ -    public Category getCategory(String name) throws ItemNotFoundException { -        for (Category c : categories) { -            if (c.getName().equals(name)) { -                return c; -            } -        } -        throw new ItemNotFoundException(); -    } -     -    /** -     * Read the users from the database into RAM -     */ -    private void readUsers() { -        users = new HashSet<>(); -        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(FILE_USERS))) { -            users = (Set) in.readObject(); -            in.close(); -        } catch (FileNotFoundException ex) { -        } catch (IOException | ClassNotFoundException ex) { -        } -    } -     -    /** -     * Read the articles from the database into RAM -     */ -    private void readArticles() { -        articles = new HashSet<>(); -        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(FILE_ARTICLES))) { -            articles = (Set) in.readObject(); -            in.close(); -        } catch (FileNotFoundException ex) { -        } catch (IOException | ClassNotFoundException ex) { -        } -    } -     -    /** -     * Read the categories from the database into RAM -     */ -    private void readCategories() { -        categories = new HashSet<>(); -        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(FILE_CATEGORIES))) { -            categories = (Set) in.readObject(); -            in.close(); -        } catch (FileNotFoundException ex) { -        } catch (IOException | ClassNotFoundException ex) { -        } -    } -     -    /** -     * Read the orders from the database into RAM -     */ -    private void readOrders() { -        orders = new HashSet<>(); -        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(FILE_ORDERS))) { -            orders = (Set) in.readObject(); -            in.close(); -        } catch (FileNotFoundException ex) { -        } catch (IOException | ClassNotFoundException ex) { -        } -    } -     -    /** -     * Write the users from RAM to the database  -     */ -    private boolean writeUsers() { -        System.err.println("Saving users..."); -         -        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(FILE_USERS))) { -            out.writeObject(users); -            out.close(); -            return true; -        } catch (IOException ex) { -            ex.printStackTrace(); -        } -        return false; -    } -     -    /** -     * Write the articles from RAM to the database  -     */ -    private boolean writeArticles() { -        System.err.println("Saving articles..."); -         -        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(FILE_ARTICLES))) { -            out.writeObject(articles); -            out.close(); -            return true; -        } catch (IOException ex) { -            ex.printStackTrace(); -        } -        return false; -    } -     -    /** -     * Write the categories from RAM to the database  -     */ -    private boolean writeCategories() { -        System.err.println("Saving categories..."); -         -        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(FILE_CATEGORIES))) { -            out.writeObject(categories); -            out.close(); -            return true; -        } catch (IOException ex) { -            ex.printStackTrace(); -        } -        return false; -    } -     -    /** -     * Write the orders from RAM to the database  -     */ -    private boolean writeOrders() { -        System.err.println("Saving orders..."); -         -        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(FILE_ORDERS))) { -            out.writeObject(orders); -            out.close(); -            return true; -        } catch (IOException ex) { -            ex.printStackTrace(); -        } -        return false; -    } - -}
\ No newline at end of file diff --git a/Week9/src/com/camilstaps/shop/DatabaseItem.java b/Week9/src/com/camilstaps/shop/DatabaseItem.java deleted file mode 100644 index 0cbe661..0000000 --- a/Week9/src/com/camilstaps/shop/DatabaseItem.java +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -import java.io.Serializable; - -/** - * DatabaseItem is a general class for anything that is stored in the Database - * @author Camil Staps, s4498062 - */ -public class DatabaseItem implements Serializable { -}
\ No newline at end of file diff --git a/Week9/src/com/camilstaps/shop/DuplicateEntryException.java b/Week9/src/com/camilstaps/shop/DuplicateEntryException.java deleted file mode 100644 index a91d7c7..0000000 --- a/Week9/src/com/camilstaps/shop/DuplicateEntryException.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -/** - * This Exception is thrown when an attempt is made to add a DatabaseItem to the - * Database which gives a uniqueness conflict, such as: - *  * An article with the same name exists - *  * A category with the same name exists - *  * A user with the same number exists - *  - * @author Camil Staps, s4498062 - */ -public class DuplicateEntryException extends Exception { -} diff --git a/Week9/src/com/camilstaps/shop/InputRequiredException.java b/Week9/src/com/camilstaps/shop/InputRequiredException.java deleted file mode 100644 index ca0110d..0000000 --- a/Week9/src/com/camilstaps/shop/InputRequiredException.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -/** - * This Exception is thrown when required input was omitted by the user. - * @author Camil Staps, s4498062 - */ -public class InputRequiredException extends Exception { -} diff --git a/Week9/src/com/camilstaps/shop/ItemNotFoundException.java b/Week9/src/com/camilstaps/shop/ItemNotFoundException.java deleted file mode 100644 index 5122d79..0000000 --- a/Week9/src/com/camilstaps/shop/ItemNotFoundException.java +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -/** - * This error is thrown when an attempt is made to instantiate an object with a  - * non-existing name, number, etc. - * @author Camil Staps, s4498062 - */ -public class ItemNotFoundException extends Exception { -} diff --git a/Week9/src/com/camilstaps/shop/Order.java b/Week9/src/com/camilstaps/shop/Order.java deleted file mode 100644 index 2b0c5a7..0000000 --- a/Week9/src/com/camilstaps/shop/Order.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -import java.util.HashSet; -import java.util.Set; - -/** - * An order is a set of articles, purchased by a user - * @author Camil Staps, s4498062 - */ -public class Order extends DatabaseItem { -     -    private final Set<Article> articles; -    private final User user; -    private boolean paid = false; -     -    /** -     * This constructor takes the articles from the Cart of the User, and clears  -     * that Cart afterwards. -     * @param user  -     */ -    public Order(User user) { -        this.user = user; -        articles = new HashSet<>(); -        for (Article a : user.getCart().getArticles()) { -            articles.add(a); -        } -        user.getCart().getArticles().clear(); -    } -     -    public User getUser() { -        return user; -    } -     -    public Set<Article> getArticles() { -        return articles; -    } -     -    public void setPaid(boolean set) { -        paid = set; -    } -     -    /** -     * See whether payment has been received for this article already -     * @return  -     */ -    public boolean isPaid() { -        return paid; -    } -     -    /** -     * Get the total price of all articles -     * @return  -     */ -    public float getTotalAmount() { -        float result = 0; -        for (Article a : articles) { -            result += a.getPrice(); -        } -        return result; -    } -     -} 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 { -    } -     -} diff --git a/Week9/src/com/camilstaps/shop/Shop.java b/Week9/src/com/camilstaps/shop/Shop.java deleted file mode 100644 index cab828a..0000000 --- a/Week9/src/com/camilstaps/shop/Shop.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -/** - * The webshop - * @author Camil Staps, s4498062 - */ -public class Shop { -     -    /** -     * Create a shell and run -     * @param args  -     */ -    public static void main(String[] args) { -        Shell sh = new Shell(new CLIInteraction()); -        sh.run(); -    } -     -} diff --git a/Week9/src/com/camilstaps/shop/User.java b/Week9/src/com/camilstaps/shop/User.java deleted file mode 100644 index 12cfd4d..0000000 --- a/Week9/src/com/camilstaps/shop/User.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -import java.util.HashSet; -import java.util.Random; -import java.util.Set; - -/** - * A User is a person with a U/S-number, email and password. - * He may be blocked / be an admin, and has a Cart. - * @author Camil Staps, s4498062 - */ -public class User extends DatabaseItem { - -    private final String nr; -    private final String email; -    private String hash; -    private final boolean isAdmin; -    private final Cart cart = new Cart(); -    private boolean isBlocked = false; - -    public User (String nr, String email) { -        this.nr = nr; -        this.email = email; -        this.isAdmin = false; -    } -     -    public User (String nr, String email, boolean isAdmin) { -        this.nr = nr; -        this.email = email; -        this.isAdmin = isAdmin; -    } -     -    public String getNr() { -        return nr; -    } -     -    public String getEmail() { -        return email; -    } -     -    public boolean isAdmin() { -        return isAdmin; -    } -     -    public Cart getCart() { -        return cart; -    } -     -    public void setBlocked(boolean set) { -        isBlocked = set; -    } -     -    public boolean isBlocked() { -        return isBlocked; -    } -     -    public Set<Article> getArticles() { -        Set<Article> articles = Database.getInstance().getArticles(); -        Set<Article> result = new HashSet<>(); -        for (Article a : articles) { -            if (a.getOwner().getNr().equals(nr)) { -                result.add(a); -            } -        } -        return result; -    } -     -    public Set<Order> getOrders() { -        Set<Order> orders = Database.getInstance().getOrders(); -        Set<Order> result = new HashSet<>(); -        for (Order o : orders) { -            if (o.getUser().getNr().equals(nr)) { -                result.add(o); -            } -        } -        return result; -    } -     -    /** -     * Set a random new password for the user -     * @return the new password -     */ -    public String setRandomPassword() { -        String pw = generatePassword(); -        hash = hash(pw); -        return pw; -    } - -    /** -     * Hash a password. Currently, this is just the identity function. -     * @param password -     * @return  -     */ -    public static String hash(String password) { -        return password; -    } -     -    /** -     * Generate a random password -     * @return  -     */ -    private static String generatePassword() { -        // Only characters that cannot easily be confused -        final String drawFrom = "123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; -        final Random r = new Random(); -         -        StringBuilder sb = new StringBuilder(); -        for (int i = 0; i < 12; i++) { -            sb.append(drawFrom.charAt(r.nextInt(drawFrom.length()))); -        } -         -        return sb.toString(); -    } -     -    /** -     * Verify if a password matches the user's password -     * @param password the password to check -     * @return  -     */ -    public boolean verify(String password) { -        return hash(password).equals(hash); -    } -     -    @Override -    public String toString() { -        return (isAdmin ? "++ " : "") + nr + " (" + email + ")" + (isBlocked ? " -!-" : ""); -    } -     -    /** -     * This User as a String, with a detailed and a quick view -     * @param showSensitive whether to show sensitive data (email, isAdmin, isBlocked) or not -     * @return  -     */ -    public String toString(boolean showSensitive) { -        return showSensitive ? toString() : nr; -    } - -}
\ No newline at end of file diff --git a/Week9/src/com/camilstaps/shop/UserInteraction.java b/Week9/src/com/camilstaps/shop/UserInteraction.java deleted file mode 100644 index 1140089..0000000 --- a/Week9/src/com/camilstaps/shop/UserInteraction.java +++ /dev/null @@ -1,198 +0,0 @@ -/** - * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> - * See the LICENSE file for copying permission. - */ - -package com.camilstaps.shop; - -import java.util.Set; - -/** - * Interact with the user: provide and request information. - * @author Camil Staps, s4498062 - */ -public abstract class UserInteraction { -     -    /** -     * Show a String -     * @param string  -     */ -    abstract void putString(String string); -     -    /** -     * Show a String with a linefeed -     * @param string  -     */ -    void putStringln(String string) { -        putString(string + System.lineSeparator()); -    } -     -    /** -     * Get a String as input -     * @return  -     */ -    abstract String getString(); -     -    /** -     * Get a String as input, after outputting a question -     * @param question -     * @return  -     */ -    String getString(String question) { -        putString(question); -        return getString(); -    } -     -    /** -     * Get a String as input, and throw an Exception when it's empty -     * @return -     * @throws InputRequiredException  -     */ -    String getRequiredString() throws InputRequiredException { -        String result = getString(); -        if (result.isEmpty()) throw new InputRequiredException(); -        return result; -    } -     -    /** -     * Get a String as input, after outputting a question, and throw an  -     * Exception when the input is empty -     * @param question -     * @return -     * @throws InputRequiredException  -     */ -    String getRequiredString(String question) throws InputRequiredException { -        putString(question); -        return getRequiredString(); -    } -     -    /** -     * Get a float as input -     * @return  -     */ -    abstract float getFloat(); -     -    /** -     * Get a float as input, after outputting a question -     * @param question -     * @return  -     */ -    float getFloat(String question) { -        putString(question); -        return getFloat(); -    } -     -    /** -     * Get a boolean as input -     * @return  -     */ -    abstract boolean getBoolean(); -     -    /** -     * Get a boolean as input, after outputting a question -     * @param question -     * @return  -     */ -    boolean getBoolean(String question) { -        putString(question); -        return getBoolean(); -    } -     -    /** -     * Get a Command as input -     * @return  -     */ -    abstract Command getCommand(); - -    /** -     * Let the user choose from an array of options, after outputting a question -     * @param question -     * @param options -     * @return the index of the choice in the options array -     */ -    abstract int getChoice(String question, String[] options); -     -    /** -     * Let the user choose from a Set of Articles -     * @param set -     * @return  -     */ -    Article getArticle(Set<Article> set) { -        String[] articleNames = new String[set.size()]; -        Article[] articles = new Article[set.size()]; -        int i = 0; -        for (Article a : set) { -            articleNames[i] = a.toString(); -            articles[i++] = a; -        } -        return articles[getChoice("Article: ", articleNames)]; -    } -     -    /** -     * Let the user choose an Article -     * @return -     * @throws InputRequiredException -     * @throws ItemNotFoundException  -     */ -    Article getArticle() throws InputRequiredException, ItemNotFoundException { -        String name = getRequiredString("Name article: "); -        return Database.getInstance().getArticle(name); -    } -     -    /** -     * Let the user choose an Article from the Articles of a specific User -     * @param user -     * @return  -     */ -    Article getArticle(User user) { -        return getArticle(user.getArticles()); -    } -     -    /** -     * Let the user choose a category -     * @return -     * @throws ItemNotFoundException  -     */ -    Category getCategory() throws ItemNotFoundException { -        String[] categories = Database.getInstance().getCategoryNames(); -        return Database.getInstance().getCategory(categories[getChoice("Category: ", categories)]); -    } -     -    /** -     * Let the user choose a User -     * @return -     * @throws InputRequiredException -     * @throws ItemNotFoundException  -     */ -    User getUser() throws InputRequiredException, ItemNotFoundException { -        return Database.getInstance().getUser(getRequiredString("Number user: ")); -    } -     -    /** -     * Let the user choose an order -     * @return -     * @throws InputRequiredException -     * @throws ItemNotFoundException  -     */ -    Order getOrder() throws InputRequiredException, ItemNotFoundException { -        return getOrder(getUser()); -    } -     -    /** -     * Let the user choose an order, from the orders of a specific User -     * @param user -     * @return  -     */ -    Order getOrder(User user) { -        Set<Order> orders = user.getOrders(); -        String[] orderStrings = new String[orders.size()]; -        Order[] orderObjects = new Order[orders.size()]; -        int i = 0; -        for (Order o : orders) { -            orderStrings[i] = o.toString(); -            orderObjects[i++] = o; -        } -        return orderObjects[getChoice("Order: ", orderStrings)]; -    } - -}
\ No newline at end of file | 
