Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Modify the library program as follows: Create a Catalog class that should contai

ID: 3835101 • Letter: M

Question

Modify the library program as follows:

Create a Catalog class that should contain a mapping from LibraryMaterial to a collection of LibraryMaterialCopy. It should keep track of all the materials and copies of them in the library.

It should support the following operations:

   a) Adding new library materials: given a book or dvd and a number n, it should create n copies of the material and add them to the catalog.

   b) Lookup copies by material: given a library material, it should return the collection of the copies of that material.

   c) Lookup material by title: given a title, it should return the library material that matches that title, or null if none exist.

   d) See all available copies: given a library material, it should return a collection of all copies of that material that are not checked out.

   e) Return a collection of all library materials in the library

My Code

-------------------------------------------------------------------------------------

LibraryCard.java

import java.util.List;
import java.util.ArrayList;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class LibraryCard {
   private String id;
   private String cardholderName;
   private List<LibraryMaterialCopy> libraryMaterialsCheckedOut;
   private double balance;

   public LibraryCard(String i, String name) {
       id = i;
       cardholderName = name;
       libraryMaterialsCheckedOut = new ArrayList<LibraryMaterialCopy>();
       balance = 0;
   }

   public String getID() {
       return id;
   }

   public String getCardholderName() {
       return cardholderName;
   }

   public List<LibraryMaterialCopy> getlibraryMaterialsCheckedOut() {
       return new ArrayList<LibraryMaterialCopy>(libraryMaterialsCheckedOut);
   }

   public void setCardholderName(String name) {
       cardholderName = name;
   }

   public boolean checkOutLibraryMaterial(LibraryMaterialCopy libraryMaterial, LocalDate todaysDate) {
       if (!libraryMaterial.checkOut(this))
           return false;
       libraryMaterialsCheckedOut.add(libraryMaterial);
       return true;
   }

   public boolean checkOutLibraryMaterial(LibraryMaterialCopy libraryMaterial)
   // default check out, uses today's date
   {
       return checkOutLibraryMaterial(libraryMaterial, LocalDate.now());
   }

   public boolean returnLibraryMaterial(LibraryMaterialCopy libraryMaterial, LocalDate returnDate)
   // returns libraryMaterial and sends message to libraryMaterialCopy to do
   // the same
   // returns false if libraryMaterial is not checked out
   // takes parameter that expresses the date of return
   {
       LocalDate dueDate = libraryMaterial.getDueDate();
       if (!libraryMaterial.returnCopy())
           return false;
       if (!libraryMaterialsCheckedOut.remove(libraryMaterial))
           return false;
       long daysBetween = ChronoUnit.DAYS.between(dueDate, returnDate);
       if (daysBetween > 0) // libraryMaterial is returned late
       {
           balance += libraryMaterial.getFinePerDay() * daysBetween;
       }
       return true;
   }

   public boolean returnLibraryMaterial(LibraryMaterialCopy libraryMaterial)
   // default method, uses today's date as returns date
   {
       return returnLibraryMaterial(libraryMaterial, LocalDate.now());
   }

   public boolean renewLibraryMaterial(LibraryMaterialCopy libraryMaterial, LocalDate renewalDate)
   // renews libraryMaterial. Returns false if libraryMaterial is not checked
   // out already
   // takes parameter that expresses date of renewal
   // returns false if librayrMaterial is not a book
   {
       if (!libraryMaterialsCheckedOut.contains(libraryMaterial))
           return false;
       if (libraryMaterial.isRenewable()) {
           if (!((BookCopy) libraryMaterial).renew(renewalDate))
               return false;
           return true;
       }
       return false;
   }

   public boolean renewLibraryMaterial(LibraryMaterialCopy libraryMaterial)
   // default renewal method uses today's date as renewal date.
   {
       return renewLibraryMaterial(libraryMaterial, LocalDate.now());
   }

   public List<LibraryMaterialCopy> getlibraryMaterialsDueBy(LocalDate date)
   // returns an List of libraryMaterials due on or before date
   {
       List<LibraryMaterialCopy> libraryMaterialsDue = new ArrayList<LibraryMaterialCopy>();
       for (LibraryMaterialCopy libraryMaterial : libraryMaterialsCheckedOut) {
           if (libraryMaterial.getDueDate().isBefore(date) || libraryMaterial.getDueDate().equals(date)) {
               libraryMaterialsDue.add(libraryMaterial);
           }
       }

       return libraryMaterialsDue;
   }

   public List<LibraryMaterialCopy> getLibraryMaterialsOverdue(LocalDate todaysDate) {
       return getlibraryMaterialsDueBy(todaysDate.minusDays(1));
   }

   public List<LibraryMaterialCopy> getLibraryMaterialsOverdue()
   // default method, returns libraryMaterials overdue as of today, which means
   // that they
   // were due by yesterday
   {
       return getLibraryMaterialsOverdue(LocalDate.now());
   }

   public List<LibraryMaterialCopy> getLibraryMaterialsSorted()
   // returns List of libraryMaterials, sorted by due date (earliest due date
   // first)
   // uses insertion sort
   {
       List<LibraryMaterialCopy> libraryMaterials = new ArrayList<LibraryMaterialCopy>(libraryMaterialsCheckedOut);
       for (int i = 1; i < libraryMaterials.size(); i++) {
           int j = i;
           while (j > 0 && libraryMaterials.get(j - 1).getDueDate().isAfter(libraryMaterials.get(j).getDueDate())) {

               // swap elements in positions j and j-1
               LibraryMaterialCopy temp = libraryMaterials.get(j);
               libraryMaterials.set(j, libraryMaterials.get(j - 1));
               libraryMaterials.set(j - 1, temp);

               j = j - 1;
           }
       }
       return libraryMaterials;
   }
}

