Skip to content

Commit 141fe98

Browse files
Merge pull request #45 from apiaddicts/feat/39/oar017_handle_patterns
Feat/39/oar017 handle patterns
2 parents b12fc37 + acd5f36 commit 141fe98

File tree

6 files changed

+37
-12
lines changed

6 files changed

+37
-12
lines changed

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

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

3+
import apiaddicts.sonar.openapi.checks.BaseCheck;
34
import com.google.common.collect.ImmutableSet;
45
import com.sonar.sslr.api.AstNodeType;
5-
import org.sonar.check.Rule;
6+
import java.util.Arrays;
7+
import java.util.Set;
8+
import java.util.stream.Stream;
69
import org.apiaddicts.apitools.dosonarapi.api.v2.OpenApi2Grammar;
710
import org.apiaddicts.apitools.dosonarapi.api.v3.OpenApi3Grammar;
811
import org.apiaddicts.apitools.dosonarapi.api.v31.OpenApi31Grammar;
9-
import apiaddicts.sonar.openapi.checks.BaseCheck;
1012
import org.apiaddicts.apitools.dosonarapi.sslr.yaml.grammar.JsonNode;
11-
12-
import java.util.Set;
13-
import java.util.stream.Stream;
13+
import org.sonar.check.Rule;
14+
import org.sonar.check.RuleProperty;
1415

1516
@Rule(key = OAR017ResourcePathCheck.KEY)
1617
public class OAR017ResourcePathCheck extends BaseCheck {
1718

1819
public static final String KEY = "OAR017";
1920
private static final String MESSAGE = "OAR017.error";
21+
private static final String MESSAGE_PATTERN = "OAR017.error-patterns";
22+
public static final String EXCLUDE_PATTERNS = "get,me,search";
23+
24+
@RuleProperty(
25+
key = "exclude_patterns",
26+
description = "List of exlude pattenrs separated by coma.",
27+
defaultValue = EXCLUDE_PATTERNS)
28+
public String patternsString = EXCLUDE_PATTERNS;
2029

2130
@Override
2231
public Set<AstNodeType> subscribedKinds() {
@@ -30,11 +39,12 @@ public void visitNode(JsonNode node) {
3039

3140
private void visitV2Node(JsonNode node) {
3241
String path = node.key().getTokenValue();
33-
if (!isCorrect(path)) addIssue(KEY, translate(MESSAGE), node.key());
42+
if (!isCorrect(path,node)) addIssue(KEY, translate(MESSAGE), node.key());
3443
}
3544

36-
private boolean isCorrect(String path) {
45+
private boolean isCorrect(String path, JsonNode node) {
3746
String[] parts = Stream.of(path.split("/")).filter(p -> !p.trim().isEmpty()).toArray(String[]::new);
47+
String[] patterns = Stream.of(patternsString.split(",")).toArray(String[]::new);
3848
if (parts.length == 0) return true;
3949

4050
boolean previousWasVariable = false;
@@ -43,6 +53,10 @@ private boolean isCorrect(String path) {
4353
for (int i = 0; i < parts.length; i++) {
4454
boolean currentIsVariable = isVariable(parts[i]);
4555

56+
if(!currentIsVariable && Arrays.asList(patterns).contains(parts[i])){
57+
issuePatterns(parts[i],node);
58+
}
59+
4660
if (previousWasVariable && currentIsVariable) {
4761
twoOrMoreVariablesInARow = true;
4862
break;
@@ -57,4 +71,8 @@ private boolean isCorrect(String path) {
5771
private boolean isVariable(String part) {
5872
return '{' == part.charAt(0) && '}' == part.charAt(part.length() - 1);
5973
}
74+
75+
private void issuePatterns(String pattern,JsonNode node){
76+
addIssue(KEY, translate(MESSAGE_PATTERN,pattern), node.key());
77+
}
6078
}

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)