]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5684 Sort rules by repository and key in backup file
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 15 Apr 2015 14:52:37 +0000 (16:52 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Fri, 17 Apr 2015 15:32:49 +0000 (17:32 +0200)
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileBackuperMediumTest.java
server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/expected-backup.xml

index 87e0ab6929a0170f6e86ef787a347d84bf099c74..536bb965cd8eb4e3932966fce0b27bd089a49de4 100644 (file)
@@ -25,6 +25,7 @@ import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.builder.CompareToBuilder;
 import org.codehaus.staxmate.SMInputFactory;
 import org.codehaus.staxmate.in.SMHierarchicCursor;
 import org.codehaus.staxmate.in.SMInputCursor;
@@ -43,6 +44,8 @@ import javax.xml.stream.XMLStreamException;
 
 import java.io.Reader;
 import java.io.Writer;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -70,8 +73,9 @@ public class QProfileBackuper implements ServerComponent {
     } finally {
       dbSession.close();
     }
-    Iterator<ActiveRule> activeRules = index.get(ActiveRuleIndex.class).findByProfile(profile.getKey());
-    writeXml(writer, profile, activeRules);
+    List<ActiveRule> activeRules = Lists.newArrayList(index.get(ActiveRuleIndex.class).findByProfile(profile.getKey()));
+    Collections.sort(activeRules, BackupActiveRuleComparator.INSTANCE);
+    writeXml(writer, profile, activeRules.iterator());
   }
 
   private void writeXml(Writer writer, QualityProfileDto profile, Iterator<ActiveRule> activeRules) {
@@ -206,4 +210,16 @@ public class QProfileBackuper implements ServerComponent {
     xmlFactory.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.FALSE);
     return new SMInputFactory(xmlFactory);
   }
+
+  private enum BackupActiveRuleComparator implements Comparator<ActiveRule> {
+    INSTANCE;
+
+    @Override
+    public int compare(ActiveRule o1, ActiveRule o2) {
+      return new CompareToBuilder()
+        .append(o1.key().ruleKey().repository(), o2.key().ruleKey().repository())
+        .append(o1.key().ruleKey().rule(), o2.key().ruleKey().rule())
+        .toComparison();
+    }
+  }
 }
index 489de2a04055dc3072971f8a68f75244df796183..173d7a60ccfc3c6a26731acad763f3d15698ceb1 100644 (file)
@@ -28,6 +28,7 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
+import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.Severity;
 import org.sonar.api.server.rule.RuleParamType;
 import org.sonar.core.persistence.DbSession;
@@ -78,12 +79,22 @@ public class QProfileBackuperMediumTest {
 
   @Test
   public void backup() throws Exception {
-    // create profile P1 with rule x1 activated
+    RuleKey blahRuleKey = RuleKey.of("blah", "my-rule");
+    RuleDto blahRule = RuleTesting.newDto(blahRuleKey).setSeverity("INFO").setLanguage("xoo");
+    db.ruleDao().insert(dbSession, blahRule);
+    dbSession.commit();
+    dbSession.clearCache();
+
+    // create profile P1 with rules x2 and x1 activated
     db.qualityProfileDao().insert(dbSession, QProfileTesting.newXooP1());
-    RuleActivation activation = new RuleActivation(RuleTesting.XOO_X1);
-    activation.setSeverity(Severity.BLOCKER);
-    activation.setParameter("max", "7");
-    tester.get(RuleActivator.class).activate(dbSession, activation, QProfileTesting.XOO_P1_NAME);
+    RuleActivation activation1 = new RuleActivation(RuleTesting.XOO_X2).setSeverity("MINOR");
+    RuleActivation activation2 = new RuleActivation(RuleTesting.XOO_X1);
+    RuleActivation activation3 = new RuleActivation(blahRuleKey);
+    activation2.setSeverity(Severity.BLOCKER);
+    activation2.setParameter("max", "7");
+    tester.get(RuleActivator.class).activate(dbSession, activation1, QProfileTesting.XOO_P1_NAME);
+    tester.get(RuleActivator.class).activate(dbSession, activation2, QProfileTesting.XOO_P1_NAME);
+    tester.get(RuleActivator.class).activate(dbSession, activation3, QProfileTesting.XOO_P1_NAME);
     dbSession.commit();
     dbSession.clearCache();
 
@@ -91,6 +102,7 @@ public class QProfileBackuperMediumTest {
     tester.get(QProfileBackuper.class).backup(QProfileTesting.XOO_P1_KEY, output);
 
     XMLUnit.setIgnoreWhitespace(true);
+    XMLUnit.setIgnoreComments(true);
     Diff diff = XMLUnit.compareXML(output.toString(),
       Resources.toString(getClass().getResource("QProfileBackuperMediumTest/expected-backup.xml"), Charsets.UTF_8));
 
index 1786ed941dd79559e4bd32850f8035046cb16638..02ff3f84ddb6249a1403eab806b960d3d78ef264 100644 (file)
@@ -3,6 +3,14 @@
   <name>P1</name>
   <language>xoo</language>
   <rules>
+    <!-- blah comes first (sorted by repository) -->
+    <rule>
+      <repositoryKey>blah</repositoryKey>
+      <key>my-rule</key>
+      <priority>INFO</priority>
+      <parameters/>
+    </rule>
+    <!-- x1 before x2 (sorted by key) -->
     <rule>
       <repositoryKey>xoo</repositoryKey>
       <key>x1</key>
         </parameter>
       </parameters>
     </rule>
+    <rule>
+      <repositoryKey>xoo</repositoryKey>
+      <key>x2</key>
+      <priority>MINOR</priority>
+      <parameters/>
+    </rule>
   </rules>
 </profile>