FileDocCategorySizeDatePackage
EBookServiceServantData.javaAPI DocExample4397Wed Oct 09 14:49:00 BST 2002ora.jwsnut.chapter6.extendedbookservice

EBookServiceServantData.java

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;       
    }
}