package pl.touk.sputnik.engine;
import com.google.common.collect.ImmutableMap;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.jetbrains.annotations.NotNull;
import pl.touk.sputnik.configuration.CliOption;
import pl.touk.sputnik.configuration.Configuration;
import pl.touk.sputnik.configuration.GeneralOption;
import pl.touk.sputnik.engine.visitor.*;
import pl.touk.sputnik.engine.visitor.score.NoScore;
import pl.touk.sputnik.engine.visitor.score.ScoreAlwaysPass;
import pl.touk.sputnik.engine.visitor.score.ScorePassIfEmpty;
import pl.touk.sputnik.engine.visitor.score.ScorePassIfNoErrors;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.apache.commons.lang3.Validate.notBlank;
@Slf4j
public class VisitorBuilder {
private static final String NOSCORE = "NOSCORE";
private static final String SCOREALWAYSPASS = "SCOREALWAYSPASS";
private static final String SCOREPASSIFEMPTY = "SCOREPASSIFEMPTY";
private static final String SCOREPASSIFNOERRORS = "SCOREPASSIFNOERRORS";
@NotNull
public List<BeforeReviewVisitor> buildBeforeReviewVisitors(Configuration configuration) {
List<BeforeReviewVisitor> beforeReviewVisitors = new ArrayList<>();
addTestFilesFilterIfConfigured(configuration, beforeReviewVisitors);
addRegexFilterIfConfigured(configuration, beforeReviewVisitors);
return beforeReviewVisitors;
}
private void addTestFilesFilterIfConfigured(Configuration configuration, List<BeforeReviewVisitor> beforeReviewVisitors) {
if (!BooleanUtils.toBoolean(configuration.getProperty(GeneralOption.PROCESS_TEST_FILES))) {
beforeReviewVisitors.add(new FilterOutTestFilesVisitor(configuration.getProperty(GeneralOption.JAVA_TEST_DIR)));
}
}
private void addRegexFilterIfConfigured(Configuration configuration, List<BeforeReviewVisitor> beforeReviewVisitors) {
String fileRegex = configuration.getProperty(CliOption.FILE_REGEX);
if (fileRegex != null) {
beforeReviewVisitors.add(new RegexFilterFilesVisitor(fileRegex));
}
}
@NotNull
public List<AfterReviewVisitor> buildAfterReviewVisitors(Configuration configuration) {
List<AfterReviewVisitor> afterReviewVisitors = new ArrayList<>();
String passingComment = configuration.getProperty(GeneralOption.MESSAGE_SCORE_PASSING_COMMENT);
afterReviewVisitors.add(new SummaryMessageVisitor(passingComment));
int maxNumberOfComments = NumberUtils.toInt(configuration.getProperty(GeneralOption.MAX_NUMBER_OF_COMMENTS), 0);
if (maxNumberOfComments > 0) {
afterReviewVisitors.add(new LimitCommentVisitor(maxNumberOfComments));
}
afterReviewVisitors.add(buildScoreAfterReviewVisitor(configuration));
return afterReviewVisitors;
}
@NotNull
private AfterReviewVisitor buildScoreAfterReviewVisitor(Configuration configuration) {
Map<String, Short> passingScore = ImmutableMap.<String, Short>of(
configuration.getProperty(GeneralOption.SCORE_PASSING_KEY),
Short.valueOf(configuration.getProperty(GeneralOption.SCORE_PASSING_VALUE))
);
Map<String, Short> failingScore = ImmutableMap.<String, Short>of(
configuration.getProperty(GeneralOption.SCORE_FAILING_KEY),
Short.valueOf(configuration.getProperty(GeneralOption.SCORE_FAILING_VALUE))
);
String scoreStrategy = configuration.getProperty(GeneralOption.SCORE_STRATEGY);
notBlank(scoreStrategy);
switch(scoreStrategy.toUpperCase()) {
case NOSCORE:
return new NoScore();
case SCOREALWAYSPASS:
return new ScoreAlwaysPass(passingScore);
case SCOREPASSIFEMPTY:
return new ScorePassIfEmpty(passingScore, failingScore);
case SCOREPASSIFNOERRORS:
return new ScorePassIfNoErrors(passingScore, failingScore);
default:
log.warn("Score strategy {} not found, using default ScoreAlwaysPass", scoreStrategy);
return new ScoreAlwaysPass(passingScore);
}
}
}