import org.sonar.db.rule.RuleDto.Scope;
import org.sonar.db.rule.RuleParamDto;
import org.sonar.db.rule.RuleRepositoryDto;
+import org.sonar.server.es.metadata.MetadataIndex;
import org.sonar.server.organization.OrganizationFlags;
import org.sonar.server.qualityprofile.ActiveRuleChange;
import org.sonar.server.qualityprofile.QProfileRules;
private final OrganizationFlags organizationFlags;
private final WebServerRuleFinder webServerRuleFinder;
private final UuidFactory uuidFactory;
+ private final MetadataIndex metadataIndex;
public RegisterRules(RuleDefinitionsLoader defLoader, QProfileRules qProfileRules, DbClient dbClient, RuleIndexer ruleIndexer,
ActiveRuleIndexer activeRuleIndexer, Languages languages, System2 system2, OrganizationFlags organizationFlags,
- WebServerRuleFinder webServerRuleFinder, UuidFactory uuidFactory) {
+ WebServerRuleFinder webServerRuleFinder, UuidFactory uuidFactory, MetadataIndex metadataIndex) {
this.defLoader = defLoader;
this.qProfileRules = qProfileRules;
this.dbClient = dbClient;
this.organizationFlags = organizationFlags;
this.webServerRuleFinder = webServerRuleFinder;
this.uuidFactory = uuidFactory;
+ this.metadataIndex = metadataIndex;
}
@Override
registerRulesContext.getRenamed().forEach(e -> LOG.info("Rule {} re-keyed to {}", e.getValue(), e.getKey().getKey()));
profiler.stopDebug();
+ if (!registerRulesContext.hasDbRules()) {
+ Stream.concat(ruleIndexer.getIndexTypes().stream(), activeRuleIndexer.getIndexTypes().stream())
+ .forEach(t -> metadataIndex.setInitialized(t, true));
+ }
+
webServerRuleFinder.startCaching();
}
}
RuleDefinitionDto rule = dbRulesByRuleId.get(ruleId);
if (rule == null) {
LOG.warn("Could not retrieve rule with id %s referenced by a deprecated rule key. " +
- "The following deprecated rule keys seem to be referencing a non-existing rule",
+ "The following deprecated rule keys seem to be referencing a non-existing rule",
ruleId, entry.getValue());
} else {
entry.getValue().forEach(d -> builder.put(d.getOldRuleKeyAsRuleKey(), rule));
return builder.build();
}
+ private boolean hasDbRules() {
+ return !dbRules.isEmpty();
+ }
+
private Optional<RuleDefinitionDto> getDbRuleFor(RulesDefinition.Rule ruleDef) {
RuleKey ruleKey = RuleKey.of(ruleDef.repository().key(), ruleDef.key());
Optional<RuleDefinitionDto> res = Stream.concat(Stream.of(ruleKey), ruleDef.deprecatedRuleKeys().stream())
changed = true;
} else if (dto.getSystemTags().size() != ruleDef.tags().size() ||
!dto.getSystemTags().containsAll(ruleDef.tags())) {
- dto.setSystemTags(ruleDef.tags());
- // FIXME this can't be implemented easily with organization support: remove end-user tags that are now declared as system
- // RuleTagHelper.applyTags(dto, ImmutableSet.copyOf(dto.getTags()));
- changed = true;
- }
+ dto.setSystemTags(ruleDef.tags());
+ // FIXME this can't be implemented easily with organization support: remove end-user tags that are now declared as system
+ // RuleTagHelper.applyTags(dto, ImmutableSet.copyOf(dto.getTags()));
+ changed = true;
+ }
return changed;
}
changed = true;
} else if (dto.getSecurityStandards().size() != ruleDef.securityStandards().size() ||
!dto.getSecurityStandards().containsAll(ruleDef.securityStandards())) {
- dto.setSecurityStandards(ruleDef.securityStandards());
- changed = true;
- }
+ dto.setSecurityStandards(ruleDef.securityStandards());
+ changed = true;
+ }
return changed;
}
import org.sonar.server.es.EsTester;
import org.sonar.server.es.SearchIdResult;
import org.sonar.server.es.SearchOptions;
+import org.sonar.server.es.metadata.MetadataIndex;
import org.sonar.server.organization.OrganizationFlags;
import org.sonar.server.organization.TestOrganizationFlags;
import org.sonar.server.plugins.ServerPluginRepository;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import static org.sonar.api.rule.RuleStatus.READY;
import static org.sonar.api.rule.RuleStatus.REMOVED;
private RuleIndexer ruleIndexer;
private ActiveRuleIndexer activeRuleIndexer;
private RuleIndex ruleIndex;
+ private MetadataIndex metadataIndex = mock(MetadataIndex.class);
private OrganizationDto defaultOrganization;
private OrganizationFlags organizationFlags = TestOrganizationFlags.standalone();
private UuidFactory uuidFactory = UuidFactoryFast.getInstance();
// verify index
RuleDto rule2 = dbClient.ruleDao().selectOrFailByKey(db.getSession(), db.getDefaultOrganization(), RULE_KEY2);
assertThat(ruleIndex.search(new RuleQuery(), new SearchOptions()).getIds()).containsOnly(rule1.getId(), rule2.getId(), hotspotRule.getId());
+ verifyIndicesMarkedAsInitialized();
// verify repositories
assertThat(dbClient.ruleRepositoryDao().selectAll(db.getSession())).extracting(RuleRepositoryDto::getKey).containsOnly("fake");
// verify index
assertThat(ruleIndex.search(new RuleQuery(), new SearchOptions()).getIds())
.containsExactly(rule.getId());
+ verifyIndicesMarkedAsInitialized();
// register no rule
execute(context -> context.createRepository("fake", "java").done());
// verify index
assertThat(ruleIndex.search(new RuleQuery(), new SearchOptions()).getIds())
.isEmpty();
+ verifyIndicesNotMarkedAsInitialized();
}
@Test
RuleDto rule2 = dbClient.ruleDao().selectOrFailByKey(db.getSession(), defaultOrganization, RULE_KEY2);
RuleDto hotspotRule = dbClient.ruleDao().selectOrFailByKey(db.getSession(), defaultOrganization, HOTSPOT_RULE_KEY);
assertThat(es.getIds(RuleIndexDefinition.TYPE_RULE)).containsOnly(valueOf(rule1.getId()), valueOf(rule2.getId()), valueOf(hotspotRule.getId()));
+ verifyIndicesMarkedAsInitialized();
// user adds tags and sets markdown note
rule1.setTags(newHashSet("usertag1", "usertag2"));
when(system.now()).thenReturn(DATE2.getTime());
execute(new FakeRepositoryV2());
+ verifyIndicesNotMarkedAsInitialized();
// rule1 has been updated
rule1 = dbClient.ruleDao().selectOrFailByKey(db.getSession(), defaultOrganization, RULE_KEY1);
assertThat(rule1.getName()).isEqualTo("One v2");
reset(webServerRuleFinder);
RegisterRules task = new RegisterRules(loader, qProfileRules, dbClient, ruleIndexer, activeRuleIndexer,
- languages, system, organizationFlags, webServerRuleFinder, uuidFactory);
+ languages, system, organizationFlags, webServerRuleFinder, uuidFactory, metadataIndex);
task.start();
// Execute a commit to refresh session state as the task is using its own session
db.getSession().commit();
repo.done();
}
+ private void verifyIndicesMarkedAsInitialized() {
+ verify(metadataIndex).setInitialized(RuleIndexDefinition.TYPE_RULE,true);
+ verify(metadataIndex).setInitialized(RuleIndexDefinition.TYPE_RULE_EXTENSION,true);
+ verify(metadataIndex).setInitialized(RuleIndexDefinition.TYPE_ACTIVE_RULE, true);
+ reset(metadataIndex);
+ }
+
+ private void verifyIndicesNotMarkedAsInitialized() {
+ verifyNoInteractions(metadataIndex);
+ }
+
private RuleParamDto getParam(List<RuleParamDto> params, String key) {
for (RuleParamDto param : params) {
if (param.getName().equals(key)) {