From: Julien HENRY Date: Wed, 31 Jul 2013 15:56:41 +0000 (+0200) Subject: SONAR-4515 Display all allowed values for sonar.languages when an invalid one is... X-Git-Tag: 3.7.1-RC1-~180 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=75406c2a365e04d3be42b61c329c48b3d13bc82d;p=sonarqube.git SONAR-4515 Display all allowed values for sonar.languages when an invalid one is specified --- diff --git a/sonar-batch/src/main/java/org/sonar/batch/DefaultProfileLoader.java b/sonar-batch/src/main/java/org/sonar/batch/DefaultProfileLoader.java index 4c349497bff..2e6e064c4be 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/DefaultProfileLoader.java +++ b/sonar-batch/src/main/java/org/sonar/batch/DefaultProfileLoader.java @@ -19,9 +19,11 @@ */ 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 " 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()); diff --git a/sonar-batch/src/test/java/org/sonar/batch/DefaultProfileLoaderTest.java b/sonar-batch/src/test/java/org/sonar/batch/DefaultProfileLoaderTest.java index 8939e345686..80e8bb1aff3 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/DefaultProfileLoaderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/DefaultProfileLoaderTest.java @@ -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) { diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java b/sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java index ee474041bc4..96dd3701751 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java @@ -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 map = Maps.newHashMap(); + private final Map 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 allKey() { + return map.keySet(); + } }