aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Jambet <guillaume.jambet@sonarsource.com>2017-11-07 11:14:06 +0100
committerGuillaume Jambet <guillaume.jambet@gmail.com>2017-11-09 16:07:06 +0100
commit7774bfe48a8028c799cbe7cf322bcd6f0dddda47 (patch)
tree368a721c3ab67fb4557ee7bf8797dbe7c627faef
parentb59f61feccd5a3e95893ac0fc68149aa403a992f (diff)
downloadsonarqube-7774bfe48a8028c799cbe7cf322bcd6f0dddda47.tar.gz
sonarqube-7774bfe48a8028c799cbe7cf322bcd6f0dddda47.zip
SONAR-10046 adding minimum length validation to Request api
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/ws/ws/ListAction.java1
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/ws/ws/list-example.json14
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/ws/ws/WebServicesWsTest.java11
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/ws/ws/WebServicesWsTest/list_including_internals.json11
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/server/ws/WebService.java21
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java10
-rw-r--r--sonar-plugin-api/src/test/java/org/sonar/api/server/ws/WebServiceTest.java14
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,10 +14,19 @@
"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,
"internal": 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<WebService.Context> {
private Set<String> possibleValues = null;
private Integer maxValuesAllowed;
private Integer maximumLength;
+ private Integer minimumLength;
private Integer maximumValue;
private NewParam(String key) {
@@ -784,6 +785,14 @@ public interface WebService extends Definable<WebService.Context> {
/**
* @since 7.0
*/
+ public NewParam setMinimumLength(@Nullable Integer minimumLength) {
+ this.minimumLength = minimumLength;
+ return this;
+ }
+
+ /**
+ * @since 7.0
+ */
public NewParam setMaximumValue(@Nullable Integer maximumValue) {
this.maximumValue = maximumValue;
return this;
@@ -844,6 +853,7 @@ public interface WebService extends Definable<WebService.Context> {
private final boolean internal;
private final Set<String> 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<WebService.Context> {
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);
}
@@ -969,6 +980,16 @@ public interface WebService extends Definable<WebService.Context> {
}
/**
+ * 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
*
* @since 7.0
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
@@ -316,6 +316,20 @@ public class WebServiceTest {
}
@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 -> {
NewController newController = context.createController("api/custom_measures");