From 7635195bd62407e674ccba76b599d6c38821879d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Wed, 15 Apr 2015 16:52:37 +0200 Subject: [PATCH] SONAR-5684 Sort rules by repository and key in backup file --- .../qualityprofile/QProfileBackuper.java | 20 +++++++++++++++-- .../QProfileBackuperMediumTest.java | 22 ++++++++++++++----- .../expected-backup.xml | 14 ++++++++++++ 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java index 87e0ab6929a..536bb965cd8 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java @@ -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 activeRules = index.get(ActiveRuleIndex.class).findByProfile(profile.getKey()); - writeXml(writer, profile, activeRules); + List 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 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 { + 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(); + } + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileBackuperMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileBackuperMediumTest.java index 489de2a0405..173d7a60ccf 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileBackuperMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileBackuperMediumTest.java @@ -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)); diff --git a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/expected-backup.xml b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/expected-backup.xml index 1786ed941dd..02ff3f84ddb 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/expected-backup.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/expected-backup.xml @@ -3,6 +3,14 @@ P1 xoo + + + blah + my-rule + INFO + + + xoo x1 @@ -14,5 +22,11 @@ + + xoo + x2 + MINOR + + -- 2.39.5