Skip to content

Commit 3c9100e

Browse files
pawlakmbenzonico
authored andcommitted
SONARJAVA-1171 Custom rules for test files
1 parent c849d12 commit 3c9100e

10 files changed

Lines changed: 188 additions & 55 deletions

File tree

its/plugin/plugins/java-extension-plugin/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<groupId>org.codehaus.sonar-plugins.java</groupId>
2929
<artifactId>sonar-java-plugin</artifactId>
3030
<type>sonar-plugin</type>
31-
<version>3.1</version>
31+
<version>3.4-SNAPSHOT</version>
3232
<scope>provided</scope>
3333
</dependency>
3434
</dependencies>

its/plugin/plugins/java-extension-plugin/src/main/java/org/sonar/samples/java/JavaExtensionPlugin.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@
2020
package org.sonar.samples.java;
2121

2222
import com.google.common.collect.ImmutableList;
23-
import org.sonar.api.SonarPlugin;
24-
2523
import java.util.List;
24+
import org.sonar.api.SonarPlugin;
2625

2726
public class JavaExtensionPlugin extends SonarPlugin {
2827

2928
@Override
3029
public List getExtensions() {
31-
return ImmutableList.of(JavaExtensionRulesDefinition.class, JavaExtensionsCheckRegistrar.class);
30+
return ImmutableList.of(
31+
JavaExtensionRulesDefinition.class,
32+
JavaExtensionsCheckRegistrar.class);
3233
}
3334

3435
}

its/plugin/plugins/java-extension-plugin/src/main/java/org/sonar/samples/java/JavaExtensionRulesDefinition.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ public void define(Context context) {
3232
repo.setName(REPOSITORY_KEY);
3333

3434
// We could use a XML or JSON file to load all rule metadata, but
35-
// we prefer use annotations in order to have all information in a single place
35+
// we prefer use annotations in order to have all information in a
36+
// single place
3637
RulesDefinitionAnnotationLoader annotationLoader = new RulesDefinitionAnnotationLoader();
38+
// Load custom check classes
3739
annotationLoader.load(repo, JavaExtensionsCheckRegistrar.checkClasses());
40+
// Load custom test check classes
41+
annotationLoader.load(repo, JavaExtensionsCheckRegistrar.testCheckClasses());
3842
repo.done();
3943
}
4044
}
41-

its/plugin/plugins/java-extension-plugin/src/main/java/org/sonar/samples/java/JavaExtensionsCheckRegistrar.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,28 @@
1919
*/
2020
package org.sonar.samples.java;
2121

22-
22+
import java.util.Arrays;
2323
import org.sonar.plugins.java.api.CheckRegistrar;
2424
import org.sonar.plugins.java.api.JavaCheck;
2525

26-
import java.util.Arrays;
27-
2826
public class JavaExtensionsCheckRegistrar implements CheckRegistrar {
2927
/**
3028
* Lists all the checks provided by the plugin
3129
*/
3230
public static Class<? extends JavaCheck>[] checkClasses() {
33-
return new Class[]{ExampleCheck.class, SubscriptionExampleCheck.class};
31+
return new Class[] {ExampleCheck.class, SubscriptionExampleCheck.class};
32+
}
33+
34+
/**
35+
* Lists all the test checks provided by the plugin
36+
*/
37+
public static Class<? extends JavaCheck>[] testCheckClasses() {
38+
return new Class[] {SubscriptionExampleTestCheck.class};
3439
}
3540

3641
@Override
3742
public void register(RegistrarContext registrarContext) {
38-
registrarContext.registerClassesForRepository(JavaExtensionRulesDefinition.REPOSITORY_KEY, Arrays.asList(checkClasses()));
43+
registrarContext.registerClassesForRepository(JavaExtensionRulesDefinition.REPOSITORY_KEY, Arrays.asList(checkClasses()), Arrays.asList(testCheckClasses()));
3944
}
4045

4146
}
42-

its/plugin/plugins/java-extension-plugin/src/main/java/org/sonar/samples/java/SubscriptionExampleCheck.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,12 @@
2020
package org.sonar.samples.java;
2121

2222
import com.google.common.collect.ImmutableList;
23+
import java.util.List;
2324
import org.sonar.check.Priority;
2425
import org.sonar.check.Rule;
2526
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
2627
import org.sonar.plugins.java.api.tree.Tree;
2728

