/* See LICENSE for licensing and NOTICE for copyright. */
package org.cryptacular.io;

import java.io.InputStream;
import org.cryptacular.CryptUtil;

/**
 * Resource that produces a {@link InputStream} from a classpath resource.
 *
 * @author  Middleware Services
 */
public class ClassPathResource implements Resource
{

  /** Classpath location of resource. */
  private final String classPath;

  /** Class loader used to get input streams on classpath locations. */
  private final ClassLoader classLoader;


  /**
   * Creates a new resource that reads from the given classpath location. <code>
   * Thread.currentThread().getContextClassLoader()</code> is used to obtain the class loader used to obtain an input
   * stream on the given classpath.
   *
   * @param  path  Classpath location.
   */
  public ClassPathResource(final String path)
  {
    this(path, Thread.currentThread().getContextClassLoader());
  }


  /**
   * Creates a new resource that reads from the given classpath location.
   *
   * @param  path  Classpath location.
   * @param  loader  Class loader used to obtain an input stream on the given classpath location.
   */
  public ClassPathResource(final String path, final ClassLoader loader)
  {
    CryptUtil.assertNotNullArg(path, "Path cannot be null");
    // Strip leading / since absolute paths are not supported by
    // ClassLoader#getResourceAsStream(...)
    if (path.startsWith("/")) {
      this.classPath = path.substring(1);
    } else {
      this.classPath = path;
    }
    this.classLoader = CryptUtil.assertNotNullArg(loader, "Class loader cannot be null");
  }


  @Override
  public InputStream getInputStream()
  {
    return classLoader.getResourceAsStream(classPath);
  }
}
