package com.yahoo.glimmer.util; import java.io.IOException; import java.io.OutputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class DigestOutputStream extends OutputStream { private final OutputStream outputStream; private final MessageDigest digest; private byte[] hash; public DigestOutputStream(OutputStream outputStream, String digestAlgorithm) throws NoSuchAlgorithmException { this.outputStream = outputStream; digest = MessageDigest.getInstance(digestAlgorithm); } public void write(int i) throws IOException { byte[] b = { (byte) i }; digest.update(b); outputStream.write(b, 0, 1); } @Override public void flush() throws IOException { super.flush(); outputStream.flush(); } @Override public void close() throws IOException { super.close(); outputStream.close(); hash = digest.digest(); } public byte[] getDigest() { if (hash == null) { throw new IllegalStateException("Stream needs to be closed before getting its digest."); } return hash; } }