Skip to content

Commit ef5f5d8

Browse files
author
Aldo Torres
committed
feat: adding oar017 patterns parameters to ignore
1 parent d738c9a commit ef5f5d8

File tree

6 files changed

+31
-11
lines changed

6 files changed

+31
-11
lines changed

src/main/java/apiaddicts/sonar/openapi/checks/operations/OAR017ResourcePathCheck.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,29 @@
44
import com.google.common.collect.ImmutableSet;
55
import com.sonar.sslr.api.AstNodeType;
66
import java.util.Arrays;
7-
import java.util.HashSet;
87
import java.util.Set;
98
import java.util.stream.Stream;
109
import org.apiaddicts.apitools.dosonarapi.api.v2.OpenApi2Grammar;
1110
import org.apiaddicts.apitools.dosonarapi.api.v3.OpenApi3Grammar;
1211
import org.apiaddicts.apitools.dosonarapi.api.v31.OpenApi31Grammar;
1312
import org.apiaddicts.apitools.dosonarapi.sslr.yaml.grammar.JsonNode;
1413
import org.sonar.check.Rule;
14+
import org.sonar.check.RuleProperty;
1515

1616
@Rule(key = OAR017ResourcePathCheck.KEY)
1717
public class OAR017ResourcePathCheck extends BaseCheck {
1818

1919
public static final String KEY = "OAR017";
2020
private static final String MESSAGE = "OAR017.error";
21-
public static final Set<String> EXCLUDE_PATTERNS = new HashSet<>(Arrays.asList("get", "me", "search"));
21+
private static final String MESSAGE_PATTERN = "OAR017.error-patterns";
22+
// public static final Set<String> EXCLUDE_PATTERNS = new HashSet<>(Arrays.asList("get", "me", "search"));
23+
public static final String EXCLUDE_PATTERNS = "get,me,search";
24+
25+
@RuleProperty(
26+
key = "exclude_patterns",
27+
description = "List of exlude pattenrs separated by coma.",
28+
defaultValue = EXCLUDE_PATTERNS)
29+
public String patternsString = EXCLUDE_PATTERNS;
2230

2331
@Override
2432
public Set<AstNodeType> subscribedKinds() {
@@ -32,11 +40,12 @@ public void visitNode(JsonNode node) {
3240

3341
private void visitV2Node(JsonNode node) {
3442
String path = node.key().getTokenValue();
35-
if (!isCorrect(path)) addIssue(KEY, translate(MESSAGE), node.key());
43+
if (!isCorrect(path,node)) addIssue(KEY, translate(MESSAGE), node.key());
3644
}
3745

38-
private boolean isCorrect(String path) {
46+
private boolean isCorrect(String path, JsonNode node) {
3947
String[] parts = Stream.of(path.split("/")).filter(p -> !p.trim().isEmpty()).toArray(String[]::new);
48+
String[] patterns = Stream.of(patternsString.split(",")).toArray(String[]::new);
4049
if (parts.length == 0) return true;
4150

4251
boolean previousWasVariable = false;
@@ -45,8 +54,8 @@ private boolean isCorrect(String path) {
4554
for (int i = 0; i < parts.length; i++) {
4655
boolean currentIsVariable = isVariable(parts[i]);
4756

48-
if(!currentIsVariable && EXCLUDE_PATTERNS.contains(parts[i])){
49-
twoOrMoreVariablesInARow = false;
57+
if(!currentIsVariable && Arrays.asList(patterns).contains(parts[i])){
58+
issuePatterns(parts[i],node);
5059
}
5160

5261
if (previousWasVariable && currentIsVariable) {
@@ -63,4 +72,8 @@ private boolean isCorrect(String path) {
6372
private boolean isVariable(String part) {
6473
return '{' == part.charAt(0) && '}' == part.charAt(part.length() - 1);
6574
}
75+
76+
private void issuePatterns(String pattern,JsonNode node){
77+
addIssue(KEY, translate(MESSAGE_PATTERN,pattern), node.key());
78+
}
6679
}

src/main/resources/messages/errors.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ OAR012.error=Path params names, query params names, object names and property na
1414
OAR013.error=Default response is required
1515
OAR016.error=Numeric types requires a valid format
1616
OAR017.error=Resource path should alternate static and parametrized parts
17+
OAR017.error-patterns=Pattern ''{0}'' not allowed
1718
OAR018.error=Operation not recommended for resource path: {0}
1819
OAR019.error={0} must be defined as a parameter in this operation
1920
OAR020.error={0} must be defined as a parameter in this operation

src/main/resources/messages/errors_es.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ OAR012.error=Los nombres de parámetros de ruta, parámetros de consulta, objeto
1414
OAR013.error=La respuesta por defecto es obligatoria
1515
OAR016.error=Tipos numéricos requieren un formato válido
1616
OAR017.error=El path del recurso debe de alternar entre partes estáticas y parametrizadas
17+
OAR017.error-patterns=Patrón ''{0}'' no permitido
1718
OAR018.error=Acción no recomendada para la ruta de recursos: {0}
1819
OAR019.error={0} debe ser definido como un parámetro en esta operación
1920
OAR020.error={0} debe ser definido como un parámetro en esta operación

src/test/java/apiaddicts/sonar/openapi/checks/operations/OAR017ResourcePathCheckTest.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package apiaddicts.sonar.openapi.checks.operations;
22

3+
import apiaddicts.sonar.openapi.BaseCheckTest;
34
import org.junit.Before;
45
import org.junit.Test;
56
import org.sonar.api.rule.Severity;
67
import org.sonar.api.rules.RuleType;
7-
import apiaddicts.sonar.openapi.BaseCheckTest;
8-
9-
import apiaddicts.sonar.openapi.checks.operations.OAR017ResourcePathCheck;
8+
import org.sonar.api.server.rule.RuleParamType;
109

1110
public class OAR017ResourcePathCheckTest extends BaseCheckTest {
1211

@@ -33,4 +32,10 @@ public void verifyRule() {
3332
assertRuleProperties("OAR017 - ResourcePath - Resource path should alternate static and parametrized parts", RuleType.BUG, Severity.MAJOR, tags("operations"));
3433
}
3534

35+
@Override
36+
public void verifyParameters() {
37+
assertNumberOfParameters(1);
38+
assertParameterProperties("exclude_patterns", "get,me,search", RuleParamType.STRING);
39+
}
40+
3641
}

src/test/resources/checks/v3/operations/OAR017/plain.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"title" : "Swagger Petstore"
66
},
77
"paths" : {
8-
"/one" : {
8+
"/one/me" : { # Noncompliant {{OAR017: Pattern 'me' not allowed}}
99
"get" : {
1010
"responses" : {
1111
"200" : {

src/test/resources/checks/v3/operations/OAR017/plain.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ info:
33
version: 1.0.0
44
title: Swagger Petstore
55
paths:
6-
/one:
6+
/one/me: # Noncompliant {{OAR017: Pattern 'me' not allowed}}
77
get:
88
responses:
99
200:

0 commit comments

Comments
 (0)