@Override
@CheckForNull
- public String debtSubCharacteristicKey() {
- throw new UnsupportedOperationException("TODO");
+ public String debtSubCharacteristicKey(){
+ return (String) fields.get(RuleField.SUB_CHARACTERISTIC.key());
}
@Override
@CheckForNull
public DebtRemediationFunction debtRemediationFunction() {
- throw new UnsupportedOperationException("TODO");
+ final String function = (String) this.fields.get(RuleField.DEBT_FUNCTION_TYPE.key());
+ if(function == null || function.isEmpty()){
+ return null;
+ } else {
+ return new DebtRemediationFunction() {
+ @Override
+ public Type type() {
+ return Type.valueOf(function.toUpperCase());
+ }
+
+ @Override
+ public String coefficient() {
+ return (String) fields.get(RuleField.DEBT_FUNCTION_COEFFICIENT.key());
+ }
+
+ @Override
+ public String offset() {
+ return (String) fields.get(RuleField.DEBT_FUNCTION_OFFSET.key());
+ }
+ };
+ }
}
@Override
RuleNormalizer.RuleField.ACTIVE.key(),
RuleNormalizer.RuleField.TEMPLATE.key(),
RuleNormalizer.RuleField.INTERNAL_KEY.key(),
- RuleNormalizer.RuleField.UPDATED_AT.key());
+ RuleNormalizer.RuleField.UPDATED_AT.key(),
+ RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.key(),
+ RuleNormalizer.RuleField.DEBT_FUNCTION_COEFFICIENT.key(),
+ RuleNormalizer.RuleField.DEBT_FUNCTION_OFFSET.key(),
+ RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key());
+
public RuleIndex(RuleNormalizer normalizer, WorkQueue workQueue, ESNode node) {
super(new RuleIndexDefinition(), normalizer, workQueue, node);
UPDATED_AT("updatedAt"),
PARAMS("params"),
ACTIVE("active"),
- DEBT_FUNCTION("debtRemFunction");
+ DEBT_FUNCTION_TYPE("debtFunction"),
+ DEBT_FUNCTION_COEFFICIENT("debtCoefficient"),
+ DEBT_FUNCTION_OFFSET("debtOffset"),
+ SUB_CHARACTERISTIC("subCharacteristicKey");
private final String key;
indexField(RuleField.LANGUAGE.key(), rule.getLanguage(), document);
indexField(RuleField.INTERNAL_KEY.key(), rule.getConfigKey(), document);
indexField(RuleField.TEMPLATE.key(), rule.getCardinality() == Cardinality.MULTIPLE, document);
- indexField(RuleField.DEBT_FUNCTION.key(), rule.getDefaultRemediationFunction(),document);
+
+ //TODO Change on key when available
+ String subChar = null;
+ if(rule.getDefaultSubCharacteristicId() != null){
+ subChar = rule.getDefaultSubCharacteristicId().toString();
+ }
+ if(rule.getSubCharacteristicId() != null){
+ subChar = rule.getSubCharacteristicId().toString();
+ }
+ indexField(RuleField.SUB_CHARACTERISTIC.key(),subChar,document);
+
+ String dType = null, dCoefficient = null, dOffset = null;
+ if(rule.getDefaultRemediationFunction() != null){
+ dType = rule.getDefaultRemediationFunction();
+ dCoefficient = rule.getDefaultRemediationCoefficient();
+ dOffset= rule.getDefaultRemediationOffset();
+ }
+ if(rule.getRemediationFunction() != null){
+ dType = rule.getRemediationFunction();
+ dCoefficient = rule.getRemediationCoefficient();
+ dOffset= rule.getRemediationOffset();
+ }
+ indexField(RuleField.DEBT_FUNCTION_TYPE.key(), dType, document);
+ indexField(RuleField.DEBT_FUNCTION_COEFFICIENT.key(), dCoefficient, document);
+ indexField(RuleField.DEBT_FUNCTION_OFFSET.key(), dOffset, document);
.prop("severity", rule.severity())
.name("tags").beginArray().values(rule.tags()).endArray()
.name("sysTags").beginArray().values(rule.systemTags()).endArray();
+ if(rule.debtSubCharacteristicKey() != null && !rule.debtSubCharacteristicKey().isEmpty()){
+ json
+ .prop("debtSubCharacteristicKey", rule.debtSubCharacteristicKey());
+ }
+ if(rule.debtRemediationFunction() != null){
+ json
+ .prop("debtRemediationFunctionType", rule.debtRemediationFunction().type().name())
+ .prop("debtRemediationFunctionCoefficient", rule.debtRemediationFunction().coefficient())
+ .prop("debtRemediationFunctionOffset", rule.debtRemediationFunction().offset());
+ }
json.name("params").beginArray();
for (RuleParam param : rule.params()) {
json
public class RuleIndexMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester();
+ public static ServerTester tester = new ServerTester()
+ .setProperty("sonar.es.http.port","9200");
MyBatis myBatis = tester.get(MyBatis.class);
RuleDao dao = tester.get(RuleDao.class);
dbSession.close();
}
+ @Test
+ public void insert_rule() throws InterruptedException {
+ RuleDto ruleDto = newRuleDto(RuleKey.of("javascript", "S001"));
+ dao.insert(ruleDto, dbSession);
+ dbSession.commit();
+
+ index.refresh();
+
+
+ Rule rule = index.getByKey(RuleKey.of("javascript", "S001"));
+
+ System.out.println("rule = " + rule);
+
+ assertThat(rule.htmlDescription()).isEqualTo(ruleDto.getDescription());
+ assertThat(rule.key()).isEqualTo(ruleDto.getKey());
+//
+// assertThat(rule.debtSubCharacteristicKey())
+// .isEqualTo(ruleDto.getDefaultSubCharacteristicId().toString());
+ assertThat(rule.debtRemediationFunction().type().name())
+ .isEqualTo(ruleDto.getRemediationFunction());
+
+
+//
+// assertThat(rule.tags()).containsExactly(ruleDto.getTags());
+// assertThat(rule.systemTags()).containsExactly(ruleDto.getSystemTags());
+
+
+ }
+
+
@Test
public void facet_test_with_repository() {
dao.insert(newRuleDto(RuleKey.of("javascript", "S001")).setRuleKey("X001"), dbSession);
assertThat(results.getHits()).hasSize(1);
}
+
private RuleDto newRuleDto(RuleKey ruleKey) {
return new RuleDto()
.setRuleKey(ruleKey.rule())
.setSeverity(Severity.INFO)
.setCardinality(Cardinality.SINGLE)
.setLanguage("js")
- .setRemediationFunction("linear")
+ .setRemediationFunction("LINEAR")
.setDefaultRemediationFunction("linear_offset")
.setRemediationCoefficient("1h")
.setDefaultRemediationCoefficient("5d")
MockUserSession.set();
WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
- System.out.println("request.toString() = " + request.toString());
WsTester.Result result = request.execute();
result.assertJson(this.getClass(),"search_2_rules.json");
}
+
+ @Test
+ public void search_debt_rules() throws Exception {
+ ruleDao.insert(newRuleDto(RuleKey.of("javascript", "S001"))
+ .setDefaultRemediationCoefficient("DefaultCoef")
+ .setDefaultRemediationFunction("DefaultFunction")
+ .setDefaultRemediationCoefficient("DefaultCoef")
+ .setDefaultSubCharacteristicId(1), session);
+ session.commit();
+
+ tester.get(RuleService.class).refresh();
+
+ MockUserSession.set();
+ WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
+ WsTester.Result result = request.execute();
+
+ result.assertJson(this.getClass(),"search_debt_rule.json");
+ }
+
+
@Test
public void search_active_rules() throws Exception {
QualityProfileDto profile = newQualityProfile();
-{"total": 2, "p":1,"ps":25, "rules": [
+{"total": 2, "p": 1, "ps": 25, "rules": [
{
"key": "javascript:S002",
"repo": "javascript",
"severity": "INFO",
"tags": [],
"sysTags": [],
+ "debtRemediationFunctionType": "LINEAR",
+ "debtRemediationFunctionCoefficient": "1h",
+ "debtRemediationFunctionOffset": "5min",
"params": [],
"actives": []
},
"severity": "INFO",
"tags": [],
"sysTags": [],
+ "debtRemediationFunctionType": "LINEAR",
+ "debtRemediationFunctionCoefficient": "1h",
+ "debtRemediationFunctionOffset": "5min",
"params": [],
"actives": []
}
"severity": "INFO",
"tags": [],
"sysTags": [],
+ "debtRemediationFunctionType": "LINEAR",
+ "debtRemediationFunctionCoefficient": "1h",
+ "debtRemediationFunctionOffset": "5min",
"params": [],
"actives": [
{
"severity": "INFO",
"tags": [],
"sysTags": [],
+ "debtRemediationFunctionType": "LINEAR",
+ "debtRemediationFunctionCoefficient": "1h",
+ "debtRemediationFunctionOffset": "5min",
"params": [
{
"key": "my_var",
--- /dev/null
+{"total": 1, "p": 1, "ps": 25, "rules": [
+ {
+ "key": "javascript:S001",
+ "repo": "javascript",
+ "lang": "js",
+ "name": "Rule S001",
+ "htmlDesc": "Description S001",
+ "status": "READY",
+ "template": false,
+ "internalKey": "InternalKeyS001",
+ "severity": "INFO",
+ "tags": [],
+ "sysTags": [],
+ "debtSubCharacteristicKey": "1",
+ "debtRemediationFunctionType": "LINEAR",
+ "debtRemediationFunctionCoefficient": "1h",
+ "debtRemediationFunctionOffset": "5min",
+ "params": [],
+ "actives": []
+ }
+]}