private Integer rootId;
private Integer ruleId;
private String functionKey;
- private Double factorValue;
- private String factorUnit;
+ private Double coefficientValue;
+ private String coefficientUnit;
private Double offsetValue;
private String offsetUnit;
private Date createdAt;
}
@CheckForNull
- public Double getFactorValue() {
- return factorValue;
+ public Double getCoefficientValue() {
+ return coefficientValue;
}
- public RequirementDto setFactorValue(@Nullable Double factor) {
- this.factorValue = factor;
+ public RequirementDto setCoefficientValue(@Nullable Double coefficientValue) {
+ this.coefficientValue = coefficientValue;
return this;
}
@CheckForNull
- public String getFactorUnit() {
- return factorUnit;
+ public String getCoefficientUnit() {
+ return coefficientUnit;
}
- public RequirementDto setFactorUnit(@Nullable String factorUnit) {
- this.factorUnit = factorUnit;
+ public RequirementDto setCoefficientUnit(@Nullable String coefficientUnit) {
+ this.coefficientUnit = coefficientUnit;
return this;
}
c.root_id as rootId,
c.rule_id as ruleId,
c.function_key as functionKey,
- c.factor_value as factorValue,
- c.factor_unit as factorUnit,
+ c.factor_value as coefficientValue,
+ c.factor_unit as coefficientUnit,
c.offset_value as offsetValue,
c.offset_unit as offsetUnit,
c.enabled as enabled,
import org.junit.Test;
import org.sonar.core.persistence.AbstractDaoTestCase;
+import java.util.List;
+
import static org.fest.assertions.Assertions.assertThat;
public class RequirementDaoTest extends AbstractDaoTestCase {
assertThat(dao.selectRequirements()).hasSize(2);
}
+ @Test
+ public void select_requirement() {
+ setupData("select_requirement");
+
+ List<RequirementDto> dtos = dao.selectRequirements();
+ assertThat(dtos).hasSize(1);
+
+ RequirementDto dto = dtos.get(0);
+ assertThat(dto.getId()).isEqualTo(3);
+ assertThat(dto.getParentId()).isEqualTo(2);
+ assertThat(dto.getRuleId()).isEqualTo(10);
+ assertThat(dto.getFunction()).isEqualTo("linear_offset");
+ assertThat(dto.getCoefficientValue()).isEqualTo(20d);
+ assertThat(dto.getCoefficientUnit()).isEqualTo("mn");
+ assertThat(dto.getOffsetValue()).isEqualTo(30d);
+ assertThat(dto.getOffsetUnit()).isEqualTo("h");
+ assertThat(dto.isEnabled()).isTrue();
+ assertThat(dto.getCreatedAt()).isNotNull();
+ assertThat(dto.getUpdatedAt()).isNull();
+ }
+
}
--- /dev/null
+<dataset>
+
+ <!-- Requirement -->
+ <characteristics id="3" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="10" characteristic_order="[null]"
+ function_key="linear_offset" factor_value="20.0" factor_unit="mn" offset_value="30.0" offset_unit="h" enabled="[true]"
+ created_at="2013-11-20" updated_at="[null]"/>
+
+</dataset>
/**
* This script copy every requirements from characteristics table (every row where rule_id is not null) to the rules table.
- *
+ * <p/>
* This script need to be executed after rules registration because default debt columns (characteristics, function, coefficient and offset) has to be populated
* in order to be able to compare default values with overridden values.
*
);
}
- private static class RuleInputLoader implements MassUpdater.InputLoader<RuleRow>{
+ private static class RuleInputLoader implements MassUpdater.InputLoader<RuleRow> {
@Override
public String selectSql() {
return "SELECT r.id,r.characteristic_id,r.remediation_function,r.remediation_coeff,r.remediation_offset," +
ruleRow.setId(SqlUtil.getInt(rs, 1));
ruleRow.setCharacteristicId(SqlUtil.getInt(rs, 2));
ruleRow.setFunction(rs.getString(3));
- ruleRow.setFactor(rs.getString(4));
+ ruleRow.setCoefficient(rs.getString(4));
ruleRow.setOffset(rs.getString(5));
ruleRow.setDefaultCharacteristicId(SqlUtil.getInt(rs, 6));
ruleRow.setDefaultFunction(rs.getString(7));
- ruleRow.setDefaultFactor(rs.getString(8));
+ ruleRow.setDefaultCoefficient(rs.getString(8));
ruleRow.setDefaultOffset(rs.getString(9));
ruleRow.setStatus(rs.getString(10));
return ruleRow;
}
}
- private static class RuleInputConvertor implements MassUpdater.InputConverter<RuleRow>{
+ private static class RuleInputConvertor implements MassUpdater.InputConverter<RuleRow> {
private final Multimap<Integer, RequirementDto> requirementsByRuleId;
private final System2 system2;
ruleRow.setCharacteristicId(enabledRequirement.getParentId());
ruleRow.setFunction(enabledRequirement.getFunction().toUpperCase());
- ruleRow.setFactor(convertDuration(enabledRequirement.getFactorValue(), enabledRequirement.getFactorUnit()));
+ ruleRow.setCoefficient(convertDuration(enabledRequirement.getCoefficientValue(), enabledRequirement.getCoefficientUnit()));
ruleRow.setOffset(convertDuration(enabledRequirement.getOffsetValue(), enabledRequirement.getOffsetUnit()));
+ // If the coefficient of a linear or linear with offset function is null, it should be replaced by 0
+ if (("LINEAR".equals(ruleRow.getFunction()) || "LINEAR_OFFSET".equals(ruleRow.getFunction())) && ruleRow.getCoefficient() == null) {
+ ruleRow.setCoefficient("0" + convertUnit(enabledRequirement.getCoefficientUnit()));
+ // If the offset of a constant per issue or linear with offset function is null, it should be replaced by 0
+ } else if (("CONSTANT_ISSUE".equals(ruleRow.getFunction()) || "LINEAR_OFFSET".equals(ruleRow.getFunction())) && ruleRow.getOffset() == null) {
+ ruleRow.setOffset("0" + convertUnit(enabledRequirement.getOffsetUnit()));
+ }
+
if (!isDebtDefaultValuesSameAsOverriddenValues(ruleRow)) {
// Default values on debt are not the same that ones set by SQALE, update the rule
updateStatement.setInt(1, ruleRow.getCharacteristicId());
updateStatement.setString(2, ruleRow.getFunction());
- updateStatement.setString(3, ruleRow.getFactor());
+ updateStatement.setString(3, ruleRow.getCoefficient());
updateStatement.setString(4, ruleRow.getOffset());
updateStatement.setTimestamp(5, new Timestamp(system2.now()));
updateStatement.setInt(6, ruleRow.getId());
@VisibleForTesting
static String convertDuration(@Nullable Double oldValue, @Nullable String oldUnit) {
if (oldValue != null && oldValue > 0) {
- String unit = oldUnit != null ? oldUnit : Duration.DAY;
- // min is replaced by mn
- unit = "mn".equals(unit) ? Duration.MINUTE : unit;
// As value is stored in double, we have to round it in order to have an integer (for instance, if it was 1.6, we'll use 2)
- return Integer.toString((int) Math.round(oldValue)) + unit;
+ return Integer.toString((int) Math.round(oldValue)) + convertUnit(oldUnit);
}
return null;
}
+ @VisibleForTesting
+ private static String convertUnit(@Nullable String oldUnit) {
+ String unit = oldUnit != null ? oldUnit : Duration.DAY;
+ return "mn".equals(unit) ? Duration.MINUTE : unit;
+ }
+
@VisibleForTesting
static boolean isDebtDefaultValuesSameAsOverriddenValues(RuleRow ruleRow) {
return new EqualsBuilder()
.append(ruleRow.getDefaultCharacteristicId(), ruleRow.getCharacteristicId())
.append(ruleRow.getDefaultFunction(), ruleRow.getFunction())
- .append(ruleRow.getDefaultFactor(), ruleRow.getFactor())
+ .append(ruleRow.getDefaultCoefficient(), ruleRow.getCoefficient())
.append(ruleRow.getDefaultOffset(), ruleRow.getOffset())
.isEquals();
}
private Integer defaultCharacteristicId;
private String function;
private String defaultFunction;
- private String factor;
- private String defaultFactor;
+ private String coefficient;
+ private String defaultCoefficient;
private String offset;
private String defaultOffset;
private String status;
}
@CheckForNull
- String getFactor() {
- return factor;
+ String getCoefficient() {
+ return coefficient;
}
- RuleRow setFactor(@Nullable String factor) {
- this.factor = factor;
+ RuleRow setCoefficient(@Nullable String coefficient) {
+ this.coefficient = coefficient;
return this;
}
@CheckForNull
- String getDefaultFactor() {
- return defaultFactor;
+ String getDefaultCoefficient() {
+ return defaultCoefficient;
}
- RuleRow setDefaultFactor(@Nullable String defaultFactor) {
- this.defaultFactor = defaultFactor;
+ RuleRow setDefaultCoefficient(@Nullable String defaultCoefficient) {
+ this.defaultCoefficient = defaultCoefficient;
return this;
}
assertThat(CopyRequirementsFromCharacteristicsToRules.isDebtDefaultValuesSameAsOverriddenValues(new CopyRequirementsFromCharacteristicsToRules.RuleRow()
.setDefaultCharacteristicId(1).setCharacteristicId(1)
.setDefaultFunction("LINEAR_OFFSET").setFunction("LINEAR_OFFSET")
- .setDefaultFactor("5h").setFactor("5h")
+ .setDefaultCoefficient("5h").setCoefficient("5h")
.setDefaultOffset("10min").setOffset("10min")
)).isTrue();
assertThat(CopyRequirementsFromCharacteristicsToRules.isDebtDefaultValuesSameAsOverriddenValues(new CopyRequirementsFromCharacteristicsToRules.RuleRow()
.setDefaultCharacteristicId(1).setCharacteristicId(2)
.setDefaultFunction("LINEAR_OFFSET").setFunction("LINEAR_OFFSET")
- .setDefaultFactor("5h").setFactor("5h")
+ .setDefaultCoefficient("5h").setCoefficient("5h")
.setDefaultOffset("10min").setOffset("10min")
)).isFalse();
assertThat(CopyRequirementsFromCharacteristicsToRules.isDebtDefaultValuesSameAsOverriddenValues(new CopyRequirementsFromCharacteristicsToRules.RuleRow()
.setDefaultCharacteristicId(1).setCharacteristicId(1)
.setDefaultFunction("LINEAR_OFFSET").setFunction("LINEAR_OFFSET")
- .setDefaultFactor("5h").setFactor("4h")
+ .setDefaultCoefficient("5h").setCoefficient("4h")
.setDefaultOffset("10min").setOffset("5min")
)).isFalse();
assertThat(CopyRequirementsFromCharacteristicsToRules.isDebtDefaultValuesSameAsOverriddenValues(new CopyRequirementsFromCharacteristicsToRules.RuleRow()
.setDefaultCharacteristicId(1).setCharacteristicId(1)
.setDefaultFunction("CONSTANT_ISSUE").setFunction("LINEAR")
- .setDefaultFactor(null).setFactor("5h")
+ .setDefaultCoefficient(null).setCoefficient("5h")
.setDefaultOffset("10min").setOffset(null)
)).isFalse();
}
remediation_coeff="[null]" default_remediation_coeff="5d"
remediation_offset="[null]" default_remediation_offset="[null]" updated_at="2014-02-19"/>
+ <!-- Rule linked to one enable requirement on Constant per issue function (with a coefficient of 0d -> to be replaced by null), with different value of debt -> Update rule -->
+ <rules id="6" plugin_rule_key="HiddenFieldCheck" plugin_name="squid" name="HiddenFieldCheck" description="HiddenFieldCheck" status="READY"
+ characteristic_id="[null]" default_characteristic_id="20"
+ remediation_function="[null]" default_remediation_function="LINEAR"
+ remediation_coeff="[null]" default_remediation_coeff="5d"
+ remediation_offset="[null]" default_remediation_offset="[null]" updated_at="2014-02-19"/>
+
+ <!-- Rule linked to one enable requirement on Linear function (with a coeeficient of 0min -> to be replaced by null), with different value of debt -> Update rule -->
+ <rules id="7" plugin_rule_key="ForLoopCounterChangedCheck" plugin_name="squid" name="ForLoopCounterChangedCheck" description="ForLoopCounterChangedCheck" status="READY"
+ characteristic_id="[null]" default_characteristic_id="20"
+ remediation_function="[null]" default_remediation_function="LINEAR"
+ remediation_coeff="[null]" default_remediation_coeff="5d"
+ remediation_offset="[null]" default_remediation_offset="[null]" updated_at="2014-02-19"/>
+
+ <!-- Rule linked to one enable requirement on Linear with offset function (with a offset of 0h -> should be replaced by 0d), with different value of debt -> Update rule -->
+ <rules id="8" plugin_rule_key="ClassVariableVisibilityCheck" plugin_name="squid" name="ClassVariableVisibilityCheck" description="ClassVariableVisibilityCheck" status="READY"
+ characteristic_id="[null]" default_characteristic_id="20"
+ remediation_function="[null]" default_remediation_function="LINEAR"
+ remediation_coeff="[null]" default_remediation_coeff="5d"
+ remediation_offset="[null]" default_remediation_offset="[null" updated_at="2014-02-19"/>
+
+ <!-- Rule linked to one enable requirement on Linear function (with a coefficient of 0d -> should keep 0d), with different value of debt -> Update rule -->
+ <rules id="9" plugin_rule_key="SwitchLastCaseIsDefaultCheck" plugin_name="squid" name="SwitchLastCaseIsDefaultCheck" description="SwitchLastCaseIsDefaultCheck" status="READY"
+ characteristic_id="[null]" default_characteristic_id="20"
+ remediation_function="[null]" default_remediation_function="LINEAR"
+ remediation_coeff="[null]" default_remediation_coeff="5d"
+ remediation_offset="[null]" default_remediation_offset="[null]" updated_at="2014-02-19"/>
+
</dataset>
remediation_coeff="20min" default_remediation_coeff="5d"
remediation_offset="30h" default_remediation_offset="[null]" updated_at="2014-03-13 19:10:03.0"/>
+ <!-- Rule linked to one enable requirement on Constant per issue function (with a coefficient of 0d -> to be replaced by null), with different value of debt -> Update rule -->
+ <rules id="6" plugin_rule_key="HiddenFieldCheck" plugin_name="squid" name="HiddenFieldCheck" description="HiddenFieldCheck" status="READY"
+ characteristic_id="10" default_characteristic_id="20"
+ remediation_function="CONSTANT_ISSUE" default_remediation_function="LINEAR"
+ remediation_coeff="[null]" default_remediation_coeff="5d"
+ remediation_offset="15min" default_remediation_offset="[null]" updated_at="2014-03-13 19:10:03.0"/>
+
+ <!-- Rule linked to one enable requirement on Linear function (with a coeeficient of 0min -> to be replaced by null), with different value of debt -> Update rule -->
+ <rules id="7" plugin_rule_key="ForLoopCounterChangedCheck" plugin_name="squid" name="ForLoopCounterChangedCheck" description="ForLoopCounterChangedCheck" status="READY"
+ characteristic_id="10" default_characteristic_id="20"
+ remediation_function="LINEAR" default_remediation_function="LINEAR"
+ remediation_coeff="0min" default_remediation_coeff="5d"
+ remediation_offset="[null]" default_remediation_offset="[null]" updated_at="2014-03-13 19:10:03.0"/>
+
+ <!-- Rule linked to one enable requirement on Linear with offset function (with a offset of 0h -> should keep 0h), with different value of debt -> Update rule -->
+ <rules id="8" plugin_rule_key="ClassVariableVisibilityCheck" plugin_name="squid" name="ClassVariableVisibilityCheck" description="ClassVariableVisibilityCheck" status="READY"
+ characteristic_id="10" default_characteristic_id="20"
+ remediation_function="LINEAR_OFFSET" default_remediation_function="LINEAR"
+ remediation_coeff="5d" default_remediation_coeff="5d"
+ remediation_offset="0h" default_remediation_offset="[null" updated_at="2014-03-13 19:10:03.0"/>
+
+ <!-- Rule linked to one enable requirement on Linear function (with a coefficient of 0d -> should keep 0d), with different value of debt -> Update rule -->
+ <rules id="9" plugin_rule_key="SwitchLastCaseIsDefaultCheck" plugin_name="squid" name="SwitchLastCaseIsDefaultCheck" description="SwitchLastCaseIsDefaultCheck" status="READY"
+ characteristic_id="10" default_characteristic_id="20"
+ remediation_function="LINEAR" default_remediation_function="LINEAR"
+ remediation_coeff="0d" default_remediation_coeff="5d"
+ remediation_offset="[null]" default_remediation_offset="[null]" updated_at="2014-03-13 19:10:03.0"/>
+
</dataset>
<!-- No requirement for rule 1 -->
- <!-- Requirement of rule 2 -->
+ <!-- Requirements of rule 2 -->
<characteristics id="1" parent_id="10" rule_id="2"
function_key="linear_offset" factor_value="20.0" factor_unit="mn" offset_value="30.0" offset_unit="h" enabled="[false]"
created_at="2013-11-20" updated_at="[null]"/>
function_key="linear_offset" factor_value="30.0" factor_unit="mn" offset_value="20.0" offset_unit="h" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
- <!-- Requirement of rule 3 -->
+ <!-- Requirements of rule 3 -->
<characteristics id="3" parent_id="10" rule_id="3"
function_key="linear_offset" factor_value="20.0" factor_unit="mn" offset_value="30.0" offset_unit="h" enabled="[false]"
created_at="2013-11-20" updated_at="[null]"/>
function_key="linear_offset" factor_value="30.0" factor_unit="mn" offset_value="20.0" offset_unit="h" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
- <!-- Requirement of rule 4 -->
+ <!-- Requirements of rule 4 -->
<characteristics id="5" parent_id="10" rule_id="4"
function_key="linear_offset" factor_value="5.0" factor_unit="mn" offset_value="9.8" offset_unit="h" enabled="[true]"
created_at="2013-11-20" updated_at="[null]"/>
function_key="linear_offset" factor_value="30.0" factor_unit="mn" offset_value="20.0" offset_unit="h" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
- <!-- Requirement of rule 5 -->
+ <!-- Requirements of rule 5 -->
<characteristics id="7" parent_id="10" rule_id="5"
function_key="linear_offset" factor_value="20.0" factor_unit="mn" offset_value="30.0" offset_unit="h" enabled="[true]"
created_at="2013-11-20" updated_at="[null]"/>
function_key="linear_offset" factor_value="30.0" factor_unit="mn" offset_value="20.0" offset_unit="h" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
+ <!-- Requirements of rule 6 -->
+ <characteristics id="9" parent_id="10" rule_id="6"
+ function_key="constant_issue" factor_value="0.0" factor_unit="d" offset_value="15.0" offset_unit="mn" enabled="[true]"
+ created_at="2013-11-20" updated_at="[null]"/>
+
+ <!-- Requirements of rule 7 -->
+ <characteristics id="10" parent_id="10" rule_id="7"
+ function_key="linear" factor_value="0.0" factor_unit="mn" offset_value="0.0" offset_unit="min" enabled="[true]"
+ created_at="2013-11-20" updated_at="[null]"/>
+
+ <!-- Requirements of rule 8 -->
+ <characteristics id="11" parent_id="10" rule_id="8"
+ function_key="linear_offset" factor_value="5.0" factor_unit="d" offset_value="0.0" offset_unit="h" enabled="[true]"
+ created_at="2013-11-20" updated_at="[null]"/>
+
+ <!-- Requirements of rule 9 -->
+ <characteristics id="12" parent_id="10" rule_id="9"
+ function_key="linear" factor_value="0.0" factor_unit="d" offset_value="0.0" offset_unit="h" enabled="[true]"
+ created_at="2013-11-20" updated_at="[null]"/>
+
</dataset>