/* @see loci.formats.FormatReader#initFile(String) */
  protected void initFile(String id) throws FormatException, IOException {
    super.initFile(id);
    reader = new ImageReader();

    reader.setMetadataOptions(getMetadataOptions());
    reader.setMetadataFiltered(isMetadataFiltered());
    reader.setOriginalMetadataPopulated(isOriginalMetadataPopulated());
    reader.setNormalized(isNormalized());
    reader.setMetadataStore(getMetadataStore());

    // NB: We need a raw handle on the ZIP data itself, not a ZipHandle.
    IRandomAccess rawHandle = Location.getHandle(id, false, false);
    in = new RandomAccessInputStream(rawHandle, id);

    ZipInputStream zip = new ZipInputStream(in);
    while (true) {
      ZipEntry ze = zip.getNextEntry();
      if (ze == null) break;
      ZipHandle handle = new ZipHandle(id, ze);
      Location.mapFile(ze.getName(), handle);
      mappedFiles.add(ze.getName());
    }

    ZipHandle base = new ZipHandle(id);
    reader.setId(base.getEntryName());

    metadataStore = reader.getMetadataStore();
    core = reader.getCoreMetadata();
    metadata = reader.getGlobalMetadata();

    base.close();
  }
 /**
  * Checks that the given id points at a valid data stream.
  *
  * @param id The id string to validate.
  * @throws IOException if the id is not valid.
  */
 public static void checkValidId(String id) throws IOException {
   if (getMappedFile(id) != null) {
     // NB: The id maps directly to an IRandomAccess handle, so is valid. Do
     // not destroy an existing mapped IRandomAccess handle by closing it.
     return;
   }
   // NB: Try to actually open a handle to make sure it is valid. Close it
   // afterward so we don't leave it dangling. The process of doing this will
   // throw IOException if something goes wrong.
   Location.getHandle(id).close();
 }
 private static IRandomAccess getHandle(String file) throws IOException {
   return Location.getHandle(file, false, false);
 }