package org.sonar.core.technicaldebt;
+import com.google.common.collect.Maps;
import org.sonar.api.BatchComponent;
import org.sonar.api.ServerComponent;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.rules.RuleQuery;
import org.sonar.api.technicaldebt.Characteristic;
-import org.sonar.core.rule.DefaultRuleFinder;
import org.sonar.core.technicaldebt.db.CharacteristicDao;
import org.sonar.core.technicaldebt.db.CharacteristicDto;
import java.util.List;
import java.util.Map;
-import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Maps.newHashMap;
public class TechnicalDebtFinder implements ServerComponent, BatchComponent {
private final CharacteristicDao dao;
- private final DefaultRuleFinder ruleFinder;
+ private final RuleFinder ruleFinder;
- public TechnicalDebtFinder(CharacteristicDao dao, DefaultRuleFinder ruleFinder) {
+ public TechnicalDebtFinder(CharacteristicDao dao, RuleFinder ruleFinder) {
this.dao = dao;
this.ruleFinder = ruleFinder;
}
TechnicalDebtModel model = new TechnicalDebtModel();
List<CharacteristicDto> dtos = dao.selectEnabledCharacteristics();
Map<Integer, Characteristic> characteristicsById = newHashMap();
- List<Integer> ruleIds = newArrayList();
- // Root characteristics
+ addRootCharacteristics(model, dtos, characteristicsById);
+ addCharacteristics(model, dtos, characteristicsById);
+ addRequirements(model, dtos, characteristicsById);
+ return model;
+ }
+
+ public TechnicalDebtModel findRootCharacteristics() {
+ TechnicalDebtModel model = new TechnicalDebtModel();
+ List<CharacteristicDto> dtos = dao.selectEnabledRootCharacteristics();
+ addRootCharacteristics(model, dtos, Maps.<Integer, Characteristic>newHashMap());
+ return model;
+ }
+
+ private void addRootCharacteristics(TechnicalDebtModel model, List<CharacteristicDto> dtos, Map<Integer, Characteristic> characteristicsById){
for (CharacteristicDto dto : dtos) {
if (dto.getParentId() == null) {
Characteristic rootCharacteristic = dto.toCharacteristic(null);
characteristicsById.put(dto.getId(), rootCharacteristic);
}
}
+ }
- // Characteristics
+ private void addCharacteristics(TechnicalDebtModel model, List<CharacteristicDto> dtos, Map<Integer, Characteristic> characteristicsById){
for (CharacteristicDto dto : dtos) {
if (dto.getParentId() != null && dto.getRuleId() == null) {
Characteristic parent = characteristicsById.get(dto.getParentId());
characteristicsById.put(dto.getId(), characteristic);
}
}
+ }
- for (CharacteristicDto dto : dtos) {
- if (dto.getRuleId() != null) {
- ruleIds.add(dto.getRuleId());
- }
- }
-
- Map<Integer, Rule> rulesById = findRules(ruleIds);
- // Requirements
+ private void addRequirements(TechnicalDebtModel model, List<CharacteristicDto> dtos, Map<Integer, Characteristic> characteristicsById){
+ Map<Integer, Rule> rulesById = rulesById(ruleFinder.findAll(RuleQuery.create()));
for (CharacteristicDto dto : dtos) {
Integer ruleId = dto.getRuleId();
if (ruleId != null) {
dto.toRequirement(ruleKey, characteristic);
}
}
-
- return model;
- }
-
- public TechnicalDebtModel findRootCharacteristics() {
- TechnicalDebtModel model = new TechnicalDebtModel();
- List<CharacteristicDto> dtos = dao.selectEnabledRootCharacteristics();
- // Root characteristics
- for (CharacteristicDto dto : dtos) {
- if (dto.getParentId() == null) {
- Characteristic rootCharacteristic = dto.toCharacteristic(null);
- model.addRootCharacteristic(rootCharacteristic);
- }
- }
- return model;
}
- private Map<Integer, Rule> findRules(List<Integer> ruleIds) {
- Collection<Rule> rules = ruleFinder.findByIds(ruleIds);
+ private Map<Integer, Rule> rulesById(Collection<Rule> rules) {
Map<Integer, Rule> rulesById = newHashMap();
for (Rule rule : rules) {
rulesById.put(rule.getId(), rule);
public TechnicalDebtModel initAndMergePlugins(ValidationMessages messages, TechnicalDebtRuleCache rulesCache, SqlSession session) {
TechnicalDebtModel defaultModel = loadModelFromXml(TechnicalDebtModelRepository.DEFAULT_MODEL, messages, rulesCache);
TechnicalDebtModel model = loadOrCreateModelFromDb(defaultModel, messages, session);
- disableRequirementsOnRemovedRules(model, rulesCache, session);
+ disableRequirementsOnRemovedRules(model, session);
mergePlugins(model, defaultModel, messages, rulesCache, session);
messages.log(LOG);
}
}
- private void disableRequirementsOnRemovedRules(TechnicalDebtModel model, TechnicalDebtRuleCache rulesCache, SqlSession session) {
+ private void disableRequirementsOnRemovedRules(TechnicalDebtModel model, SqlSession session) {
for (Requirement requirement : model.requirements()) {
- if (!rulesCache.exists(requirement.ruleKey())) {
+ if (requirement.ruleKey() == null) {
requirement.characteristic().removeRequirement(requirement);
service.disable(requirement, session);
}
import org.mockito.runners.MockitoJUnitRunner;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.rules.RuleQuery;
import org.sonar.api.technicaldebt.Characteristic;
import org.sonar.api.technicaldebt.Requirement;
import org.sonar.api.technicaldebt.WorkUnit;
-import org.sonar.core.rule.DefaultRuleFinder;
import org.sonar.core.technicaldebt.db.CharacteristicDao;
import org.sonar.core.technicaldebt.db.CharacteristicDto;
import static com.google.common.collect.Lists.newArrayList;
import static org.fest.assertions.Assertions.assertThat;
+import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
CharacteristicDao dao;
@Mock
- DefaultRuleFinder ruleFinder;
+ RuleFinder ruleFinder;
TechnicalDebtFinder finder;
RuleKey ruleKey = RuleKey.of("checkstyle", "Regexp");
Rule rule = Rule.create(ruleKey.repository(), ruleKey.rule());
rule.setId(100);
- when(ruleFinder.findByIds(newArrayList(100))).thenReturn(newArrayList(rule));
+ when(ruleFinder.findAll(any(RuleQuery.class))).thenReturn(newArrayList(rule));
when(dao.selectEnabledCharacteristics()).thenReturn(newArrayList(rootCharacteristicDto, characteristicDto, requirementDto));
TechnicalDebtModel result = finder.findAll();