package org.limewire.swarm.file.verifier; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.limewire.collection.IntervalSet; import org.limewire.collection.Range; import org.limewire.swarm.SwarmBlockVerifier; import org.limewire.swarm.SwarmFile; import org.limewire.swarm.SwarmFileSystem; import org.limewire.swarm.VerificationException; import org.limewire.util.FileUtils; /** * This class allows for adding various ranges to check against an MD5Sum. * */ public class MD5SumFileVerifier implements SwarmBlockVerifier { private Map<Range, String> rangeMD5s = new HashMap<Range, String>(); public MD5SumFileVerifier() { } public MD5SumFileVerifier(Range range, String md5String) { addMD5Check(range, md5String); } public void addMD5Check(Range range, String md5String) { rangeMD5s.put(range, md5String); } public List<Range> scanForVerifiableRanges(IntervalSet writtenBlocks, long completeSize) { List<Range> ret = new ArrayList<Range>(); for (Map.Entry<Range, String> entry : rangeMD5s.entrySet()) { Range range = entry.getKey(); if (writtenBlocks.contains(range)) { ret.add(range); } } return ret; } public boolean verify(Range range, SwarmFileSystem swarmFileSystem) throws VerificationException { SwarmFile swarmFile = swarmFileSystem.getSwarmFile(range.getLow()); String md5String = rangeMD5s.get(range); String testMd5; try { testMd5 = FileUtils.getMD5(swarmFile.getFile()); } catch (NoSuchAlgorithmException e) { throw new VerificationException(e, range); } catch (IOException e) { throw new VerificationException(e, range); } return testMd5.equals(md5String); } }