InputStreamContent.java

/*
 * InputStreamContent
 */
package gov.usgs.earthquake.product;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import gov.usgs.util.StreamUtils;

/**
 * Content within an InputStream.
 */
public class InputStreamContent extends AbstractContent {

  /** The actual content. */
  private InputStream content;

  /**
   * Create a new InputStream content.
   *
   * @param content the content.
   */
  public InputStreamContent(final InputStream content) {
    this.content = content;
  }

  /**
   * Create an InputStreamContent from another Content.
   *
   * @param content the content to duplicate.
   * @throws IOException if IO error occurs
   */
  public InputStreamContent(final Content content) throws IOException {
    super(content);
    this.content = content.getInputStream();
  }

  /**
   * @return InputStream to content.
   */
  public InputStream getInputStream() throws IOException {
    return content;
  }

  /**
   * InputStream can only be read once.
   *
   * <p>
   * If sha256 is null, read and convert to in memory stream.
   */
  public String getSha256() throws Exception {
    String sha256 = super.getSha256(false);
    if (sha256 == null) {
      // convert stream into byte array to read multiple times
      final byte[] contentBytes;
      try (final InputStream in = getInputStream()) {
        contentBytes = StreamUtils.readStream(in);
      }
      // generate sha256 from byte stream
      this.content = new ByteArrayInputStream(contentBytes);
      sha256 = super.getSha256();
      // set byte stream for next reader
      this.content = new ByteArrayInputStream(contentBytes);
    }
    return sha256;
  }

  /**
   * Free any resources associated with this content.
   */
  public void close() {
    StreamUtils.closeStream(content);
    content = null;
  }
}