package it.unitn.molerat.repos.trackers.changes; import it.unitn.molerat.evidence.ChangeEvidence; import it.unitn.molerat.repos.trackers.AbstractEvidenceTracker; import it.unitn.molerat.repos.utils.CommitMetrics; 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; import java.util.TreeMap; public class ChangeEvidenceTracker extends AbstractEvidenceTracker { protected final Map> evidences = new TreeMap<>(); protected Map> fixConstructs; protected ChangeEvidenceTracker(RepoWrapper wrapper, String fixedRev) throws Exception { super(wrapper, fixedRev); } public ChangeEvidenceTracker(RepoWrapper repoWrapper, String fixedCommit, Set commits) throws Exception { this(repoWrapper, fixedCommit); this.commits = commits; this.fixConstructs = extractSignatures(this.fixedRevision); } protected Map> extractSignatures(String commit) throws Exception { Map> result = new TreeMap<>(); Map files = CommitMetrics.getFileContentsPerRevision(commit, this.repoWrapper); for (Map.Entry file : files.entrySet()) { SignatureExtractor se = new SignatureExtractor(file.getValue()); Set signatures = new HashSet<>(); for (String signature : se.getSignaturesWithLines().keySet()) { signatures.add(signature); } result.put(file.getKey(), signatures); } return result; } @Override public void trackEvidence() throws Exception { for (String commit : this.commits) { // long timeNow = System.currentTimeMillis(); Map> currentSignatures = extractSignatures(commit); for (Map.Entry> currentSignature : currentSignatures.entrySet()) { Set temp = this.fixConstructs.get(currentSignature.getKey()); if (temp == null) { for (String sign : currentSignature.getValue()) { ChangeEvidence evidence = new ChangeEvidence( currentSignature.getKey(), commit, sign, true ); if (evidence.isPublicMethodOrConstructor()) { addEvidence(evidence); } } } else { for (String sign : currentSignature.getValue()) { boolean removed = true; for (String fixSign : temp) { if (sign.equals(fixSign)) { removed = false; break; } } ChangeEvidence evidence = new ChangeEvidence( currentSignature.getKey(), commit, sign, removed ); if (evidence.isPublicMethodOrConstructor()) { addEvidence(evidence); } } } } } } protected void addEvidence(ChangeEvidence evidence) { if (this.evidences.containsKey(evidence.getCommit())) { this.evidences.get(evidence.getCommit()).add(evidence); } else { Set set = new HashSet<>(); set.add(evidence); this.evidences.put(evidence.getCommit(), set); } } public Set getEvidence(String commit) { Set evd = this.evidences.get(commit); return (evd != null) ? evd : new HashSet<>(); } public Map> getEvidences() { return this.evidences; } }