]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-2977 Stop Sonar if more than 1 default profile for a language
authorFabrice Bellingard <bellingard@gmail.com>
Wed, 21 Mar 2012 09:43:28 +0000 (10:43 +0100)
committerFabrice Bellingard <bellingard@gmail.com>
Wed, 21 Mar 2012 12:55:24 +0000 (13:55 +0100)
sonar-server/src/main/java/org/sonar/server/startup/ActivateDefaultProfiles.java
sonar-server/src/main/java/org/sonar/server/startup/RegisterProvidedProfiles.java

index f597ee3214b49659bb05c5d00280c043d2b03c3e..29d76befbdf7bccde6a8b070b1acc704efbd0279 100644 (file)
@@ -70,6 +70,10 @@ public final class ActivateDefaultProfiles {
         profileToActivate = profiles.get(0);
       }
     }
+    activateProfileIfNeeded(session, profileToActivate, oneProfileIsActivated);
+  }
+
+  private void activateProfileIfNeeded(DatabaseSession session, RulesProfile profileToActivate, boolean oneProfileIsActivated) {
     if (!oneProfileIsActivated && profileToActivate != null) {
       profileToActivate.setDefaultProfile(true);
       session.saveWithoutFlush(profileToActivate);
index b9a803b49d8dc26b6c00d13f55de0164e1ad6456..d8d504a0f2cfaf2fc9741a9990ded9190f2234fa 100644 (file)
  */
 package org.sonar.server.startup;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -28,16 +32,19 @@ import org.slf4j.LoggerFactory;
 import org.sonar.api.database.DatabaseSession;
 import org.sonar.api.profiles.ProfileDefinition;
 import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.rules.*;
+import org.sonar.api.rules.ActiveRule;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.rules.RuleParam;
+import org.sonar.api.rules.RuleQuery;
+import org.sonar.api.utils.SonarException;
 import org.sonar.api.utils.TimeProfiler;
 import org.sonar.api.utils.ValidationMessages;
 import org.sonar.jpa.session.DatabaseSessionFactory;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 
 public final class RegisterProvidedProfiles {
 
@@ -72,19 +79,34 @@ public final class RegisterProvidedProfiles {
     profiler.stop();
   }
 
-  List<RulesProfile> createProfiles() {
+  private List<RulesProfile> createProfiles() {
     List<RulesProfile> result = Lists.newArrayList();
+    Map<String, RulesProfile> defaultProfilesByLanguage = Maps.newHashMap();
     for (ProfileDefinition definition : definitions) {
       ValidationMessages validation = ValidationMessages.create();
       RulesProfile profile = definition.createProfile(validation);
       validation.log(LOGGER);
       if (profile != null && !validation.hasErrors()) {
         result.add(profile);
+        checkIfNoMoreThanOneDefaultProfile(defaultProfilesByLanguage, profile);
       }
     }
     return result;
   }
 
+  private void checkIfNoMoreThanOneDefaultProfile(Map<String, RulesProfile> defaultProfilesByLanguage, RulesProfile profile) {
+    if (profile.getDefaultProfile()) {
+      RulesProfile defaultProfileForLanguage = defaultProfilesByLanguage.get(profile.getLanguage());
+      if (defaultProfileForLanguage == null) {
+        defaultProfilesByLanguage.put(profile.getLanguage(), profile);
+      } else {
+        throw new SonarException("Language " + profile.getLanguage() + " can't have 2 default provided profiles: "
+          + profile.getName() + " and "
+          + defaultProfileForLanguage.getName());
+      }
+    }
+  }
+
   private void cleanProvidedProfiles(List<RulesProfile> profiles, DatabaseSession session) {
     TimeProfiler profiler = new TimeProfiler().start("Clean provided profiles");
     List<RulesProfile> existingProfiles = session.getResults(RulesProfile.class, "provided", true);