28-
import java.util.List;
29-
3029
@Rule(key = "subscriptionexamplecheck", priority = Priority.MINOR, name = "SubscriptionExampleCheck", description = "SubscriptionExampleCheck")
3130
public class SubscriptionExampleCheck extends IssuableSubscriptionVisitor {
3231

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.sonar.samples.java;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import java.util.List;
5+
import org.sonar.check.Priority;
6+
import org.sonar.check.Rule;
7+
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
8+
import org.sonar.plugins.java.api.tree.Tree;
9+
10+
@Rule(key = "subscriptionexampletestcheck", priority = Priority.MINOR, name = "SubscriptionExampleTestCheck", description = "SubscriptionExampleTestCheck")
11+
public class SubscriptionExampleTestCheck extends IssuableSubscriptionVisitor {
12+
13+
@Override
14+
public List<Tree.Kind> nodesToVisit() {
15+
return ImmutableList.of(Tree.Kind.METHOD);
16+
}
17+
18+
@Override
19+
public void visitNode(Tree tree) {
20+
addIssue(tree, "Issue on test methods");
21+
}
22+
}

java-squid/src/main/java/org/sonar/java/SonarComponents.java

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
import javax.annotation.Nullable;
3939
import java.io.File;
40+
import java.util.ArrayList;
4041
import java.util.Collection;
4142
import java.util.List;
4243

@@ -49,30 +50,34 @@ public class SonarComponents implements BatchExtension {
4950
private final FileSystem fs;
5051
private final JavaClasspath javaClasspath;
5152
private final List<Checks<JavaCheck>> checks;
52-
private Checks<JavaCheck> testChecks;
53+
private final List<Checks<JavaCheck>> testChecks;
5354

5455
public SonarComponents(FileLinesContextFactory fileLinesContextFactory, ResourcePerspectives resourcePerspectives, FileSystem fs,
55-
JavaClasspath javaClasspath, JavaTestClasspath javaTestClasspath,
56-
CheckFactory checkFactory) {
56+
JavaClasspath javaClasspath, JavaTestClasspath javaTestClasspath,
57+
CheckFactory checkFactory) {
5758
this(fileLinesContextFactory, resourcePerspectives, fs, javaClasspath, javaTestClasspath, checkFactory, null);
5859
}
5960

6061
public SonarComponents(FileLinesContextFactory fileLinesContextFactory, ResourcePerspectives resourcePerspectives, FileSystem fs,
61-
JavaClasspath javaClasspath, JavaTestClasspath javaTestClasspath, CheckFactory checkFactory,
62-
@Nullable CheckRegistrar[] checkRegistrars) {
62+
JavaClasspath javaClasspath, JavaTestClasspath javaTestClasspath, CheckFactory checkFactory,
63+
@Nullable CheckRegistrar[] checkRegistrars) {
6364
this.fileLinesContextFactory = fileLinesContextFactory;
6465
this.resourcePerspectives = resourcePerspectives;
6566
this.fs = fs;
6667
this.javaClasspath = javaClasspath;
6768
this.javaTestClasspath = javaTestClasspath;
6869
this.checkFactory = checkFactory;
69-
checks = Lists.newArrayList();
70+
this.checks = Lists.newArrayList();
71+
this.testChecks = Lists.newArrayList();
7072

71-
if(checkRegistrars != null) {
73+
if (checkRegistrars != null) {
7274
CheckRegistrar.RegistrarContext registrarContext = new CheckRegistrar.RegistrarContext();
7375
for (CheckRegistrar checkClassesRegister : checkRegistrars) {
7476
checkClassesRegister.register(registrarContext);
75-
registerCheckClasses(registrarContext.repositoryKey(), Lists.newArrayList(registrarContext.checkClasses()));
77+
Iterable<Class<? extends JavaCheck>> checkClasses = registrarContext.checkClasses();
78+
Iterable<Class<? extends JavaCheck>> testCheckClasses = registrarContext.testCheckClasses();
79+
registerCheckClasses(registrarContext.repositoryKey(), Lists.newArrayList(checkClasses != null ? checkClasses : new ArrayList<Class<? extends JavaCheck>>()));
80+
registerTestCheckClasses(registrarContext.repositoryKey(), Lists.newArrayList(testCheckClasses != null ? testCheckClasses : new ArrayList<Class<? extends JavaCheck>>()));
7681
}
7782
}
7883
}
@@ -108,14 +113,17 @@ public ResourcePerspectives getResourcePerspectives() {
108113
return resourcePerspectives;
109114
}
110115

111-
public void registerCheckClasses(String repositoryKey, Collection<Class<? extends JavaCheck>> checkClasses) {
116+
public void registerCheckClasses(String repositoryKey, List<Class<? extends JavaCheck>> checkClasses) {
112117
checks.add(checkFactory.<JavaCheck>create(repositoryKey).addAnnotatedChecks(checkClasses));
113118
}
114119

115120
public CodeVisitor[] checkClasses() {
116121
List<CodeVisitor> visitors = Lists.newArrayList();
117-
for (Checks<JavaCheck> check : checks) {
118-
visitors.addAll(check.all());
122+
for (Checks<JavaCheck> checksElement : checks) {
123+
Collection<JavaCheck> checksCollection = checksElement.all();
124+
if (!checksCollection.isEmpty()) {
125+
visitors.addAll(checksCollection);
126+
}
119127
}
120128
return visitors.toArray(new CodeVisitor[visitors.size()]);
121129
}
@@ -124,17 +132,19 @@ public Iterable<Checks<JavaCheck>> checks() {
124132
return Iterables.concat(checks, Lists.newArrayList(testChecks));
125133
}
126134

127-
public void registerTestCheckClasses(String repositoryKey, List<Class<? extends JavaCheck>> javaTestChecks) {
128-
testChecks = checkFactory.<JavaCheck>create(repositoryKey).addAnnotatedChecks(javaTestChecks);
135+
public void registerTestCheckClasses(String repositoryKey, List<Class<? extends JavaCheck>> checkClasses) {
136+
testChecks.add(checkFactory.<JavaCheck>create(repositoryKey).addAnnotatedChecks(checkClasses));
129137
}
130138

131139
public Collection<JavaCheck> testCheckClasses() {
132-
if(testChecks == null) {
133-
return Lists.newArrayList();
140+
List<JavaCheck> visitors = Lists.newArrayList();
141+
for (Checks<JavaCheck> checksElement : testChecks) {
142+
Collection<JavaCheck> checksCollection = checksElement.all();
143+
if (!checksCollection.isEmpty()) {
144+
visitors.addAll(checksCollection);
145+
}
134146
}
135-
return testChecks.all();
147+
return visitors;
136148
}
137149

138-
139-
140150
}

java-squid/src/main/java/org/sonar/plugins/java/api/CheckRegistrar.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
/**
2828
* This batch extension should be extended to provide the classes to be used to instantiate checks.
2929
* The register method has to be implemented and the registrarContext should register the repository keys.
30+
*
3031
* <pre>
3132
* {@code
3233
* public void register(RegistrarContext registrarContext) {
@@ -47,11 +48,13 @@ public interface CheckRegistrar extends BatchExtension {
4748
class RegistrarContext {
4849
private String repositoryKey;
4950
private Iterable<Class<? extends JavaCheck>> checkClasses;
51+
private Iterable<Class<? extends JavaCheck>> testCheckClasses;
5052

51-
public void registerClassesForRepository(String repositoryKey, Iterable<Class<? extends JavaCheck>> checkClasses){
53+
public void registerClassesForRepository(String repositoryKey, Iterable<Class<? extends JavaCheck>> checkClasses, Iterable<Class<? extends JavaCheck>> testCheckClasses) {
5254
Preconditions.checkArgument(StringUtils.isNotBlank(repositoryKey), "Please specify a valid repository key to register your custom rules");
5355
this.repositoryKey = repositoryKey;
5456
this.checkClasses = checkClasses;
57+
this.testCheckClasses = testCheckClasses;
5558
}
5659

5760
public String repositoryKey() {
@@ -62,6 +65,10 @@ public Iterable<Class<? extends JavaCheck>> checkClasses() {
6265
return checkClasses;
6366
}
6467

68+
public Iterable<Class<? extends JavaCheck>> testCheckClasses() {
69+
return testCheckClasses;
70+
}
71+
6572
}
6673

6774
}

0 commit comments

Comments
 (0)