mainProgram.java


import java.util.ArrayList;
import java.util.List;
import java.time.LocalDate;

public class mainProgram {
   public static void main(String[] args) {
       ArrayList<LibraryMaterial> books = new ArrayList<LibraryMaterial>();
       books.add(new Book("12345678910", "Harry Potter", "J. K. Rowling"));
       books.add(new Book("98765432", "Berenstein Bears", "Stan and Jan"));
       books.add(new Book("6547901", "Curious George", "No Clue"));
       books.add(new Book("5678322222", "Samantha", "Me Myself"));

       ArrayList<LibraryMaterialCopy> bookCopies = new ArrayList<LibraryMaterialCopy>();
       for (LibraryMaterial b : books) {
           bookCopies.add(new BookCopy((Book) b));
       }

       ArrayList<LibraryCard> cards = new ArrayList<>();
       cards.add(new LibraryCard("123456", "Devorah Kletenik"));
       cards.add(new LibraryCard("87654", "Me and Me"));
       cards.add(new LibraryCard("8887654", "Sarah Kletenik"));

       for (LibraryMaterialCopy bc : bookCopies) {
           System.out.println(cards.get(0).checkOutLibraryMaterial(bc));
           System.out.println(cards.get(1).checkOutLibraryMaterial(bc));
           System.out.println(cards.get(2).checkOutLibraryMaterial(bc));
           System.out.println("Is Berenstein Bears title of the book:"+bc.isTitle("Berenstein Bears"));
       }

       List<LibraryMaterialCopy> bookCopies2 = cards.get(0).getLibraryMaterialsSorted();
       for (LibraryMaterialCopy book : bookCopies2)
           System.out.println(book.getTitle() + " " + book.getDueDate());

       System.out.println("got here");
       System.out.println(bookCopies.get(3).getTitle());
       ((BookCopy) bookCopies.get(3)).renew();

       System.out.println("renewed");

       bookCopies2 = cards.get(0).getLibraryMaterialsSorted();
       System.out.println("and here again");
       for (LibraryMaterialCopy book : bookCopies2)
           System.out.println(book.getTitle() + " " + book.getDueDate());

       System.out.println("here again");

       for (LibraryMaterialCopy bc : bookCopies) {
           System.out.println(cards.get(0).returnLibraryMaterial(bc));
           System.out.println(cards.get(1).returnLibraryMaterial(bc));
           System.out.println(cards.get(2).returnLibraryMaterial(bc));
       }

   }
}

