@CheckForNull private static RuleDebt toRuleDebt(RuleDto rule, DebtModel debtModel) { RuleDebt ruleDebt = new RuleDebt().setRuleKey(RuleKey.of(rule.getRepositoryKey(), rule.getRuleKey())); Integer effectiveSubCharacteristicId = rule.getSubCharacteristicId() != null ? rule.getSubCharacteristicId() : rule.getDefaultSubCharacteristicId(); DebtCharacteristic subCharacteristic = (effectiveSubCharacteristicId != null && !RuleDto.DISABLED_CHARACTERISTIC_ID.equals(effectiveSubCharacteristicId)) ? debtModel.characteristicById(effectiveSubCharacteristicId) : null; if (subCharacteristic != null) { ruleDebt.setSubCharacteristicKey(subCharacteristic.key()); String overriddenFunction = rule.getRemediationFunction(); String defaultFunction = rule.getDefaultRemediationFunction(); if (overriddenFunction != null) { ruleDebt.setFunction(overriddenFunction); ruleDebt.setCoefficient(rule.getRemediationCoefficient()); ruleDebt.setOffset(rule.getRemediationOffset()); return ruleDebt; } else if (defaultFunction != null) { ruleDebt.setFunction(defaultFunction); ruleDebt.setCoefficient(rule.getDefaultRemediationCoefficient()); ruleDebt.setOffset(rule.getDefaultRemediationOffset()); return ruleDebt; } } return null; }
private void restoreRules( List<CharacteristicDto> allCharacteristicDtos, List<RuleDto> rules, List<RuleDebt> ruleDebts, ValidationMessages validationMessages, Date updateDate, DbSession session) { for (RuleDto rule : rules) { RuleDebt ruleDebt = ruleDebt(rule.getRepositoryKey(), rule.getRuleKey(), ruleDebts); String subCharacteristicKey = ruleDebt != null ? ruleDebt.subCharacteristicKey() : null; CharacteristicDto subCharacteristicDto = subCharacteristicKey != null ? characteristicByKey(ruleDebt.subCharacteristicKey(), allCharacteristicDtos, true) : null; ruleOperations.updateRule( rule, subCharacteristicDto, ruleDebt != null ? ruleDebt.function() : null, ruleDebt != null ? ruleDebt.coefficient() : null, ruleDebt != null ? ruleDebt.offset() : null, session); rule.setUpdatedAt(updateDate); ruleDebts.remove(ruleDebt); } for (RuleDebt ruleDebt : ruleDebts) { validationMessages.addWarningText( String.format("The rule '%s' does not exist.", ruleDebt.ruleKey())); } }
@Test public void backup_from_language() { when(dao.selectEnabledCharacteristics(session)) .thenReturn( newArrayList( new CharacteristicDto() .setId(1) .setKey("PORTABILITY") .setName("Portability updated") .setOrder(2), new CharacteristicDto() .setId(2) .setKey("COMPILER") .setName("Compiler updated") .setParentId(1))); when(ruleDao.selectEnabledAndNonManual(session)) .thenReturn( newArrayList( new RuleDto() .setId(1) .setRepositoryKey("squid") .setRuleKey("UselessImportCheck") .setLanguage("java") .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.toString()) .setRemediationOffset("15min"), // .setCreatedAt(oldDate).setUpdatedAt(oldDate), // Should be ignored new RuleDto() .setId(2) .setRepositoryKey("checkstyle") .setLanguage("java2") .setSubCharacteristicId(3) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString()) .setRemediationCoefficient("2h") // .setCreatedAt(oldDate).setUpdatedAt(oldDate) )); debtModelBackup.backup("java"); verify(debtModelXMLExporter).export(any(DebtModel.class), ruleDebtListCaptor.capture()); List<RuleDebt> rules = ruleDebtListCaptor.getValue(); assertThat(rules).hasSize(1); RuleDebt rule = rules.get(0); assertThat(rule.ruleKey().repository()).isEqualTo("squid"); assertThat(rule.ruleKey().rule()).isEqualTo("UselessImportCheck"); assertThat(rule.subCharacteristicKey()).isEqualTo("COMPILER"); assertThat(rule.function()).isEqualTo("CONSTANT_ISSUE"); assertThat(rule.coefficient()).isNull(); assertThat(rule.offset()).isEqualTo("15min"); }
@Test public void backup_with_rule_having_default_linear_and_overridden_offset() { when(dao.selectEnabledCharacteristics(session)) .thenReturn( newArrayList( new CharacteristicDto() .setId(1) .setKey("PORTABILITY") .setName("Portability updated") .setOrder(2), new CharacteristicDto() .setId(2) .setKey("COMPILER") .setName("Compiler updated") .setParentId(1))); when(ruleDao.selectEnabledAndNonManual(session)) .thenReturn( newArrayList( // Rule with default debt values : default value is linear (only coefficient is set) // and overridden value is constant per issue (only offset is set) // -> Ony offset should be set new RuleDto() .setRepositoryKey("squid") .setRuleKey("AvoidNPE") .setDefaultSubCharacteristicId(2) .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR.toString()) .setDefaultRemediationCoefficient("2h") .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE.toString()) .setRemediationOffset("15min"))); debtModelBackup.backup(); ArgumentCaptor<DebtModel> debtModelArgument = ArgumentCaptor.forClass(DebtModel.class); verify(debtModelXMLExporter).export(debtModelArgument.capture(), ruleDebtListCaptor.capture()); assertThat(debtModelArgument.getValue().rootCharacteristics()).hasSize(1); assertThat(debtModelArgument.getValue().subCharacteristics("PORTABILITY")).hasSize(1); List<RuleDebt> rules = ruleDebtListCaptor.getValue(); assertThat(rules).hasSize(1); RuleDebt rule = rules.get(0); assertThat(rule.ruleKey().repository()).isEqualTo("squid"); assertThat(rule.ruleKey().rule()).isEqualTo("AvoidNPE"); assertThat(rule.subCharacteristicKey()).isEqualTo("COMPILER"); assertThat(rule.function()).isEqualTo("CONSTANT_ISSUE"); assertThat(rule.offset()).isEqualTo("15min"); assertThat(rule.coefficient()).isNull(); }
@Test public void backup() { when(dao.selectEnabledCharacteristics(session)) .thenReturn( newArrayList( new CharacteristicDto() .setId(1) .setKey("PORTABILITY") .setName("Portability updated") .setOrder(2), new CharacteristicDto() .setId(2) .setKey("COMPILER") .setName("Compiler updated") .setParentId(1))); when(ruleDao.selectEnabledAndNonManual(session)) .thenReturn( newArrayList( // Rule with overridden debt values new RuleDto() .setRepositoryKey("squid") .setRuleKey("UselessImportCheck") .setSubCharacteristicId(2) .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString()) .setRemediationCoefficient("2h") .setRemediationOffset("15min"), // Rule with default debt values new RuleDto() .setRepositoryKey("squid") .setRuleKey("AvoidNPE") .setDefaultSubCharacteristicId(2) .setDefaultRemediationFunction("LINEAR") .setDefaultRemediationCoefficient("2h"))); debtModelBackup.backup(); ArgumentCaptor<DebtModel> debtModelArgument = ArgumentCaptor.forClass(DebtModel.class); verify(debtModelXMLExporter).export(debtModelArgument.capture(), ruleDebtListCaptor.capture()); assertThat(debtModelArgument.getValue().rootCharacteristics()).hasSize(1); assertThat(debtModelArgument.getValue().subCharacteristics("PORTABILITY")).hasSize(1); List<RuleDebt> rules = ruleDebtListCaptor.getValue(); assertThat(rules).hasSize(2); RuleDebt rule = rules.get(0); assertThat(rule.ruleKey().repository()).isEqualTo("squid"); assertThat(rule.ruleKey().rule()).isEqualTo("UselessImportCheck"); assertThat(rule.subCharacteristicKey()).isEqualTo("COMPILER"); assertThat(rule.function()).isEqualTo("LINEAR_OFFSET"); assertThat(rule.coefficient()).isEqualTo("2h"); assertThat(rule.offset()).isEqualTo("15min"); rule = rules.get(1); assertThat(rule.ruleKey().repository()).isEqualTo("squid"); assertThat(rule.ruleKey().rule()).isEqualTo("AvoidNPE"); assertThat(rule.subCharacteristicKey()).isEqualTo("COMPILER"); assertThat(rule.function()).isEqualTo("LINEAR"); assertThat(rule.coefficient()).isEqualTo("2h"); assertThat(rule.offset()).isNull(); }