From bf39b235e5d55f07a43707949129aee6a85dd4a3 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Thu, 16 Apr 2015 17:44:52 +0200 Subject: [PATCH] SONAR-5685 Fail to restore profile with duplicated rule keys --- .../qualityprofile/QProfileBackuper.java | 15 +++++++ .../QProfileBackuperMediumTest.java | 11 +++++ .../duplicates-xml-backup.xml | 40 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/duplicates-xml-backup.xml 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 5110006f25c..87e0ab6929a 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 @@ -19,8 +19,10 @@ */ package org.sonar.server.qualityprofile; +import com.google.common.base.Joiner; import com.google.common.collect.Lists; 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.codehaus.staxmate.SMInputFactory; @@ -44,6 +46,7 @@ import java.io.Writer; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; public class QProfileBackuper implements ServerComponent { @@ -51,6 +54,8 @@ public class QProfileBackuper implements ServerComponent { private final DbClient db; private final IndexClient index; + private static final Joiner RULEKEY_JOINER = Joiner.on(", ").skipNulls(); + public QProfileBackuper(QProfileReset reset, DbClient db, IndexClient index) { this.reset = reset; this.db = db; @@ -134,6 +139,8 @@ public class QProfileBackuper implements ServerComponent { private List parseRuleActivations(SMInputCursor rulesCursor) throws XMLStreamException { List activations = Lists.newArrayList(); + Set activatedKeys = Sets.newHashSet(); + List duplicatedKeys = Lists.newArrayList(); while (rulesCursor.getNext() != null) { SMInputCursor ruleCursor = rulesCursor.childElementCursor(); String repositoryKey = null, key = null, severity = null; @@ -155,11 +162,19 @@ public class QProfileBackuper implements ServerComponent { } } RuleKey ruleKey = RuleKey.of(repositoryKey, key); + if (activatedKeys.contains(ruleKey)) { + duplicatedKeys.add(ruleKey); + } + activatedKeys.add(ruleKey); RuleActivation activation = new RuleActivation(ruleKey); activation.setSeverity(severity); activation.setParameters(parameters); activations.add(activation); } + if (!duplicatedKeys.isEmpty()) { + throw new IllegalArgumentException("The quality profile cannot be restored as it contains duplicates for the following rules: " + + RULEKEY_JOINER.join(duplicatedKeys)); + } return activations; } 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 0debd26b199..489de2a0405 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 @@ -269,6 +269,17 @@ public class QProfileBackuperMediumTest { } } + @Test + public void fail_to_restore_if_duplicate_rule() throws Exception { + try { + tester.get(QProfileBackuper.class).restore(new StringReader( + Resources.toString(getClass().getResource("QProfileBackuperMediumTest/duplicates-xml-backup.xml"), Charsets.UTF_8)), null); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessage("The quality profile cannot be restored as it contains duplicates for the following rules: xoo:x1, xoo:x2"); + } + } + @Test public void restore_and_override_profile_name() throws Exception { tester.get(QProfileBackuper.class).restore(new StringReader( diff --git a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/duplicates-xml-backup.xml b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/duplicates-xml-backup.xml new file mode 100644 index 00000000000..4a41aa0b275 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/QProfileBackuperMediumTest/duplicates-xml-backup.xml @@ -0,0 +1,40 @@ + + + P1 + xoo + + + xoo + x1 + BLOCKER + + + max + 7 + + + + + xoo + x2 + CRITICAL + + + xoo + x1 + MAJOR + + + max + 5 + + + + + xoo + x2 + MINOR + + + + -- 2.39.5