Book.java


public class Book extends LibraryMaterial {
   private String author;

   public Book(String i, String t, String a) {
       super(i, t);
       author = a;
   }

   public String getAuthor() {
       return author;
   }

   public void print() {
       super.print();
       System.out.println("author: " + author);
   }
}

DVDCopy.java


public class DVDCopy extends LibraryMaterialCopy {
   public static final int BORROWING_WEEKS = 2;
   public static final double FINE_PER_DAY = 1;
   public static final boolean IS_RENEWABLE = false;
   private DVD dvd;

   public DVDCopy(DVD d) {
       super();
       dvd = d;
   }

   @Override
   public LibraryMaterial getLibraryMaterial() {
       return dvd;
   }

   @Override
   public String getTitle() {
       return dvd.getTitle();
   }

   @Override
   public String getISBN() {
       return dvd.getISBN();
   }

   public String getMainActor() {
       return dvd.getMainActor();
   }

   @Override
   public int getBorrowingWeeks() {
       return BORROWING_WEEKS;
   }

   @Override
   public double getFinePerDay() {
       return FINE_PER_DAY;
   }

   @Override
   public boolean isRenewable() {
       return IS_RENEWABLE;
   }

   public void print() {
       dvd.print();
       super.print();
   }

   @Override
   public boolean isTitle(String s) {
      
       if(this.dvd.getTitle().equals(s)) {
           return true;
       }
       return false;
   }
}

BookCopy.java


import java.time.*;

public class BookCopy extends LibraryMaterialCopy {
   private Book book;
   public static final int BORROWING_WEEKS = 3;
   public static final int RENEWAL_WEEKS = 2;
   public static final double FINE_PER_DAY = .10;
   public static final boolean IS_RENEWABLE = true;

   public BookCopy(Book b) {
       super();
       book = b;
   }

   @Override
   public LibraryMaterial getLibraryMaterial() {
       return book;
   }

   @Override
   public int getBorrowingWeeks() {
       return BORROWING_WEEKS;
   }

   @Override
   public double getFinePerDay() {
       return FINE_PER_DAY;
   }

   @Override
   public String getTitle() {
       return book.getTitle();
   }

   @Override
   public String getISBN() {
       return book.getISBN();
   }

   public String getAuthor() {
       return book.getAuthor();
   }

   @Override
   public boolean isRenewable() {
       return IS_RENEWABLE;
   }

   public boolean renew(LocalDate renewalDate) {
       if (card == null)
           return false;
       dueDate = renewalDate.plusWeeks(RENEWAL_WEEKS);
       return true;
   }

   public boolean renew()
   // default method uses todays date as renewal date
   {
       return renew(LocalDate.now());
   }

   public void print() {
       book.print();
       super.print();
   }

   @Override
   public boolean isTitle(String s) {

       if(this.book.getTitle().equals(s)) {
           return true;
       }
       return false;
   }
}

LibraryMaterialCopy.java


import java.time.LocalDate;

public abstract class LibraryMaterialCopy {
   protected LibraryCard card;
   protected LocalDate dueDate;

   public LibraryMaterialCopy() {
       card = null;
       dueDate = null;
   }

   public abstract LibraryMaterial getLibraryMaterial();

   public abstract String getTitle();

   public abstract String getISBN();

   public abstract int getBorrowingWeeks();

   public abstract double getFinePerDay();

   public abstract boolean isRenewable();
  
   public abstract boolean isTitle(String s);

   public LibraryCard getCard() {
       return card;
   }

   public LocalDate getDueDate() {
       return dueDate;
   }

   public boolean checkOut(LibraryCard borrower, LocalDate dateOfBorrowing)
   /*
   * checks book out by setting card reference to borrower. returns false if
   * book is already checked out sets due date to BORROWING_WEEKS after
   * current date passed
   */
   {
       if (card != null)
           return false;
       card = borrower;
       dueDate = dateOfBorrowing.plusWeeks(getBorrowingWeeks());
       return true;
   }

