/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.core.designer.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
/**
* This utility class provides mechanisms for computing the checksum.
*
* @since 8.0
*/
public class ChecksumUtil {
protected static final int BUFFER_SIZE = 1024;
/**
* Compute and return the checksum (using the default CRC-32 algorithm) of the contents on the specified stream. This method
* closes the stream upon completion.
*
* @param stream the stream containing the contents for which the checksum is to be computed; may not be null
* @return the Checksum for the contents
* @throws AssertionError if <code>stream</code> is null
* @throws IOException if there is an error reading the stream
*/
public static Checksum computeChecksum( InputStream stream ) throws IOException {
Checksum checksum = new CRC32();
computeChecksum(stream, checksum);
return checksum;
}
/**
* Compute the checksum of the contents on the specified stream using the supplied Checksum algorithm, and modify that
* Checksum instance with the checksum value. This method closes the stream upon completion.
*
* @param stream the stream containing the contents for which the checksum is to be computed; may not be null
* @param algorithm the checksum algorithm to be used.
* @return the number of bytes from <code>stream</code> that were processed
* @throws AssertionError if <code>stream</code> or <code>algorithm</code> is null
* @throws IOException if there is an error reading the stream
*/
public static long computeChecksum( InputStream stream,
Checksum algorithm ) throws IOException {
byte[] buffer = new byte[BUFFER_SIZE];
int n = 0;
long sizeInBytes = 0;
// Compute the checksum ...
IOException ioe = null;
try {
while ((n = stream.read(buffer)) > -1) {
algorithm.update(buffer, 0, n);
sizeInBytes += n;
}
} catch (IOException e) {
ioe = e;
} finally {
try {
stream.close();
} catch (IOException e) {
// Throw this only if there was no IOException from processing above
if (ioe == null) {
ioe = e;
}
}
}
if (ioe != null) {
throw ioe;
}
return sizeInBytes;
}
}