package au.edu.anu.dcclient.tasks; import gov.loc.repository.bagit.Manifest; import gov.loc.repository.bagit.Manifest.Algorithm; import gov.loc.repository.bagit.utilities.MessageDigestHelper; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import au.edu.anu.dcclient.progress.ProgressInputStream; public class CalcMessageDigestTask extends AbstractDcBagTask<String, Void> { private static final Logger LOGGER = LoggerFactory.getLogger(CalcMessageDigestTask.class); private File sourceFile; private Manifest.Algorithm algorithm; public CalcMessageDigestTask(File sourceFile) { this.sourceFile = sourceFile; this.algorithm = Algorithm.MD5; } public CalcMessageDigestTask(File sourceFile, Manifest.Algorithm algorithm) { this.sourceFile = sourceFile; this.algorithm = algorithm; } @Override protected String doInBackground() throws Exception { return calcMd(); } public String calcMd() throws FileNotFoundException { ProgressInputStream fileStream = null; String md5sum; try { fileStream = new ProgressInputStream(new FileInputStream(sourceFile), sourceFile.length()); fileStream.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("percentComplete".equals(evt.getPropertyName())) { setProgress((Integer) evt.getNewValue()); } } }); md5sum = MessageDigestHelper.generateFixity(fileStream, algorithm); LOGGER.trace("{}, MD5: {}", sourceFile.getAbsolutePath(), md5sum); } finally { IOUtils.closeQuietly(fileStream); } return md5sum; } }