Trying to create a Library in Java 8 using the Date API Book

Trying to create a Library in Java 8 using the Date API.

BookCopy has an associated  DueDate (which is null if the book is not checked out)

and LibraryCard has a non-negative balance, which is incurred if books are checked in past their  due  dates. The library charges $.10 per day per book.

Modify your checkOut method ( which I named removeBookCopy() ) to give the BookCopy a  due  date that is equal to three weeks from the day that the books are checked out.

Modify your checkIn method ( which I named addBookCopy() )to check if the book is overdue; if so, update the balance accordingly.

Note: although a real library application would use only the real  date, for ease of testing and debugging, ALSO create an additional checkIn and checkOut method that takes a date as a parameter, so that you don\'t have to wait three weeks to test your code.

Also create the following LibraryCard methods:

- a renewal method which allows the cardholder to get a new  due date for that book. Renewal periods are in  two-week increments.

- a method which takes a  date as a parameter and returns a list of books that are  due on or before that  date.

- a method that checks if any books are overdue. (Note: although in a real-world application, this would check for overdue books using today\'s date, ALSO create an additional method that takes a date as a parameter for ease of testing.)

- a method that returns a list of all the books checked out, sorted by due date. (You may use an array or an ArrayList -- we\'re not focusing on the specific data structures yet.)

This is my code so far.

//Book class stores the title, author and ISBN of the book
public class Book {
  
   private String Title;
   private String Author;
  
   //Using String for ISBN instead of a int because it is 13 digits long
   private String Isbn;
  
   //Constructor
   public Book(String title, String author, String isbn)
   {
   Title = title;
   Author = author;
   Isbn = isbn;
   }
  
   //No need for setters because a book\'s title, author and ISBN will never change
  
   //Getters
   public String getTitle()
   {
   return Title;
   }
  
   public String getAuthor()
   {
   return Author;
   }
  
   public String getIsbn()
   {
   return Isbn;
   }
}

********************************************************************************

//BookCopy class stores the current copy of the book that is being checked in or out and the current library card that is being used.
public class BookCopy {
  
   private Book Book;
   private LibraryCard LibraryCard;
  
   //Constructor
   //If book is not checked out, pass null for library card
   public BookCopy(Book book, LibraryCard libraryCard)
   {
   Book = book;
   LibraryCard = libraryCard;
   }
  
   //Getters and setters
   public Book getBook()
   {
   return Book;
   }
  
   public LibraryCard getLibraryCard()
   {
   return LibraryCard;
   }
  
   //We don\'t need setter for Book as a book\'s copy won\'t change
   //But we need setter for LibraryCard, as multiple people can borrow
   //a single book copy
   public void setLibraryCard(LibraryCard libraryCard)
   {
   LibraryCard = libraryCard;
   }
}

**********************************************************************

//LibraryCard class stores the library card holder\'s ID, name and a list of the books that are currently checked out on the card
//Prints the user and checkout information onto the console
import java.util.*;

public class LibraryCard {

   private int ID;
   private String CardHolderName;
     
   //List that stores the books that are checked out on the card
   private ArrayList<BookCopy> BookCopyList = new ArrayList<>();
  
   //Constructor
   public LibraryCard(int id, String cardHolderName, BookCopy bookCopy)
   {
   ID = id;
   CardHolderName = cardHolderName;
   BookCopyList.add(bookCopy);
   }
  
   //Getters and Setters
   //We don\'t need setter for id as it wont change
   public int getId()
   {
   return ID;
   }
  
   public String getCardHolderName()
   {
   return CardHolderName;
   }
  
  
   public void setCardHolderName(String cardHolderName)
   {
   CardHolderName = cardHolderName;
   }
  
   //Methods to Add and remove bookcopies to LibraryCard
   public void addBookCopy(BookCopy bookCopy)
   {
   BookCopyList.add(bookCopy);
   //Adding libraryCard to bookcopy
   bookCopy.setLibraryCard(this);
  
   //Printing on screen that the book has been checked out
   System.out.println(\"CheckOut Information: \");
   System.out.println(\"Borrower Name: \"+this.CardHolderName);
   System.out.println(\"Book Title: \"+bookCopy.getBook().getTitle());
   System.out.println(\"Author Name: \"+bookCopy.getBook().getAuthor());
   System.out.println(\"ISBN No.: \"+bookCopy.getBook().getIsbn());
   System.out.println(\"\");
   }
  
   //Method returns true if bookCopy was successfully removed from LibraryCard
   public boolean removeBookCopy(BookCopy bookCopy)
   {
   if(BookCopyList.contains(bookCopy))
   {
   BookCopyList.remove(bookCopy);
   //resetting librarycard to null as its checked in now
   bookCopy.setLibraryCard(null);
   System.out.println(\"Book Checkd In Successfully:\");
   System.out.println(\"Book Title: \"+bookCopy.getBook().getTitle());
   System.out.println(\"\");
   return true;
   }
  
   System.out.println(\"This book is not borrowed by \"+this.CardHolderName);
   System.out.println(\"\");
   return false;
   }
}

*******************************************************************************************

//Test program for the Book class, Library class and BookCopy class
public class Main {
   public static void main (String[] args) throws java.lang.Exception
   {
   //List of Books and their bookCopies
   Book Book1 = new Book(\"Diary of a Wimpy Kid # 11: Double Down\", \"Jeff Kinney\", \"9781419723445\");
   BookCopy BookCopy1a = new BookCopy(Book1, null);
   BookCopy BookCopy1b = new BookCopy(Book1, null);
  
   Book Book2 = new Book(\"A Man Called Ove: A Novel\", \"Fredrik Backman\", \"9781476738024\");
   BookCopy BookCopy2a = new BookCopy(Book2, null);
   BookCopy BookCopy2b = new BookCopy(Book2, null);
  
   Book Book3 = new Book(\"To Kill a Mockingbird\", \"Harper Lee\", \"9780446310789\");
   BookCopy BookCopy3a = new BookCopy(Book3, null);
   BookCopy BookCopy3b = new BookCopy(Book3, null);
  
   Book Book4 = new Book(\"A Dance with Dragons\", \"George R. R. Martin\", \"9780553801477\");
   BookCopy BookCopy4a = new BookCopy(Book4, null);
   BookCopy BookCopy4b = new BookCopy(Book4, null);
  
   Book Book5 = new Book(\"One Flew Over the Cuckoo\'s Nest\", \"Ken Kesey\", \"9780451163967\");
   BookCopy BookCopy5a = new BookCopy(Book5, null);
   BookCopy BookCopy5b = new BookCopy(Book5, null);
  
   Book Book6 = new Book(\"The Amber Spyglass: His Dark Materials\", \"Philip Pullman\", \"9780440418566\");
   BookCopy BookCopy6a = new BookCopy(Book6, null);
   BookCopy BookCopy6b = new BookCopy(Book6, null);
  
   Book Book7 = new Book(\"The Help\", \"Kathryn Stockett\", \"9780399155345\");
   BookCopy BookCopy7a = new BookCopy(Book7, null);
   BookCopy BookCopy7b = new BookCopy(Book7, null);
  
   Book Book8 = new Book(\"Of Mice and Men\", \"John Steinbeck\", \"9780140177398\");
   BookCopy BookCopy8a = new BookCopy(Book8, null);
   BookCopy BookCopy8b = new BookCopy(Book8, null);
  
   Book Book9 = new Book(\"Harry Potter and the Deathly Hallows\", \"J. K. Rowling\", \"9780545010221\");
   BookCopy BookCopy9a = new BookCopy(Book9, null);
   BookCopy BookCopy9b = new BookCopy(Book9, null);
  
   Book Book10 = new Book(\"A Thousand Splendid Suns\", \"Khaled Hosseini\", \"9781594489501\");
   BookCopy BookCopy10a = new BookCopy(Book10, null);
   BookCopy BookCopy10b = new BookCopy(Book10, null);
  
   //Library Cards
   LibraryCard libraryCard1 = new LibraryCard(1, \"Tony Stark\", null);
   LibraryCard libraryCard2 = new LibraryCard(2, \"Bruce Wayne\", null);
   LibraryCard libraryCard3 = new LibraryCard(3, \"Jon Snow\", null);
  
   libraryCard1.addBookCopy(BookCopy6a);
   libraryCard1.addBookCopy(BookCopy6b);
   libraryCard1.addBookCopy(BookCopy5a);
  
   libraryCard2.addBookCopy(BookCopy3b);
   libraryCard3.addBookCopy(BookCopy4a);
  
   //This book has been borrowed by libraryCard1Holder
   libraryCard1.removeBookCopy(BookCopy6a);
  
   //This book hasn\'t been borrowed by libraryCard3Holder
   libraryCard3.removeBookCopy(BookCopy9b);
   }
}

********************************************************************************

Output:

CheckOut Information:
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Author Name: Philip Pullman
ISBN No.: 9780440418566

CheckOut Information:
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Author Name: Philip Pullman
ISBN No.: 9780440418566

CheckOut Information:
Borrower Name: Tony Stark
Book Title: One Flew Over the Cuckoo\'s Nest
Author Name: Ken Kesey
ISBN No.: 9780451163967

CheckOut Information:
Borrower Name: Bruce Wayne
Book Title: To Kill a Mockingbird
Author Name: Harper Lee
ISBN No.: 9780446310789

CheckOut Information:
Borrower Name: Jon Snow
Book Title: A Dance with Dragons
Author Name: George R. R. Martin
ISBN No.: 9780553801477

Book Checkd In Successfully:
Book Title: The Amber Spyglass: His Dark Materials

This book is not borrowed by Jon Snow

Solution

I have kept book class as it is as per your question.

BookCopy.java

import java.time.LocalDate;

//BookCopy class stores the current copy of the book that is being checked in or out and the current library card that is being used.
public class BookCopy {

   private Book Book;
   private LibraryCard LibraryCard;
  
   // adding dueDate field
   private LocalDate dueDate;

   // Constructor
   // If book is not checked out, pass null for library card
   public BookCopy(Book book, LibraryCard libraryCard) {
       Book = book;
       LibraryCard = libraryCard;
       dueDate = null;
   }

   // Getters and setters
   public Book getBook() {
       return Book;
   }

   public LibraryCard getLibraryCard() {
       return LibraryCard;
   }

   public LocalDate getDueDate() {
       return dueDate;
   }

   public void setDueDate(LocalDate dueDate) {
       this.dueDate = dueDate;
   }

   // We don\'t need setter for Book as a book\'s copy won\'t change
   // But we need setter for LibraryCard, as multiple people can borrow
   // a single book copy
   public void setLibraryCard(LibraryCard libraryCard) {
       LibraryCard = libraryCard;
   }
}



LibraryCard.java

//LibraryCard class stores the library card holder\'s ID, name and a list of the books that are currently checked out on the card
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
//Prints the user and checkout information onto the console
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class LibraryCard {
   private int ID;
   private String CardHolderName;
  
   // adding balance field
   private double balance;

   // List that stores the books that are checked out on the card
   private ArrayList<BookCopy> BookCopyList = new ArrayList<>();

   // Constructor
   public LibraryCard(int id, String cardHolderName, BookCopy bookCopy,
           double balance) {
       ID = id;
       CardHolderName = cardHolderName;
       BookCopyList.add(bookCopy);
       this.balance = balance;
   }

   // Getters and Setters
   // We don\'t need setter for id as it wont change
   public int getId() {
       return ID;
   }

   public String getCardHolderName() {
       return CardHolderName;
   }

   public void setCardHolderName(String cardHolderName) {
       CardHolderName = cardHolderName;
   }

   // only getter, as the setter for now is through constructor only
   public double getBalance() {
       return balance;
   }

   // Methods to Add and remove bookcopies to LibraryCard
   public void addBookCopy(BookCopy bookCopy) {
       addBookCopy(bookCopy, LocalDate.now());
   }

   // Methods to Add and remove bookcopies to LibraryCard
   // dummy method to test with checkout date
   public void addBookCopy(BookCopy bookCopy, LocalDate checkoutDate) {
       BookCopyList.add(bookCopy);
       // Adding libraryCard to bookcopy
       bookCopy.setLibraryCard(this);

       // set due date for 3 weeks later
       bookCopy.setDueDate(checkoutDate.plusDays(7 * 3));

       // Printing on screen that the book has been checked out
       System.out.println(\"CheckOut Information: \");
       System.out.println(\"Borrower Name: \" + this.CardHolderName);
       System.out.println(\"Book Title: \" + bookCopy.getBook().getTitle());
       System.out.println(\"Author Name: \" + bookCopy.getBook().getAuthor());
       System.out.println(\"ISBN No.: \" + bookCopy.getBook().getIsbn());
       System.out.println(\"Due date: \" + bookCopy.getDueDate());
       System.out.println(\"\");
   }

   // Method returns true if bookCopy was successfully removed from LibraryCard
   public boolean removeBookCopy(BookCopy bookCopy) {
       return removeBookCopy(bookCopy, LocalDate.now());
   }

   // Method returns true if bookCopy was successfully removed from LibraryCard
   // created for testing with a custom returing date
   public boolean removeBookCopy(BookCopy bookCopy, LocalDate returningDate) {
       if (BookCopyList.contains(bookCopy)) {
           BookCopyList.remove(bookCopy);

           // checking if due date is of later time, and we need to subtract
           // balance
           if (bookCopy.getDueDate().isBefore(returningDate)) {
               long noOfDays = ChronoUnit.DAYS.between(bookCopy.getDueDate(), returningDate);
               System.out.println(\"Deduting balance for \" + noOfDays
                       + \" Days.\");
               balance -= noOfDays * 0.10;
           }

           // resetting librarycard to null as its checked in now
           bookCopy.setLibraryCard(null);

           // resetting the due date
           bookCopy.setDueDate(null);

           System.out.println(\"Book Checkd In Successfully:\");
           System.out.println(\"Book Title: \" + bookCopy.getBook().getTitle());
           System.out.println(\"Balance: \" + balance);
           System.out.println(\"\");
           return true;
       }

       System.out.println(\"This book is not borrowed by \"
               + this.CardHolderName);
       System.out.println(\"\");
       return false;
   }

   // renews books due date for 2 weeks more.
   public void renewal(BookCopy bookCopy) {
       bookCopy.setDueDate(bookCopy.getDueDate().plusDays(14));
       System.out.println(\"Renewal successful.\");

       // Printing on screen that the book has been checked out
       System.out.println(\"Borrower Name: \" + this.CardHolderName);
       System.out.println(\"Book Title: \" + bookCopy.getBook().getTitle());
       System.out.println(\"Due date: \" + bookCopy.getDueDate());
       System.out.println(\"\");
   }

   // get the books which are overdue on a particular date
   public void getListOfBooksDue(LocalDate date) {
       ArrayList<BookCopy> dueBooks = new ArrayList<>();
       for (BookCopy b : BookCopyList) {
           if (!b.getDueDate().isAfter(date)) {
               dueBooks.add(b);
               System.out.println(\"Book Title: \" + b.getBook().getTitle());
           }
       }
       // return dueBooks; You can get the books if you want.
   }

   // return the books overdue on the calling date
   public void getOverdueBooks() {
       getListOfBooksDue(LocalDate.now());
   }

   // for testing the above method
   public void getOverdueBooks(LocalDate d) {
       getListOfBooksDue(d);
   }

   // for testing the above method
   public void getCheckedOutBooks() {
       ArrayList<BookCopy> resultantList = new ArrayList<>(BookCopyList);

       Collections.sort(resultantList, new Comparator<BookCopy>() {
           public int compare(BookCopy b1, BookCopy b2) {
               return b1.getDueDate().compareTo(b2.getDueDate());
           }
       });

       for (BookCopy b : resultantList) {
           System.out.println(\"Book Title: \" + b.getBook().getTitle());
       }

       // return resultantList;
   }

}


Main.java

import java.time.LocalDate;

//Test program for the Book class, Library class and BookCopy class
public class Main {
public static void main (String[] args) throws java.lang.Exception
{
//List of Books and their bookCopies
Book Book1 = new Book(\"Diary of a Wimpy Kid # 11: Double Down\", \"Jeff Kinney\", \"9781419723445\");
BookCopy BookCopy1a = new BookCopy(Book1, null);
BookCopy BookCopy1b = new BookCopy(Book1, null);
  
Book Book2 = new Book(\"A Man Called Ove: A Novel\", \"Fredrik Backman\", \"9781476738024\");
BookCopy BookCopy2a = new BookCopy(Book2, null);
BookCopy BookCopy2b = new BookCopy(Book2, null);
  
Book Book3 = new Book(\"To Kill a Mockingbird\", \"Harper Lee\", \"9780446310789\");
BookCopy BookCopy3a = new BookCopy(Book3, null);
BookCopy BookCopy3b = new BookCopy(Book3, null);
  
Book Book4 = new Book(\"A Dance with Dragons\", \"George R. R. Martin\", \"9780553801477\");
BookCopy BookCopy4a = new BookCopy(Book4, null);
BookCopy BookCopy4b = new BookCopy(Book4, null);
  
Book Book5 = new Book(\"One Flew Over the Cuckoo\'s Nest\", \"Ken Kesey\", \"9780451163967\");
BookCopy BookCopy5a = new BookCopy(Book5, null);
BookCopy BookCopy5b = new BookCopy(Book5, null);
  
Book Book6 = new Book(\"The Amber Spyglass: His Dark Materials\", \"Philip Pullman\", \"9780440418566\");
BookCopy BookCopy6a = new BookCopy(Book6, null);
BookCopy BookCopy6b = new BookCopy(Book6, null);
  
Book Book7 = new Book(\"The Help\", \"Kathryn Stockett\", \"9780399155345\");
BookCopy BookCopy7a = new BookCopy(Book7, null);
BookCopy BookCopy7b = new BookCopy(Book7, null);
  
Book Book8 = new Book(\"Of Mice and Men\", \"John Steinbeck\", \"9780140177398\");
BookCopy BookCopy8a = new BookCopy(Book8, null);
BookCopy BookCopy8b = new BookCopy(Book8, null);
  
Book Book9 = new Book(\"Harry Potter and the Deathly Hallows\", \"J. K. Rowling\", \"9780545010221\");
BookCopy BookCopy9a = new BookCopy(Book9, null);
BookCopy BookCopy9b = new BookCopy(Book9, null);
  
Book Book10 = new Book(\"A Thousand Splendid Suns\", \"Khaled Hosseini\", \"9781594489501\");
BookCopy BookCopy10a = new BookCopy(Book10, null);
BookCopy BookCopy10b = new BookCopy(Book10, null);
  
//Library Cards
LibraryCard libraryCard1 = new LibraryCard(1, \"Tony Stark\", null, 10);
LibraryCard libraryCard2 = new LibraryCard(2, \"Bruce Wayne\", null, 20);
LibraryCard libraryCard3 = new LibraryCard(3, \"Jon Snow\", null, 15);
  
// setting due dates for book 6a and 6b
libraryCard1.addBookCopy(BookCopy6a, LocalDate.of(2017, 1, 10));
libraryCard1.addBookCopy(BookCopy6b, LocalDate.of(2017, 1, 10));
libraryCard1.addBookCopy(BookCopy5a);
  
libraryCard2.addBookCopy(BookCopy3b);
libraryCard3.addBookCopy(BookCopy4a);
  
// renew due date of book 6b
libraryCard1.renewal(BookCopy6b);

//This book has been borrowed by libraryCard1Holder.. It is being
// returned after due date. So watch the balance being deducted.
libraryCard1.removeBookCopy(BookCopy6a);
  
//This book hasn\'t been borrowed by libraryCard3Holder
libraryCard3.removeBookCopy(BookCopy9b);
}
}


Sample Output:

CheckOut Information:
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Author Name: Philip Pullman
ISBN No.: 9780440418566
Due date: 2017-01-31

CheckOut Information:
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Author Name: Philip Pullman
ISBN No.: 9780440418566
Due date: 2017-01-31

CheckOut Information:
Borrower Name: Tony Stark
Book Title: One Flew Over the Cuckoo\'s Nest
Author Name: Ken Kesey
ISBN No.: 9780451163967
Due date: 2017-03-20

CheckOut Information:
Borrower Name: Bruce Wayne
Book Title: To Kill a Mockingbird
Author Name: Harper Lee
ISBN No.: 9780446310789
Due date: 2017-03-20

CheckOut Information:
Borrower Name: Jon Snow
Book Title: A Dance with Dragons
Author Name: George R. R. Martin
ISBN No.: 9780553801477
Due date: 2017-03-20

Renewal successful.
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Due date: 2017-02-14

Deduting balance for 27 Days.
Book Checkd In Successfully:
Book Title: The Amber Spyglass: His Dark Materials
Balance: 7.3

This book is not borrowed by Jon Snow

Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a
Trying to create a Library in Java 8 using the Date API. BookCopy has an associated DueDate (which is null if the book is not checked out) and LibraryCard has a

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site