Characteristic rootCharacteristic = rootCharacteristicDto.toCharacteristic(null);
Characteristic characteristic = characteristicDto.toCharacteristic(rootCharacteristic);
- return requirementDto.toRequirement(RuleKey.of(rule.getRepositoryKey(), rule.getKey()), characteristic);
+ return requirementDto.toRequirement(RuleKey.of(rule.getRepositoryKey(), rule.getKey()), characteristic, rootCharacteristic);
}
private void addRootCharacteristics(TechnicalDebtModel model, List<CharacteristicDto> dtos, Map<Integer, Characteristic> characteristicsById){
Integer ruleId = dto.getRuleId();
if (ruleId != null) {
Characteristic characteristic = characteristicsById.get(dto.getParentId());
+ Characteristic rootCharacteristic = characteristicsById.get(dto.getRootId());
Rule rule = rulesById.get(ruleId);
RuleKey ruleKey = RuleKey.of(rule.getRepositoryKey(), rule.getKey());
- dto.toRequirement(ruleKey, characteristic);
+ dto.toRequirement(ruleKey, characteristic, rootCharacteristic);
}
}
}
}
}
- public void create(Requirement requirement, Integer characteristicId, TechnicalDebtRuleCache ruleCache, SqlSession session) {
+ public void create(Requirement requirement, Integer characteristicId, Integer rootCharacteristicId, TechnicalDebtRuleCache ruleCache, SqlSession session) {
Rule rule = ruleCache.getByRuleKey(requirement.ruleKey());
- CharacteristicDto requirementDto = CharacteristicDto.toDto(requirement, characteristicId, rule.getId());
+ CharacteristicDto requirementDto = CharacteristicDto.toDto(requirement, characteristicId, rootCharacteristicId, rule.getId());
dao.insert(requirementDto, session);
requirement.setId(requirementDto.getId());
}
- public void create(Requirement requirement, Integer characteristicId, TechnicalDebtRuleCache ruleCache) {
+ public void create(Requirement requirement, Integer characteristicId, Integer rootCharacteristicId, TechnicalDebtRuleCache ruleCache) {
SqlSession session = mybatis.openSession();
try {
- create(requirement, characteristicId, ruleCache, session);
+ create(requirement, characteristicId, rootCharacteristicId, ruleCache, session);
session.commit();
} finally {
MyBatis.closeQuietly(session);
Rule rule = rulesCache.getByRuleKey(pluginRequirement.ruleKey());
if (!find(existingModel, rule)) {
CharacteristicDto characteristicDto = findCharacteristic(existingModel, pluginRequirement.characteristic().key());
- CharacteristicDto requirementDto = CharacteristicDto.toDto(pluginRequirement, characteristicDto.getId(), rule.getId());
+ CharacteristicDto requirementDto = CharacteristicDto.toDto(pluginRequirement, characteristicDto.getId(), characteristicDto.getRootId(), rule.getId());
dao.insert(requirementDto, session);
}
}
private String kee;
private String name;
private Integer parentId;
+ private Integer rootId;
private Integer characteristicOrder;
private Integer ruleId;
private String functionKey;
return this;
}
+ @CheckForNull
+ public Integer getRootId() {
+ return rootId;
+ }
+
+ public CharacteristicDto setRootId(@Nullable Integer rootId) {
+ this.rootId = rootId;
+ return this;
+ }
+
@CheckForNull
public Integer getOrder() {
return characteristicOrder;
.setName(name)
.setOrder(characteristicOrder)
.setParent(parent)
+ .setRoot(parent)
.setCreatedAt(createdAt)
.setUpdatedAt(updatedAt);
}
.setName(characteristic.name())
.setOrder(characteristic.order())
.setParentId(parentId)
+ .setRootId(parentId)
.setEnabled(true)
.setCreatedAt(characteristic.createdAt())
.setUpdatedAt(characteristic.updatedAt());
}
- public Requirement toRequirement(RuleKey ruleKey, Characteristic characteristic) {
+ public Requirement toRequirement(RuleKey ruleKey, Characteristic characteristic, Characteristic rootCharacteristic) {
return new Requirement()
.setId(id)
.setRuleKey(ruleKey)
.setCharacteristic(characteristic)
+ .setRootCharacteristic(rootCharacteristic)
.setFunction(functionKey)
.setFactor(WorkUnit.create(factorValue, factorUnit))
.setOffset(WorkUnit.create(offsetValue, offsetUnit))
.setUpdatedAt(updatedAt);
}
- public static CharacteristicDto toDto(Requirement requirement, Integer characteristicId, Integer ruleId) {
+ public static CharacteristicDto toDto(Requirement requirement, Integer characteristicId, Integer rootCharacteristicId, Integer ruleId) {
return new CharacteristicDto()
.setRuleId(ruleId)
.setParentId(characteristicId)
+ .setRootId(rootCharacteristicId)
.setFunction(requirement.function())
.setFactorValue(requirement.factor().getValue())
.setFactorUnit(requirement.factor().getUnit())
"NAME" VARCHAR(100),
"DESCRIPTION" VARCHAR(4000),
"PARENT_ID" INTEGER,
+ "ROOT_ID" INTEGER,
"RULE_ID" INTEGER,
"FUNCTION_KEY" VARCHAR(100),
"FACTOR_VALUE" DOUBLE,
c.kee as kee,
c.name as name,
c.parent_id as parentId,
+ c.root_id as rootId,
c.characteristic_order as characteristicOrder,
c.rule_id as ruleId,
c.function_key as functionKey,
</select>
<insert id="insert" parameterType="Characteristic" keyColumn="id" useGeneratedKeys="true" keyProperty="id">
- INSERT INTO characteristics (kee, name, parent_id, characteristic_order,
+ INSERT INTO characteristics (kee, name, parent_id, root_id, characteristic_order,
rule_id, function_key, factor_value, factor_unit, offset_value, offset_unit,
enabled, created_at, updated_at)
- VALUES (#{kee}, #{name}, #{parentId}, #{characteristicOrder},
+ VALUES (#{kee}, #{name}, #{parentId}, #{rootId}, #{characteristicOrder},
#{ruleId}, #{functionKey}, #{factorValue}, #{factorUnit}, #{offsetValue}, #{offsetUnit},
#{enabled}, current_timestamp, current_timestamp)
</insert>
update characteristics set
name=#{name},
parent_id=#{parentId},
+ root_id=#{rootId},
characteristic_order=#{characteristicOrder},
rule_id=#{ruleId},
function_key=#{functionKey},
assertThat(rootCharacteristic.getKey()).isEqualTo("PORTABILITY");
assertThat(rootCharacteristic.getName()).isEqualTo("Portability");
assertThat(rootCharacteristic.getParentId()).isNull();
+ assertThat(rootCharacteristic.getRootId()).isNull();
assertThat(rootCharacteristic.getRuleId()).isNull();
assertThat(rootCharacteristic.getOrder()).isEqualTo(1);
assertThat(rootCharacteristic.isEnabled()).isTrue();
assertThat(characteristic.getKey()).isEqualTo("COMPILER_RELATED_PORTABILITY");
assertThat(characteristic.getName()).isEqualTo("Compiler related portability");
assertThat(characteristic.getParentId()).isEqualTo(1);
+ assertThat(characteristic.getRootId()).isEqualTo(1);
assertThat(characteristic.getRuleId()).isNull();
assertThat(characteristic.getOrder()).isNull();
assertThat(characteristic.isEnabled()).isTrue();
assertThat(requirement.getKey()).isNull();
assertThat(requirement.getName()).isNull();
assertThat(requirement.getParentId()).isEqualTo(2);
+ assertThat(requirement.getRootId()).isEqualTo(1);
assertThat(requirement.getRuleId()).isEqualTo(1);
assertThat(requirement.getOrder()).isNull();
assertThat(requirement.getFunction()).isEqualTo("linear_offset");
assertThat(dto).isNotNull();
assertThat(dto.getId()).isEqualTo(3);
assertThat(dto.getParentId()).isEqualTo(2);
+ assertThat(dto.getRootId()).isEqualTo(1);
}
@Test
assertThat(dto).isNotNull();
assertThat(dto.getId()).isEqualTo(2);
assertThat(dto.getParentId()).isEqualTo(1);
+ assertThat(dto.getRootId()).isEqualTo(1);
dto = dao.selectCharacteristic("PORTABILITY");
assertThat(dto).isNotNull();
assertThat(dto.getId()).isEqualTo(1);
assertThat(dto.getParentId()).isNull();
+ assertThat(dto.getRootId()).isNull();
assertThat(dao.selectCharacteristic("UNKNOWN")).isNull();
}
public void insert_requirement() throws Exception {
CharacteristicDto dto = new CharacteristicDto()
.setParentId(2)
+ .setRootId(1)
.setRuleId(1)
.setFunction("linear_offset")
.setFactorValue(20.0)
CharacteristicDto dto = new CharacteristicDto()
.setId(1)
.setParentId(3)
+ .setRootId(1)
.setRuleId(2)
.setFunction("linear")
.setFactorValue(21.0)
<dataset>
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="1"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
created_at="2013-11-20" updated_at="[null]"/>
<dataset>
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="1"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<dataset>
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="1"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="[null]"/>
<dataset>
- <characteristics id="1" kee="[null]" name="[null]" parent_id="2" rule_id="1" characteristic_order="[null]"
+ <characteristics id="1" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="1" 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>
- <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="1"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-22"/>
- <characteristics id="2" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="1" rule_id="[null]" characteristic_order="[null]"
+ <characteristics id="2" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="1" root_id="1" rule_id="[null]" characteristic_order="[null]"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<!-- requirement -->
- <characteristics id="3" kee="[null]" name="[null]" parent_id="2" rule_id="1"
+ <characteristics id="3" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="1"
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]"/>
<!-- disabled characteristics -->
- <characteristics id="4" kee="DISABLED_CHARACTERISTIC" name="Disabled characteristic" parent_id="1" rule_id="[null]" characteristic_order="2"
+ <characteristics id="4" kee="DISABLED_CHARACTERISTIC" name="Disabled characteristic" parent_id="1" root_id="1" rule_id="[null]" characteristic_order="2"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<!-- disabled requirement -->
- <characteristics id="5" kee="[null]" name="[null]" parent_id="4" rule_id="1"
+ <characteristics id="5" kee="[null]" name="[null]" parent_id="4" root_id="4" rule_id="1"
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"/>
<dataset>
- <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="2"
+ <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="2"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-22"/>
- <characteristics id="2" kee="TESTABILITY" name="Testability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ <characteristics id="2" kee="TESTABILITY" name="Testability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="1"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-22"/>
- <characteristics id="3" kee="MAINTAINABILITY" name="Maintainability" parent_id="[null]" rule_id="[null]" characteristic_order="4"
+ <characteristics id="3" kee="MAINTAINABILITY" name="Maintainability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="4"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<dataset>
<!-- Root characteristic -->
- <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="1"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<!-- Characteristic -->
- <characteristics id="2" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="1" rule_id="[null]" characteristic_order="[null]"
+ <characteristics id="2" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="1" root_id="1" rule_id="[null]" characteristic_order="[null]"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<!-- Requirement -->
- <characteristics id="3" kee="[null]" name="[null]" parent_id="2" rule_id="1"
+ <characteristics id="3" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="1"
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]"/>
<!-- Disabled root characteristic -->
- <characteristics id="4" kee="DISABLED_ROOT_CHARACTERISTIC" name="Disabled root characteristic" parent_id="[null]" rule_id="[null]" characteristic_order="2"
+ <characteristics id="4" kee="DISABLED_ROOT_CHARACTERISTIC" name="Disabled root characteristic" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="2"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<!-- Disabled characteristic -->
- <characteristics id="5" kee="DISABLED_CHARACTERISTIC" name="Disabled characteristic" parent_id="4" rule_id="[null]" characteristic_order="[null]"
+ <characteristics id="5" kee="DISABLED_CHARACTERISTIC" name="Disabled characteristic" parent_id="4" root_id="4" rule_id="[null]" characteristic_order="[null]"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<!-- Disabled requirement -->
- <characteristics id="6" kee="[null]" name="[null]" parent_id="5" rule_id="1"
+ <characteristics id="6" kee="[null]" name="[null]" parent_id="5" root_id="4" rule_id="1"
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"/>
<dataset>
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="New name" parent_id="[null]" rule_id="[null]" characteristic_order="2"
+ <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="New name" parent_id="[null]" rule_id="[null]" root_id="[null]" characteristic_order="2"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<dataset>
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="1"
function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
created_at="2013-11-20" updated_at="2013-11-20"/>
<dataset>
- <characteristics id="1" kee="[null]" name="[null]" parent_id="3" rule_id="2" characteristic_order="[null]"
+ <characteristics id="1" kee="[null]" name="[null]" parent_id="3" root_id="1" rule_id="2" characteristic_order="[null]"
function_key="linear" factor_value="21.0" factor_unit="h" offset_value="[null]" offset_unit="[null]" enabled="[false]"
created_at="2013-11-20" updated_at="2013-11-22"/>
<dataset>
- <characteristics id="1" kee="[null]" name="[null]" parent_id="2" rule_id="1" characteristic_order="[null]"
+ <characteristics id="1" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="1" 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]"/>
private String name;
private Integer order;
private Characteristic parent;
+ private Characteristic root;
private List<Characteristic> children;
private List<Requirement> requirements;
return this;
}
+ @CheckForNull
+ public Characteristic getRoot() {
+ return root;
+ }
+
+ public Characteristic setRoot(@Nullable Characteristic root) {
+ this.root = root;
+ return this;
+ }
+
public List<Characteristic> children() {
return children;
}
private Integer id;
private RuleKey ruleKey;
private Characteristic characteristic;
+ private Characteristic rootCharacteristic;
private String function;
private WorkUnit factor;
return this;
}
+ public Characteristic getRootCharacteristic() {
+ return rootCharacteristic;
+ }
+
+ public Requirement setRootCharacteristic(Characteristic rootCharacteristic) {
+ this.rootCharacteristic = rootCharacteristic;
+ return this;
+ }
+
public String function() {
return function;
}
characteristic.factor_unit = 'd'
characteristic.offset_value = 0.0
characteristic.offset_unit = 'd'
+
end
# requirement without properties or without remediationFunction has to be disabled
else
requirement.enabled = false
+ requirements_to_disable << characteristic
end
end
- characteristic.parent_id = parent_ids_by_characteristic_id[characteristic.id]
- characteristic.root_id = parent_ids_by_characteristic_id[characteristic.parent_id] if characteristic.parent_id
+ parent_id = parent_ids_by_characteristic_id[characteristic.id]
+ # Not for root characteristics
+ if parent_id
+ characteristic.parent_id = parent_id
+ # Requirements
+ if characteristic.rule_id
+ characteristic.root_id = parent_ids_by_characteristic_id[characteristic.parent_id]
+ # Characteristics as same root_id as parent_id
+ else
+ characteristic.root_id = parent_id
+ end
+ end
characteristic.created_at = now
characteristic.updated_at = now
characteristic.save