private synchronized Map signerMap() {
   if (signerMap == null) {
     /*
      * Snapshot signer state so it doesn't change on us. We care
      * only about the asserted signatures. Verification of
      * signature validity happens via the JarEntry apis.
      */
     signerMap = new HashMap(verifiedSigners.size() + sigFileSigners.size());
     signerMap.putAll(verifiedSigners);
     signerMap.putAll(sigFileSigners);
   }
   return signerMap;
 }
  /*
   * Like entries() but screens out internal JAR mechanism entries
   * and includes signed entries with no ZIP data.
   */
  public Enumeration<JarEntry> entries2(final JarFile jar, Enumeration e) {
    final Map map = new HashMap();
    map.putAll(signerMap());
    final Enumeration enum_ = e;
    return new Enumeration<JarEntry>() {

      Enumeration signers = null;
      JarEntry entry;

      public boolean hasMoreElements() {
        if (entry != null) {
          return true;
        }
        while (enum_.hasMoreElements()) {
          ZipEntry ze = (ZipEntry) enum_.nextElement();
          if (JarVerifier.isSigningRelated(ze.getName())) {
            continue;
          }
          entry = jar.newEntry(ze);
          return true;
        }
        if (signers == null) {
          signers = Collections.enumeration(map.keySet());
        }
        while (signers.hasMoreElements()) {
          String name = (String) signers.nextElement();
          entry = jar.newEntry(new ZipEntry(name));
          return true;
        }

        // Any map entries left?
        return false;
      }

      public JarEntry nextElement() {
        if (hasMoreElements()) {
          JarEntry je = entry;
          map.remove(je.getName());
          entry = null;
          return je;
        }
        throw new NoSuchElementException();
      }
    };
  }