]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5972 A plugin can't declare a quality profile related to a language which is...
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Fri, 19 Dec 2014 20:31:10 +0000 (21:31 +0100)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Fri, 19 Dec 2014 20:43:54 +0000 (21:43 +0100)
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/RegisterQualityProfiles.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/RegisterQualityProfilesMediumTest.java

index 7139554e54c3e6029e85486dbb05da82d36af5de..0f8016fc22c59d298e6389d4cb200781dfa2e94a 100644 (file)
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.profiles.ProfileDefinition;
 import org.sonar.api.profiles.RulesProfile;
+import org.sonar.api.resources.Languages;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rules.ActiveRuleParam;
 import org.sonar.api.utils.TimeProfiler;
@@ -62,24 +63,26 @@ public class RegisterQualityProfiles implements ServerComponent {
   private final DbClient dbClient;
   private final QProfileFactory profileFactory;
   private final RuleActivator ruleActivator;
+  private final Languages languages;
 
   /**
    * To be kept when no ProfileDefinition are injected
    */
   public RegisterQualityProfiles(PersistentSettings settings, BuiltInProfiles builtInProfiles,
-    DbClient dbClient, QProfileFactory profileFactory, RuleActivator ruleActivator) {
-    this(settings, builtInProfiles, dbClient, profileFactory, ruleActivator, Collections.<ProfileDefinition>emptyList());
+                                 DbClient dbClient, QProfileFactory profileFactory, RuleActivator ruleActivator, Languages languages) {
+    this(settings, builtInProfiles, dbClient, profileFactory, ruleActivator, Collections.<ProfileDefinition>emptyList(), languages);
   }
 
   public RegisterQualityProfiles(PersistentSettings settings, BuiltInProfiles builtInProfiles,
-    DbClient dbClient, QProfileFactory profileFactory, RuleActivator ruleActivator,
-    List<ProfileDefinition> definitions) {
+                                 DbClient dbClient, QProfileFactory profileFactory, RuleActivator ruleActivator,
+                                 List<ProfileDefinition> definitions, Languages languages) {
     this.settings = settings;
     this.builtInProfiles = builtInProfiles;
     this.dbClient = dbClient;
     this.profileFactory = profileFactory;
     this.ruleActivator = ruleActivator;
     this.definitions = definitions;
+    this.languages = languages;
   }
 
   public void start() {
@@ -90,19 +93,19 @@ public class RegisterQualityProfiles implements ServerComponent {
       ListMultimap<String, RulesProfile> profilesByLanguage = profilesByLanguage();
       for (String language : profilesByLanguage.keySet()) {
         List<RulesProfile> defs = profilesByLanguage.get(language);
-        verifyLanguage(language, defs);
-
-        for (Map.Entry<String, Collection<RulesProfile>> entry : profilesByName(defs).entrySet()) {
-          String name = entry.getKey();
-          QProfileName profileName = new QProfileName(language, name);
-          if (shouldRegister(profileName, session)) {
-            register(profileName, entry.getValue(), session);
-            session.commit();
+        if (verifyLanguage(language, defs)) {
+          for (Map.Entry<String, Collection<RulesProfile>> entry : profilesByName(defs).entrySet()) {
+            String name = entry.getKey();
+            QProfileName profileName = new QProfileName(language, name);
+            if (shouldRegister(profileName, session)) {
+              register(profileName, entry.getValue(), session);
+              session.commit();
+            }
+            builtInProfiles.put(language, name);
           }
-          builtInProfiles.put(language, name);
+          setDefault(language, defs, session);
+          session.commit();
         }
-        setDefault(language, defs, session);
-        session.commit();
       }
 
     } finally {
@@ -111,15 +114,20 @@ public class RegisterQualityProfiles implements ServerComponent {
     }
   }
 
-  private static void verifyLanguage(String language, List<RulesProfile> profiles) {
+  private boolean verifyLanguage(String language, List<RulesProfile> profiles) {
+    if (languages.get(language) == null) {
+      LOGGER.info(String.format("Language %s is not installed, related Quality profiles are ignored", language));
+      // profiles relate to a language which is not installed
+      return false;
+    }
     if (profiles.isEmpty()) {
-      LOGGER.warn("No Quality Profile defined for language: " + language);
+      LOGGER.warn(String.format("No Quality profiles defined for language: %s", language));
     }
-
     Set<String> defaultProfileNames = defaultProfileNames(profiles);
     if (defaultProfileNames.size() > 1) {
-      throw new IllegalStateException("Several Quality profiles are flagged as default for the language " + language + ": " + defaultProfileNames);
+      throw new IllegalStateException(String.format("Several Quality profiles are flagged as default for the language %s: %s", language, defaultProfileNames));
     }
+    return true;
   }
 
   private void register(QProfileName name, Collection<RulesProfile> profiles, DbSession session) {
@@ -160,7 +168,7 @@ public class RegisterQualityProfiles implements ServerComponent {
     }
 
     if (!upToDate) {
-      String defaultProfileName = defaultProfileName(profileDefs);
+      String defaultProfileName = nameOfDefaultProfile(profileDefs);
       LOGGER.info("Set default " + language + " profile: " + defaultProfileName);
       settings.saveProperty(propertyKey, defaultProfileName);
     }
@@ -191,7 +199,7 @@ public class RegisterQualityProfiles implements ServerComponent {
     }).asMap();
   }
 
-  private static String defaultProfileName(List<RulesProfile> profiles) {
+  private static String nameOfDefaultProfile(List<RulesProfile> profiles) {
     String defaultName = null;
     boolean hasSonarWay = false;
 
@@ -221,6 +229,7 @@ public class RegisterQualityProfiles implements ServerComponent {
   }
 
   private boolean shouldRegister(QProfileName key, DbSession session) {
+    // check if the profile was already registered in the past
     return dbClient.loadedTemplateDao()
       .countByTypeAndKey(LoadedTemplateDto.QUALITY_PROFILE_TYPE, templateKey(key), session) == 0;
   }
index 39d73517b8e7993f1e3d6f6d1ff506e440b69696..507e03dcdfa596b8453ed11d6d035dda0c71f0cb 100644 (file)
@@ -141,6 +141,18 @@ public class RegisterQualityProfilesMediumTest {
     assertThat(params.get("max").getValue()).isEqualTo("10");
   }
 
+  @Test
+  public void do_not_register_profile_if_missing_language() throws Exception {
+    // xoo language is not installed
+    tester = new ServerTester().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
+    tester.start();
+    dbSession = dbClient().openSession(false);
+
+    // Check Profile in DB
+    QualityProfileDao qualityProfileDao = dbClient().qualityProfileDao();
+    assertThat(qualityProfileDao.findAll(dbSession)).hasSize(0);
+  }
+
   @Test
   public void fail_if_two_definitions_are_marked_as_default_on_the_same_language() throws Exception {
     tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", true));