]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4515 Display all allowed values for sonar.languages when an invalid one is...
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 31 Jul 2013 15:56:41 +0000 (17:56 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Wed, 31 Jul 2013 15:57:58 +0000 (17:57 +0200)
sonar-batch/src/main/java/org/sonar/batch/DefaultProfileLoader.java
sonar-batch/src/test/java/org/sonar/batch/DefaultProfileLoaderTest.java
sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java

index 4c349497bff93f505053da88621d30dea9d0789b..2e6e064c4be5641828d4a018308b2c228c2b7065 100644 (file)
  */
 package org.sonar.batch;
 
+import com.google.common.base.Joiner;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.config.Settings;
 import org.sonar.api.profiles.RulesProfile;
+import org.sonar.api.resources.Languages;
 import org.sonar.api.resources.Project;
 import org.sonar.api.rules.ActiveRule;
 import org.sonar.api.utils.SonarException;
@@ -29,22 +31,24 @@ import org.sonar.jpa.dao.ProfilesDao;
 
 public class DefaultProfileLoader implements ProfileLoader {
   private ProfilesDao dao;
+  private Languages languages;
 
-  public DefaultProfileLoader(ProfilesDao dao) {
+  public DefaultProfileLoader(ProfilesDao dao, Languages languages) {
     this.dao = dao;
+    this.languages = languages;
   }
 
   public RulesProfile load(Project project, Settings settings) {
+    if (!languages.allKey().contains(project.getLanguageKey())) {
+      String languageList = Joiner.on(", ").join(languages.allKey());
+      throw new SonarException("You must install a plugin that supports the language '" + project.getLanguageKey() +
+        "'. Supported language keys are: " + languageList);
+    }
+
     String profileName = StringUtils.defaultIfBlank(
         settings.getString("sonar.profile"),
         settings.getString("sonar.profile." + project.getLanguageKey()));
 
-    if (StringUtils.isBlank(profileName)) {
-      // This means that the current language is not supported by any installed plugin, otherwise at least a
-      // "Default <Language Name>" profile would have been created by ActivateDefaultProfiles class.
-      throw new SonarException("You must install a plugin that supports the language '" + project.getLanguageKey() + "'");
-    }
-
     RulesProfile profile = dao.getProfile(project.getLanguageKey(), profileName);
     if (profile == null) {
       throw new SonarException("Quality profile not found : " + profileName + ", language " + project.getLanguageKey());
index 8939e3456864411c35138ed9ea8e66f721a5b8c7..80e8bb1aff3bfdf52b0ca5e978d70720bec11024 100644 (file)
@@ -26,7 +26,10 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.sonar.api.config.Settings;
 import org.sonar.api.profiles.RulesProfile;
+import org.sonar.api.resources.AbstractLanguage;
 import org.sonar.api.resources.Java;
+import org.sonar.api.resources.Language;
+import org.sonar.api.resources.Languages;
 import org.sonar.api.resources.Project;
 import org.sonar.api.utils.SonarException;
 import org.sonar.jpa.dao.ProfilesDao;
@@ -41,11 +44,23 @@ public class DefaultProfileLoaderTest {
   public ExpectedException thrown = ExpectedException.none();
 
   private ProfilesDao dao;
+  private Languages languages;
   private Project javaProject = newProject(Java.KEY);
 
   @Before
   public void setUp() {
     dao = mock(ProfilesDao.class);
+    Language java = new AbstractLanguage("java", "Java") {
+      public String[] getFileSuffixes() {
+        return null;
+      };
+    };
+    Language cobol = new AbstractLanguage("js", "JavaScript") {
+      public String[] getFileSuffixes() {
+        return null;
+      };
+    };
+    languages = new Languages(java, cobol);
   }
 
   @Test
@@ -54,7 +69,7 @@ public class DefaultProfileLoaderTest {
     settings.setProperty("sonar.profile.java", "legacy profile");
     when(dao.getProfile(Java.KEY, "legacy profile")).thenReturn(RulesProfile.create("legacy profile", "java"));
 
-    RulesProfile profile = new DefaultProfileLoader(dao).load(javaProject, settings);
+    RulesProfile profile = new DefaultProfileLoader(dao, languages).load(javaProject, settings);
 
     assertThat(profile.getName()).isEqualTo("legacy profile");
   }
@@ -66,19 +81,19 @@ public class DefaultProfileLoaderTest {
 
     thrown.expect(SonarException.class);
     thrown.expectMessage("Quality profile not found : unknown, language java");
-    new DefaultProfileLoader(dao).load(javaProject, settings);
+    new DefaultProfileLoader(dao, languages).load(javaProject, settings);
   }
 
   /**
-   * SONAR-3125
+   * SONAR-3125, SONAR-4515
    */
   @Test
   public void should_give_explicit_message_if_default_profile_not_found() {
     Project cobolProject = newProject("cobol");
 
     thrown.expect(SonarException.class);
-    thrown.expectMessage("You must install a plugin that supports the language 'cobol'");
-    new DefaultProfileLoader(dao).load(cobolProject, new Settings());
+    thrown.expectMessage("You must install a plugin that supports the language 'cobol'. Supported language keys are: java, js");
+    new DefaultProfileLoader(dao, languages).load(cobolProject, new Settings());
   }
 
   private Project newProject(String language) {
index ee474041bc454d358e31b498fa43d55792e3f0c4..96dd37017510869356456b5383bbbedcf1328f13 100644 (file)
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * A class to store the list of languages
@@ -36,7 +37,7 @@ import java.util.Map;
  */
 public class Languages implements BatchComponent, ServerComponent {
 
-  private final Map<String, Language> map = Maps.newHashMap();
+  private final Map<String, Language> map = Maps.newLinkedHashMap();
 
   /**
    * Creates a list of languages
@@ -81,4 +82,12 @@ public class Languages implements BatchComponent, ServerComponent {
   public void add(Language language) {
     map.put(language.getKey(), language);
   }
+
+  /**
+   * @return list of all available language keys
+   * @since 4.0
+   */
+  public Set<String> allKey() {
+    return map.keySet();
+  }
 }