]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9132 do not register template rules, if organizations are enabled
authorDaniel Schwarz <daniel.schwarz@sonarsource.com>
Tue, 18 Apr 2017 12:03:33 +0000 (14:03 +0200)
committerDaniel Schwarz <bartfastiel@users.noreply.github.com>
Thu, 20 Apr 2017 11:23:39 +0000 (13:23 +0200)
server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java

index cf11ebf815ef30d52bdf47011bcc5b20a2d88f71..234e1e693ac9c970939136733731d716ac230b04 100644 (file)
@@ -52,6 +52,7 @@ import org.sonar.db.rule.RuleDefinitionDto;
 import org.sonar.db.rule.RuleDto.Format;
 import org.sonar.db.rule.RuleParamDto;
 import org.sonar.db.rule.RuleRepositoryDto;
+import org.sonar.server.organization.OrganizationFlags;
 import org.sonar.server.qualityprofile.ActiveRuleChange;
 import org.sonar.server.qualityprofile.RuleActivator;
 import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
@@ -74,9 +75,10 @@ public class RegisterRules implements Startable {
   private final ActiveRuleIndexer activeRuleIndexer;
   private final Languages languages;
   private final System2 system2;
+  private final OrganizationFlags organizationFlags;
 
   public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, RuleIndexer ruleIndexer,
-    ActiveRuleIndexer activeRuleIndexer, Languages languages, System2 system2) {
+    ActiveRuleIndexer activeRuleIndexer, Languages languages, System2 system2, OrganizationFlags organizationFlags) {
     this.defLoader = defLoader;
     this.ruleActivator = ruleActivator;
     this.dbClient = dbClient;
@@ -84,6 +86,7 @@ public class RegisterRules implements Startable {
     this.activeRuleIndexer = activeRuleIndexer;
     this.languages = languages;
     this.system2 = system2;
+    this.organizationFlags = organizationFlags;
   }
 
   @Override
@@ -94,9 +97,14 @@ public class RegisterRules implements Startable {
       List<RuleKey> keysToIndex = new ArrayList<>();
 
       RulesDefinition.Context context = defLoader.load();
+      boolean orgsEnabled = organizationFlags.isEnabled(session);
       for (RulesDefinition.ExtendedRepository repoDef : getRepositories(context)) {
         if (languages.get(repoDef.language()) != null) {
           for (RulesDefinition.Rule ruleDef : repoDef.rules()) {
+            if (ruleDef.template() && orgsEnabled) {
+              LOG.info("Template rule {} will not be imported, because organizations are enabled.", RuleKey.of(ruleDef.repository().key(), ruleDef.key()));
+              continue;
+            }
             boolean relevantForIndex = registerRule(ruleDef, allRules, session);
             if (relevantForIndex) {
               keysToIndex.add(RuleKey.of(ruleDef.repository().key(), ruleDef.key()));
index 0a676943fa517752d0eab8fdf99d9d9fc930de3f..47009c005b179b531bba5d0f720af24ceda4778f 100644 (file)
@@ -33,6 +33,8 @@ import org.sonar.api.server.debt.DebtRemediationFunction;
 import org.sonar.api.server.rule.RulesDefinition;
 import org.sonar.api.utils.DateUtils;
 import org.sonar.api.utils.System2;
+import org.sonar.api.utils.log.LogTester;
+import org.sonar.api.utils.log.LoggerLevel;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
@@ -43,6 +45,8 @@ import org.sonar.db.rule.RuleParamDto;
 import org.sonar.db.rule.RuleRepositoryDto;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.es.SearchOptions;
+import org.sonar.server.organization.OrganizationFlags;
+import org.sonar.server.organization.TestOrganizationFlags;
 import org.sonar.server.qualityprofile.RuleActivator;
 import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
 import org.sonar.server.rule.index.RuleIndex;
@@ -75,6 +79,8 @@ public class RegisterRulesTest {
   public DbTester dbTester = DbTester.create(system);
   @org.junit.Rule
   public EsTester esTester = new EsTester(new RuleIndexDefinition(new MapSettings()));
+  @org.junit.Rule
+  public LogTester logTester = new LogTester();
 
   private RuleActivator ruleActivator = mock(RuleActivator.class);
   private DbClient dbClient = dbTester.getDbClient();
@@ -82,6 +88,7 @@ public class RegisterRulesTest {
   private ActiveRuleIndexer activeRuleIndexer;
   private RuleIndex ruleIndex;
   private OrganizationDto defaultOrganization;
+  private OrganizationFlags organizationFlags = TestOrganizationFlags.standalone();
 
   @Before
   public void before() {
@@ -456,12 +463,29 @@ public class RegisterRulesTest {
     assertThat(result.getSystemTags()).isEmpty();
   }
 
+  @Test
+  public void ignore_template_rules_if_organizations_are_enabled() {
+    organizationFlags.enable(dbTester.getSession());
+    execute(new RepositoryWithOneTemplateRule());
+
+    List<RuleDefinitionDto> rules = dbClient.ruleDao().selectAllDefinitions(dbTester.getSession());
+    assertThat(rules).hasSize(0);
+  }
+
+  @Test
+  public void log_ignored_template_rules_if_organizations_are_enabled() {
+    organizationFlags.enable(dbTester.getSession());
+    execute(new RepositoryWithOneTemplateRule());
+
+    assertThat(logTester.logs(LoggerLevel.INFO)).contains("Template rule test:rule1 will not be imported, because organizations are enabled.");
+  }
+
   private void execute(RulesDefinition... defs) {
     RuleDefinitionsLoader loader = new RuleDefinitionsLoader(mock(DeprecatedRulesDefinitionLoader.class), mock(CommonRuleDefinitionsImpl.class), defs);
     Languages languages = mock(Languages.class);
     when(languages.get("java")).thenReturn(mock(Language.class));
 
-    RegisterRules task = new RegisterRules(loader, ruleActivator, dbClient, ruleIndexer, activeRuleIndexer, languages, system);
+    RegisterRules task = new RegisterRules(loader, ruleActivator, dbClient, ruleIndexer, activeRuleIndexer, languages, system, organizationFlags);
     task.start();
     // Execute a commit to refresh session state as the task is using its own session
     dbTester.getSession().commit();
@@ -563,6 +587,7 @@ public class RegisterRulesTest {
   }
 
   static class FbContribRepository implements RulesDefinition {
+
     @Override
     public void define(Context context) {
       NewExtendedRepository repo = context.extendRepository("findbugs", "java");
@@ -572,4 +597,16 @@ public class RegisterRulesTest {
       repo.done();
     }
   }
+
+  static class RepositoryWithOneTemplateRule implements RulesDefinition {
+    @Override
+    public void define(Context context) {
+      RulesDefinition.NewRepository repo = context.createRepository("test", "java");
+      repo.createRule("rule1")
+        .setName("Rule One")
+        .setHtmlDescription("Description of Rule One")
+        .setTemplate(true);
+      repo.done();
+    }
+  }
 }