From aff6df3e136f5ecf3d48b1082bb30c45635323a5 Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Fri, 2 Aug 2013 13:57:34 +0200 Subject: [PATCH] ONAR-4515 Display all allowed values for sonar.languages --- .../java/org/sonar/batch/DefaultProfileLoader.java | 13 ++++++++++++- .../main/java/org/sonar/batch/ProfileProvider.java | 6 +++++- .../org/sonar/batch/DefaultProfileLoaderTest.java | 2 +- .../java/org/sonar/batch/ProfileProviderTest.java | 5 +++-- .../java/org/sonar/api/resources/Languages.java | 7 +++++++ 5 files changed, 28 insertions(+), 5 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 035d6209063..8e8e02aa5c1 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/DefaultProfileLoader.java +++ b/sonar-batch/src/main/java/org/sonar/batch/DefaultProfileLoader.java @@ -20,6 +20,8 @@ package org.sonar.batch; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.sonar.api.config.Settings; import org.sonar.api.profiles.RulesProfile; import org.sonar.api.resources.Project; @@ -28,6 +30,9 @@ import org.sonar.api.utils.SonarException; import org.sonar.jpa.dao.ProfilesDao; public class DefaultProfileLoader implements ProfileLoader { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultProfileLoader.class); + private ProfilesDao dao; public DefaultProfileLoader(ProfilesDao dao) { @@ -43,7 +48,13 @@ public class DefaultProfileLoader implements ProfileLoader { 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() + "'"); + String msg = "You must install a plugin that supports the language key '" + project.getLanguageKey() + "'."; + if (!LOG.isDebugEnabled()) { + msg += " Run analysis in verbose mode to see list of available language keys."; + } else { + msg += " See analysis log for a list of available language keys."; + } + throw new SonarException(msg); } RulesProfile profile = dao.getProfile(project.getLanguageKey(), profileName); diff --git a/sonar-batch/src/main/java/org/sonar/batch/ProfileProvider.java b/sonar-batch/src/main/java/org/sonar/batch/ProfileProvider.java index cc34e85c299..93012a107d2 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/ProfileProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/ProfileProvider.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.config.Settings; import org.sonar.api.profiles.RulesProfile; +import org.sonar.api.resources.Languages; import org.sonar.api.resources.Project; public class ProfileProvider extends ProviderAdapter { @@ -32,7 +33,10 @@ public class ProfileProvider extends ProviderAdapter { private RulesProfile profile; - public RulesProfile provide(Project project, ProfileLoader profileLoader, Settings settings) { + /** + * @param languages This parameter is here to ensure Languages is started before this provider in order to display available languages. + */ + public RulesProfile provide(Project project, ProfileLoader profileLoader, Settings settings, Languages languages) { if (profile == null) { profile = profileLoader.load(project, settings); LOG.info("Quality profile : {}", profile); 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 98004894633..693d4d67f09 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/DefaultProfileLoaderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/DefaultProfileLoaderTest.java @@ -92,7 +92,7 @@ public class DefaultProfileLoaderTest { Project cobolProject = newProject("cobol"); thrown.expect(SonarException.class); - thrown.expectMessage("You must install a plugin that supports the language 'cobol'"); + thrown.expectMessage("You must install a plugin that supports the language key 'cobol'"); new DefaultProfileLoader(dao).load(cobolProject, new Settings()); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/ProfileProviderTest.java b/sonar-batch/src/test/java/org/sonar/batch/ProfileProviderTest.java index f0bac78d121..12c7cb251b7 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/ProfileProviderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/ProfileProviderTest.java @@ -26,6 +26,7 @@ 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.Languages; import org.sonar.api.resources.Project; import static org.hamcrest.Matchers.is; @@ -56,8 +57,8 @@ public class ProfileProviderTest { RulesProfile profile = RulesProfile.create(); when(loader.load(eq(javaProject), any(Settings.class))).thenReturn(profile); - assertThat(provider.provide(javaProject, loader, new Settings()), is(profile)); - assertThat(provider.provide(javaProject, loader, new Settings()), is(profile)); + assertThat(provider.provide(javaProject, loader, new Settings(), mock(Languages.class)), is(profile)); + assertThat(provider.provide(javaProject, loader, new Settings(), mock(Languages.class)), is(profile)); verify(loader).load(eq(javaProject), any(Settings.class)); verifyNoMoreInteractions(loader); } 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 96dd3701751..47d667db493 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 @@ -21,6 +21,8 @@ package org.sonar.api.resources; import com.google.common.collect.Maps; import org.apache.commons.lang.ArrayUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; @@ -37,14 +39,18 @@ import java.util.Set; */ public class Languages implements BatchComponent, ServerComponent { + private static final Logger LOG = LoggerFactory.getLogger(Languages.class); + private final Map map = Maps.newLinkedHashMap(); /** * Creates a list of languages */ public Languages(Language... languages) { + LOG.debug("Available languages:"); for (Language language : languages) { map.put(language.getKey(), language); + LOG.debug(" * " + language.getName() + " => \"" + language.getKey() + "\""); } } @@ -52,6 +58,7 @@ public class Languages implements BatchComponent, ServerComponent { * No languages are installed */ public Languages() { + LOG.debug("No language available"); } /** -- 2.39.5