/**
   * overriding getResource() because we want to search FIRST in this ClassLoader, then the parent,
   * the path, etc.
   */
  public URL getResource(String name) {
    try {
      if (jar != null) {
        ZipFile zipFile = jar.getZipFile();
        ZipEntry entry = zipFile.getEntry(name);
        if (entry != null) {
          return new URL(getResourceAsPath(name));
        }
      }

      Object obj = resourcesHash.get(name);
      if (obj instanceof JARClassLoader) {
        JARClassLoader classLoader = (JARClassLoader) obj;
        return classLoader.getResource(name);
      } else {
        URL ret = getSystemResource(name);
        if (ret != null) {
          Log.log(
              Log.DEBUG,
              JARClassLoader.class,
              "Would have returned null for getResource(" + name + ")");
          Log.log(Log.DEBUG, JARClassLoader.class, "returning(" + ret + ")");
        }
        return ret;
      }
    } catch (IOException io) {
      Log.log(Log.ERROR, this, io);
      return null;
    }
  } // }}}
  /** @exception ClassNotFoundException if the class could not be found */
  public Class loadClass(String clazz, boolean resolveIt) throws ClassNotFoundException {
    ClassNotFoundException pending = null;
    if (delegateFirst) {
      try {
        return loadFromParent(clazz);
      } catch (ClassNotFoundException cnf) {
        // keep going if class was not found.
        pending = cnf;
      }
    }

    Object obj = classHash.get(clazz);
    if (obj == NO_CLASS) {
      // we remember which classes we don't exist
      // because BeanShell tries loading all possible
      // <imported prefix>.<class name> combinations
      throw new ClassNotFoundException(clazz);
    } else if (obj instanceof JARClassLoader) {
      JARClassLoader classLoader = (JARClassLoader) obj;
      try {
        return classLoader._loadClass(clazz, resolveIt);
      } catch (ClassNotFoundException cnf2) {
        classHash.put(clazz, NO_CLASS);
        throw cnf2;
      }
    } else if (delegateFirst) {
      // if delegating, reaching this statement means
      // the class was really not found. Otherwise
      // we'll try loading from the parent class loader.
      throw pending;
    }

    return loadFromParent(clazz);
  } // }}}
  // {{{ getResourceAsStream() method
  public InputStream getResourceAsStream(String name) {
    try {
      // try in current jar first
      if (jar != null) {
        ZipFile zipFile = jar.getZipFile();
        ZipEntry entry = zipFile.getEntry(name);
        if (entry != null) {
          return zipFile.getInputStream(entry);
        }
      }
      // then try from another jar
      Object obj = resourcesHash.get(name);
      if (obj instanceof JARClassLoader) {
        JARClassLoader classLoader = (JARClassLoader) obj;
        return classLoader.getResourceAsStream(name);
      }
      // finally try from the system class loader
      return getSystemResourceAsStream(name);
    } catch (IOException io) {
      Log.log(Log.ERROR, this, io);

      return null;
    }
  } // }}}