import org.picocontainer.Startable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.server.debt.DebtRemediationFunction;
private final RuleDefinitionsLoader defLoader;
private final RuleActivator ruleActivator;
private final DbClient dbClient;
+ private final Languages languages;
private final CharacteristicDao characteristicDao;
/**
* @param registerDebtModel used only to be started after init of the technical debt model
*/
- public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, RegisterDebtModel registerDebtModel) {
- this(defLoader, ruleActivator, dbClient, System2.INSTANCE);
+ public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, Languages languages, RegisterDebtModel registerDebtModel) {
+ this(defLoader, ruleActivator, dbClient, languages, System2.INSTANCE);
}
@VisibleForTesting
RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator,
- DbClient dbClient, System2 system) {
+ DbClient dbClient, Languages languages, System2 system) {
this.defLoader = defLoader;
this.ruleActivator = ruleActivator;
this.dbClient = dbClient;
+ this.languages = languages;
this.characteristicDao = dbClient.debtCharacteristicDao();
}
RulesDefinition.Context context = defLoader.load();
for (RulesDefinition.ExtendedRepository repoDef : getRepositories(context)) {
- for (RulesDefinition.Rule ruleDef : repoDef.rules()) {
- RuleKey ruleKey = RuleKey.of(ruleDef.repository().key(), ruleDef.key());
+ if (languages.get(repoDef.language()) != null) {
+ for (RulesDefinition.Rule ruleDef : repoDef.rules()) {
+ RuleKey ruleKey = RuleKey.of(ruleDef.repository().key(), ruleDef.key());
- RuleDto rule = allRules.containsKey(ruleKey) ? allRules.remove(ruleKey) : createRuleDto(ruleDef, session);
+ RuleDto rule = allRules.containsKey(ruleKey) ? allRules.remove(ruleKey) : createRuleDto(ruleDef, session);
- boolean executeUpdate = false;
- if (mergeRule(ruleDef, rule)) {
- executeUpdate = true;
- }
+ boolean executeUpdate = false;
+ if (mergeRule(ruleDef, rule)) {
+ executeUpdate = true;
+ }
- CharacteristicDto subCharacteristic = characteristic(ruleDef, rule.getSubCharacteristicId(), allCharacteristics);
- if (mergeDebtDefinitions(ruleDef, rule, subCharacteristic)) {
- executeUpdate = true;
- }
+ CharacteristicDto subCharacteristic = characteristic(ruleDef, rule.getSubCharacteristicId(), allCharacteristics);
+ if (mergeDebtDefinitions(ruleDef, rule, subCharacteristic)) {
+ executeUpdate = true;
+ }
- if (mergeTags(ruleDef, rule)) {
- executeUpdate = true;
- }
+ if (mergeTags(ruleDef, rule)) {
+ executeUpdate = true;
+ }
- if (executeUpdate) {
- dbClient.ruleDao().update(session, rule);
- }
+ if (executeUpdate) {
+ dbClient.ruleDao().update(session, rule);
+ }
- mergeParams(ruleDef, rule, session);
+ mergeParams(ruleDef, rule, session);
+ }
+ session.commit();
}
- session.commit();
}
List<RuleDto> activeRules = processRemainingDbRules(allRules.values(), session);
removeActiveRulesOnStillExistingRepositories(session, activeRules, context);
import org.sonar.api.profiles.ProfileExporter;
import org.sonar.api.profiles.RulesProfile;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.*;
-import org.sonar.api.rules.ActiveRule;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RulePriority;
import org.sonar.api.server.rule.RuleParamType;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.utils.ValidationMessages;
public class QProfileExportersTest {
@ClassRule
- public static ServerTester tester = new ServerTester().addComponents(
+ public static ServerTester tester = new ServerTester().addXoo().addComponents(
XooRulesDefinition.class, XooProfileDefinition.class,
XooExporter.class, StandardExporter.class);
import org.sonar.core.persistence.DbSession;
import org.sonar.core.properties.PropertiesDao;
import org.sonar.core.properties.PropertyDto;
-import org.sonar.core.qualityprofile.db.ActiveRuleDto;
-import org.sonar.core.qualityprofile.db.ActiveRuleKey;
-import org.sonar.core.qualityprofile.db.ActiveRuleParamDto;
-import org.sonar.core.qualityprofile.db.QualityProfileDao;
-import org.sonar.core.qualityprofile.db.QualityProfileDto;
+import org.sonar.core.qualityprofile.db.*;
import org.sonar.core.template.LoadedTemplateDto;
import org.sonar.server.db.DbClient;
import org.sonar.server.platform.Platform;
@Test
public void register_existing_profile_definitions() throws Exception {
- tester = new ServerTester().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
+ tester = new ServerTester().addXoo().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester.start();
dbSession = dbClient().openSession(false);
@Test
public void register_profile_definitions() throws Exception {
- tester = new ServerTester().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
+ tester = new ServerTester().addXoo().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester.start();
dbSession = dbClient().openSession(false);
@Test
public void fail_if_two_definitions_are_marked_as_default_on_the_same_language() throws Exception {
- tester = new ServerTester().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", true));
+ tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", true));
try {
tester.start();
@Test
public void mark_profile_as_default() throws Exception {
- tester = new ServerTester().addComponents(new SimpleProfileDefinition("one", false), new SimpleProfileDefinition("two", true));
+ tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", false), new SimpleProfileDefinition("two", true));
tester.start();
verifyProperty("sonar.profile.xoo", "two");
@Test
public void use_sonar_way_as_default_profile_if_none_are_marked_as_default() throws Exception {
- tester = new ServerTester().addComponents(new SimpleProfileDefinition("Sonar way", false), new SimpleProfileDefinition("Other way", false));
+ tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("Sonar way", false), new SimpleProfileDefinition("Other way", false));
tester.start();
verifyProperty("sonar.profile.xoo", "Sonar way");
@Test
public void fix_default_profile_if_invalid() throws Exception {
- tester = new ServerTester().addComponents(new SimpleProfileDefinition("one", true));
+ tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", true));
tester.start();
PropertiesDao propertiesDao = dbClient().propertiesDao();
@Test
public void do_not_reset_default_profile_if_still_valid() throws Exception {
- tester = new ServerTester().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", false));
+ tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", false));
tester.start();
PropertiesDao propertiesDao = dbClient().propertiesDao();
*/
@Test
public void clean_up_profiles_if_missing_loaded_template() throws Exception {
- tester = new ServerTester().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
+ tester = new ServerTester().addXoo().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester.start();
dbSession = dbClient().openSession(false);
public static class XooProfileDefinition extends ProfileDefinition {
@Override
public RulesProfile createProfile(ValidationMessages validation) {
- final RulesProfile profile = RulesProfile.create("Basic", "xoo");
+ final RulesProfile profile = RulesProfile.create("Basic", ServerTester.Xoo.KEY);
ActiveRule activeRule1 = profile.activateRule(
org.sonar.api.rules.Rule.create("xoo", "x1").setParams(newArrayList(new RuleParam().setKey("acceptWhitespace"))),
RulePriority.CRITICAL);
public static class XooRulesDefinition implements RulesDefinition {
@Override
public void define(Context context) {
- NewRepository repository = context.createRepository("xoo", "xoo").setName("Xoo Repo");
+ NewRepository repository = context.createRepository("xoo", ServerTester.Xoo.KEY).setName("Xoo Repo");
NewRule x1 = repository.createRule("x1")
.setName("x1 name")
.setHtmlDescription("x1 desc")
static final XooRulesDefinition RULE_DEFS = new XooRulesDefinition();
@ClassRule
- public static final ServerTester TESTER = new ServerTester().addComponents(RULE_DEFS);
+ public static final ServerTester TESTER = new ServerTester().addXoo().addComponents(RULE_DEFS);
RuleIndex ruleIndex;
ActiveRuleIndex activeRuleIndex;
assertThat(rule.name()).isEqualTo("x1 name");
assertThat(rule.htmlDescription()).isEqualTo("x1 desc");
assertThat(rule.systemTags()).contains("tag1");
+ assertThat(rule.language()).contains("xoo");
assertThat(rule.params()).hasSize(2);
assertThat(rule.param("acceptWhitespace").type()).isEqualTo(RuleParamType.BOOLEAN);
assertThat(rule.param("acceptWhitespace").defaultValue()).isEqualTo("false");
@Override
public void define(Context context) {
if (rules != null) {
- NewRepository repository = context.createRepository("xoo", "xoo").setName("Xoo Repo");
+ NewRepository repository = context.createRepository("xoo", ServerTester.Xoo.KEY).setName("Xoo Repo");
rules.init(repository);
repository.done();
}
}
-
}
+
}
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.sonar.api.resources.Language;
+import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
private void execute(RulesDefinition... defs) {
RuleDefinitionsLoader loader = new RuleDefinitionsLoader(mock(RuleRepositories.class), defs);
- RegisterRules task = new RegisterRules(loader, ruleActivator, dbClient, system);
+ Languages languages = mock(Languages.class);
+ when(languages.get("java")).thenReturn(mock(Language.class));
+
+ RegisterRules task = new RegisterRules(loader, ruleActivator, dbClient, languages, system);
task.start();
}
import org.apache.commons.lang.StringUtils;
import org.junit.rules.ExternalResource;
import org.sonar.api.database.DatabaseProperties;
+import org.sonar.api.resources.Language;
import org.sonar.process.MonitoredProcess;
import org.sonar.process.NetworkUtils;
import org.sonar.process.Props;
import org.sonar.server.ws.WsTester;
import javax.annotation.Nullable;
+
import java.io.File;
import java.util.Arrays;
import java.util.List;
return this;
}
+ public ServerTester addXoo() {
+ addComponents(Xoo.class);
+ return this;
+ }
+
public ServerTester addPluginJar(File jar) {
Preconditions.checkArgument(jar.exists() && jar.isFile(), "Plugin JAR file does not exist: " + jar.getAbsolutePath());
try {
}
}
+ public static class Xoo implements Language {
+
+ public static final String KEY = "xoo";
+ public static final String NAME = "Xoo";
+ public static final String FILE_SUFFIX = ".xoo";
+
+ private static final String[] XOO_SUFFIXES = {
+ FILE_SUFFIX
+ };
+
+ @Override
+ public String getKey() {
+ return KEY;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public String[] getFileSuffixes() {
+ return XOO_SUFFIXES;
+ }
+ }
+
}