/*
 *
 * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * This software is the proprietary information of Sun Microsystems, Inc.  
 * Use is subject to license terms.
 * 
 */

package database;

import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.util.*;
import exception.*;

public class BookDB {

   private ArrayList books;
    Connection con;
    private boolean conFree = true;
    private String dbName = "java:comp/env/jdbc/BookDB";

   public BookDB () throws Exception {
      try  {               
         InitialContext ic = new InitialContext();
         DataSource ds = (DataSource) ic.lookup(dbName);
         con =  ds.getConnection();     
      } catch (Exception ex) {
         throw new Exception("Couldn't open connection to database: " + ex.getMessage());
      }	 	
    		
   }
    
    public void remove () {
      try {
         getConnection().close();
      } catch (SQLException ex) {
         System.out.println(ex.getMessage());
      }
    }

     protected synchronized Connection getConnection() {
         while (conFree == false) {
            try {
               wait();
            } catch (InterruptedException e) {
            }
         }
         conFree = false;
         notify();
         return con;
    }

    protected synchronized void releaseConnection() {
        while (conFree == true) {
            try {
               wait();
            } catch (InterruptedException e) {
            }
         }
         conFree = true;
         notify();
   }
    
   public int getNumberOfBooks() throws BooksNotFoundException {
    			getConnection();
            books = new ArrayList();
                try {

                     String selectStatement =
                                       "select * " + 
                                       "from books";
                     PreparedStatement prepStmt = 
                                       con.prepareStatement(selectStatement);
                     ResultSet rs = prepStmt.executeQuery();

                     while (rs.next()) {
                        BookDetails bd = new BookDetails(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), 
                              rs.getFloat(5), rs.getInt(6), rs.getString(7));
                        books.add(bd);
                     }
                     prepStmt.close();
                } catch (SQLException ex) {
                  releaseConnection();
                  throw new BooksNotFoundException(ex.getMessage());
                }
            releaseConnection();
            return books.size();
   }

   public Collection getBooks() throws BooksNotFoundException {
    		getConnection();
   		books = new ArrayList();
         try {
         
               String selectStatement =
                           "select * " + 
                           "from books";
               PreparedStatement prepStmt = 
                           con.prepareStatement(selectStatement);
               ResultSet rs = prepStmt.executeQuery();

               

               while (rs.next()) {
                  BookDetails bd = new BookDetails(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), 
                     rs.getFloat(5), rs.getInt(6), rs.getString(7));
                     books.add(bd);
               }
               prepStmt.close();
         } catch (SQLException ex) {
            releaseConnection();
            throw new BooksNotFoundException(ex.getMessage());
         }

      Collections.sort(books);
      releaseConnection();
      return books;
   }

   public BookDetails getBookDetails(String bookId) throws BookNotFoundException {
         getConnection();
         try {
               String selectStatement =
                                 "select * " +
                                 "from books where id = ? ";
               PreparedStatement prepStmt = 
                                 con.prepareStatement(selectStatement);

               prepStmt.setString(1, bookId);

               ResultSet rs = prepStmt.executeQuery();

            if (rs.next()) {
                BookDetails bd = new BookDetails(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), 
                     rs.getFloat(5), rs.getInt(6), rs.getString(7));
                prepStmt.close();
                releaseConnection();
                return bd;

            }
            else {					
          		 prepStmt.close();
                releaseConnection();
                throw new BookNotFoundException("Couldn't find book: " + bookId);
            }
         } catch (SQLException ex) {
               releaseConnection();
               throw new BookNotFoundException("Couldn't find book: " + bookId + ex.getMessage());
         }
      }
}
