Skip to content

Commit fd84f42

Browse files
committed
Improve compatibility with Checkstyle 10
Closes gh-395
1 parent e875f94 commit fd84f42

File tree

2 files changed

+66
-25
lines changed

2 files changed

+66
-25
lines changed

Diff for: spring-javaformat/spring-javaformat-checkstyle/src/main/java/io/spring/javaformat/checkstyle/SpringConfigurationLoader.java

+10-7
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
import com.puppycrawl.tools.checkstyle.ConfigurationLoader;
2525
import com.puppycrawl.tools.checkstyle.ConfigurationLoader.IgnoredModulesOptions;
2626
import com.puppycrawl.tools.checkstyle.PropertyResolver;
27-
import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
2827
import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
28+
import com.puppycrawl.tools.checkstyle.api.Configurable;
2929
import com.puppycrawl.tools.checkstyle.api.Configuration;
3030
import com.puppycrawl.tools.checkstyle.api.Context;
31+
import com.puppycrawl.tools.checkstyle.api.Contextualizable;
3132
import com.puppycrawl.tools.checkstyle.api.FileSetCheck;
3233
import org.xml.sax.InputSource;
3334

@@ -79,19 +80,21 @@ private Object createModule(Configuration configuration) {
7980
String name = configuration.getName();
8081
try {
8182
Object module = this.moduleFactory.createModule(name);
82-
if (module instanceof AutomaticBean) {
83-
initialize(configuration, (AutomaticBean) module);
84-
}
83+
initialize(configuration, module);
8584
return module;
8685
}
8786
catch (CheckstyleException ex) {
8887
throw new IllegalStateException("cannot initialize module " + name + " - " + ex.getMessage(), ex);
8988
}
9089
}
9190

92-
private void initialize(Configuration configuration, AutomaticBean bean) throws CheckstyleException {
93-
bean.contextualize(this.context);
94-
bean.configure(configuration);
91+
private void initialize(Configuration configuration, Object module) throws CheckstyleException {
92+
if (module instanceof Contextualizable) {
93+
((Contextualizable) module).contextualize(this.context);
94+
}
95+
if (module instanceof Configurable) {
96+
((Configurable) module).configure(configuration);
97+
}
9598
}
9699

97100
}

Diff for: spring-javaformat/spring-javaformat-checkstyle/src/main/java/io/spring/javaformat/checkstyle/check/SpringJUnit5Check.java

+56-18
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import java.util.ArrayList;
2020
import java.util.Arrays;
2121
import java.util.Collections;
22+
import java.util.HashSet;
2223
import java.util.LinkedHashMap;
2324
import java.util.LinkedHashSet;
2425
import java.util.List;
2526
import java.util.Map;
2627
import java.util.Set;
2728
import java.util.stream.Collectors;
29+
import java.util.stream.Stream;
2830

