import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_DEBT_OVERLOADED;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_DEBT_REM_FUNCTION;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_DEFAULT_DEBT_REM_FUNCTION;
+import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_DEFAULT_REM_FUNCTION;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_EFFORT_TO_FIX_DESCRIPTION;
+import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_GAP_DESCRIPTION;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_HTML_DESCRIPTION;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_INTERNAL_KEY;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_IS_TEMPLATE;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_NAME;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_NOTE_LOGIN;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_PARAMS;
+import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_REM_FUNCTION;
+import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_REM_FUNCTION_OVERLOADED;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_REPO;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_SEVERITY;
import static org.sonarqube.ws.client.rule.RulesWsParameters.FIELD_STATUS;
setTemplateKey(ruleResponse, ruleDto, result, fieldsToReturn);
setDebtRemediationFunctionFields(ruleResponse, ruleDto, fieldsToReturn);
setDefaultDebtRemediationFunctionFields(ruleResponse, ruleDto, fieldsToReturn);
- setIsDebtOverloaded(ruleResponse, ruleDto, fieldsToReturn);
+ setIsRemediationFunctionOverloaded(ruleResponse, ruleDto, fieldsToReturn);
setEffortToFixDescription(ruleResponse, ruleDto, fieldsToReturn);
return ruleResponse.build();
}
private static void setEffortToFixDescription(Rules.Rule.Builder ruleResponse, RuleDto ruleDto, Set<String> fieldsToReturn) {
- if (shouldReturnField(fieldsToReturn, FIELD_EFFORT_TO_FIX_DESCRIPTION) && ruleDto.getGapDescription() != null) {
+ if ((shouldReturnField(fieldsToReturn, FIELD_EFFORT_TO_FIX_DESCRIPTION) || shouldReturnField(fieldsToReturn, FIELD_GAP_DESCRIPTION))
+ && ruleDto.getGapDescription() != null) {
ruleResponse.setEffortToFixDescription(ruleDto.getGapDescription());
ruleResponse.setGapDescription(ruleDto.getGapDescription());
}
}
- private static void setIsDebtOverloaded(Rules.Rule.Builder ruleResponse, RuleDto ruleDto, Set<String> fieldsToReturn) {
- if (shouldReturnField(fieldsToReturn, FIELD_DEBT_OVERLOADED)) {
- ruleResponse.setDebtOverloaded(ruleToOverloaded(ruleDto));
+ private static void setIsRemediationFunctionOverloaded(Rules.Rule.Builder ruleResponse, RuleDto ruleDto, Set<String> fieldsToReturn) {
+ if (shouldReturnField(fieldsToReturn, FIELD_DEBT_OVERLOADED) || shouldReturnField(fieldsToReturn, FIELD_REM_FUNCTION_OVERLOADED)) {
+ ruleResponse.setDebtOverloaded(isRemediationFunctionOverloaded(ruleDto));
+ ruleResponse.setRemFnOverloaded(isRemediationFunctionOverloaded(ruleDto));
}
}
private static void setDefaultDebtRemediationFunctionFields(Rules.Rule.Builder ruleResponse, RuleDto ruleDto, Set<String> fieldsToReturn) {
- if (shouldReturnField(fieldsToReturn, FIELD_DEFAULT_DEBT_REM_FUNCTION)) {
+ if (shouldReturnField(fieldsToReturn, FIELD_DEFAULT_DEBT_REM_FUNCTION) || shouldReturnField(fieldsToReturn, FIELD_DEFAULT_REM_FUNCTION)) {
DebtRemediationFunction defaultDebtRemediationFunction = defaultDebtRemediationFunction(ruleDto);
if (defaultDebtRemediationFunction != null) {
String gapMultiplier = defaultDebtRemediationFunction.gapMultiplier();
}
private static void setDebtRemediationFunctionFields(Rules.Rule.Builder ruleResponse, RuleDto ruleDto, Set<String> fieldsToReturn) {
- if (shouldReturnField(fieldsToReturn, FIELD_DEBT_REM_FUNCTION)) {
+ if (shouldReturnField(fieldsToReturn, FIELD_DEBT_REM_FUNCTION) || shouldReturnField(fieldsToReturn, FIELD_REM_FUNCTION)) {
DebtRemediationFunction debtRemediationFunction = debtRemediationFunction(ruleDto);
if (debtRemediationFunction != null) {
if (debtRemediationFunction.type() != null) {
return fieldsToReturn.isEmpty() || fieldsToReturn.contains(fieldName);
}
- private static boolean ruleToOverloaded(RuleDto rule) {
+ private static boolean isRemediationFunctionOverloaded(RuleDto rule) {
return rule.getRemediationFunction() != null;
}
}
WebService.NewParam paramFields = action.createParam(Param.FIELDS)
- .setDescription("Comma-separated list of the fields to be returned in response. All the fields are returned by default, except actives.")
+ .setDescription("Comma-separated list of the fields to be returned in response. All the fields are returned by default, except actives." +
+ "Since 5.5, following fields have been deprecated :" +
+ "<ul>" +
+ "<li>\"defaultDebtRemFn\" becomes \"defaultRemFn\"</li>" +
+ "<li>\"debtRemFn\" becomes \"remFn\"</li>" +
+ "<li>\"effortToFixDescription\" becomes \"gapDescription\"</li>" +
+ "<li>\"debtOverloaded\" becomes \"remFnOverloaded\"</li>" +
+ "</ul>")
.setPossibleValues(OPTIONAL_FIELDS);
Iterator<String> it = OPTIONAL_FIELDS.iterator();
paramFields.setExampleValue(String.format("%s,%s", it.next(), it.next()));
protected void doDefinition(WebService.NewAction action) {
action.setDescription("Search for a collection of relevant rules matching a specified query.<br/>" +
"Since 5.5, following fields in the response have been deprecated :" +
- "<ul><li>\"effortToFixDescription\" becomes \"gapDescription\"</li>" +
+ "<ul>" +
+ "<li>\"effortToFixDescription\" becomes \"gapDescription\"</li>" +
"<li>\"debtRemFnCoeff\" becomes \"remFnGapMultiplier\"</li>" +
"<li>\"defaultDebtRemFnCoeff\" becomes \"defaultRemFnGapMultiplier\"</li>" +
"<li>\"debtRemFnOffset\" becomes \"remFnBaseEffort\"</li>" +
- "<li>\"defaultDebtRemFnOffset\" becomes \"defaultRemFnBaseEffort\"</li></ul>")
+ "<li>\"defaultDebtRemFnOffset\" becomes \"defaultRemFnBaseEffort\"</li>" +
+ "<li>\"debtOverloaded\" becomes \"remFnOverloaded\"</li>" +
+ "</ul>")
.setResponseExample(Resources.getResource(getClass(), "example-search.json"))
.setSince("4.4")
.setHandler(this);
.createAction("show")
.setDescription("Get detailed information about a rule" +
"Since 5.5, following fields in the response have been deprecated :" +
- "<ul><li>\"effortToFixDescription\" becomes \"gapDescription\"</li>" +
+ "<ul>" +
+ "<li>\"effortToFixDescription\" becomes \"gapDescription\"</li>" +
"<li>\"debtRemFnCoeff\" becomes \"remFnGapMultiplier\"</li>" +
"<li>\"defaultDebtRemFnCoeff\" becomes \"defaultRemFnGapMultiplier\"</li>" +
"<li>\"debtRemFnOffset\" becomes \"remFnBaseEffort\"</li>" +
- "<li>\"defaultDebtRemFnOffset\" becomes \"defaultRemFnBaseEffort\"</li></ul>")
+ "<li>\"defaultDebtRemFnOffset\" becomes \"defaultRemFnBaseEffort\"</li>" +
+ "<li>\"debtOverloaded\" becomes \"remFnOverloaded\"</li>" +
+ "</ul>")
.setSince("4.2")
.setResponseExample(Resources.getResource(getClass(), "example-show.json"))
.setHandler(this);
"template": false,
"tags": [],
"sysTags": ["brain-overload"],
- "debtSubChar": "39",
- "debtRemFnType": "CONSTANT_ISSUE",
- "debtRemFnBaseEffort": "10min",
+ "remFnType": "LINEAR_OFFSET",
+ "remFnGapMultiplier": "5d",
+ "remFnBaseEffort": "10h",
+ "defaultRemFnType": "LINEAR_OFFSET",
+ "defaultRemFnGapMultiplier": "6d",
+ "defaultRemFnBaseEffort": "11h",
+ "remFnOverloaded": true,
+ "gapDescription": "java.S001.effortToFix",
"lang": "java",
"langName": "Java",
"type": "CODE_SMELL",
result.assertJson("{\"total\":0,\"p\":1,\"ps\":100,\"rules\":[]}");
}
+ @Test
+ public void search_rules_with_deprecated_fields() throws Exception {
+ ruleDao.insert(dbSession, RuleTesting.newXooX1()
+ .setDefaultRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name())
+ .setDefaultRemediationGapMultiplier("1h")
+ .setDefaultRemediationBaseEffort("15min")
+ .setRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.name())
+ .setRemediationGapMultiplier("2h")
+ .setRemediationBaseEffort("25min"));
+ dbSession.commit();
+ ruleIndexer.index();
+
+ WsTester.TestRequest request = tester.wsTester()
+ .newGetRequest(API_ENDPOINT, API_SEARCH_METHOD)
+ .setParam(WebService.Param.FIELDS, "name,defaultDebtRemFn,debtRemFn,effortToFixDescription,debtOverloaded");
+ WsTester.Result result = request.execute();
+
+ result.assertJson(getClass(), "search_rules_with_deprecated_fields.json");
+ }
+
private ActiveRuleDto newActiveRule(QualityProfileDto profile, RuleDto rule) {
return ActiveRuleDto.createFor(profile, rule)
.setInheritance(null)
--- /dev/null
+{
+ "rules": [
+ {
+ "key": "xoo:x1",
+ "name": "Rule x1",
+ "defaultDebtRemFnType": "LINEAR_OFFSET",
+ "defaultDebtRemFnCoeff": "1h",
+ "defaultDebtRemFnOffset": "15min",
+ "effortToFixDescription": "xoo.x1.effortToFix",
+ "debtOverloaded": true,
+ "debtRemFnType": "LINEAR_OFFSET",
+ "debtRemFnCoeff": "2h",
+ "debtRemFnOffset": "25min",
+ "defaultRemFnType": "LINEAR_OFFSET",
+ "defaultRemFnGapMultiplier": "1h",
+ "defaultRemFnBaseEffort": "15min",
+ "remFnType": "LINEAR_OFFSET",
+ "remFnGapMultiplier": "2h",
+ "remFnBaseEffort": "25min",
+ "remFnOverloaded": true,
+ "gapDescription": "xoo.x1.effortToFix",
+ "type": "CODE_SMELL"
+ }
+ ]
+}
"severity": "MINOR",
"status": "BETA",
"remFnType": "LINEAR_OFFSET",
+ "remFnGapMultiplier": "5d",
+ "remFnBaseEffort": "10h",
+ "defaultRemFnType": "LINEAR_OFFSET",
+ "defaultRemFnGapMultiplier": "6d",
+ "defaultRemFnBaseEffort": "11h",
+ "remFnOverloaded": true,
+ "gapDescription": "java.S001.effortToFix",
"debtRemFnType": "LINEAR_OFFSET",
"debtRemFnCoeff": "5d",
- "remFnGapMultiplier": "5d",
"debtRemFnOffset": "10h",
- "remFnBaseEffort": "10h",
"defaultDebtRemFnType": "LINEAR_OFFSET",
- "defaultRemFnType": "LINEAR_OFFSET",
"defaultDebtRemFnCoeff": "6d",
- "defaultRemFnGapMultiplier": "6d",
"defaultDebtRemFnOffset": "11h",
- "defaultRemFnBaseEffort": "11h",
"debtOverloaded": true,
- "effortToFixDescription": "java.S001.effortToFix",
- "gapDescription": "java.S001.effortToFix"
+ "effortToFixDescription": "java.S001.effortToFix"
}
}
public static final String FIELD_NOTE_LOGIN = "noteLogin";
public static final String FIELD_MARKDOWN_NOTE = "mdNote";
public static final String FIELD_HTML_NOTE = "htmlNote";
+
+ /**
+ * @deprecated since 5.5, replaced by {@link #FIELD_DEFAULT_REM_FUNCTION}
+ */
+ @Deprecated
public static final String FIELD_DEFAULT_DEBT_REM_FUNCTION = "defaultDebtRemFn";
+ public static final String FIELD_DEFAULT_REM_FUNCTION = "defaultRemFn";
+
+ /**
+ * @deprecated since 5.5, replaced by {@link #FIELD_REM_FUNCTION}
+ */
+ @Deprecated
+ public static final String FIELD_DEBT_REM_FUNCTION = "debtRemFn";
+ public static final String FIELD_REM_FUNCTION = "remFn";
+
+ /**
+ * @deprecated since 5.5, replaced by {@link #FIELD_GAP_DESCRIPTION}
+ */
+ @Deprecated
public static final String FIELD_EFFORT_TO_FIX_DESCRIPTION = "effortToFixDescription";
+ public static final String FIELD_GAP_DESCRIPTION = "gapDescription";
+
+ /**
+ * @deprecated since 5.5, replaced by {@link #FIELD_REM_FUNCTION_OVERLOADED}
+ */
+ @Deprecated
public static final String FIELD_DEBT_OVERLOADED = "debtOverloaded";
- public static final String FIELD_DEBT_REM_FUNCTION = "debtRemFn";
+ public static final String FIELD_REM_FUNCTION_OVERLOADED = "remFnOverloaded";
+
public static final String FIELD_PARAMS = "params";
public static final String FIELD_ACTIVES = "actives";
public static final Set<String> OPTIONAL_FIELDS = ImmutableSet.of(FIELD_REPO, FIELD_NAME, FIELD_CREATED_AT, FIELD_SEVERITY, FIELD_STATUS, FIELD_INTERNAL_KEY, FIELD_IS_TEMPLATE,
FIELD_TEMPLATE_KEY, FIELD_TAGS, FIELD_SYSTEM_TAGS, FIELD_LANGUAGE, FIELD_LANGUAGE_NAME, FIELD_HTML_DESCRIPTION, FIELD_MARKDOWN_DESCRIPTION, FIELD_NOTE_LOGIN,
- FIELD_MARKDOWN_NOTE, FIELD_HTML_NOTE, FIELD_DEFAULT_DEBT_REM_FUNCTION, FIELD_EFFORT_TO_FIX_DESCRIPTION, FIELD_DEBT_OVERLOADED, FIELD_DEBT_REM_FUNCTION, FIELD_PARAMS,
- FIELD_ACTIVES);
+ FIELD_MARKDOWN_NOTE, FIELD_HTML_NOTE,
+ FIELD_DEFAULT_DEBT_REM_FUNCTION, FIELD_EFFORT_TO_FIX_DESCRIPTION, FIELD_DEBT_OVERLOADED, FIELD_DEBT_REM_FUNCTION,
+ FIELD_DEFAULT_REM_FUNCTION, FIELD_GAP_DESCRIPTION, FIELD_REM_FUNCTION_OVERLOADED, FIELD_REM_FUNCTION,
+ FIELD_PARAMS, FIELD_ACTIVES);
private RulesWsParameters() {
// prevent instantiation
optional string defaultDebtRemFnOffset = 31;
// Deprecated since 5.5, replaced by gapDescription
optional string effortToFixDescription = 32;
+ // Deprecated since 5.5, replaced by remFnOverloaded
optional bool debtOverloaded = 33;
// Deprecated since 5.5, replaced by remFnType
optional string debtRemFnType = 34;
optional string remFnType = 41;
optional string remFnGapMultiplier = 42;
optional string remFnBaseEffort = 43;
+ optional bool remFnOverloaded = 45;
optional string gapDescription = 44;
optional sonarqube.ws.commons.RuleType type = 37;