/************************************************************************************************** * Program Name: Programming Project 5.7: Bookshelf * Class Name: pp5_7.Librarian * Author: Terry Weiss * Date Written: October 15, 2015 * Program Description: * This class handles everything with the `Bookshelf`. It allows the User to store a book, * browse the list of books by various categories, view the details of a particular book and * take a book off the shelf. **************************************************************************************************/ package pp5_7; //import pp5_7.Book; //import pp5_7.Bookshelf; //import Prompt; /** * This class is the driver behind {@link pp5_7.Bookshelf}. It uses menus to allow the User to * store a book, browse the list of books by various categories, view the details of a particular * book and take a book off the shelf. * * @author Terry Weiss * @see pp5_7.Book * @see pp5_7.Bookshelf */ public class Librarian { /* * Definitions of all menu options for {@link #mainMenu} */ private static enum Main_Options { MAIN_OPTION_ADD_BOOK, MAIN_OPTION_REMOVE_BOOK, MAIN_OPTION_BROWSE, MAIN_OPTION_QUIT; /** * Converts an int menu option to a Main_Options option. Since menus start at 1, all * options are returned as 1 less to start at 0. * * @param option Integer option to be converted * @return Converted value of Main_Options */ public static Main_Options fromInteger( int option ) { return Main_Options.values()[option - 1]; } } /* * Definitions of all menu options for {@link #browseMenu} */ private static enum Browse_Options { BROWSE_OPTION_BROWSE_ALL, BROWSE_OPTION_BROWSE_AUTHORS, BROWSE_OPTION_BROWSE_GENRES, BROWSE_OPTION_BROWSE_SIZE, BROWSE_OPTION_CATEGORIZE_AUTHORS, BROWSE_OPTION_CATEGORIZE_GENRES, BROWSE_OPTION_VIEW_BY_AUTHOR, BROWSE_OPTION_VIEW_BY_GENRE, BROWSE_OPTION_VIEW_BOOK_DETAILS, BROWSE_OPTION_MAIN_MENU; /** * Converts an int menu option to a Browse_Options option. Since menus start at 1, all * options are returned as 1 less to start at 0. * * @param option Integer option to be converted * @return Converted value of Browse_Options */ public static Browse_Options fromInteger( int option ) { return Browse_Options.values()[option - 1]; } } /* * {@link pp5_7.Bookshelf} instance that holds each {@link pp5_7.Book} */ private static final Bookshelf shelf = new Bookshelf(); /* * Creates the main menu prompt message and prompts the user for which option to proceed. * * @return Menu option selected * @see pp5_7.Prompt */ private static int mainMenu() { String prompt = "\n" + "\t1. Add a book\n" + "\t2. Remove a book\n" + "\t3. Browse\n" + "\t4. Quit\n" + "Please select an option"; return Prompt.intInRange(prompt, 1, Main_Options.MAIN_OPTION_QUIT.ordinal() + 1, "Not a valid option."); } /* * Prompts the user for a {@link pp5_7.Book}'s details, creates the new Book and adds it * to the {@link pp5_7.Bookshelf}. * * @see pp5_7.Bookshelf#addBook */ private static void addBook() { String title = Prompt.string("Enter title"); String author = Prompt.string("Enter author"); int pages = Prompt.wholeNumber("Enter number of pages"); String genre = Prompt.string("Enter genre"); Book book = new Book(title, pages, author, genre); shelf.addBook(book); System.out.println("Added " + book + " to the shelf."); } /* * Removes a book from the bookshelf, or displays a message that the book doesn't exist. */ private static void removeBook() { String title = Prompt.string("Enter title"); if (shelf.removeBook(title)) { System.out.println("Removed " + title + " from the shelf."); } else { System.out.println("That book doesn't exist."); } } /* * Creates the browse menu prompt message and prompts the user for which option to proceed. * * @return Menu option selected * @see pp5_7.Prompt */ private static int browseMenu() { String prompt = "\n" + "\t1. Browse all books\n" + "\t2. Browse by authors\n" + "\t3. Browse by genres\n" + "\t4. Browse by size\n" + "\t5. Categorize by author\n" + "\t6. Categorize by genre\n" + "\t7. View books by a certain author\n" + "\t8. View books in a certain genre\n" + "\t9. View book details\n" + "\t10. Return to main menu\n" + "Please select an option"; return Prompt.intInRange(prompt, 1, Browse_Options.BROWSE_OPTION_MAIN_MENU.ordinal() + 1, "Not a valid option."); } /* * Displays all {@link pp5_7.Book}s on the {@link pp5_7.Bookshelf}, sorted by their title. * * @see pp5_7.Bookshelf#browse */ private static void browseAll() { System.out.println("\nAll books in " + shelf + ":"); System.out.print(shelf.browse()); } /* * Displays all {@link pp5_7.Book}s on the {@link pp5_7.Bookshelf}, sorted by their author. * * @see pp5_7.Bookshelf#browseBooksByAuthor */ private static void browseAuthors() { System.out.println("\nAll books in " + shelf + ":"); System.out.print(shelf.browseByAuthor()); } /* * Displays all {@link pp5_7.Book}s on the {@link pp5_7.Bookshelf}, sorted by their genre. * * @see pp5_7.Bookshelf#browseBooksByGenre */ private static void browseGenres() { System.out.println("\nAll books in " + shelf + ":"); System.out.print(shelf.browseByGenre()); } /* * Displays all {@link pp5_7.Book}s on the {@link pp5_7.Bookshelf}, sorted by their size. * * @see pp5_7.Bookshelf#browseBySize */ private static void browseSize() { System.out.println("\nAll books in " + shelf + ":"); System.out.print(shelf.browseBySize()); } /* * Displays all {@link pp5_7.Book}s on the {@link pp5_7.Bookshelf}, categorized and sorted * by their author. * * @see pp5_7.Bookshelf#browseByCategory */ private static void browseCategorizeAuthors() { System.out.println("\nAll books in " + shelf + ":"); System.out.print(shelf.browseByCategory("author")); } /* * Displays all {@link pp5_7.Book}s on the {@link pp5_7.Bookshelf}, categorized and sorted * by their genre. * * @see pp5_7.Bookshelf#browseByCategory */ private static void browseCategorizeGenres() { System.out.println("\nAll books in " + shelf + ":"); System.out.print(shelf.browseByCategory("genre")); } /* * Prompts for an author and displays all {@link pp5_7.Book}s on the {@link pp5_7.Bookshelf} * written by that author, sorted by their title. * * @see pp5_7.Bookshelf#browseBooksOfAuthor */ private static void browseBooksByAuthor() { String author = Prompt.string("Pick an author"); System.out.println("\nAll books by " + author + ":"); System.out.print(shelf.browseBooksOfAuthor(author)); } /* * Prompts for a genre and displays all {@link pp5_7.Book}s on the {@link pp5_7.Bookshelf} * that are in that genre, sorted by their title. * * @see pp5_7.Bookshelf#browseBooksOfGenre */ private static void browseBooksByGenre() { String genre = Prompt.string("Pick a genre"); System.out.println("\nAll " + genre + " books:"); System.out.print(shelf.browseBooksOfGenre(genre)); } /* * Prompts for a title and displays the details of that {@link pp5_7.Book} * * @see pp5_7.Bookshelf#viewBook */ private static void browseViewDetails() { String title = Prompt.string("Enter a title"); System.out.println(shelf.viewBook(title)); } /** * Runs the menus to allows the User to store a book, browse the list of books by various * categories, view the details of a particular book, and take a book off the shelf. * * @param args Command line input isn't currently supported * @throws pp5_7.Prompt.OptionOutOfBoundsException In case a menu choice isn't valid * @see pp5_7.Book * @see pp5_7.Bookshelf */ public static void main( String args[] ) throws Prompt.OptionOutOfBoundsException { int mainChoice, browseChoice; do { mainChoice = mainMenu(); switch (Main_Options.fromInteger(mainChoice)) { case MAIN_OPTION_ADD_BOOK: addBook(); break; case MAIN_OPTION_REMOVE_BOOK: removeBook(); break; case MAIN_OPTION_BROWSE: do { browseChoice = browseMenu(); switch (Browse_Options.fromInteger(browseChoice)) { case BROWSE_OPTION_BROWSE_ALL: browseAll(); break; case BROWSE_OPTION_BROWSE_AUTHORS: browseAuthors(); break; case BROWSE_OPTION_BROWSE_GENRES: browseGenres(); break; case BROWSE_OPTION_BROWSE_SIZE: browseSize(); break; case BROWSE_OPTION_CATEGORIZE_AUTHORS: browseCategorizeAuthors(); break; case BROWSE_OPTION_CATEGORIZE_GENRES: browseCategorizeGenres(); break; case BROWSE_OPTION_VIEW_BY_AUTHOR: browseBooksByAuthor(); break; case BROWSE_OPTION_VIEW_BY_GENRE: browseBooksByGenre(); break; case BROWSE_OPTION_VIEW_BOOK_DETAILS: browseViewDetails(); break; case BROWSE_OPTION_MAIN_MENU: System.out.println("Returning to the main menu."); break; default: throw new Prompt.OptionOutOfBoundsException( "Browse menu option doesn't exist"); } } while (browseChoice != Browse_Options.BROWSE_OPTION_MAIN_MENU.ordinal() + 1); break; case MAIN_OPTION_QUIT: System.out.println("Please come again!"); break; default: throw new Prompt.OptionOutOfBoundsException("Main menu option doesn't exist"); } } while (mainChoice != Main_Options.MAIN_OPTION_QUIT.ordinal() + 1); } }