11package apiaddicts .sonar .openapi .checks .operations ;
22
3+ import apiaddicts .sonar .openapi .checks .BaseCheck ;
34import com .google .common .collect .ImmutableSet ;
45import 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 ;
69import org .apiaddicts .apitools .dosonarapi .api .v2 .OpenApi2Grammar ;
710import org .apiaddicts .apitools .dosonarapi .api .v3 .OpenApi3Grammar ;
811import org .apiaddicts .apitools .dosonarapi .api .v31 .OpenApi31Grammar ;
9- import apiaddicts .sonar .openapi .checks .BaseCheck ;
1012import 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 )
1617public 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}
0 commit comments