Skip to content

Commit 762306e

Browse files
committed
SONARCH-708 SonarJava: extend CheckRegistrar API for registering custom file scanner hooks
1 parent 6303741 commit 762306e

File tree

4 files changed

+85
-2
lines changed

4 files changed

+85
-2
lines changed

java-checks-testkit/src/main/java/org/sonar/java/checks/verifier/TestCheckRegistrarContext.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import java.util.Set;
2525
import org.apache.commons.lang3.StringUtils;
2626
import org.sonar.api.rule.RuleKey;
27+
import org.sonar.api.rule.RuleScope;
2728
import org.sonar.api.rules.RuleAnnotationUtils;
2829
import org.sonar.plugins.java.api.CheckRegistrar;
2930
import org.sonar.plugins.java.api.JavaCheck;
31+
import org.sonar.plugins.java.api.JavaFileScanner;
3032

3133
public class TestCheckRegistrarContext extends CheckRegistrar.RegistrarContext {
3234

@@ -52,16 +54,34 @@ public void registerTestChecks(String repositoryKey, Collection<?> javaCheckClas
5254

5355
@Override
5456
public void registerMainSharedCheck(JavaCheck check, Collection<RuleKey> ruleKeys) {
57+
registerMainHook(check);
58+
mainRuleKeys.addAll(ruleKeys);
59+
}
60+
61+
private void registerMainHook(JavaCheck check) {
5562
mainCheckClasses.add(check.getClass());
5663
mainCheckInstances.add(check);
57-
mainRuleKeys.addAll(ruleKeys);
5864
}
5965

6066
@Override
6167
public void registerTestSharedCheck(JavaCheck check, Collection<RuleKey> ruleKeys) {
68+
registerTestHook(check);
69+
testRuleKeys.addAll(ruleKeys);
70+
}
71+
72+
private void registerTestHook(JavaCheck check) {
6273
testCheckClasses.add(check.getClass());
6374
testCheckInstances.add(check);
64-
testRuleKeys.addAll(ruleKeys);
75+
}
76+
77+
@Override
78+
public void registerCustomFileScanner(RuleScope ruleScope, JavaFileScanner scanner) {
79+
if (ruleScope != RuleScope.TEST) {
80+
registerMainHook(scanner);
81+
}
82+
if (ruleScope != RuleScope.MAIN) {
83+
registerTestHook(scanner);
84+
}
6585
}
6686

6787
@Override

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

+12
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.sonar.api.measures.FileLinesContext;
5757
import org.sonar.api.measures.FileLinesContextFactory;
5858
import org.sonar.api.rule.RuleKey;
59+
import org.sonar.api.rule.RuleScope;
5960
import org.sonar.api.utils.Version;
6061
import org.sonar.java.annotations.VisibleForTesting;
6162
import org.sonar.java.caching.ContentHashCache;
@@ -69,6 +70,7 @@
6970
import org.sonar.java.reporting.JavaIssue;
7071
import org.sonar.plugins.java.api.CheckRegistrar;
7172
import org.sonar.plugins.java.api.JavaCheck;
73+
import org.sonar.plugins.java.api.JavaFileScanner;
7274
import org.sonar.plugins.java.api.JspCodeVisitor;
7375
import org.sonar.plugins.java.api.caching.SonarLintCache;
7476
import org.sonarsource.api.sonarlint.SonarLintSide;
@@ -305,6 +307,16 @@ public void registerTestSharedCheck(JavaCheck check, Collection<RuleKey> ruleKey
305307
}
306308
}
307309

310+
@Override
311+
public void registerCustomFileScanner(RuleScope ruleScope, JavaFileScanner scanner) {
312+
if (ruleScope != RuleScope.TEST) {
313+
mainChecks.add(scanner);
314+
}
315+
if (ruleScope != RuleScope.MAIN) {
316+
testChecks.add(scanner);
317+
}
318+
}
319+
308320
@Override
309321
public void registerAutoScanCompatibleRules(Collection<RuleKey> ruleKeys) {
310322
additionalAutoScanCompatibleRuleKeys.addAll(ruleKeys);

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

+8
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.sonar.api.batch.rule.CheckFactory;
2626
import org.sonar.api.batch.rule.Checks;
2727
import org.sonar.api.rule.RuleKey;
28+
import org.sonar.api.rule.RuleScope;
2829
import org.sonar.api.server.rule.RulesDefinition;
2930
import org.sonar.java.Preconditions;
3031
import org.sonar.java.annotations.Beta;
@@ -171,6 +172,13 @@ public void registerMainSharedCheck(JavaCheck check, Collection<RuleKey> ruleKey
171172
// to be overridden
172173
}
173174

175+
/**
176+
* Registers a custom file scanner not related to any rule or repository.
177+
*/
178+
public void registerCustomFileScanner(RuleScope ruleScope, JavaFileScanner scanner) {
179+
// to be overridden
180+
}
181+
174182
/**
175183
* Registers one test code check related to not one but a list of rules. The check will be active if at least one
176184
* of the given rule key is active. In this context injection of @RuleProperty and auto instantiation of rules

java-frontend/src/test/java/org/sonar/java/SonarComponentsTest.java

+43
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import org.sonar.api.measures.FileLinesContext;
6969
import org.sonar.api.measures.FileLinesContextFactory;
7070
import org.sonar.api.rule.RuleKey;
71+
import org.sonar.api.rule.RuleScope;
7172
import org.sonar.api.testfixtures.log.LogTesterJUnit5;
7273
import org.sonar.api.utils.Version;
7374
import org.sonar.check.Rule;
@@ -81,6 +82,8 @@
8182
import org.sonar.java.testing.ThreadLocalLogTester;
8283
import org.sonar.plugins.java.api.CheckRegistrar;
8384
import org.sonar.plugins.java.api.JavaCheck;
85+
import org.sonar.plugins.java.api.JavaFileScanner;
86+
import org.sonar.plugins.java.api.JavaFileScannerContext;
8487
import org.sonar.plugins.java.api.JspCodeVisitor;
8588
import org.sonar.plugins.java.api.caching.SonarLintCache;
8689
import org.sonarsource.sonarlint.core.plugin.commons.sonarapi.SonarLintRuntimeImpl;
@@ -407,6 +410,46 @@ class RuleF implements JavaCheck {
407410
.containsExactly("RuleE");
408411
}
409412

413+
@Test
414+
void register_custom_file_scanners_with_no_active_rules() {
415+
var noActiveRules = (new ActiveRulesBuilder()).build();
416+
CheckFactory specificCheckFactory = new CheckFactory(noActiveRules);
417+
SensorContextTester specificContext = SensorContextTester.create(new File(".")).setActiveRules(noActiveRules);
418+
419+
class MainScanner implements JavaFileScanner {
420+
@Override
421+
public void scanFile(JavaFileScannerContext context) {
422+
}
423+
}
424+
425+
class TestScanner implements JavaFileScanner {
426+
@Override
427+
public void scanFile(JavaFileScannerContext context) {
428+
}
429+
}
430+
431+
class AllScanner implements JavaFileScanner {
432+
@Override
433+
public void scanFile(JavaFileScannerContext context) {
434+
}
435+
}
436+
437+
SonarComponents sonarComponents = new SonarComponents(fileLinesContextFactory, null, null,
438+
null, specificCheckFactory, noActiveRules, new CheckRegistrar[]{
439+
ctx -> ctx.registerCustomFileScanner(RuleScope.MAIN, new MainScanner()),
440+
ctx -> ctx.registerCustomFileScanner(RuleScope.TEST, new TestScanner()),
441+
ctx -> ctx.registerCustomFileScanner(RuleScope.ALL, new AllScanner())
442+
});
443+
444+
sonarComponents.setSensorContext(specificContext);
445+
assertThat(sonarComponents.mainChecks())
446+
.extracting(c -> c.getClass().getSimpleName())
447+
.containsExactly("MainScanner", "AllScanner");
448+
assertThat(sonarComponents.testChecks())
449+
.extracting(c -> c.getClass().getSimpleName())
450+
.containsExactly("TestScanner", "AllScanner");
451+
}
452+
410453
@Test
411454
void register_custom_rule_by_instances_instead_of_classes() {
412455
ActiveRules activeRules = activeRules("java:S101", "java:S102");

0 commit comments

Comments
 (0)