diff --git a/java-checks-test-sources/default/src/main/java/checks/EmptyMethodsCheckNoSemantics.java b/java-checks-test-sources/default/src/main/java/checks/EmptyMethodsCheckNoSemantics.java index 3f8c5890960..eeb1d6c72b6 100644 --- a/java-checks-test-sources/default/src/main/java/checks/EmptyMethodsCheckNoSemantics.java +++ b/java-checks-test-sources/default/src/main/java/checks/EmptyMethodsCheckNoSemantics.java @@ -2,6 +2,7 @@ import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; +import org.springframework.cache.annotation.CacheEvict; class EmptyMethodsCheckNoSemantics { class A { @@ -186,12 +187,18 @@ private void emptyMethod2() { private class ExceptionalCompliantCases { @org.aspectj.lang.annotation.Pointcut() - void foo() { + void foo() { // Compliant } @Pointcut() - void bar() {} + void bar() {} // Compliant + + @org.springframework.cache.annotation.CacheEvict(cacheNames = "flowers", allEntries = true) + void evictAll() {} // Compliant + + @CacheEvict(value = "flowers", key = "{#name}") + void evict(String name) {} // Compliant @Before("") void stillTriggerOnOtherAnnotations() {} // Noncompliant diff --git a/java-checks-test-sources/default/src/main/java/checks/EmptyMethodsCheckSample.java b/java-checks-test-sources/default/src/main/java/checks/EmptyMethodsCheckSample.java index 36755f832e8..3e3dccf31fb 100644 --- a/java-checks-test-sources/default/src/main/java/checks/EmptyMethodsCheckSample.java +++ b/java-checks-test-sources/default/src/main/java/checks/EmptyMethodsCheckSample.java @@ -2,6 +2,7 @@ import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; +import org.springframework.cache.annotation.CacheEvict; class EmptyMethodsCheckSample { class A { @@ -186,12 +187,18 @@ private void emptyMethod2() { private class ExceptionalCompliantCases { @org.aspectj.lang.annotation.Pointcut() - void foo() { + void foo() { // Compliant } @Pointcut() - void bar() {} + void bar() {} // Compliant + + @org.springframework.cache.annotation.CacheEvict(cacheNames = "flowers", allEntries = true) + void evictAll() {} // Compliant + + @CacheEvict(value = "flowers", key = "{#name}") + void evict(String name) {} // Compliant @Before("") void stillTriggerOnOtherAnnotations() {} // Noncompliant diff --git a/java-checks/src/main/java/org/sonar/java/checks/EmptyMethodsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/EmptyMethodsCheck.java index b3cd2c9bd4e..75bc2ac8a1b 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/EmptyMethodsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/EmptyMethodsCheck.java @@ -39,10 +39,6 @@ @Rule(key = "S1186") public class EmptyMethodsCheck extends IssuableSubscriptionVisitor { - // Some methods may legitimately be left empty, e.g. methods annotated with org.aspectj.lang.annotation.Pointcut. We ignore them here. - private static final String IGNORED_METHODS_ANNOTATION = "org.aspectj.lang.annotation.Pointcut"; - private static final String IGNORED_METHODS_ANNOTATION_UNQUALIFIED = "Pointcut"; - @Override public List nodesToVisit() { return Arrays.asList(Tree.Kind.CLASS, Tree.Kind.ENUM, Tree.Kind.RECORD); @@ -73,8 +69,18 @@ private void checkMethods(List members) { * Returns true if the annotation indicates that the method body can legitimately be empty. */ private static boolean isExceptedAnnotation(AnnotationTree annotationTree) { - return annotationTree.symbolType().is(IGNORED_METHODS_ANNOTATION) || - (annotationTree.symbolType().isUnknown() && annotationTree.symbolType().name().equals(IGNORED_METHODS_ANNOTATION_UNQUALIFIED)); + if (annotationTree.symbolType().isUnknown()) { + return switch (annotationTree.symbolType().name()) { + case "Pointcut", + "CacheEvict" -> true; + default -> false; + }; + } + return switch (annotationTree.symbolType().fullyQualifiedName()) { + case "org.aspectj.lang.annotation.Pointcut", + "org.springframework.cache.annotation.CacheEvict" -> true; + default -> false; + }; } private void checkConstructors(List members) { diff --git a/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S1186.html b/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S1186.html index c0b28831a41..29421d044fd 100644 --- a/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S1186.html +++ b/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S1186.html @@ -14,6 +14,7 @@

Exceptions

  • Public default (no-argument) constructors when there are other constructors in the class
  • Empty methods in abstract classes
  • Methods annotated with @org.aspectj.lang.annotation.Pointcut()
  • +
  • Methods annotated with @org.springframework.cache.annotation.CacheEvict()
  •  public abstract class Animal {