   public boolean checkOut(LibraryCard borrower)
   // default check out method that uses todays' date
   {
       return checkOut(borrower, LocalDate.now());
   }

   public boolean returnCopy()
   // returns book by removing card reference
   // returns false if there is no reference to a card
   {
       if (card == null)
           return false;
       card = null;
       return true;
   }

   public void print() {
       if (card != null) {
           System.out.println("Checked out to: " + card.getCardholderName() + ", " + card.getID());
           System.out.println("Due: " + dueDate);
       }
   }
}

LibraryMaterial.java


class LibraryMaterial {
   private String ISBN;
   private String title;

   public LibraryMaterial(String i, String t) {
       ISBN = i;
       title = t;
   }

   public String getISBN() {
       return ISBN;
   }

   public String getTitle() {
       return title;
   }

   public void print() {
       System.out.print("ISBN: " + ISBN + " title: " + title + " ");
   }
  
   public boolean isTitle(String s) {
       if(this.title.equals(s)) {
           return true;
       }
       return false;
   }
}

DVD.java


public class DVD extends LibraryMaterial {
   private String mainActor;

   public DVD(String i, String t, String mA) {
       super(i, t);
       mainActor = mA;
   }

   public String getMainActor() {
       return mainActor;
   }

   public void print() {
       super.print();
       System.out.println("Main actor: " + mainActor);
   }
}

Sample Output:

true

false

false

Is Berenstein Bears title of the book:false

true

false

false

Is Berenstein Bears title of the book:true

true

false

false

Is Berenstein Bears title of the book:false

true

false

false

Is Berenstein Bears title of the book:false

Harry Potter 2017-05-28

Berenstein Bears 2017-05-28

Curious George 2017-05-28

Samantha 2017-05-28

got here

Samantha

renewed

and here again

Samantha 2017-05-21

Harry Potter 2017-05-28

Berenstein Bears 2017-05-28

Curious George 2017-05-28

here again

true

false

false

true

false

false

true

false

false

true

false

false

Explanation / Answer

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

public class Catalog {

   HashMap<LibraryMaterial,ArrayList<LibraryMaterialCopy>> map=new HashMap<LibraryMaterial,ArrayList<LibraryMaterialCopy>>();
  
  
   public void add(LibraryMaterial m,int n)
   {
       ArrayList<LibraryMaterialCopy> copies=new ArrayList<LibraryMaterialCopy>();
      
   if(m instanceof Book)
   {
         
     
       for(int i=0;i<n;i++)
       {
           LibraryMaterialCopy c=new BookCopy((Book)m);
       copies.add(c);
       }
   }  
   else
   {
       for(int i=0;i<n;i++)
           {
               LibraryMaterialCopy c=new DVDCopy((DVD)m);
           copies.add(c);
           }
   }
     
       map.put(m,copies);
   }
  
   public Collection<LibraryMaterialCopy> lookUpByMaterial(LibraryMaterial m)
   {
       if(map.containsKey(m))
       {
           return map.get(m);
       }
      
       return null;
   }
  
   public Collection<LibraryMaterialCopy> lookUpByTitle(String title)
   {
      
       for (LibraryMaterial m : map.keySet()) {
             
           if(m.getTitle().equals(title))
           {
               return map.get(m);
           }
       }


       return null;
   }
  
  
   public Collection<LibraryMaterialCopy> availableCopies(LibraryMaterial m)
   {
       ArrayList<LibraryMaterialCopy>    copies=map.get(m);


       ArrayList<LibraryMaterialCopy> availablecopies=new ArrayList<LibraryMaterialCopy>() ;
      
      
      
      
       for(LibraryMaterialCopy c: copies)
       {
           if(c.dueDate==null)
           {
               availablecopies.add(c);
           }
       }
      

       return availablecopies;
   }
  
  
  
   public Collection<LibraryMaterial> availableCopies()
   {
      
       ArrayList<LibraryMaterial> materials=new ArrayList<LibraryMaterial>(map.keySet());
       return materials;
   }
  
  
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote