package org.codefx.mvn.jdeps.mojo;
import org.codefx.mvn.jdeps.rules.ArrowRuleParser;
import org.codefx.mvn.jdeps.rules.DependencyJudge;
import org.codefx.mvn.jdeps.rules.DependencyJudgeBuilder;
import org.codefx.mvn.jdeps.rules.DependencyRule;
import org.codefx.mvn.jdeps.rules.MapDependencyJudge.MapDependencyJudgeBuilder;
import org.codefx.mvn.jdeps.rules.PackageInclusion;
import org.codefx.mvn.jdeps.rules.Severity;
import org.codefx.mvn.jdeps.rules.SimpleDependencyJudge;
import org.codefx.mvn.jdeps.rules.XmlRule;
import org.codehaus.plexus.classworlds.launcher.ConfigurationException;
import java.util.List;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
import static org.codefx.mvn.jdeps.mojo.MojoLogging.logger;
/**
* Captures the MOJO configuration that pertains the dependency rules and {@link #createJudge() creates} the
* according {@link DependencyJudge}.
*/
class DependencyRulesConfiguration {
/*
* It looks like this class belongs into 'org.codefx.mvn.jdeps.rules' (look at the imports) but
* stupid logging is in the way. I'd rather have a class that, in spirit, belongs somewhere else hang around here
* than introduce Maven-specific logging into the other package.
*/
private final Severity defaultSeverity;
private final PackageInclusion packageInclusion;
private final List<XmlRule> xml;
private final List<String> arrow;
public DependencyRulesConfiguration(
Severity defaultSeverity, PackageInclusion packageInclusion, List<XmlRule> xml, List<String> arrow) {
this.defaultSeverity = requireNonNull(defaultSeverity, "The argument 'defaultSeverity' must not be null.");
this.packageInclusion = requireNonNull(packageInclusion, "The argument 'packageInclusion' must not be null.");
this.xml = requireNonNull(xml, "The argument 'xml' must not be null.");
this.arrow = requireNonNull(arrow, "The argument 'arrow' must not be null.");
}
/**
* @return the {@link DependencyJudge} matching the configuration
*/
public DependencyJudge createJudge() throws ConfigurationException {
if (xml.isEmpty() && arrow.isEmpty())
return new SimpleDependencyJudge(defaultSeverity);
DependencyJudgeBuilder dependencyJudgeBuilder = createBuilderFromConfiguration();
addXmlRulesToBuilder(xml, dependencyJudgeBuilder);
addArrowRulesToBuilder(arrow, dependencyJudgeBuilder);
return dependencyJudgeBuilder.build();
}
private DependencyJudgeBuilder createBuilderFromConfiguration() {
return new MapDependencyJudgeBuilder()
.withInclusion(packageInclusion)
.withDefaultSeverity(defaultSeverity);
}
static void addXmlRulesToBuilder(List<XmlRule> xmlRules, DependencyJudgeBuilder dependencyJudgeBuilder)
throws ConfigurationException {
logStartAddingRules(xmlRules, "XML");
for (XmlRule rule : xmlRules) {
DependencyRule dependencyRule = rule.asDependencyRule();
dependencyJudgeBuilder.addDependency(dependencyRule);
logAddedRule(dependencyRule);
}
logDoneAddingRules(xmlRules, "XML");
}
static void addArrowRulesToBuilder(List<String> arrowRules, DependencyJudgeBuilder dependencyJudgeBuilder)
throws ConfigurationException {
logStartAddingRules(arrowRules, "Arrow");
// the loop can be no stream because 'ArrowRuleParser.parseRules' throws a checked exception
for (String arrowRule : arrowRules) {
ArrowRuleParser
.parseRules(arrowRule)
.forEach(rule -> {
dependencyJudgeBuilder.addDependency(rule);
logAddedRule(rule);
});
}
logDoneAddingRules(arrowRules, "Arrow");
}
private static void logStartAddingRules(List<?> rules, String ruleName) {
if (!rules.isEmpty())
logger().debug("\t" + ruleName + " rules:");
}
private static void logAddedRule(DependencyRule dependencyRule) {
logger().debug("\t\t" + dependencyRule);
}
private static void logDoneAddingRules(List<?> rules, String ruleName) {
if (rules.isEmpty())
logger().debug(format("\t%s rules: none configured", ruleName));
else
logger().debug(format("\ttotal: %d", rules.size()));
}
}