IOProvider:

 * The IOProvider shall be public and contain the public accessor methods for
   implementing classes.
 * The IOProvider shall provide various read and skip methods for each data 
   type.
 * The IOProvider shall allow the user to get a list of available DOMs and set
   which DOMs should be read from.
 * The IOProvider shall have constructors allowing the user to connect to a
   DOMHub or one or more files.
 * The methods of the IOProvider shall invoke the appropriate methods of the
   appropriate package classes.
 * The constructor of the IOProvider shall initialize the file looper if 
   appropriate.
 * The getAvailableDoms method shall invoke the RMI methods of DomHubApp to
   determine the DOMs connected to it if appropriate.
 * If connecting to a DOMHub, the setUsedDoms method shall initialize the 
   socket reader.
 * The IOProvider shall return an exception if a user attempts to read from a
   DOMHub before calling setUsedDoms

InputFileLooper:

 * The InputFileLooper shall be protected and shall be responsible for managing
   all file reading operations.
 * The InputFileLooper shall distinguish between ZIP archives and data files.
 * The InputFileLooper shall contain a list of all input files and the DOMs
   to be read from each file.
 * The InputFileLooper shall throw an exception if a read command is issued 
   which cannot be processed.  (For example, if neither the current file nor 
   any subsequent file contains the appropriate data type.)
 * The InputFileLooper shall advance to the next appropriate file if a read 
   command is issued for a data type not contained in the current file.
 * The InputFileLooper shall advance to the next file if a read command is
   issued for a data type which has run out in the current file.
 * The list of input files available to the looper shall be filled in the 
   constructor.
 * The methods of the InputFileLooper shall invoke the appropriate methods in
   its current child.
 * The InputFileLooper shall assume that single files contain data of the most
   recent format.

InputFile:

 * The InputFile shall contain a list of Strings containing the Ids of the
   DOMs to be read.
 * The InputFile shall contain a list of Strings containing the Ids of all 
   available DOMs.
 * Each InputFile shall be associated with a specific file on disk.
 * The constructor of the InputFile shall determine which DOMs are available in
   its associated file.
 * The InputFile shall contain a method to setUsedDoms.
   - When setUsedDoms is invoked, it shall compare the list of used DOMs to the
     list of available DOMs and create a short list of the Strings common to 
     both lists.

ZipFileReader:

 * The ZipFileReader shall unpack the contents of a ZIP archive into temporary
   files with well-defined names in the current working directory.
 * The ZipFileReader shall provide a static method to determine the DOMs 
   available in a given file (either ZIP or otherwise).
 * If the getAvailableDoms method is passed a filename that does not correspond
   to a ZIP archive, it shall return a string of zeros.

RunHeaderReader:

 * The RunHeaderReader shall implement SAX interfaces to parse the beginning of
   a RunHeader document.
 * The RunHeaderReader shall locate the version information for a run header
   and use it to create a VersionedRunHeaderReader.
 * The RunHeaderReader shall implement both SAX reading and error methods.
 * The RunHeaderReader shall create an appropriate VersionedHeaderReader as 
   soon as it finishes parsing the run header.

VersionedHeaderReader:

 * A VersionedHeaderReader shall use JAXB to read a specific run header 
   format associated with its version id.
 * A VersionedHeaderReader shall contain references to VersionedDataReaders
   for the other files in its archive.
 * A VersionedHeaderReader shall read the run header during construction.
 * A new VersionedHeaderReader shall be created for each new format of the run
   header.
 
SocketReader:

 * The SocketReader shall contain lists of the hit, monitor and rap cal sockets
   to which it is connected.
 * The SocketReader shall contain lists of DOM Id Strings corresponding to its
   lists of sockets.
 * The hasNext method of the SocketReader shall always return true unless the
   sockets have been closed.
 * The SocketReader shall have read methods that read from a specific DOM,
   specified by DOM id, and from each DOM in sequence.
 * When reading multiple records in one method call, all records shall come 
   from the same DOM.
 * The SocketReader shall contain lists of VersionedDataReaders associated 
   with the lists of data sockets.
 * The SocketReader shall assume that data produced by a DOMHub is of the most
   recent format.

VersionedDataReader:

 * A new VersionedDataReader class shall be created for each new data format.
 * Each VersionedDataReader class shall have a descriptive name including the
   read methods which invoke it and a version tag as follows: V#R#
 * The MonitorReader shall itself wrap three readers, two of which will have a 
   different version tag.  These event readers have a version tag V# that 
   reflects the intrinsic version information contained in monitor records.
 * The read method of the VersionedDataReader shall check the DOM id of the
   record it has read against the list of used DOMs.
   - If the DOM Id does not appear in the list of of used DOMs, the reader 
     shall continue reading until an appropriate record is found, or the end of
     input is reached.
