From 7774bfe48a8028c799cbe7cf322bcd6f0dddda47 Mon Sep 17 00:00:00 2001 From: Guillaume Jambet Date: Tue, 7 Nov 2017 11:14:06 +0100 Subject: [PATCH] SONAR-10046 adding minimum length validation to Request api --- .../org/sonar/server/ws/ws/ListAction.java | 1 + .../org/sonar/server/ws/ws/list-example.json | 14 +++++++++---- .../sonar/server/ws/ws/WebServicesWsTest.java | 11 ++++++++-- .../list_including_internals.json | 11 +++++++++- .../org/sonar/api/server/ws/WebService.java | 21 +++++++++++++++++++ .../server/ws/internal/ValidatingRequest.java | 10 +++++++++ .../sonar/api/server/ws/WebServiceTest.java | 14 +++++++++++++ 7 files changed, 75 insertions(+), 7 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/ws/ws/ListAction.java b/server/sonar-server/src/main/java/org/sonar/server/ws/ws/ListAction.java index 126bfd341f6..d2e5ef809c1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ws/ws/ListAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ws/ws/ListAction.java @@ -136,6 +136,7 @@ public class ListAction implements WebServicesWsAction { writer.prop("maxValuesAllowed", param.maxValuesAllowed()); ofNullable(param.possibleValues()).ifPresent(possibleValues -> writer.name("possibleValues").beginArray().values(possibleValues).endArray()); ofNullable(param.maximumLength()).ifPresent(maximumLength -> writer.prop("maximumLength", maximumLength)); + ofNullable(param.minimumLength()).ifPresent(minimumLength -> writer.prop("minimumLength", minimumLength)); ofNullable(param.maximumValue()).ifPresent(maximumValue -> writer.prop("maximumValue", maximumValue)); writer.endObject(); } diff --git a/server/sonar-server/src/main/resources/org/sonar/server/ws/ws/list-example.json b/server/sonar-server/src/main/resources/org/sonar/server/ws/ws/list-example.json index ade270b1dbd..a01a7493008 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/ws/ws/list-example.json +++ b/server/sonar-server/src/main/resources/org/sonar/server/ws/ws/list-example.json @@ -29,10 +29,17 @@ ], "params": [ { - "key": "maximum_value", - "maximumValue": 12, + "key": "constrained_numeric_param", "required": false, - "internal": false + "internal": false, + "maximumValue": 12 + }, + { + "key": "constrained_string_param", + "required": false, + "internal": false, + "maximumLength": 64, + "minimumLength": 3 }, { "key": "name", @@ -41,7 +48,6 @@ }, { "key": "severity", - "maximumLength": 20, "description": "Severity", "required": false, "internal": false, diff --git a/server/sonar-server/src/test/java/org/sonar/server/ws/ws/WebServicesWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/ws/ws/WebServicesWsTest.java index d9e1fc2fc4f..7151638d961 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ws/ws/WebServicesWsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ws/ws/WebServicesWsTest.java @@ -114,7 +114,6 @@ public class WebServicesWsTest { create .createParam("severity") - .setMaximumLength(20) .setDescription("Severity") .setSince("4.4") .setDeprecatedSince("5.2") @@ -125,7 +124,15 @@ public class WebServicesWsTest { .setDefaultValue("BLOCKER"); create.createParam("name"); create.createParam("internal").setInternal(true); - create.createParam("maximum_value").setMaximumValue(12); + + create + .createParam("constrained_string_param") + .setMaximumLength(64) + .setMinimumLength(3); + + create + .createParam("constrained_numeric_param") + .setMaximumValue(12); newController.createAction("internal_action") .setDescription("Internal Action Description") diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ws/ws/WebServicesWsTest/list_including_internals.json b/server/sonar-server/src/test/resources/org/sonar/server/ws/ws/WebServicesWsTest/list_including_internals.json index dddcd8edbe6..d118e6e60cf 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/ws/ws/WebServicesWsTest/list_including_internals.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/ws/ws/WebServicesWsTest/list_including_internals.json @@ -14,9 +14,18 @@ "hasResponseExample": true, "params": [ { - "key": "maximum_value", + "key": "constrained_numeric_param", + "required": false, + "internal": false, "maximumValue": 12 }, + { + "key": "constrained_string_param", + "required": false, + "internal": false, + "maximumLength": 64, + "minimumLength": 3 + }, { "key": "name", "required": false, diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/WebService.java b/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/WebService.java index 02285cab9ba..58a4e73f620 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/WebService.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/WebService.java @@ -636,6 +636,7 @@ public interface WebService extends Definable { private Set possibleValues = null; private Integer maxValuesAllowed; private Integer maximumLength; + private Integer minimumLength; private Integer maximumValue; private NewParam(String key) { @@ -781,6 +782,14 @@ public interface WebService extends Definable { return this; } + /** + * @since 7.0 + */ + public NewParam setMinimumLength(@Nullable Integer minimumLength) { + this.minimumLength = minimumLength; + return this; + } + /** * @since 7.0 */ @@ -844,6 +853,7 @@ public interface WebService extends Definable { private final boolean internal; private final Set possibleValues; private final Integer maximumLength; + private final Integer minimumLength; private final Integer maximumValue; private final Integer maxValuesAllowed; @@ -861,6 +871,7 @@ public interface WebService extends Definable { this.possibleValues = newParam.possibleValues; this.maxValuesAllowed = newParam.maxValuesAllowed; this.maximumLength = newParam.maximumLength; + this.minimumLength = newParam.minimumLength; this.maximumValue = newParam.maximumValue; checkArgument(!required || defaultValue == null, "Default value must not be set on parameter '%s?%s' as it's marked as required", action, key); } @@ -968,6 +979,16 @@ public interface WebService extends Definable { return maximumLength; } + /** + * Specify the minimum length of the value used in this parameter + * + * @since 7.0 + */ + @CheckForNull + public Integer minimumLength() { + return minimumLength; + } + /** * Specify the maximum value of the numeric variable used in this parameter * diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java b/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java index a9141a3943d..e217bd4325b 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java @@ -76,6 +76,7 @@ public abstract class ValidatingRequest extends Request { } validatePossibleValues(key, value, definition); validateMaximumLength(key, definition, valueOrDefault); + validateMinimumLength(key, definition, valueOrDefault); validateMaximumValue(key, definition, value); return value; } @@ -183,6 +184,15 @@ public abstract class ValidatingRequest extends Request { checkArgument(valueLength <= maximumLength, "'%s' length (%s) is longer than the maximum authorized (%s)", key, valueLength, maximumLength); } + private static void validateMinimumLength(String key, WebService.Param definition, String valueOrDefault) { + Integer minimumLength = definition.minimumLength(); + if (minimumLength == null) { + return; + } + int valueLength = valueOrDefault.length(); + checkArgument(valueLength >= minimumLength, "'%s' length (%s) is shorter than the minimum authorized (%s)", key, valueLength, minimumLength); + } + private static void validateMaximumValue(String key, WebService.Param definition, String value) { Integer maximumValue = definition.maximumValue(); if (maximumValue == null) { diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/server/ws/WebServiceTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/server/ws/WebServiceTest.java index 3cf9d04101f..edfe2bab0cb 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/server/ws/WebServiceTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/server/ws/WebServiceTest.java @@ -315,6 +315,20 @@ public class WebServiceTest { assertThat(action.param("string_value").maximumLength()).isEqualTo(24); } + @Test + public void param_with_minimum_length() { + ((WebService) context -> { + NewController newController = context.createController("api/custom_measures"); + NewAction create = newDefaultAction(newController, "create"); + create.createParam("string_value") + .setMinimumLength(3); + newController.done(); + }).define(context); + + WebService.Action action = context.controller("api/custom_measures").action("create"); + assertThat(action.param("string_value").minimumLength()).isEqualTo(3); + } + @Test public void param_with_maximum_value() { ((WebService) context -> { -- 2.39.5