package ora.jwsnut.chapter6.extendedbookservice;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;
/**
* A class that loads the data for the extended book service
*/
class EBookServiceServantData {
/**
* The image data in the form of a HashMap, created when it is
* first requested.
*/
private static HashMap bookImageMap;
/**
* HashMap containing the XML details for each book.
*/
private static HashMap bookDetailsMap;
/**
* List of book titles.
*/
private static String[] bookTitles;
/**
* Buffer used when reading image data
*/
private static byte[] buffer;
/**
* Stream used when reading image data
*/
private static ByteArrayOutputStream os;
/**
* Gets a list of all known books.
*/
public static String[] getBookTitles() {
loadData();
return bookTitles;
}
/**
* Gets the image data for a book with a
* given title.
*/
public static byte[] getImageData(String title, boolean gif) {
byte[][] data = (byte[][])bookImageMap.get(title.trim().toUpperCase());
return data == null ? null : data[gif ? 1 : 0];
}
/**
* Gets the XML details for a book with a given title.
*/
public static String getXMLDetails(String title) {
return (String)bookDetailsMap.get(title.trim().toUpperCase());
}
/**
* Loads the book data from information contained
* in the booklist.txt file.
*/
private static void loadData() {
if (bookImageMap == null) {
// First request - create the data
bookImageMap = new HashMap();
bookDetailsMap = new HashMap();
ArrayList list = new ArrayList();
try {
buffer = new byte[1024];
os = new ByteArrayOutputStream();
InputStream is =
EBookServiceServantData.class.getResourceAsStream("booklist.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, "!");
if (st.countTokens() == 4) {
String title = st.nextToken();
String canonicalTitle = title.trim().toUpperCase();
String jpegImagePath = st.nextToken();
String gifImagePath = st.nextToken();
String xmlDetails = st.nextToken();
// Load the images
byte[][] imageData = new byte[2][];
imageData[0] = getImage(jpegImagePath);
imageData[1] = getImage(gifImagePath);
// Store the details and the images
bookImageMap.put(canonicalTitle, imageData);
bookDetailsMap.put(canonicalTitle, xmlDetails);
// Add a new book title
list.add(title);
}
}
bookTitles = new String[list.size()];
list.toArray(bookTitles);
} catch (Exception ex) {
// Just return an empty or partial list
ex.printStackTrace();
}
}
}
/**
* Reads an image file and returns the content.
*/
private static byte[] getImage(String path) throws IOException {
InputStream is = EBookServiceServantData.class.getResourceAsStream(path);
int count;
while ((count = is.read(buffer, 0, buffer.length)) > 0) {
os.write(buffer, 0, count);
}
byte[] content = os.toByteArray();
os.reset();
return content;
}
} |