package pl.touk.sputnik.processor.sonar; import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Set; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import com.google.common.annotations.VisibleForTesting; import pl.touk.sputnik.configuration.Configuration; import pl.touk.sputnik.review.Review; import pl.touk.sputnik.review.ReviewException; import pl.touk.sputnik.review.ReviewFile; import pl.touk.sputnik.review.ReviewProcessor; import pl.touk.sputnik.review.ReviewResult; import pl.touk.sputnik.review.Violation; @Slf4j public class SonarProcessor implements ReviewProcessor { private static final String PROCESSOR_NAME = "Sonar"; private SonarRunnerBuilder sonarRunnerBuilder; private final Configuration configuration; public SonarProcessor(@NotNull final Configuration configuration) { this(new SonarRunnerBuilder(), configuration); } public SonarProcessor(SonarRunnerBuilder sonarRunnerBuilder, @NotNull final Configuration configuration) { this.sonarRunnerBuilder = sonarRunnerBuilder; this.configuration = configuration; } @Nullable @Override public ReviewResult process(@NotNull Review review) { if (review.getFiles().isEmpty()) { return new ReviewResult(); } try { SonarRunner runner = sonarRunnerBuilder.prepareRunner(review, configuration); File resultFile = runner.run(); SonarResultParser parser = new SonarResultParser(resultFile); return filterResults(parser.parseResults(), review); } catch (IOException e) { throw new ReviewException("SonarResultParser error", e); } } /** * Filters a ReviewResult to keep only the violations that are about a file * which is modified by a given review. */ @VisibleForTesting ReviewResult filterResults(ReviewResult results, Review review) { ReviewResult filteredResults = new ReviewResult(); Set<String> reviewFiles = new HashSet<>(); for (ReviewFile file : review.getFiles()) { reviewFiles.add(file.getReviewFilename()); } for (Violation violation : results.getViolations()) { if (reviewFiles.contains(violation.getFilenameOrJavaClassName())) { filteredResults.add(violation); } } return filteredResults; } @NotNull @Override public String getName() { return PROCESSOR_NAME; } }