/**
   * Fetches a resource from the local repository.
   *
   * @param path the path to the resource (ie. "config/miso.properties"). This should not begin with
   *     a slash.
   * @exception IOException thrown if a problem occurs locating or reading the resource.
   */
  public InputStream getResource(String path) throws IOException {
    String localePath = getLocalePath(path);
    InputStream in;

    // first look for this resource in our default resource bundle
    for (ResourceBundle bundle : _default) {
      // Try a localized version first.
      if (localePath != null) {
        in = bundle.getResource(localePath);
        if (in != null) {
          return in;
        }
      }
      // If that didn't work, try generic.
      in = bundle.getResource(path);
      if (in != null) {
        return in;
      }
    }

    // fallback next to an unpacked resource file
    File file = getResourceFile(path);
    if (file != null && file.exists()) {
      return new FileInputStream(file);
    }

    // if we still didn't find anything, try the classloader; first try a locale-specific file
    if (localePath != null) {
      in = getInputStreamFromClasspath(PathUtil.appendPath(_rootPath, localePath));
      if (in != null) {
        return in;
      }
    }

    // if we didn't find that, try locale-neutral
    in = getInputStreamFromClasspath(PathUtil.appendPath(_rootPath, path));
    if (in != null) {
      return in;
    }

    // if we still haven't found it, we throw an exception
    throw new FileNotFoundException("Unable to locate resource [path=" + path + "]");
  }
  /**
   * Fetches and decodes the specified resource into a {@link BufferedImage}.
   *
   * @exception FileNotFoundException thrown if the resource could not be located in any of the
   *     bundles in the specified set, or if the specified set does not exist.
   * @exception IOException thrown if a problem occurs locating or reading the resource.
   */
  public BufferedImage getImageResource(String path) throws IOException {
    String localePath = getLocalePath(path);

    // first look for this resource in our default resource bundle
    for (ResourceBundle bundle : _default) {
      // try a localized version first
      BufferedImage image;
      if (localePath != null) {
        image = bundle.getImageResource(localePath, false);
        if (image != null) {
          return image;
        }
      }
      // if we didn't find that, try generic
      image = bundle.getImageResource(path, false);
      if (image != null) {
        return image;
      }
    }

    // fallback next to an unpacked resource file
    File file = getResourceFile(path);
    if (file != null && file.exists()) {
      return loadImage(file, path.endsWith(FastImageIO.FILE_SUFFIX));
    }

    // if we still didn't find anything, try the classloader
    InputStream in;
    if (localePath != null) {
      in = getInputStreamFromClasspath(PathUtil.appendPath(_rootPath, localePath));
      if (in != null) {
        return loadImage(in);
      }
    }
    in = getInputStreamFromClasspath(PathUtil.appendPath(_rootPath, path));
    if (in != null) {
      return loadImage(in);
    }

    // if we still haven't found it, we throw an exception
    throw new FileNotFoundException("Unable to locate image resource [path=" + path + "]");
  }