aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/DefaultProfileLoader.java18
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/DefaultProfileLoaderTest.java25
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java11
3 files changed, 41 insertions, 13 deletions
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 <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());
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<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();
+ }
}