]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10046 adding minimum length validation to Request api
authorGuillaume Jambet <guillaume.jambet@sonarsource.com>
Tue, 7 Nov 2017 10:14:06 +0000 (11:14 +0100)
committerGuillaume Jambet <guillaume.jambet@gmail.com>
Thu, 9 Nov 2017 15:07:06 +0000 (16:07 +0100)
server/sonar-server/src/main/java/org/sonar/server/ws/ws/ListAction.java
server/sonar-server/src/main/resources/org/sonar/server/ws/ws/list-example.json
server/sonar-server/src/test/java/org/sonar/server/ws/ws/WebServicesWsTest.java
server/sonar-server/src/test/resources/org/sonar/server/ws/ws/WebServicesWsTest/list_including_internals.json
sonar-plugin-api/src/main/java/org/sonar/api/server/ws/WebService.java
sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java
sonar-plugin-api/src/test/java/org/sonar/api/server/ws/WebServiceTest.java

index 126bfd341f6b2f8758a510c55cce52fcf57b408c..d2e5ef809c126ad10258fa486e67c4be5428bd7a 100644 (file)
@@ -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();
   }
index ade270b1dbdb66ca8a9fc690e49851a8ee5155dd..a01a74930081de52a8768b7cd26bfbcbcdca14c9 100644 (file)
           ],
           "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,
index d9e1fc2fc4f4531b72dd68e264cf64b3d44233bd..7151638d961b2c780a0550291cb3f47d200bd07a 100644 (file)
@@ -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")
index dddcd8edbe6e2016cf2b3599e31bc78986022381..d118e6e60cfad3e838e9c5fb143e13fd6b515e84 100644 (file)
           "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,
index 02285cab9baadaafe4bdb4a5102dc8eb73af1ef7..58a4e73f620069699dc38b57d3728867fff4d804 100644 (file)
@@ -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) {
@@ -781,6 +782,14 @@ public interface WebService extends Definable<WebService.Context> {
       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<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);
     }
@@ -968,6 +979,16 @@ public interface WebService extends Definable<WebService.Context> {
       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
      *
index a9141a3943d7a0a30f60c03d8b6c65d03c0d3f4f..e217bd4325b8f5a09737abaf25ae81ab5fb71b5d 100644 (file)
@@ -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) {
index 3cf9d04101f8add9db21e36850982c609aa173dd..edfe2bab0cb35cf77c189d67b22fdd74284833f7 100644 (file)
@@ -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 -> {