*/
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;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
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;
private List<RuleActivation> parseRuleActivations(SMInputCursor rulesCursor) throws XMLStreamException {
List<RuleActivation> activations = Lists.newArrayList();
+ Set<RuleKey> activatedKeys = Sets.newHashSet();
+ List<RuleKey> duplicatedKeys = Lists.newArrayList();
while (rulesCursor.getNext() != null) {
SMInputCursor ruleCursor = rulesCursor.childElementCursor();
String repositoryKey = null, key = null, severity = null;
}
}
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;
}
}
}
+ @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(
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<profile>
+ <name>P1</name>
+ <language>xoo</language>
+ <rules>
+ <rule>
+ <repositoryKey>xoo</repositoryKey>
+ <key>x1</key>
+ <priority>BLOCKER</priority>
+ <parameters>
+ <parameter>
+ <key>max</key>
+ <value>7</value>
+ </parameter>
+ </parameters>
+ </rule>
+ <rule>
+ <repositoryKey>xoo</repositoryKey>
+ <key>x2</key>
+ <priority>CRITICAL</priority>
+ </rule>
+ <rule>
+ <repositoryKey>xoo</repositoryKey>
+ <key>x1</key>
+ <priority>MAJOR</priority>
+ <parameters>
+ <parameter>
+ <key>max</key>
+ <value>5</value>
+ </parameter>
+ </parameters>
+ </rule>
+ <rule>
+ <repositoryKey>xoo</repositoryKey>
+ <key>x2</key>
+ <priority>MINOR</priority>
+ </rule>
+
+ </rules>
+</profile>