EntryInputStream(final ZipEntry entry, final InputStream in)
EntryInputStream(final ZipEntry entry, final InputStream in, final JarFile jar)
    EntryInputStream(final ZipEntry entry, final InputStream in)      throws IOException    {      super(in);      this.entry = entry;      length = entry.getSize();      pos = 0;      checked = false;      Attributes attr = manifest.getAttributes(entry.getName());      if (DEBUG)        debug("verifying entry " + entry + " attr=" + attr);      if (attr == null)        {          hashes = new byte[0][];          md = new MessageDigest[0];        }      else        {          List hashes = new LinkedList();          List md = new LinkedList();          for (Iterator it = attr.entrySet().iterator(); it.hasNext(); )            {              Map.Entry e = (Map.Entry) it.next();              String key = String.valueOf(e.getKey());              if (key == null)                continue;              if (!key.endsWith(DIGEST_KEY_SUFFIX))                continue;              hashes.add(Base64InputStream.decode((String) e.getValue()));              try                {                  md.add(MessageDigest.getInstance                         (key.substring(0, key.length() - DIGEST_KEY_SUFFIX.length())));                }              catch (NoSuchAlgorithmException nsae)                {                  IOException ioe = new IOException("no such message digest: " + key);                  ioe.initCause(nsae);                  throw ioe;                }            }          if (DEBUG)            debug("digests=" + md);          this.hashes = (byte[][]) hashes.toArray(new byte[hashes.size()][]);          this.md = (MessageDigest[]) md.toArray(new MessageDigest[md.size()]);        }    }