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;
}
}