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










