]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7479 Remove system tags from DB when no tags in plugin 838/head
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 14 Mar 2016 16:04:56 +0000 (17:04 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 16 Mar 2016 14:16:18 +0000 (15:16 +0100)
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 8c6e6c5c52d822a45a0cb844afe898ee24d3cd81..c6c3cd28a5d85ae921e288a92de4280099b08cb3 100644 (file)
@@ -24,7 +24,6 @@ import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -60,6 +59,7 @@ import org.sonar.server.rule.index.RuleIndexer;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Sets.intersection;
 
 /**
  * Register rules at server startup
@@ -77,7 +77,7 @@ public class RegisterRules implements Startable {
   private final System2 system2;
 
   public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, RuleIndexer ruleIndexer,
-                       ActiveRuleIndexer activeRuleIndexer, Languages languages, System2 system2) {
+    ActiveRuleIndexer activeRuleIndexer, Languages languages, System2 system2) {
     this.defLoader = defLoader;
     this.ruleActivator = ruleActivator;
     this.dbClient = dbClient;
@@ -202,10 +202,6 @@ public class RegisterRules implements Startable {
     if (mergeDescription(def, dto)) {
       changed = true;
     }
-    if (!dto.getSystemTags().containsAll(def.tags())) {
-      dto.setSystemTags(def.tags());
-      changed = true;
-    }
     if (!StringUtils.equals(dto.getConfigKey(), def.internalKey())) {
       dto.setConfigKey(def.internalKey());
       changed = true;
@@ -348,8 +344,9 @@ public class RegisterRules implements Startable {
     if (RuleStatus.REMOVED == ruleDef.status()) {
       dto.setSystemTags(Collections.<String>emptySet());
       changed = true;
-    } else if (!dto.getSystemTags().containsAll(ruleDef.tags())
-      || !Sets.intersection(dto.getTags(), ruleDef.tags()).isEmpty()) {
+    } else if (dto.getSystemTags().size() != ruleDef.tags().size() ||
+      !dto.getSystemTags().containsAll(ruleDef.tags())
+      || !intersection(dto.getTags(), ruleDef.tags()).isEmpty()) {
       dto.setSystemTags(ruleDef.tags());
       // remove end-user tags that are now declared as system
       RuleTagHelper.applyTags(dto, ImmutableSet.copyOf(dto.getTags()));
index e506446406da81741d3627bf429b1b6644c77826..f67746d1018eafbc15a5a6ce20bbb742569a4f1b 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.rule;
 
-import com.google.common.collect.Sets;
 import java.util.Date;
 import java.util.List;
 import org.junit.Before;
@@ -48,6 +47,7 @@ import org.sonar.server.rule.index.RuleIndexDefinition;
 import org.sonar.server.rule.index.RuleIndexer;
 import org.sonar.server.rule.index.RuleQuery;
 
+import static com.google.common.collect.Sets.newHashSet;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -131,7 +131,7 @@ public class RegisterRulesTest {
 
     // user adds tags and sets markdown note
     RuleDto rule1 = dbClient.ruleDao().selectOrFailByKey(dbTester.getSession(), RULE_KEY1);
-    rule1.setTags(Sets.newHashSet("usertag1", "usertag2"));
+    rule1.setTags(newHashSet("usertag1", "usertag2"));
     rule1.setNoteData("user *note*");
     rule1.setNoteUserLogin("marius");
     dbClient.ruleDao().update(dbTester.getSession(), rule1);
@@ -175,6 +175,39 @@ public class RegisterRulesTest {
     assertThat(ruleIndex.search(new RuleQuery(), new SearchOptions()).getIds()).containsOnly(RULE_KEY1, RULE_KEY3);
   }
 
+  @Test
+  public void add_new_tag() {
+    execute(new RulesDefinition() {
+      @Override
+      public void define(RulesDefinition.Context context) {
+        RulesDefinition.NewRepository repo = context.createRepository("fake", "java");
+        repo.createRule("rule1")
+          .setName("Rule One")
+          .setHtmlDescription("Description of Rule One")
+          .setTags("tag1");
+        repo.done();
+      }
+    });
+
+    RuleDto rule = dbClient.ruleDao().selectOrFailByKey(dbTester.getSession(), RULE_KEY1);
+    assertThat(rule.getSystemTags()).containsOnly("tag1");
+
+    execute(new RulesDefinition() {
+      @Override
+      public void define(RulesDefinition.Context context) {
+        RulesDefinition.NewRepository repo = context.createRepository("fake", "java");
+        repo.createRule("rule1")
+          .setName("Rule One")
+          .setHtmlDescription("Description of Rule One")
+          .setTags("tag1", "tag2");
+        repo.done();
+      }
+    });
+
+    rule = dbClient.ruleDao().selectOrFailByKey(dbTester.getSession(), RULE_KEY1);
+    assertThat(rule.getSystemTags()).containsOnly("tag1", "tag2");
+  }
+
   @Test
   public void update_only_rule_name() throws Exception {
     when(system.now()).thenReturn(DATE1.getTime());
@@ -333,6 +366,29 @@ public class RegisterRulesTest {
     }
   }
 
+  @Test
+  public void remove_system_tags_when_plugin_does_not_provide_any() {
+    // Rule already exists in DB, with some system tags
+    dbClient.ruleDao().insert(dbTester.getSession(), new RuleDto()
+      .setRuleKey("rule1")
+      .setRepositoryKey("findbugs")
+      .setName("Rule One")
+      .setDescription("Rule one description")
+      .setDescriptionFormat(RuleDto.Format.HTML)
+      .setSystemTags(newHashSet("tag1", "tag2"))
+      );
+    dbTester.getSession().commit();
+
+    // Synchronize rule without tag
+    execute(new FindbugsRepository());
+
+    List<RuleDto> rules = dbClient.ruleDao().selectAll(dbTester.getSession());
+    assertThat(rules).hasSize(1);
+    RuleDto result = rules.get(0);
+    assertThat(result.getKey()).isEqualTo(RuleKey.of("findbugs", "rule1"));
+    assertThat(result.getSystemTags()).isEmpty();
+  }
+
   private void execute(RulesDefinition... defs) {
     RuleDefinitionsLoader loader = new RuleDefinitionsLoader(mock(DeprecatedRulesDefinitionLoader.class), new RuleRepositories(), mock(CommonRuleDefinitionsImpl.class), defs);
     Languages languages = mock(Languages.class);