/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cache;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Adler32;
import java.util.zip.CheckedInputStream;
import org.apache.commons.io.IOUtils;
import net.sourceforge.pmd.RuleViolation;
/**
* The result of a single file analysis.
* Includes a checksum of the file and the complete list of violations detected.
*/
public class AnalysisResult {
private final long fileChecksum;
private final List<RuleViolation> violations;
public AnalysisResult(final long fileChecksum, final List<RuleViolation> violations) {
this.fileChecksum = fileChecksum;
this.violations = violations;
}
public AnalysisResult(final File sourceFile) {
this(computeFileChecksum(sourceFile), new ArrayList<RuleViolation>());
}
private static long computeFileChecksum(final File sourceFile) {
try (
CheckedInputStream stream = new CheckedInputStream(
new BufferedInputStream(new FileInputStream(sourceFile)), new Adler32());
) {
// Just read it, the CheckedInputStream will update the checksum on it's own
IOUtils.skipFully(stream, sourceFile.length());
return stream.getChecksum().getValue();
} catch (final IOException e) {
// We don't really care, if it's unreadable
// the analysis will fail and report the error on it's own
}
return 0;
}
public long getFileChecksum() {
return fileChecksum;
}
public List<RuleViolation> getViolations() {
return violations;
}
public void addViolations(final List<RuleViolation> violations) {
this.violations.addAll(violations);
}
public void addViolation(final RuleViolation ruleViolation) {
this.violations.add(ruleViolation);
}
}