home *** CD-ROM | disk | FTP | other *** search
/ Java Certification Exam Guide / McGrawwHill-JavaCertificationExamGuide.iso / pc / Web Links and Code / code / chap27 / DB.java < prev    next >
Encoding:
Java Source  |  1997-04-20  |  4.9 KB  |  194 lines

  1. import java.io.*;
  2.  
  3. /**
  4.  * Record format is:
  5.  * <num records>
  6.  * <name> <seat #>
  7.  * repeat as necessary
  8.  */
  9. public class DB {
  10.    public static final String FILE_NAME = "Reservations.db";
  11.    public static final int MAX_SEATS = 5;
  12.  
  13.    private static final int ACTIVE_REC = 0;
  14.    private static final int DELETED_REC = 1;
  15.  
  16.    private boolean open;
  17.    private RandomAccessFile file;
  18.  
  19.    public DB() throws IOException {
  20.       try {
  21.          File test = new File(FILE_NAME);
  22.          boolean alreadyExisted = test.exists();
  23.          file = new RandomAccessFile(FILE_NAME, "rw");
  24.          open = true;
  25.  
  26.          if (!alreadyExisted) {
  27.             FileHeader header = new FileHeader();
  28.             writeHeader(header);
  29.          }
  30.  
  31.       } catch (IOException x) {
  32.          close();
  33.          throw x;
  34.       }
  35.    }
  36.  
  37.    public synchronized String[] getPassengerList() throws IOException {
  38.       String[] reservations = null;
  39.  
  40.       // PLACE YOUR CODE HERE.
  41.  
  42.       return reservations;
  43.    }
  44.       
  45.    public synchronized int getSeat(String passenger)
  46.       throws IOException, SeatNotFoundException
  47.    {
  48.       int seat = 0; 
  49.  
  50.       // PLACE YOUR CODE HERE.
  51.  
  52.       return seat;
  53.    }
  54.  
  55.    public synchronized void reservePassenger(String passenger, int seat)
  56.       throws IOException, SeatTakenException
  57.    {
  58.    
  59.       // PLACE YOUR CODE HERE. 
  60.  
  61.    }
  62.  
  63.    public synchronized int[] getOpenSeats() throws IOException {
  64.       PassengerRecord record;
  65.  
  66.       FileHeader header = readHeader();
  67.       // Do the case where there are no seats:
  68.       if (header.numPassengers == MAX_SEATS)
  69.          return new int[0];
  70.  
  71.       // Do the case where all seats are still available.
  72.       if (header.numPassengers == 0) {
  73.          int[] open = {1, 2, 3, 4, 5};
  74.          return open;
  75.       }
  76.  
  77.       // Determine the open seats from the reserved seats.
  78.       boolean[] reserved = new boolean[MAX_SEATS];
  79.       String passenger;
  80.       for (int i = 0; i < header.numPassengers; i++) {
  81.          record = readNextRecord();
  82.          reserved[record.getSeat() - 1] = true;
  83.       }
  84.  
  85.       // Make the int array only as large as it needs to be.    
  86.       int[] open = new int[MAX_SEATS - header.numPassengers];
  87.       int next = 0;
  88.       for (int i = 0; i < MAX_SEATS; i++) {
  89.          if (reserved[i] == false)
  90.             open[next++] = i + 1;
  91.       }
  92.  
  93.       return open;
  94.    }
  95.  
  96.    public synchronized void deletePassenger(String name) 
  97.       throws IOException 
  98.    {
  99.       FileHeader header = readHeader();
  100.  
  101.       boolean found = false;
  102.       PassengerRecord record = null; // make the compiler happy
  103.       for (int i = 0; i < header.numPassengers && !found; i++) {         
  104.          record = readNextRecord();
  105.          if (name.equals(record.getName()))
  106.             found = true;
  107.       }
  108.  
  109.       // Delete at the position before we read the record to be deleted.
  110.       if (found) {
  111.          file.seek(record.getPtr());
  112.          file.write(DELETED_REC);
  113.  
  114.          header.numPassengers--;
  115.          writeHeader(header);
  116.       }
  117.    }
  118.  
  119.    public synchronized void close() {
  120.       if (open) {
  121.          try {
  122.             file.close();
  123.          } catch (IOException x) {
  124.             System.out.println(x.getMessage());
  125.          } finally {
  126.             open = false;
  127.          }
  128.       }
  129.    }
  130.  
  131.    public void finalize() throws Throwable {
  132.       close();
  133.       super.finalize();
  134.    }
  135.  
  136.    private synchronized PassengerRecord readNextRecord() 
  137.       throws IOException  
  138.    {
  139.       boolean looking = true;
  140.       PassengerRecord record = new PassengerRecord();
  141.  
  142.       try {
  143.          while (looking) {
  144.             record.setPtr(file.getFilePointer());
  145.             int type = file.readInt();
  146.             record.setName(file.readUTF());
  147.             record.setSeat(file.readInt());
  148.             if (type == ACTIVE_REC)
  149.                looking = false;
  150.          }
  151.       } catch (EOFException x) {
  152.          System.out.println("read past the end of the file");
  153.       }
  154.  
  155.       return record;
  156.    }
  157.  
  158.    private synchronized void writeRecord(PassengerRecord record) 
  159.       throws IOException 
  160.    {
  161.       FileHeader header = readHeader();
  162.       header.totalRecords++;
  163.       header.numPassengers++;
  164.       writeHeader(header);
  165.  
  166.       file.seek(file.length());
  167.       file.writeInt(ACTIVE_REC);
  168.       file.writeUTF(record.getName());
  169.       file.writeInt(record.getSeat());
  170.    }
  171.  
  172.    private synchronized FileHeader readHeader() throws IOException {
  173.       FileHeader header = new FileHeader();
  174.       file.seek(0);
  175.       header.totalRecords = file.readInt();
  176.       header.numPassengers = file.readInt();
  177.       return header;
  178.    }
  179.  
  180.    private synchronized void writeHeader(FileHeader header) 
  181.       throws IOException 
  182.    {
  183.       file.seek(0);
  184.       file.writeInt(header.totalRecords);
  185.       file.writeInt(header.numPassengers);
  186.    }
  187.  
  188. }
  189.  
  190. class FileHeader {
  191.    int totalRecords;
  192.    int numPassengers;
  193. }
  194.