import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
import org.sonar.api.config.Settings;
+import org.sonar.api.utils.MessageException;
import static java.lang.String.format;
import static org.sonar.api.CoreProperties.DEVELOPMENT_COST;
String[] languageConfigIndexes = settings.getStringArray(LANGUAGE_SPECIFIC_PARAMETERS);
for (String languageConfigIndex : languageConfigIndexes) {
String languagePropertyKey = LANGUAGE_SPECIFIC_PARAMETERS + "." + languageConfigIndex + "." + LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY;
- builder.put(settings.getString(languagePropertyKey), LanguageSpecificConfiguration.create(settings, languageConfigIndex));
+ String languageKey = settings.getString(languagePropertyKey);
+ if (languageKey == null) {
+ throw MessageException.of("Technical debt configuration is corrupted. At least one language specific parameter has no Language key. " +
+ "Contact your administrator to update this configuration in the global administration section of SonarQube.");
+ }
+ builder.put(languageKey, LanguageSpecificConfiguration.create(settings, languageConfigIndex));
}
return builder.build();
}
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.measures.CoreMetrics;
+import org.sonar.api.utils.MessageException;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.api.CoreProperties.DEVELOPMENT_COST;
+import static org.sonar.api.CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS;
+import static org.sonar.api.CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY;
+import static org.sonar.api.CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY;
public class RatingSettingsTest {
@Test
public void load_work_units_for_language() {
- settings.setProperty(CoreProperties.DEVELOPMENT_COST, "50");
+ settings.setProperty(DEVELOPMENT_COST, "50");
RatingSettings configurationLoader = new RatingSettings(settings);
assertThat(configurationLoader.getDevCost("defaultLanguage")).isEqualTo(50L);
String aLanguage = "aLanguage";
String anotherLanguage = "anotherLanguage";
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS, "0,1");
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY, aLanguage);
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY, "30");
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_SIZE_METRIC_KEY, CoreMetrics.NCLOC_KEY);
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS + "." + "1" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY, anotherLanguage);
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS + "." + "1" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY, "40");
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS + "." + "1" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_SIZE_METRIC_KEY, CoreMetrics.COMPLEXITY_KEY);
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS, "0,1");
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY, aLanguage);
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY, "30");
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_SIZE_METRIC_KEY, CoreMetrics.NCLOC_KEY);
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "1" + "." + LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY, anotherLanguage);
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "1" + "." + LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY, "40");
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "1" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_SIZE_METRIC_KEY, CoreMetrics.COMPLEXITY_KEY);
RatingSettings configurationLoader = new RatingSettings(settings);
@Test
public void fail_on_invalid_rating_grid_configuration() {
+ RatingSettings configurationLoader = new RatingSettings(settings);
throwable.expect(IllegalArgumentException.class);
settings.setProperty(CoreProperties.RATING_GRID, "a b c");
- RatingSettings configurationLoader = new RatingSettings(settings);
configurationLoader.getRatingGrid();
}
public void use_generic_value_when_specific_setting_is_missing() {
String aLanguage = "aLanguage";
- settings.setProperty(CoreProperties.DEVELOPMENT_COST, "30");
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS, "0");
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY, aLanguage);
- settings.setProperty(CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + CoreProperties.LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY, "40");
+ settings.setProperty(DEVELOPMENT_COST, "30");
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS, "0");
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + LANGUAGE_SPECIFIC_PARAMETERS_LANGUAGE_KEY, aLanguage);
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY, "40");
RatingSettings configurationLoader = new RatingSettings(settings);
assertThat(configurationLoader.getDevCost(aLanguage)).isEqualTo(40L);
}
+
+ @Test
+ public void constructor_fails_with_ME_if_language_specific_parameter_language_is_missing() {
+ settings.setProperty(DEVELOPMENT_COST, "30");
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS, "0");
+ settings.setProperty(LANGUAGE_SPECIFIC_PARAMETERS + "." + "0" + "." + LANGUAGE_SPECIFIC_PARAMETERS_MAN_DAYS_KEY, "40");
+
+ throwable.expect(MessageException.class);
+ throwable.expectMessage("Technical debt configuration is corrupted. At least one language specific parameter has no Language key. " +
+ "Contact your administrator to update this configuration in the global administration section of SonarQube.");
+
+ new RatingSettings(settings);
+ }
}