package it.unitn.molerat.repos.trackers.vuln; import it.unitn.molerat.evidence.Changes; import it.unitn.molerat.evidence.VulnerabilityEvidence; import it.unitn.molerat.repos.utils.SignatureExtractor; import it.unitn.molerat.repos.wrappers.RepoWrapper; import java.util.HashSet; import java.util.Map; import java.util.Set; public class EnhancedDeletionVulnerabilityEvidenceTracker extends DeletionVulnerabilityEvidenceTracker{ public EnhancedDeletionVulnerabilityEvidenceTracker(RepoWrapper wrapper, String fixedRev) throws Exception { super(wrapper, fixedRev); } @Override protected Set getInitialVulnerabilityEvidence(Changes changes) throws Exception { if (changes.getDeletions().size() != 0) { return super.getInitialVulnerabilityEvidence(changes); } else { SignatureExtractor se = new SignatureExtractor(repoWrapper.doCat(changes.getPath(), changes.getRightRevision())); Map> rightSignatures = se.getSignaturesWithLines(); Set relevantSignatures = new HashSet<>(); for (int line : changes.getAdditions().keySet()) { for (Map.Entry> entry : rightSignatures.entrySet()) { if (entry.getValue().contains(line)) { relevantSignatures.add(entry.getKey()); } } } String leftFile = repoWrapper.doCat(changes.getPath(), changes.getLeftRevision()); Map lineMappings = repoWrapper.getLineMappings(leftFile); se = new SignatureExtractor(leftFile); Map> leftSignatures = se.getSignaturesWithLines(); for (int line : changes.getDeletions().keySet()) { for (Map.Entry> entry : leftSignatures.entrySet()) { if (entry.getValue().contains(line)) { relevantSignatures.add(entry.getKey()); } } } Set initialEvidence = new HashSet<>(); for (String signature : relevantSignatures) { for (Map.Entry> entry : leftSignatures.entrySet()) { if (signature.equals(entry.getKey())) { for (int line : entry.getValue()) { VulnerabilityEvidence evd = new VulnerabilityEvidence( changes.getPath(), changes.getLeftRevision(), signature, line, lineMappings.get(line) ); initialEvidence.add(evd); } } } } return initialEvidence; } } }