2931
import com.puppycrawl.tools.checkstyle.api.DetailAST;
3032
import com.puppycrawl.tools.checkstyle.api.FullIdent;
@@ -38,33 +40,33 @@
3840
*/
3941
public class SpringJUnit5Check extends AbstractSpringCheck {
4042

41-
private static final String JUNIT4_TEST_ANNOTATION = "org.junit.Test";
43+
private static final String JUNIT4_TEST_ANNOTATION_NAME = "org.junit.Test";
4244

43-
private static final List<String> TEST_ANNOTATIONS;
45+
private static final List<Annotation> TEST_ANNOTATIONS;
4446
static {
45-
Set<String> annotations = new LinkedHashSet<>();
46-
annotations.add("RepeatedTest");
47-
annotations.add("Test");
48-
annotations.add("TestFactory");
49-
annotations.add("TestTemplate");
50-
annotations.add("ParameterizedTest");
47+
Set<Annotation> annotations = new LinkedHashSet<>();
48+
annotations.add(new Annotation("org.junit.jupiter.api", "RepeatedTest"));
49+
annotations.add(new Annotation("org.junit.jupiter.api", "Test"));
50+
annotations.add(new Annotation("org.junit.jupiter.api", "TestFactory"));
51+
annotations.add(new Annotation("org.junit.jupiter.api", "TestTemplate"));
52+
annotations.add(new Annotation("org.junit.jupiter.api", "ParameterizedTest"));
5153
TEST_ANNOTATIONS = Collections.unmodifiableList(new ArrayList<>(annotations));
5254
}
5355

54-
private static final List<String> LIFECYCLE_ANNOTATIONS;
56+
private static final List<Annotation> LIFECYCLE_ANNOTATIONS;
5557
static {
56-
Set<String> annotations = new LinkedHashSet<>();
57-
annotations.add("BeforeAll");
58-
annotations.add("BeforeEach");
59-
annotations.add("AfterAll");
60-
annotations.add("AfterEach");
58+
Set<Annotation> annotations = new LinkedHashSet<>();
59+
annotations.add(new Annotation("org.junit.jupiter.api", "BeforeAll"));
60+
annotations.add(new Annotation("org.junit.jupiter.api", "BeforeEach"));
61+
annotations.add(new Annotation("org.junit.jupiter.api", "AfterAll"));
62+
annotations.add(new Annotation("org.junit.jupiter.api", "AfterEach"));
6163
LIFECYCLE_ANNOTATIONS = Collections.unmodifiableList(new ArrayList<>(annotations));
6264
}
6365

6466
private static final Set<String> BANNED_IMPORTS;
6567
static {
6668
Set<String> bannedImports = new LinkedHashSet<>();
67-
bannedImports.add(JUNIT4_TEST_ANNOTATION);
69+
bannedImports.add(JUNIT4_TEST_ANNOTATION_NAME);
6870
bannedImports.add("org.junit.After");
6971
bannedImports.add("org.junit.AfterClass");
7072
bannedImports.add("org.junit.Before");
@@ -106,14 +108,33 @@ public void visitToken(DetailAST ast) {
106108
}
107109

108110
private void visitMethodDef(DetailAST ast) {
109-
if (AnnotationUtil.containsAnnotation(ast, TEST_ANNOTATIONS)) {
111+
if (containsAnnotation(ast, TEST_ANNOTATIONS)) {
110112
this.testMethods.add(ast);
111113
}
112-
if (AnnotationUtil.containsAnnotation(ast, LIFECYCLE_ANNOTATIONS)) {
114+
if (containsAnnotation(ast, LIFECYCLE_ANNOTATIONS)) {
113115
this.lifecycleMethods.add(ast);
114116
}
115117
}
116118

119+
private boolean containsAnnotation(DetailAST ast, List<Annotation> annotations) {
120+
List<String> annotationNames = annotations.stream().flatMap((annotation) ->
121+
Stream.of(annotation.simpleName, annotation.fullyQualifiedName())).collect(Collectors.toList());
122+
try {
123+
return AnnotationUtil.containsAnnotation(ast, annotationNames);
124+
}
125+
catch (NoSuchMethodError ex) {
126+
// Checkstyle >= 10.3 (https://github.com/checkstyle/checkstyle/issues/14134)
127+
Set<String> annotationNamesSet = new HashSet<>(annotationNames);
128+
try {
129+
return (boolean) AnnotationUtil.class.getMethod("containsAnnotation", DetailAST.class, Set.class)
130+
.invoke(null, ast, annotationNamesSet);
131+
}
132+
catch (Exception ex2) {
133+
throw new RuntimeException("containsAnnotation failed", ex2);
134+
}
135+
}
136+
}
137+
117138
private void visitImport(DetailAST ast) {
118139
FullIdent ident = FullIdent.createFullIdentBelow(ast);
119140
this.imports.put(ident.getText(), ident);
@@ -146,7 +167,7 @@ private void check() {
146167
}
147168
}
148169
for (DetailAST testMethod : this.testMethods) {
149-
if (AnnotationUtil.containsAnnotation(testMethod, JUNIT4_TEST_ANNOTATION)) {
170+
if (AnnotationUtil.containsAnnotation(testMethod, JUNIT4_TEST_ANNOTATION_NAME)) {
150171
log(testMethod, "junit5.bannedTestAnnotation");
151172
}
152173
}
@@ -176,4 +197,21 @@ public void setUnlessImports(String unlessImports) {
176197
.unmodifiableList(Arrays.stream(unlessImports.split(",")).map(String::trim).collect(Collectors.toList()));
177198
}
178199

200+
private static final class Annotation {
201+
202+
private final String packageName;
203+
204+
private final String simpleName;
205+
206+
private Annotation(String packageName, String simpleName) {
207+
this.packageName = packageName;
208+
this.simpleName = simpleName;
209+
}
210+
211+
private String fullyQualifiedName() {
212+
return this.packageName + "." + this.simpleName;
213+
}
214+
215+
}
216+
179217
}

0 commit comments

Comments
 (0)