private DefaultCharacteristic processCharacteristic(DefaultTechnicalDebtModel model, DefaultCharacteristic parent, SMInputCursor chcCursor, ValidationMessages messages,
TechnicalDebtRuleCache technicalDebtRuleCache) throws XMLStreamException {
DefaultCharacteristic characteristic = new DefaultCharacteristic();
- characteristic.setParent(parent);
-
SMInputCursor cursor = chcCursor.childElementCursor();
while (cursor.getNext() != null) {
String node = cursor.getLocalName();
if (StringUtils.equals(node, CHARACTERISTIC_KEY)) {
characteristic.setKey(cursor.collectDescendantText().trim());
+ // Attached to parent only if a key is existing, otherwise characteristic with empty key can be added.
+ characteristic.setParent(parent);
} else if (StringUtils.equals(node, CHARACTERISTIC_NAME)) {
characteristic.setName(cursor.collectDescendantText().trim(), false);
} else if (StringUtils.equals(node, REPOSITORY_KEY)) {
DefaultRequirement requirement = processRequirement(model, cursor, messages, technicalDebtRuleCache);
if (requirement != null) {
- requirement.setCharacteristic(parent);
+ if (parent.parent() == null) {
+ messages.addWarningText("Requirement '" + requirement.ruleKey() + "' is ignored because it's defined directly under a root characteristic.");
+ } else {
+ requirement.setCharacteristic(parent);
+ requirement.setRootCharacteristic(parent.parent());
+ }
}
}
}
assertThat(efficiency.requirements()).isEmpty();
}
+ @Test
+ public void ignore_requirement_on_root_characteristics() {
+ TechnicalDebtRuleCache technicalDebtRuleCache = mockRuleCache();
+
+ String xml = getFileContent("ignore_requirement_on_root_characteristics.xml");
+
+ ValidationMessages messages = ValidationMessages.create();
+ DefaultTechnicalDebtModel sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
+
+ assertThat(messages.getWarnings()).hasSize(1);
+
+ assertThat(sqale.characteristics()).hasSize(1);
+ DefaultCharacteristic efficiency = sqale.characteristicByKey("EFFICIENCY");
+ assertThat(efficiency.requirements()).isEmpty();
+ assertThat(messages.getWarnings().get(0)).contains("checkstyle");
+ }
+
@Test
public void shouldBadlyFormattedImportXML() {
TechnicalDebtRuleCache technicalDebtRuleCache = mockRuleCache();
assertThat(requirement.function()).isEqualTo("linear");
assertThat(requirement.factor()).isEqualTo(WorkUnit.create(3.2, "h"));
assertThat(requirement.offset()).isEqualTo(offset);
+ assertThat(requirement.characteristic().key()).isEqualTo("MEMORY_EFFICIENCY");
+ assertThat(requirement.rootCharacteristic().key()).isEqualTo("EFFICIENCY");
}
private String getFileContent(String file) {