package pl.touk.sputnik.processor.codenarc; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.codenarc.results.FileResults; import org.codenarc.results.Results; import org.codenarc.rule.Rule; import pl.touk.sputnik.review.ReviewException; import pl.touk.sputnik.review.ReviewResult; import pl.touk.sputnik.review.Severity; import pl.touk.sputnik.review.Violation; import java.util.Stack; @Slf4j class ResultParser { public ReviewResult parseResults(Results results) { ReviewResult reviewResult = new ReviewResult(); Stack<Results> resultsStack = new Stack<>(); resultsStack.add(results); while (!resultsStack.isEmpty()) { parseResult(reviewResult, resultsStack); } return reviewResult; } private void parseResult(ReviewResult reviewResult, Stack<Results> resultsStack) { Results current = resultsStack.pop(); if (current.isFile()) { parseFileResult(reviewResult, (FileResults) current); } else { parseDirectoryResult(resultsStack, current); } } private void parseDirectoryResult(Stack<Results> resultsStack, Results current) { for (Object child : current.getChildren()) { Results childResults = (Results) child; if (!childResults.getViolations().isEmpty()) { resultsStack.push(childResults); } } } private void parseFileResult(ReviewResult reviewResult, FileResults fileResults) { for (Object object : fileResults.getViolations()) { org.codenarc.rule.Violation codeNarcViolation = (org.codenarc.rule.Violation) object; log.debug("Found violation: {}", codeNarcViolation); Rule rule = codeNarcViolation.getRule(); reviewResult.add(createViolation(fileResults, codeNarcViolation, rule)); } } private Violation createViolation(FileResults fileResults, org.codenarc.rule.Violation codeNarcViolation, Rule rule) { return new Violation(fileResults.getPath(), setLineNumber(codeNarcViolation.getLineNumber()), createViolationMessage(codeNarcViolation, rule), getRuleSeverity(rule)); } private int setLineNumber(Integer lineNumber) { return lineNumber == null ? 0 : lineNumber; } private String createViolationMessage(org.codenarc.rule.Violation codeNarcViolation, Rule rule) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(rule.getName()); if (StringUtils.isNotBlank(codeNarcViolation.getMessage())) { stringBuilder.append(": ").append(codeNarcViolation.getMessage()); } return stringBuilder.toString(); } private Severity getRuleSeverity(Rule rule) { switch (rule.getPriority()) { case 1: return Severity.ERROR; case 2: return Severity.WARNING; case 3: return Severity.INFO; default: throw new ReviewException("Invalid priority of rule " + rule.getName()); } } }