Преглед на файлове

SONAR-5485 SonarQube should ignore creation of a repository and its rules if the language is not installed

tags/4.5-RC1
Julien Lancelot преди 9 години
родител
ревизия
3eb33cf633

+ 27
- 22
server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java Целия файл

@@ -30,6 +30,7 @@ import org.apache.commons.lang.StringUtils;
import org.picocontainer.Startable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.server.debt.DebtRemediationFunction;
@@ -66,21 +67,23 @@ public class RegisterRules implements Startable {
private final RuleDefinitionsLoader defLoader;
private final RuleActivator ruleActivator;
private final DbClient dbClient;
private final Languages languages;
private final CharacteristicDao characteristicDao;

/**
* @param registerDebtModel used only to be started after init of the technical debt model
*/
public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, RegisterDebtModel registerDebtModel) {
this(defLoader, ruleActivator, dbClient, System2.INSTANCE);
public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, Languages languages, RegisterDebtModel registerDebtModel) {
this(defLoader, ruleActivator, dbClient, languages, System2.INSTANCE);
}

@VisibleForTesting
RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator,
DbClient dbClient, System2 system) {
DbClient dbClient, Languages languages, System2 system) {
this.defLoader = defLoader;
this.ruleActivator = ruleActivator;
this.dbClient = dbClient;
this.languages = languages;
this.characteristicDao = dbClient.debtCharacteristicDao();
}

