From 3eb33cf6333f264b25b5dd23bbeeb7df634ea731 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Mon, 11 Aug 2014 13:42:48 +0200 Subject: [PATCH] SONAR-5485 SonarQube should ignore creation of a repository and its rules if the language is not installed --- .../org/sonar/server/rule/RegisterRules.java | 49 ++++++++++--------- .../qualityprofile/QProfileExportersTest.java | 6 +-- .../RegisterQualityProfilesMediumTest.java | 26 +++++----- .../server/rule/RegisterRulesMediumTest.java | 7 +-- .../sonar/server/rule/RegisterRulesTest.java | 7 ++- .../org/sonar/server/tester/ServerTester.java | 33 +++++++++++++ 6 files changed, 84 insertions(+), 44 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java index 5e09f77dd06..ff7817ad150 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java @@ -30,6 +30,7 @@ import org.apache.commons.lang.StringUtils; 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; @@ -66,21 +67,23 @@ public class RegisterRules implements Startable { 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(); } @@ -94,32 +97,34 @@ public class RegisterRules implements Startable { 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 activeRules = processRemainingDbRules(allRules.values(), session); removeActiveRulesOnStillExistingRepositories(session, activeRules, context); diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileExportersTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileExportersTest.java index 72c4ea98088..fd8a87a9dd2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileExportersTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileExportersTest.java @@ -25,8 +25,8 @@ import org.sonar.api.profiles.ProfileDefinition; 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; @@ -43,7 +43,7 @@ import static org.fest.assertions.Fail.fail; 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); diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/RegisterQualityProfilesMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/RegisterQualityProfilesMediumTest.java index 79e469dbc8d..1c22edba15b 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/RegisterQualityProfilesMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/RegisterQualityProfilesMediumTest.java @@ -35,11 +35,7 @@ import org.sonar.api.utils.ValidationMessages; 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; @@ -69,7 +65,7 @@ public class RegisterQualityProfilesMediumTest { @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); @@ -112,7 +108,7 @@ public class RegisterQualityProfilesMediumTest { @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); @@ -147,7 +143,7 @@ public class RegisterQualityProfilesMediumTest { @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(); @@ -158,7 +154,7 @@ public class RegisterQualityProfilesMediumTest { @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"); @@ -166,7 +162,7 @@ public class RegisterQualityProfilesMediumTest { @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"); @@ -174,7 +170,7 @@ public class RegisterQualityProfilesMediumTest { @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(); @@ -189,7 +185,7 @@ public class RegisterQualityProfilesMediumTest { @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(); @@ -206,7 +202,7 @@ public class RegisterQualityProfilesMediumTest { */ @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); @@ -234,7 +230,7 @@ public class RegisterQualityProfilesMediumTest { 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); @@ -248,7 +244,7 @@ public class RegisterQualityProfilesMediumTest { 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") diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java index 284c9496f29..22b0d2e8728 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java @@ -68,7 +68,7 @@ public class RegisterRulesMediumTest { 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; @@ -143,6 +143,7 @@ public class RegisterRulesMediumTest { 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"); @@ -658,11 +659,11 @@ public class RegisterRulesMediumTest { @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(); } } - } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java index a95cf00380b..ac63a246aad 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java @@ -23,6 +23,8 @@ import com.google.common.collect.Sets; 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; @@ -199,7 +201,10 @@ public class RegisterRulesTest extends AbstractDaoTestCase { 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(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java b/server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java index 121261051bd..649fd8c9df0 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java +++ b/server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java @@ -25,6 +25,7 @@ import org.apache.commons.io.FileUtils; 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; @@ -34,6 +35,7 @@ import org.sonar.server.search.IndexProperties; import org.sonar.server.ws.WsTester; import javax.annotation.Nullable; + import java.io.File; import java.util.Arrays; import java.util.List; @@ -162,6 +164,11 @@ public class ServerTester extends ExternalResource { 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 { @@ -220,4 +227,30 @@ public class ServerTester extends ExternalResource { } } + 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; + } + } + } -- 2.39.5