diff --git a/finalproject/Question6/Borrower.java b/finalproject/Question6/Borrower.java new file mode 100644 index 0000000..64b700c --- /dev/null +++ b/finalproject/Question6/Borrower.java @@ -0,0 +1,63 @@ +/* + * Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007) + * Date: 2022-04-25 + * Description: This is the borrower class. + */ + +public class Borrower extends User { + /** + * Constructor. + * + * @param name Borrower's name + * @param int book number of books borrowed by user + */ + public Borrower(String name, int book) throws NotALenderException { + super(name, book); + + // check + if (book < 0) { + throw new NotALenderException("A new borrower cannot lend books."); + } + } + + /** + * increase the number of books borrowed by the user. + * + * @param number Incrased number of books + * @throws NotALenderException + */ + public void moreBook(int number) throws NotALenderException { + int newBook = getBook() + number; + if (number < 0 && newBook < 0) { + throw new NotALenderException("A borrower cannot lend " + (-newBook) + " book(s)."); + } + setBook(newBook); + } + + /** + * Test. + */ + public static void testBorrower() { + try { + Borrower b = new Borrower("Bob", -1); + } catch (NotALenderException e) { + System.out.println(e.getMessage().equals("A new borrower cannot lend books.")); + } + try { + Borrower b = new Borrower("Bob", 10); + System.out.println(b.getName() == "Bob"); + System.out.println(b.getBook() == 10); + b.setBook(5); + System.out.println(b.getBook() == 5); + b.moreBook(2); + System.out.println(b.getBook() == 7); + b.moreBook(-2); + System.out.println(b.getBook() == 5); + b.moreBook(-5); + System.out.println(b.getBook() == 0); + b.moreBook(-1); + } catch (NotALenderException e) { + System.out.println(e.getMessage().equals("A borrower cannot lend 1 book(s).")); + } + } +} diff --git a/finalproject/Question6/CLI.java b/finalproject/Question6/CLI.java new file mode 100644 index 0000000..c172ec3 --- /dev/null +++ b/finalproject/Question6/CLI.java @@ -0,0 +1,145 @@ +/* + * Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007) + * Date: 2022-04-25 + * Description: This is the CLI class. + */ + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class CLI { + private static Scanner input = new Scanner(System.in); + + /** + * Read one line from CLI. + * + * @param message Hint printed to screen + * @return one line input + */ + private static String readLine(String message) { + System.out.print(message); + return input.nextLine(); + } + + /** + * Read one positive integer. + * + * @param message HINT printed to screen + * @return one positive integer + */ + private static int readPosInt(String message) { + while (true) { + System.out.print(message); + try { + int result = input.nextInt(); + input.nextLine(); + if (result >= 0) { + return result; + } else { + System.out.println("Positive integers only!"); + } + } catch (InputMismatchException e) { + System.out.println("You must type an integer!"); + input.nextLine(); + } + } + } + + public static void main(String[] args) { + int book; + String username; + String menuHint = "Type an action (total:1 add:2 get:3 more:4 less:5 quit:6): "; + String userRoleHint = "Type the user role (lender:1 borrower:2): "; + + Library library = new Library("UIC Library"); + while (true) { + switch (readPosInt(menuHint)) { + // total + case 1: + System.out.println("Total number of borrowed books: " + + library.totalBorrowedBooks()); + break; + // add + case 2: + switch (readPosInt(userRoleHint)) { + // lender + case 1: + username = readLine("Enter the name of the user: "); + book = readPosInt( + "Enter the initial number of borrowed books: "); + Lender lender = new Lender(username, book); + library.addUser(lender); + System.out.println("Lender \"" + username + "\" lending " + book + + " book(s) has been added."); + break; + // borrower + case 2: + username = readLine( + "Enter the name of the user: "); + book = readPosInt( + "Enter the initial number of borrowed books: "); + try { + library.addUser(new Borrower(username, book)); + System.out.println("Borrower \"" + + username + + "\" borrowing " + + book + + " book(s) has been added."); + } catch (NotALenderException e) { + System.out.println("BUG! This must never happen!"); + System.exit(1); + } + break; + default: + System.out.println("Unknown user role!"); + break; + } + break; + // get + case 3: + username = readLine("Enter the name of the user: "); + try { + System.out.println(username + " borrows " + + library.getBook(username) + " book(s)."); + } catch (UnknownUserException e) { + System.out.println("User " + username + " unknown."); + } + break; + case 4: + username = readLine("Enter the name of the user: "); + book = readPosInt("Enter the number of books: "); + try { + library.moreBook(username, book); + } catch (NotALenderException e) { + System.out.println("BUG! This must never happen!"); + } catch (UnknownUserException e) { + System.out.println("User " + username + " unknown."); + } + break; + case 5: + username = readLine("Enter the name of the user: "); + book = readPosInt("Enter the number of books: "); + try { + // decrease numbers + try { + library.moreBook(username, -book); + } catch (NotALenderException e) { + System.out.println("A borrower cannot lend " + + (-(library.getBook(username) - book)) + + " book(s)."); + } + } catch (UnknownUserException e) { + System.out.println("User " + username + " unknown."); + } + break; + case 6: + System.out.println("Goodbye!"); + System.exit(0); + break; + default: + System.out.println("Unknown action!"); + break; + } + } + } +} diff --git a/finalproject/Question6/IUser.java b/finalproject/Question6/IUser.java new file mode 100644 index 0000000..f2f1b19 --- /dev/null +++ b/finalproject/Question6/IUser.java @@ -0,0 +1,13 @@ +/* + * Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007) + * Date: 2022-04-25 + * Description: This is the interface of IUser. + */ + +public interface IUser { + public String getName(); + + public int getBook(); + + public void moreBook(int number) throws NotALenderException; +} diff --git a/finalproject/Question6/Lender.java b/finalproject/Question6/Lender.java new file mode 100644 index 0000000..8d719bf --- /dev/null +++ b/finalproject/Question6/Lender.java @@ -0,0 +1,42 @@ +/* + * Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007) + * Date: 2022-04-25 + * Description: This is the Lender class. + */ + +public class Lender extends User { + /** + * Constructor. + * + * @param name The user's name. + * @param book number of bookds lent by the user. This will be store in negetive value. + */ + public Lender(String name, int book) { + // lender negetive book value + super(name, -book); + } + + /** + * Increases the number of bookds. + * + * @param book the number of books. + */ + public void moreBook(int book) { + setBook(getBook() - book); + } + + /** + * Test. + */ + public static void testLender() { + Lender l = new Lender("Anna", 5); + System.out.println(l.getName() == "Anna"); + System.out.println(l.getBook() == -5); + l.setBook(-6); + System.out.println(l.getBook() == -6); + l.moreBook(2); + System.out.println(l.getBook() == -8); + l.moreBook(-9); + System.out.println(l.getBook() == 1); + } +} diff --git a/finalproject/Question6/Library.java b/finalproject/Question6/Library.java new file mode 100644 index 0000000..09aeb86 --- /dev/null +++ b/finalproject/Question6/Library.java @@ -0,0 +1,106 @@ +/* + * Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007) + * Date: 2022-04-25 + * Description: This is the Library class. + */ + +import java.util.ArrayList; + +public class Library { + private String name; + private ArrayList users; + + /** + * Constructor. + * + * @param name + */ + public Library(String name) { + this.name = name; + + // init array list + users = new ArrayList(); + } + + /** + * Add the user to the array list. + * + * @param user The user to be added + */ + public void addUser(IUser user) { + users.add(user); + } + + /** + * The total number of bookds borrowed by all users. + * + * @return the number of books. + */ + public int totalBorrowedBooks() { + int total = 0; + for (IUser user : users) { + total += user.getBook(); + } + return total; + } + + /** + * Get the number of books borrowed by this user. + * + * @param name the name of the query user + * @return the number of books + * @throws UnknownUserException if user not found + */ + public int getBook(String name) throws UnknownUserException { + for (IUser user : users) { + if (user.getName().equals(name)) { + return user.getBook(); + } + } + // user not found + throw new UnknownUserException("User " + name + " unknown."); + } + + /** + * Change the number of books currently borrowed by that user. + * + * @param name the user's name + * @param number the number of books + * @throws UnknownUserException user not found + * @throws NotALenderException can not lend book + */ + public void moreBook(String name, int number) throws UnknownUserException, NotALenderException { + for (IUser user : users) { + if (user.getName().equals(name)) { + user.moreBook(number); + return; + } + } + // user not found + throw new UnknownUserException("User " + name + " unknown."); + } + + /** + * Test. + */ + public static void testLibrary() { + Library li = new Library("UIC Library"); + System.out.println(li.totalBorrowedBooks() == 0); + li.addUser(new Lender("L1", 10)); + try { + System.out.println(li.getBook("L1") == -10); + System.out.println(li.totalBorrowedBooks() == -10); + li.addUser(new Borrower("B1", 20)); + System.out.println(li.getBook("L1") == -10); + System.out.println(li.getBook("B1") == 20); + System.out.println(li.totalBorrowedBooks() == 10); + li.getBook("B2"); + } catch (UnknownUserException ex) { + System.out.println(ex.getMessage().equals("User B2 unknown.")); + } catch (NotALenderException ex) { + // This should never happen! + System.out.println(false); + } + // More test cases are needed + } +} diff --git a/finalproject/Question6/NotALenderException.java b/finalproject/Question6/NotALenderException.java new file mode 100644 index 0000000..377f323 --- /dev/null +++ b/finalproject/Question6/NotALenderException.java @@ -0,0 +1,5 @@ +public class NotALenderException extends Exception { + public NotALenderException(String message) { + super(message); + } +} diff --git a/finalproject/Question6/Test.java b/finalproject/Question6/Test.java new file mode 100644 index 0000000..d7fc547 --- /dev/null +++ b/finalproject/Question6/Test.java @@ -0,0 +1,8 @@ +public class Test { + public static void main(String[] args) { + User.testUser(); + Lender.testLender(); + Borrower.testBorrower(); + Library.testLibrary(); + } +} diff --git a/finalproject/Question6/UnknownUserException.java b/finalproject/Question6/UnknownUserException.java new file mode 100644 index 0000000..9f9f04a --- /dev/null +++ b/finalproject/Question6/UnknownUserException.java @@ -0,0 +1,5 @@ +public class UnknownUserException extends Exception { + public UnknownUserException(String message) { + super(message); + } +} diff --git a/finalproject/Question6/User.java b/finalproject/Question6/User.java new file mode 100644 index 0000000..6eec5a9 --- /dev/null +++ b/finalproject/Question6/User.java @@ -0,0 +1,69 @@ +/* + * Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007) + * Date: 2022-04-25 + * Description: This is the User class. + */ + +public abstract class User implements IUser { + /** + * The user's name. + */ + private String name; + + /** + * The number of books borrowed by the user. + */ + private int book; + + /** + * Constructor. + * + * @param name The user's name. + * @param book The number of books borrowed by the user. + */ + public User(String name, int book) { + this.name = name; + this.book = book; + } + + /** + * Getter of the user's name. + * + * @return The user's name. + */ + public String getName() { + return name; + } + + /** + * Getter of the number of books borrowed by the user. + * + * @return The number of books borrowed by the user. + */ + public int getBook() { + return book; + } + + /** + * Change the number of books borrowed by the user. + * + * @param book The number of books borrowed by the user. + */ + protected void setBook(int book) { + this.book = book; + } + + /** + * Increase the number of books borrowed by the user. + * + * @param book The number of books borrowed by the user. + */ + public abstract void moreBook(int number) throws NotALenderException; + + /** + * Test. + */ + public static void testUser() { + // abstract class not testing + } +}