@@ -94,32 +97,34 @@ public class RegisterRules implements Startable {

RulesDefinition.Context context = defLoader.load();
for (RulesDefinition.ExtendedRepository repoDef : getRepositories(context)) {
for (RulesDefinition.Rule ruleDef : repoDef.rules()) {
RuleKey ruleKey = RuleKey.of(ruleDef.repository().key(), ruleDef.key());
if (languages.get(repoDef.language()) != null) {
for (RulesDefinition.Rule ruleDef : repoDef.rules()) {
RuleKey ruleKey = RuleKey.of(ruleDef.repository().key(), ruleDef.key());

RuleDto rule = allRules.containsKey(ruleKey) ? allRules.remove(ruleKey) : createRuleDto(ruleDef, session);
RuleDto rule = allRules.containsKey(ruleKey) ? allRules.remove(ruleKey) : createRuleDto(ruleDef, session);

boolean executeUpdate = false;
if (mergeRule(ruleDef, rule)) {
executeUpdate = true;
}
boolean executeUpdate = false;
if (mergeRule(ruleDef, rule)) {
executeUpdate = true;
}

CharacteristicDto subCharacteristic = characteristic(ruleDef, rule.getSubCharacteristicId(), allCharacteristics);
if (mergeDebtDefinitions(ruleDef, rule, subCharacteristic)) {
executeUpdate = true;
}
CharacteristicDto subCharacteristic = characteristic(ruleDef, rule.getSubCharacteristicId(), allCharacteristics);
if (mergeDebtDefinitions(ruleDef, rule, subCharacteristic)) {
executeUpdate = true;
}

if (mergeTags(ruleDef, rule)) {
executeUpdate = true;
}
if (mergeTags(ruleDef, rule)) {
executeUpdate = true;
}

if (executeUpdate) {
dbClient.ruleDao().update(session, rule);
}
if (executeUpdate) {
dbClient.ruleDao().update(session, rule);
}

mergeParams(ruleDef, rule, session);
mergeParams(ruleDef, rule, session);
}
session.commit();
}
session.commit();
}
List<RuleDto> activeRules = processRemainingDbRules(allRules.values(), session);
removeActiveRulesOnStillExistingRepositories(session, activeRules, context);

+ 3
- 3
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileExportersTest.java Целия файл

@@ -25,8 +25,8 @@ import org.sonar.api.profiles.ProfileDefinition;
import org.sonar.api.profiles.ProfileExporter;
import org.sonar.api.profiles.RulesProfile;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.*;
import org.sonar.api.rules.ActiveRule;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RulePriority;
import org.sonar.api.server.rule.RuleParamType;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.utils.ValidationMessages;
@@ -43,7 +43,7 @@ import static org.fest.assertions.Fail.fail;
public class QProfileExportersTest {

@ClassRule
public static ServerTester tester = new ServerTester().addComponents(
public static ServerTester tester = new ServerTester().addXoo().addComponents(
XooRulesDefinition.class, XooProfileDefinition.class,
XooExporter.class, StandardExporter.class);


+ 11
- 15
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/RegisterQualityProfilesMediumTest.java Целия файл

@@ -35,11 +35,7 @@ import org.sonar.api.utils.ValidationMessages;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.properties.PropertiesDao;
import org.sonar.core.properties.PropertyDto;
import org.sonar.core.qualityprofile.db.ActiveRuleDto;
import org.sonar.core.qualityprofile.db.ActiveRuleKey;
import org.sonar.core.qualityprofile.db.ActiveRuleParamDto;
import org.sonar.core.qualityprofile.db.QualityProfileDao;
import org.sonar.core.qualityprofile.db.QualityProfileDto;
import org.sonar.core.qualityprofile.db.*;
import org.sonar.core.template.LoadedTemplateDto;
import org.sonar.server.db.DbClient;
import org.sonar.server.platform.Platform;
@@ -69,7 +65,7 @@ public class RegisterQualityProfilesMediumTest {

@Test
public void register_existing_profile_definitions() throws Exception {
tester = new ServerTester().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester = new ServerTester().addXoo().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester.start();
dbSession = dbClient().openSession(false);

@@ -112,7 +108,7 @@ public class RegisterQualityProfilesMediumTest {

@Test
public void register_profile_definitions() throws Exception {
tester = new ServerTester().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester = new ServerTester().addXoo().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester.start();
dbSession = dbClient().openSession(false);

@@ -147,7 +143,7 @@ public class RegisterQualityProfilesMediumTest {

@Test
public void fail_if_two_definitions_are_marked_as_default_on_the_same_language() throws Exception {
tester = new ServerTester().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", true));
tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", true));

try {
tester.start();
@@ -158,7 +154,7 @@ public class RegisterQualityProfilesMediumTest {

@Test
public void mark_profile_as_default() throws Exception {
tester = new ServerTester().addComponents(new SimpleProfileDefinition("one", false), new SimpleProfileDefinition("two", true));
tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", false), new SimpleProfileDefinition("two", true));

tester.start();
verifyProperty("sonar.profile.xoo", "two");
@@ -166,7 +162,7 @@ public class RegisterQualityProfilesMediumTest {

@Test
public void use_sonar_way_as_default_profile_if_none_are_marked_as_default() throws Exception {
tester = new ServerTester().addComponents(new SimpleProfileDefinition("Sonar way", false), new SimpleProfileDefinition("Other way", false));
tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("Sonar way", false), new SimpleProfileDefinition("Other way", false));

tester.start();
verifyProperty("sonar.profile.xoo", "Sonar way");
@@ -174,7 +170,7 @@ public class RegisterQualityProfilesMediumTest {

@Test
public void fix_default_profile_if_invalid() throws Exception {
tester = new ServerTester().addComponents(new SimpleProfileDefinition("one", true));
tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", true));
tester.start();

PropertiesDao propertiesDao = dbClient().propertiesDao();
@@ -189,7 +185,7 @@ public class RegisterQualityProfilesMediumTest {

@Test
public void do_not_reset_default_profile_if_still_valid() throws Exception {
tester = new ServerTester().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", false));
tester = new ServerTester().addXoo().addComponents(new SimpleProfileDefinition("one", true), new SimpleProfileDefinition("two", false));
tester.start();

PropertiesDao propertiesDao = dbClient().propertiesDao();
@@ -206,7 +202,7 @@ public class RegisterQualityProfilesMediumTest {
*/
@Test
public void clean_up_profiles_if_missing_loaded_template() throws Exception {
tester = new ServerTester().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester = new ServerTester().addXoo().addComponents(XooRulesDefinition.class, XooProfileDefinition.class);
tester.start();

dbSession = dbClient().openSession(false);
@@ -234,7 +230,7 @@ public class RegisterQualityProfilesMediumTest {
public static class XooProfileDefinition extends ProfileDefinition {
@Override
public RulesProfile createProfile(ValidationMessages validation) {
final RulesProfile profile = RulesProfile.create("Basic", "xoo");
final RulesProfile profile = RulesProfile.create("Basic", ServerTester.Xoo.KEY);
ActiveRule activeRule1 = profile.activateRule(
org.sonar.api.rules.Rule.create("xoo", "x1").setParams(newArrayList(new RuleParam().setKey("acceptWhitespace"))),
RulePriority.CRITICAL);
@@ -248,7 +244,7 @@ public class RegisterQualityProfilesMediumTest {
public static class XooRulesDefinition implements RulesDefinition {
@Override
public void define(Context context) {
NewRepository repository = context.createRepository("xoo", "xoo").setName("Xoo Repo");
NewRepository repository = context.createRepository("xoo", ServerTester.Xoo.KEY).setName("Xoo Repo");
NewRule x1 = repository.createRule("x1")
.setName("x1 name")
.setHtmlDescription("x1 desc")

+ 4
- 3
server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java Целия файл

@@ -68,7 +68,7 @@ public class RegisterRulesMediumTest {
static final XooRulesDefinition RULE_DEFS = new XooRulesDefinition();

@ClassRule
public static final ServerTester TESTER = new ServerTester().addComponents(RULE_DEFS);
public static final ServerTester TESTER = new ServerTester().addXoo().addComponents(RULE_DEFS);

RuleIndex ruleIndex;
ActiveRuleIndex activeRuleIndex;
@@ -143,6 +143,7 @@ public class RegisterRulesMediumTest {
assertThat(rule.name()).isEqualTo("x1 name");
assertThat(rule.htmlDescription()).isEqualTo("x1 desc");
assertThat(rule.systemTags()).contains("tag1");
assertThat(rule.language()).contains("xoo");
assertThat(rule.params()).hasSize(2);
assertThat(rule.param("acceptWhitespace").type()).isEqualTo(RuleParamType.BOOLEAN);
assertThat(rule.param("acceptWhitespace").defaultValue()).isEqualTo("false");
@@ -658,11 +659,11 @@ public class RegisterRulesMediumTest {
@Override
public void define(Context context) {
if (rules != null) {
NewRepository repository = context.createRepository("xoo", "xoo").setName("Xoo Repo");
NewRepository repository = context.createRepository("xoo", ServerTester.Xoo.KEY).setName("Xoo Repo");
rules.init(repository);
repository.done();
}
}

}

}

+ 6
- 1
server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java Целия файл

@@ -23,6 +23,8 @@ import com.google.common.collect.Sets;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.resources.Language;
import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
@@ -199,7 +201,10 @@ public class RegisterRulesTest extends AbstractDaoTestCase {

private void execute(RulesDefinition... defs) {
RuleDefinitionsLoader loader = new RuleDefinitionsLoader(mock(RuleRepositories.class), defs);
RegisterRules task = new RegisterRules(loader, ruleActivator, dbClient, system);
Languages languages = mock(Languages.class);
when(languages.get("java")).thenReturn(mock(Language.class));

RegisterRules task = new RegisterRules(loader, ruleActivator, dbClient, languages, system);
task.start();
}


+ 33
- 0
server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java Целия файл

@@ -25,6 +25,7 @@ import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.rules.ExternalResource;
import org.sonar.api.database.DatabaseProperties;
import org.sonar.api.resources.Language;
import org.sonar.process.MonitoredProcess;
import org.sonar.process.NetworkUtils;
import org.sonar.process.Props;
@@ -34,6 +35,7 @@ import org.sonar.server.search.IndexProperties;
import org.sonar.server.ws.WsTester;

import javax.annotation.Nullable;

import java.io.File;
import java.util.Arrays;
import java.util.List;
@@ -162,6 +164,11 @@ public class ServerTester extends ExternalResource {
return this;
}

public ServerTester addXoo() {
addComponents(Xoo.class);
return this;
}

public ServerTester addPluginJar(File jar) {
Preconditions.checkArgument(jar.exists() && jar.isFile(), "Plugin JAR file does not exist: " + jar.getAbsolutePath());
try {
@@ -220,4 +227,30 @@ public class ServerTester extends ExternalResource {
}
}

public static class Xoo implements Language {

public static final String KEY = "xoo";
public static final String NAME = "Xoo";
public static final String FILE_SUFFIX = ".xoo";

private static final String[] XOO_SUFFIXES = {
FILE_SUFFIX
};

@Override
public String getKey() {
return KEY;
}

@Override
public String getName() {
return NAME;
}

@Override
public String[] getFileSuffixes() {
return XOO_SUFFIXES;
}
}

}

Loading…
Отказ
Запис