Browse Source

SONAR-9132 do not register template rules, if organizations are enabled

tags/6.4-RC1
Daniel Schwarz 7 years ago
parent
commit
280ce7ec0a

+ 9
- 1
server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java View File

@@ -52,6 +52,7 @@ import org.sonar.db.rule.RuleDefinitionDto;
import org.sonar.db.rule.RuleDto.Format;
import org.sonar.db.rule.RuleParamDto;
import org.sonar.db.rule.RuleRepositoryDto;
import org.sonar.server.organization.OrganizationFlags;
import org.sonar.server.qualityprofile.ActiveRuleChange;
import org.sonar.server.qualityprofile.RuleActivator;
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
@@ -74,9 +75,10 @@ public class RegisterRules implements Startable {
private final ActiveRuleIndexer activeRuleIndexer;
private final Languages languages;
private final System2 system2;
private final OrganizationFlags organizationFlags;

public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator, DbClient dbClient, RuleIndexer ruleIndexer,
ActiveRuleIndexer activeRuleIndexer, Languages languages, System2 system2) {
ActiveRuleIndexer activeRuleIndexer, Languages languages, System2 system2, OrganizationFlags organizationFlags) {
this.defLoader = defLoader;
this.ruleActivator = ruleActivator;
this.dbClient = dbClient;
@@ -84,6 +86,7 @@ public class RegisterRules implements Startable {
this.activeRuleIndexer = activeRuleIndexer;
this.languages = languages;
this.system2 = system2;
this.organizationFlags = organizationFlags;
}

@Override
@@ -94,9 +97,14 @@ public class RegisterRules implements Startable {
List<RuleKey> keysToIndex = new ArrayList<>();

RulesDefinition.Context context = defLoader.load();
boolean orgsEnabled = organizationFlags.isEnabled(session);
for (RulesDefinition.ExtendedRepository repoDef : getRepositories(context)) {
if (languages.get(repoDef.language()) != null) {
for (RulesDefinition.Rule ruleDef : repoDef.rules()) {
if (ruleDef.template() && orgsEnabled) {
LOG.info("Template rule {} will not be imported, because organizations are enabled.", RuleKey.of(ruleDef.repository().key(), ruleDef.key()));
continue;
}
boolean relevantForIndex = registerRule(ruleDef, allRules, session);
if (relevantForIndex) {
keysToIndex.add(RuleKey.of(ruleDef.repository().key(), ruleDef.key()));

+ 38
- 1
server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java View File

@@ -33,6 +33,8 @@ import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -43,6 +45,8 @@ import org.sonar.db.rule.RuleParamDto;
import org.sonar.db.rule.RuleRepositoryDto;
import org.sonar.server.es.EsTester;
import org.sonar.server.es.SearchOptions;
import org.sonar.server.organization.OrganizationFlags;
import org.sonar.server.organization.TestOrganizationFlags;
import org.sonar.server.qualityprofile.RuleActivator;
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
import org.sonar.server.rule.index.RuleIndex;
@@ -75,6 +79,8 @@ public class RegisterRulesTest {
public DbTester dbTester = DbTester.create(system);
@org.junit.Rule
public EsTester esTester = new EsTester(new RuleIndexDefinition(new MapSettings()));
@org.junit.Rule
public LogTester logTester = new LogTester();

private RuleActivator ruleActivator = mock(RuleActivator.class);
private DbClient dbClient = dbTester.getDbClient();
@@ -82,6 +88,7 @@ public class RegisterRulesTest {
private ActiveRuleIndexer activeRuleIndexer;
private RuleIndex ruleIndex;
private OrganizationDto defaultOrganization;
private OrganizationFlags organizationFlags = TestOrganizationFlags.standalone();

@Before
public void before() {
@@ -456,12 +463,29 @@ public class RegisterRulesTest {
assertThat(result.getSystemTags()).isEmpty();
}

@Test
public void ignore_template_rules_if_organizations_are_enabled() {
organizationFlags.enable(dbTester.getSession());
execute(new RepositoryWithOneTemplateRule());

List<RuleDefinitionDto> rules = dbClient.ruleDao().selectAllDefinitions(dbTester.getSession());
assertThat(rules).hasSize(0);
}

@Test
public void log_ignored_template_rules_if_organizations_are_enabled() {
organizationFlags.enable(dbTester.getSession());
execute(new RepositoryWithOneTemplateRule());

assertThat(logTester.logs(LoggerLevel.INFO)).contains("Template rule test:rule1 will not be imported, because organizations are enabled.");
}

private void execute(RulesDefinition... defs) {
RuleDefinitionsLoader loader = new RuleDefinitionsLoader(mock(DeprecatedRulesDefinitionLoader.class), mock(CommonRuleDefinitionsImpl.class), defs);
Languages languages = mock(Languages.class);
when(languages.get("java")).thenReturn(mock(Language.class));

RegisterRules task = new RegisterRules(loader, ruleActivator, dbClient, ruleIndexer, activeRuleIndexer, languages, system);
RegisterRules task = new RegisterRules(loader, ruleActivator, dbClient, ruleIndexer, activeRuleIndexer, languages, system, organizationFlags);
task.start();
// Execute a commit to refresh session state as the task is using its own session
dbTester.getSession().commit();
@@ -563,6 +587,7 @@ public class RegisterRulesTest {
}

static class FbContribRepository implements RulesDefinition {

@Override
public void define(Context context) {
NewExtendedRepository repo = context.extendRepository("findbugs", "java");
@@ -572,4 +597,16 @@ public class RegisterRulesTest {
repo.done();
}
}

static class RepositoryWithOneTemplateRule implements RulesDefinition {
@Override
public void define(Context context) {
RulesDefinition.NewRepository repo = context.createRepository("test", "java");
repo.createRule("rule1")
.setName("Rule One")
.setHtmlDescription("Description of Rule One")
.setTemplate(true);
repo.done();
}
}
}

Loading…
Cancel
Save