/*************************** Library.java **************************/
import java.io.*;
import java.util.LinkedList;
class Author {
String name;
BookList books = new BookList();
Author() {
}
public boolean equals(Object node) {
return name.equals(((Author) node).name);
}
void display() {
System.out.println(name);
books.display();
}
}
class Book {
String title;
Person person = null;
Book() {
}
public boolean equals(Object node) {
return title.equals(((Book) node).title);
}
public String toString() {
return " * " + title +
(person != null ? " - checked out to " + person.name : "") + "\n";
}
}
class CheckedOutBook {
Author author = null;
Book book = null;
CheckedOutBook() {
}
public boolean equals(Object node) {
return book.title.equals(((CheckedOutBook) node).book.title) &&
author.name.equals(((CheckedOutBook) node).author.name);
}
public String toString() {
return " * " + author.name + ", " + book.title + "\n";
}
}
class Person {
String name;
BookList books = new BookList();
Person() {
}
public boolean equals(Object node) {
return name.equals(((Person) node).name);
}
void display() {
if (!books.isEmpty()) {
System.out.println(name + " has the following books:");
books.display();
}
else System.out.print(name + " has no books");
}
}
class AuthorList extends LinkedList {
AuthorList() {
super();
}
void display() {
Object[] authors = toArray();
for (int i = 0; i < authors.length; i++)
((Author)authors[i]).display();
}
}
class BookList extends LinkedList {
BookList() {
super();
}
void display() {
for (int i = 0; i < size(); i++)
System.out.print(get(i).toString());
}
}
class PersonList extends LinkedList {
PersonList() {
super();
}
void display() {
for (java.util.Iterator it = iterator(); it.hasNext(); )
((Person)it.next()).display();
}
}
class Library {
static AuthorList[] catalog = new AuthorList[(int)('Z'+1)];
static PersonList[] people = new PersonList[(int)('Z'+1)];
static String input;
static InputStreamReader cin = new InputStreamReader(System.in);
static BufferedReader buffer = new BufferedReader(cin);
static String getString(String msg) {
System.out.print(msg + " ");
System.out.flush();
try {
input = buffer.readLine();
} catch(IOException io) {
}
return input.substring(0,1).toUpperCase() + input.substring(1);
}
static void status() {
System.out.println("Library has the following books:\n ");
for (int i = (int) 'A'; i <= (int) 'Z'; i++)
if (!catalog[i].isEmpty())
catalog[i].display();
System.out.println("\nThe following people are using the library:\n ");
for (int i = (int) 'A'; i <= (int) 'Z'; i++)
if (!people[i].isEmpty())
people[i].display();
}
static void includeBook() {
Author newAuthor = new Author();
int oldAuthor;
Book newBook = new Book();
newAuthor.name = getString("Enter author's name:");
newBook.title = getString("Enter the title of the book:");
oldAuthor = catalog[(int) newAuthor.name.charAt(0)].indexOf(newAuthor);
if (oldAuthor == -1) {
newAuthor.books.add(newBook);
catalog[(int) newAuthor.name.charAt(0)].add(newAuthor);
}
else ((Author)catalog[(int) newAuthor.name.charAt(0)].get(oldAuthor)).
books.add(newBook);
}
static void checkOutBook() {
Person person = new Person(), personRef = new Person();
Author author = new Author(), authorRef = new Author();
Book book = new Book(), bookRef = new Book();
int personIndex, bookIndex = -1, authorIndex = -1;
CheckedOutBook bookToCheckOut = new CheckedOutBook();
person.name = getString("Enter person's name:");
while (authorIndex == -1) {
author.name = getString("Enter author's name:");
authorIndex = catalog[(int) author.name.charAt(0)].indexOf(author);
if (authorIndex == -1)
System.out.println("Misspelled author's name");
}
while (bookIndex == -1) {
book.title = getString("Enter the title of the book:");
authorRef = (Author) catalog[(int) author.name.charAt(0)].get(authorIndex);
bookIndex = authorRef.books.indexOf(book);
if (bookIndex == -1)
System.out.println("Misspelled title");
}
bookRef = (Book) authorRef.books.get(bookIndex);
bookToCheckOut.author = authorRef;
bookToCheckOut.book = bookRef;
personIndex = people[(int) person.name.charAt(0)].indexOf(person);
if (personIndex == -1) { // a new person in the library;
person.books.add(bookToCheckOut);
people[(int) person.name.charAt(0)].add(person);
bookRef.person = (Person) people[(int) person.name.charAt(0)].getFirst();
}
else {
personRef = (Person) people[(int) person.name.charAt(0)].get(personIndex);
personRef.books.add(bookToCheckOut);
bookRef.person = personRef;
}
}
static void returnBook() {
Person person = new Person();
CheckedOutBook checkedOutBook = new CheckedOutBook();
Book book = new Book();
Author author = new Author(), authorRef = new Author();
int personIndex = -1, bookIndex = -1, authorIndex = -1;
while (personIndex == -1) {
person.name = getString("Enter person's name:");
personIndex = people[(int) person.name.charAt(0)].indexOf(person);
if (personIndex == -1)
System.out.println("Person's name misspelled");
}
while (authorIndex == -1) {
author.name = getString("Enter author's name:");
authorIndex = catalog[(int) author.name.charAt(0)].indexOf(author);
if (authorIndex == -1)
System.out.println("Misspelled author's name");
}
while (bookIndex == -1) {
book.title = getString("Enter the title of the book:");
authorRef = (Author) catalog[(int) author.name.charAt(0)].get(authorIndex);
bookIndex = authorRef.books.indexOf(book);
if (bookIndex == -1)
System.out.println("Misspelled title");
}
checkedOutBook.author = authorRef;
checkedOutBook.book = (Book) authorRef.books.get(bookIndex);
((Book)authorRef.books.get(bookIndex)).person = null;
((Person)people[(int) person.name.charAt(0)].get(personIndex)).
books.remove(checkedOutBook);
}
static char menu() {
return getString("\nEnter one of the following options:\n" +
"1. Include a book in the catalog\n" +
"2. Check out a book\n" +
"3. Return a book\n4. Status\n5. Exit\n" +
"Your option:").charAt(0);
}
public static void main(String args[]) {
for (int i = 0; i <= (int) 'Z'; i++) {
catalog[i] = new AuthorList();
people[i] = new PersonList();
}
while (true)
switch (menu()) {
case '1': includeBook(); break;
case '2': checkOutBook(); break;
case '3': returnBook(); break;
case '4': status(); break;
case '5': return;
default: System.out.println("Wrong option, try again.");
}
}
}