Skip to content

Commit 29bd363

Browse files
Centralize spring fully qualified names into constants
1 parent b9d401b commit 29bd363

32 files changed

Lines changed: 134 additions & 111 deletions

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.HashSet;
2020
import java.util.List;
2121
import org.sonar.check.Rule;
22+
import org.sonar.java.checks.helpers.SpringUtils;
2223
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
2324
import org.sonar.plugins.java.api.tree.ClassTree;
2425
import org.sonar.plugins.java.api.tree.MethodTree;
@@ -49,14 +50,14 @@ public void visitNode(Tree tree) {
4950
}
5051

5152
private static boolean isConfigurationClass(ClassTree classTree) {
52-
return classTree.symbol().metadata().isAnnotatedWith("org.springframework.context.annotation.Configuration");
53+
return classTree.symbol().metadata().isAnnotatedWith(SpringUtils.CONFIGURATION_ANNOTATION);
5354
}
5455

5556
private static List<MethodTree> getBeanMethods(ClassTree classTree) {
5657
return classTree.members().stream()
5758
.filter(member -> member.is(Tree.Kind.METHOD))
5859
.map(MethodTree.class::cast)
59-
.filter(method -> method.symbol().metadata().isAnnotatedWith("org.springframework.context.annotation.Bean"))
60+
.filter(method -> method.symbol().metadata().isAnnotatedWith(SpringUtils.BEAN_ANNOTATION))
6061
.toList();
6162
}
6263

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.Optional;
2525
import java.util.Set;
2626
import org.sonar.check.Rule;
27+
import org.sonar.java.checks.helpers.SpringUtils;
2728
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
2829
import org.sonar.plugins.java.api.semantic.Symbol;
2930
import org.sonar.plugins.java.api.semantic.SymbolMetadata;
@@ -41,7 +42,7 @@
4142
public class LeastSpecificTypeCheck extends IssuableSubscriptionVisitor {
4243

4344
private static final Set<String> SPRING_INJECT_ANNOTATIONS = Set.of(
44-
"org.springframework.beans.factory.annotation.Autowired",
45+
SpringUtils.AUTOWIRED_ANNOTATION,
4546
"javax.inject.Inject",
4647
"jakarta.inject.Inject",
4748
"javax.annotation.Resource",

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.List;
2121
import org.sonar.check.Rule;
2222
import org.sonar.check.RuleProperty;
23+
import org.sonar.java.checks.helpers.SpringUtils;
2324
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
2425
import org.sonar.plugins.java.api.semantic.SymbolMetadata;
2526
import org.sonar.plugins.java.api.tree.ClassTree;
@@ -71,7 +72,7 @@ public class TooManyParametersCheck extends IssuableSubscriptionVisitor {
7172
"io.micronaut.http.annotation.Patch",
7273
"io.micronaut.http.annotation.Head",
7374
"io.micronaut.http.annotation.Trace",
74-
"org.springframework.beans.factory.annotation.Autowired");
75+
SpringUtils.AUTOWIRED_ANNOTATION);
7576

7677
@Override
7778
public List<Tree.Kind> nodesToVisit() {

java-checks/src/main/java/org/sonar/java/checks/helpers/SpringUtils.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,27 @@
2222

2323
public final class SpringUtils {
2424

25-
public static final String SPRING_SCOPE_ANNOTATION = "org.springframework.context.annotation.Scope";
25+
public static final String SPRING_BOOT_APP_ANNOTATION = "org.springframework.boot.autoconfigure.SpringBootApplication";
26+
public static final String CONTROLLER_ANNOTATION = "org.springframework.stereotype.Controller";
27+
public static final String COMPONENT_ANNOTATION = "org.springframework.stereotype.Component";
28+
public static final String REPOSITORY_ANNOTATION = "org.springframework.stereotype.Repository";
29+
public static final String SERVICE_ANNOTATION = "org.springframework.stereotype.Service";
2630
public static final String AUTOWIRED_ANNOTATION = "org.springframework.beans.factory.annotation.Autowired";
31+
public static final String VALUE_ANNOTATION = "org.springframework.beans.factory.annotation.Value";
32+
public static final String TRANSACTIONAL_ANNOTATION = "org.springframework.transaction.annotation.Transactional";
33+
public static final String BEAN_ANNOTATION = "org.springframework.context.annotation.Bean";
34+
public static final String SCOPE_ANNOTATION = "org.springframework.context.annotation.Scope";
35+
public static final String CONFIGURATION_ANNOTATION = "org.springframework.context.annotation.Configuration";
36+
public static final String ASYNC_ANNOTATION = "org.springframework.scheduling.annotation.Async";
37+
public static final String DATA_REPOSITORY_ANNOTATION = "org.springframework.data.repository.Repository";
38+
public static final String REST_CONTROLLER_ANNOTATION = "org.springframework.web.bind.annotation.RestController";
2739

2840
private SpringUtils() {
2941
// Utils class
3042
}
3143

3244
public static boolean isScopeSingleton(SymbolMetadata clazzMeta) {
33-
List<SymbolMetadata.AnnotationValue> values = clazzMeta.valuesForAnnotation(SPRING_SCOPE_ANNOTATION);
45+
List<SymbolMetadata.AnnotationValue> values = clazzMeta.valuesForAnnotation(SCOPE_ANNOTATION);
3446
if (values == null) {
3547
// Scope is singleton by default
3648
return true;

java-checks/src/main/java/org/sonar/java/checks/spring/AsyncMethodsCalledViaThisCheck.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import java.util.Map;
2121
import org.sonar.check.Rule;
22+
import org.sonar.java.checks.helpers.SpringUtils;
2223
import org.sonar.java.model.ExpressionUtils;
2324
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
2425
import org.sonar.plugins.java.api.tree.MemberSelectExpressionTree;
@@ -29,8 +30,8 @@
2930
public class AsyncMethodsCalledViaThisCheck extends IssuableSubscriptionVisitor {
3031

3132
private static final Map<String, String> DISALLOWED_METHOD_ANNOTATIONS = Map.of(
32-
"org.springframework.scheduling.annotation.Async", "async",
33-
"org.springframework.transaction.annotation.Transactional", "transactional",
33+
SpringUtils.ASYNC_ANNOTATION, "async",
34+
SpringUtils.TRANSACTIONAL_ANNOTATION, "transactional",
3435
"org.springframework.cache.annotation.Cacheable", "cacheable");
3536

3637
@Override

java-checks/src/main/java/org/sonar/java/checks/spring/AsyncMethodsOnConfigurationClassCheck.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import org.sonar.check.Rule;
2121
import org.sonar.java.checks.helpers.QuickFixHelper;
22+
import org.sonar.java.checks.helpers.SpringUtils;
2223
import org.sonar.java.reporting.JavaQuickFix;
2324
import org.sonar.java.reporting.JavaTextEdit;
2425
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
@@ -38,14 +39,14 @@ public List<Tree.Kind> nodesToVisit() {
3839
public void visitNode(Tree tree) {
3940
ClassTree classTree = (ClassTree) tree;
4041
boolean isConfiguration = classTree.modifiers().annotations().stream()
41-
.anyMatch(annotation -> annotation.annotationType().symbolType().is("org.springframework.context.annotation.Configuration"));
42+
.anyMatch(annotation -> annotation.annotationType().symbolType().is(SpringUtils.CONFIGURATION_ANNOTATION));
4243

4344
if (isConfiguration) {
4445
classTree.members().stream()
4546
.filter(member -> member.is(Tree.Kind.METHOD))
4647
.map(MethodTree.class::cast)
4748
.forEach(member -> member.modifiers().annotations().stream()
48-
.filter(annotation -> annotation.annotationType().symbolType().is("org.springframework.scheduling.annotation.Async"))
49+
.filter(annotation -> annotation.annotationType().symbolType().is(SpringUtils.ASYNC_ANNOTATION))
4950
.findFirst()
5051
.ifPresent(annotation -> QuickFixHelper.newIssue(context)
5152
.forRule(this)

java-checks/src/main/java/org/sonar/java/checks/spring/AsyncMethodsReturnTypeCheck.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.List;
2020
import org.sonar.check.Rule;
21+
import org.sonar.java.checks.helpers.SpringUtils;
2122
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
2223
import org.sonar.plugins.java.api.tree.MethodTree;
2324
import org.sonar.plugins.java.api.tree.Tree;
@@ -33,7 +34,7 @@ public List<Tree.Kind> nodesToVisit() {
3334
@Override
3435
public void visitNode(Tree tree) {
3536
var mt = (MethodTree) tree;
36-
if (mt.symbol().metadata().isAnnotatedWith("org.springframework.scheduling.annotation.Async")) {
37+
if (mt.symbol().metadata().isAnnotatedWith(SpringUtils.ASYNC_ANNOTATION)) {
3738
var returnType = mt.returnType();
3839
// returnType can only be null if the method is a constructor. Since the @Async annotation is not allowed on constructors, and since
3940
// we hence only visit methods, not constructors, we assume that returnType is not null.

java-checks/src/main/java/org/sonar/java/checks/spring/AutowiredOnConstructorWhenMultipleConstructorsCheck.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.List;
2020
import org.sonar.check.Rule;
21+
import org.sonar.java.checks.helpers.SpringUtils;
2122
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
2223
import org.sonar.plugins.java.api.tree.ClassTree;
2324
import org.sonar.plugins.java.api.tree.MethodTree;
@@ -27,12 +28,12 @@
2728
public class AutowiredOnConstructorWhenMultipleConstructorsCheck extends IssuableSubscriptionVisitor {
2829

2930
private final List<String> annotations = List.of(
30-
"org.springframework.context.annotation.Bean",
31-
"org.springframework.context.annotation.Configuration",
32-
"org.springframework.stereotype.Component",
33-
"org.springframework.stereotype.Controller",
34-
"org.springframework.stereotype.Repository",
35-
"org.springframework.stereotype.Service");
31+
SpringUtils.BEAN_ANNOTATION,
32+
SpringUtils.CONFIGURATION_ANNOTATION,
33+
SpringUtils.COMPONENT_ANNOTATION,
34+
SpringUtils.CONTROLLER_ANNOTATION,
35+
SpringUtils.REPOSITORY_ANNOTATION,
36+
SpringUtils.SERVICE_ANNOTATION);
3637

3738
@Override
3839
public List<Tree.Kind> nodesToVisit() {
@@ -57,7 +58,7 @@ public void visitNode(Tree tree) {
5758
if (constructors.size() > 1) {
5859
boolean anyHasAutowired = constructors.stream()
5960
.anyMatch(constructor -> constructor.modifiers().annotations().stream()
60-
.anyMatch(annotation -> annotation.symbolType().is("org.springframework.beans.factory.annotation.Autowired")));
61+
.anyMatch(annotation -> annotation.symbolType().is(SpringUtils.AUTOWIRED_ANNOTATION)));
6162

6263
if (!anyHasAutowired) {
6364
reportIssue(classTree.simpleName(), "Add @Autowired to one of the constructors.");

java-checks/src/main/java/org/sonar/java/checks/spring/AutowiredOnMultipleConstructorsCheck.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import java.util.Optional;
2121
import org.sonar.check.Rule;
22+
import org.sonar.java.checks.helpers.SpringUtils;
2223
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
2324
import org.sonar.plugins.java.api.semantic.Symbol;
2425
import org.sonar.plugins.java.api.semantic.SymbolMetadata;
@@ -30,8 +31,6 @@
3031
@Rule(key = "S6818")
3132
public class AutowiredOnMultipleConstructorsCheck extends IssuableSubscriptionVisitor {
3233

33-
private static final String AUTOWIRED_ANNOTATION = "org.springframework.beans.factory.annotation.Autowired";
34-
3534
@Override
3635
public List<Tree.Kind> nodesToVisit() {
3736
return List.of(Tree.Kind.CLASS);
@@ -61,7 +60,7 @@ private boolean checkConstructor(MethodTree methodTree, boolean isAutowiredAlrea
6160

6261
if (isAutowiredAlreadyFound && isAutowired) {
6362
Optional<AnnotationTree> autowiredAnnotation = methodTree.modifiers().annotations().stream()
64-
.filter(a -> a.annotationType().symbolType().is(AUTOWIRED_ANNOTATION))
63+
.filter(a -> a.annotationType().symbolType().is(SpringUtils.AUTOWIRED_ANNOTATION))
6564
.findFirst();
6665
autowiredAnnotation.ifPresent(annotationTree -> reportIssue(annotationTree, "Remove this \"@Autowired\" annotation."));
6766
}
@@ -70,8 +69,8 @@ private boolean checkConstructor(MethodTree methodTree, boolean isAutowiredAlrea
7069
}
7170

7271
private static boolean isAutowired(Symbol s) {
73-
if (s.metadata().isAnnotatedWith(AUTOWIRED_ANNOTATION)) {
74-
List<SymbolMetadata.AnnotationValue> annotationValues = s.metadata().valuesForAnnotation(AUTOWIRED_ANNOTATION);
72+
if (s.metadata().isAnnotatedWith(SpringUtils.AUTOWIRED_ANNOTATION)) {
73+
List<SymbolMetadata.AnnotationValue> annotationValues = s.metadata().valuesForAnnotation(SpringUtils.AUTOWIRED_ANNOTATION);
7574
return annotationValues.isEmpty() || annotationValues.stream().anyMatch(a -> a.value().equals(true));
7675
}
7776
return false;

java-checks/src/main/java/org/sonar/java/checks/spring/AvoidQualifierOnBeanMethodsCheck.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.List;
2121
import org.sonar.check.Rule;
2222
import org.sonar.java.checks.helpers.QuickFixHelper;
23+
import org.sonar.java.checks.helpers.SpringUtils;
2324
import org.sonar.java.model.expression.AssignmentExpressionTreeImpl;
2425
import org.sonar.java.model.expression.LiteralTreeImpl;
2526
import org.sonar.java.reporting.JavaQuickFix;
@@ -32,7 +33,6 @@
3233

3334
@Rule(key = "S6831")
3435
public class AvoidQualifierOnBeanMethodsCheck extends IssuableSubscriptionVisitor {
35-
private static final String BEAN_ANNOTATION = "org.springframework.context.annotation.Bean";
3636
private static final String QUALIFIER_ANNOTATION = "org.springframework.beans.factory.annotation.Qualifier";
3737

3838
@Override
@@ -47,7 +47,7 @@ public List<Tree.Kind> nodesToVisit() {
4747
public void visitNode(Tree tree) {
4848
var methodTree = (MethodTree) tree;
4949

50-
var beanAnnotation = getAnnotation(methodTree, BEAN_ANNOTATION);
50+
var beanAnnotation = getAnnotation(methodTree, SpringUtils.BEAN_ANNOTATION);
5151
var qualifierAnnotation = getAnnotation(methodTree, QUALIFIER_ANNOTATION);
5252

5353
if (beanAnnotation != null && qualifierAnnotation != null) {

0 commit comments

Comments
 (0)