Skip to content

Commit 5592a80

Browse files
SONARJAVA-4865 Fix issue when path is named regex (#4728)
1 parent 8a4de4d commit 5592a80

3 files changed

Lines changed: 28 additions & 1 deletion

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"ruleKey": "S6856",
33
"hasTruePositives": false,
4-
"falseNegatives": 22,
4+
"falseNegatives": 23,
55
"falsePositives": 0
66
}

java-checks-test-sources/default/src/main/java/checks/MissingPathVariableAnnotationCheckSample.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,20 @@
1010
import org.springframework.web.bind.annotation.PutMapping;
1111

1212
public class MissingPathVariableAnnotationCheckSample {
13+
14+
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}") // Noncompliant
15+
public void handleWithoutExt(@PathVariable String name, @PathVariable String version) {}
16+
17+
@GetMapping("/something/{id:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}}") // Compliant
18+
public String getObj(@PathVariable("id") String id){
19+
return "";
20+
}
21+
22+
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}") // Compliant
23+
public void handle(@PathVariable String name, @PathVariable String version, @PathVariable String ext) {}
24+
25+
26+
1327
@GetMapping("/{id}") // Noncompliant [[sc=3;ec=23]] {{Bind path variable "id" to a method parameter.}}
1428
public String get(String id) {
1529
return "Hello World";

java-checks/src/main/java/org/sonar/java/checks/MissingPathVariableAnnotationCheck.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Optional;
2626
import java.util.Set;
2727
import java.util.function.Predicate;
28+
import java.util.regex.MatchResult;
2829
import java.util.regex.Matcher;
2930
import java.util.regex.Pattern;
3031
import java.util.stream.Collectors;
@@ -45,6 +46,9 @@ public class MissingPathVariableAnnotationCheck extends IssuableSubscriptionVisi
4546
private static final String MODEL_ATTRIBUTE_ANNOTATION = "org.springframework.web.bind.annotation.ModelAttribute";
4647
private static final Pattern EXTRACT_PATH_VARIABLE = Pattern.compile("([^:}/]*)(:.*)?}.*");
4748
private static final Predicate<String> CONTAINS_PLACEHOLDER = Pattern.compile("\\$\\{.*}").asPredicate();
49+
private static final Predicate<String> PATH_ARG_REGEX = Pattern.compile("\\{([^{}:]+:.*)}").asPredicate();
50+
private static final Pattern PATH_REGEX = Pattern.compile("\\{([^{}]+)}");
51+
4852
private static final List<String> MAPPING_ANNOTATIONS = List.of(
4953
"org.springframework.web.bind.annotation.GetMapping",
5054
"org.springframework.web.bind.annotation.PostMapping",
@@ -131,6 +135,15 @@ private static Set<String> extractPathVariables(String path) {
131135
return new HashSet<>();
132136
}
133137

138+
if (PATH_ARG_REGEX.test(path)) {
139+
return PATH_REGEX.matcher(path).results()
140+
.map(MatchResult::group)
141+
.map(s -> s.substring(1))
142+
.filter(s -> s.contains(":"))
143+
.map(s -> s.split(":")[0])
144+
.collect(Collectors.toSet());
145+
}
146+
134147
return Stream.of(path.split("\\{"))
135148
.map(EXTRACT_PATH_VARIABLE::matcher)
136149
.filter(Matcher::matches)

0 commit comments

Comments
 (0)