package ora.jwsnut.chapter2.bookservice;
import java.util.HashMap;
/**
* Implementation class for the books web service.
*/
public class BookServiceServant implements BookQuery {
/**
* Gets the number of books known to the service
* @return the number of books known to the service.
*/
public int getBookCount() {
return BookServiceServantData.getBookInfo().length;
}
/**
* Get the author for a book with a given name.
* @param name the name of the book.
* @return the author of the book, or <code>null</code>
* if no matching book can be found.
*/
public String getAuthor(String name) {
BookInfo book = findBook(name);
return book == null ? null : book.getAuthor();
}
/**
* Gets the name of the editor for a book.
* @param name the name of the book.
* @return the editor of the book, or <code>null</code>
* if no matching book can be found.
*/
public String getEditor(String name) {
BookInfo book = findBook(name);
return book == null ? null : book.getEditor();
}
/**
* Gets the price of a book with a given name. If the given
* name does not match with a known book, a BookServiceException
* is thrown.
* @param name the name of the book.
* @return the price of the book.
*/
public double getPrice(String name) throws BookServiceException {
BookInfo book = findBook(name);
if (book == null) {
// No such book - throw an exception
throw new BookServiceException("No matching book for '" + name + "'");
}
return book.getPrice();
}
/**
* Gets information for all known books, in the form of an array.
* @return an array of <code>BookInfo</code> objects with one
* entry for each book.
*/
public BookInfo[] getBookInfo() {
return BookServiceServantData.getBookInfo();
}
/**
* Returns all of the books known to the book
* service in the form of a <code>HashMap</code> where the
* key to each entry is the book title in upper case
* and the value is a <code>BookInfo</code> object.
*/
public HashMap getBookMap() {
return BookServiceServantData.getBookInfoHashMap();
}
/* -- Implementation details -- */
/**
* Looks for a book whose title matches a given string.
* The comparison is case-insensitive.
* @param name the string to match against the book name
* @return the <code>BookInfo</code> object for the first
* matching book, or <code>null</code> if no match exists.
*/
private BookInfo findBook(String name) {
BookInfo[] books = BookServiceServantData.getBookInfo();
for (int i = 0; i < books.length; i++) {
if (books[i].getTitle().equalsIgnoreCase(name)) {
// Found a match
return books[i];
}
}
return null; // No match
}
}
|