From 4a942f5982a0657c294ba4e221a5b6382dc4e3f3 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 7 Mar 2014 15:59:38 +0100 Subject: [PATCH] SONAR-5120 When a rule is linked on a root characteristic, server startup should stop --- .../debt/TechnicalDebtModelSynchronizer.java | 17 +++++++++++------ .../sonar/server/rule/RuleRegistration.java | 6 +++--- .../server/rule/RuleRegistrationTest.java | 12 +++++++++--- ...s_linked_on_root_characteristic-result.xml | 19 ------------------- 4 files changed, 23 insertions(+), 31 deletions(-) delete mode 100644 sonar-server/src/test/resources/org/sonar/server/rule/RuleRegistrationTest/ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic-result.xml diff --git a/sonar-core/src/main/java/org/sonar/core/debt/TechnicalDebtModelSynchronizer.java b/sonar-core/src/main/java/org/sonar/core/debt/TechnicalDebtModelSynchronizer.java index a58032fc366..f5703a43f71 100644 --- a/sonar-core/src/main/java/org/sonar/core/debt/TechnicalDebtModelSynchronizer.java +++ b/sonar-core/src/main/java/org/sonar/core/debt/TechnicalDebtModelSynchronizer.java @@ -35,6 +35,8 @@ import org.sonar.core.debt.db.CharacteristicDao; import org.sonar.core.debt.db.CharacteristicDto; import org.sonar.core.persistence.MyBatis; +import javax.annotation.CheckForNull; + import java.io.Reader; import java.util.Collection; import java.util.List; @@ -124,12 +126,14 @@ public class TechnicalDebtModelSynchronizer implements ServerExtension { Rule rule = rulesCache.getByRuleKey(pluginRequirement.ruleKey()); if (!isRequirementExists(existingModel, rule)) { CharacteristicDto characteristicDto = findCharacteristic(existingModel, pluginRequirement.characteristic().key()); - Integer rootId = characteristicDto.getRootId(); - if (rootId == null) { - throw new IllegalArgumentException("Requirement on rule '" + pluginRequirement.ruleKey() + "' should not be linked on a root characteristic."); + if (characteristicDto != null) { + Integer rootId = characteristicDto.getRootId(); + if (rootId == null) { + throw new IllegalArgumentException("Requirement on rule '" + pluginRequirement.ruleKey() + "' should not be linked on a root characteristic."); + } + CharacteristicDto requirementDto = CharacteristicDto.toDto(pluginRequirement, characteristicDto.getId(), rootId, rule.getId()); + dao.insert(requirementDto, session); } - CharacteristicDto requirementDto = CharacteristicDto.toDto(pluginRequirement, characteristicDto.getId(), rootId, rule.getId()); - dao.insert(requirementDto, session); } } } @@ -169,6 +173,7 @@ public class TechnicalDebtModelSynchronizer implements ServerExtension { return pluginList; } + @CheckForNull private CharacteristicDto findCharacteristic(List existingModel, final String key) { return Iterables.find(existingModel, new Predicate() { @Override @@ -176,7 +181,7 @@ public class TechnicalDebtModelSynchronizer implements ServerExtension { String characteristicKey = input.getKey(); return input.getRuleId() == null && characteristicKey != null && characteristicKey.equals(key); } - }); + }, null); } private boolean isRequirementExists(List existingModel, final Rule rule) { diff --git a/sonar-server/src/main/java/org/sonar/server/rule/RuleRegistration.java b/sonar-server/src/main/java/org/sonar/server/rule/RuleRegistration.java index 11831d56338..4a60de81464 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule/RuleRegistration.java +++ b/sonar-server/src/main/java/org/sonar/server/rule/RuleRegistration.java @@ -32,6 +32,7 @@ import org.sonar.api.rule.RemediationFunction; import org.sonar.api.rule.RuleKey; import org.sonar.api.rules.Rule; import org.sonar.api.server.rule.RuleDefinitions; +import org.sonar.api.utils.MessageException; import org.sonar.api.utils.System2; import org.sonar.api.utils.TimeProfiler; import org.sonar.check.Cardinality; @@ -555,9 +556,8 @@ public class RuleRegistration implements Startable { LOG.warn(String.format("Characteristic '%s' has not been found, Technical debt definitions on rule '%s:%s' will be ignored", key, ruleDef.repository().name(), ruleDef.key())); } else if (characteristicDto.getParentId() == null) { - LOG.error(String.format("Rule '%s:%s' should not be linked on the root characteristic '%s'. Technical debt definitions on this rule wll be ignored", key, - ruleDef.repository().name(), ruleDef.key())); - return null; + throw MessageException.of(String.format("Rule '%s:%s' cannot be linked on the root characteristic '%s'", + ruleDef.repository().name(), ruleDef.key(), key)); } return characteristicDto; } diff --git a/sonar-server/src/test/java/org/sonar/server/rule/RuleRegistrationTest.java b/sonar-server/src/test/java/org/sonar/server/rule/RuleRegistrationTest.java index 386cfd35aa1..ead303577bd 100644 --- a/sonar-server/src/test/java/org/sonar/server/rule/RuleRegistrationTest.java +++ b/sonar-server/src/test/java/org/sonar/server/rule/RuleRegistrationTest.java @@ -26,6 +26,7 @@ import org.sonar.api.rule.RemediationFunction; import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; import org.sonar.api.server.rule.RuleDefinitions; +import org.sonar.api.utils.MessageException; import org.sonar.core.debt.db.CharacteristicDao; import org.sonar.core.persistence.AbstractDaoTestCase; import org.sonar.core.persistence.MyBatis; @@ -36,6 +37,7 @@ import org.sonar.server.qualityprofile.ProfilesManager; import org.sonar.server.startup.RegisterDebtCharacteristicModel; import static org.fest.assertions.Assertions.assertThat; +import static org.fest.assertions.Fail.fail; import static org.mockito.Mockito.*; public class RuleRegistrationTest extends AbstractDaoTestCase { @@ -174,11 +176,15 @@ public class RuleRegistrationTest extends AbstractDaoTestCase { } @Test - public void ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic() { + public void fail_when_rule_is_linked_on_root_characteristic() { setupData("ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic"); - task.start(); - checkTables("ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic", EXCLUDED_COLUMN_NAMES, "rules"); + try { + task.start(); + fail(); + } catch (Exception e) { + assertThat(e).isInstanceOf(MessageException.class).hasMessage("Rule 'fake:rule1' cannot be linked on the root characteristic 'MEMORY_EFFICIENCY'"); + } } @Test diff --git a/sonar-server/src/test/resources/org/sonar/server/rule/RuleRegistrationTest/ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic-result.xml b/sonar-server/src/test/resources/org/sonar/server/rule/RuleRegistrationTest/ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic-result.xml deleted file mode 100644 index a773983725f..00000000000 --- a/sonar-server/src/test/resources/org/sonar/server/rule/RuleRegistrationTest/ignore_rule_debt_definitions_if_rule_is_linked_on_root_characteristic-result.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - -- 2.39.5