@@ -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); |
@@ -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); | |||
@@ -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") |
@@ -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(); | |||
} | |||
} | |||
} | |||
} |
@@ -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(); | |||
} | |||
@@ -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; | |||
} | |||
} | |||
} |