Skip to content

Commit 9e61d97

Browse files
mpaladinsaberduck
andauthored
SONARFLEX-169 Declare Flex sensor as a sensor processing files independently (#138)
Co-authored-by: Tibor Blenessy <[email protected]>
1 parent e4f9161 commit 9e61d97

File tree

2 files changed

+71
-5
lines changed

2 files changed

+71
-5
lines changed

sonar-flex-plugin/src/main/java/org/sonar/plugins/flex/FlexSquidSensor.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@
2323
import com.sonar.sslr.api.RecognitionException;
2424
import com.sonar.sslr.impl.Parser;
2525
import java.io.IOException;
26+
import java.lang.reflect.Method;
2627
import java.nio.charset.Charset;
2728
import java.util.ArrayList;
2829
import java.util.List;
2930
import java.util.concurrent.TimeUnit;
3031
import java.util.stream.Collectors;
32+
import org.sonar.api.SonarProduct;
33+
import org.sonar.api.SonarRuntime;
3134
import org.sonar.api.batch.fs.FilePredicate;
3235
import org.sonar.api.batch.fs.FilePredicates;
3336
import org.sonar.api.batch.fs.FileSystem;
@@ -44,6 +47,7 @@
4447
import org.sonar.api.measures.FileLinesContextFactory;
4548
import org.sonar.api.measures.Metric;
4649
import org.sonar.api.rule.RuleKey;
50+
import org.sonar.api.utils.Version;
4751
import org.sonar.api.utils.log.Logger;
4852
import org.sonar.api.utils.log.Loggers;
4953
import org.sonar.flex.FlexCheck;
@@ -62,10 +66,12 @@ public class FlexSquidSensor implements Sensor {
6266

6367
private static final Logger LOG = Loggers.get(FlexSquidSensor.class);
6468

69+
private final SonarRuntime sonarRuntime;
6570
private final Checks<FlexCheck> checks;
6671
private final FileLinesContextFactory fileLinesContextFactory;
6772

68-
public FlexSquidSensor(CheckFactory checkFactory, FileLinesContextFactory fileLinesContextFactory) {
73+
public FlexSquidSensor(SonarRuntime sonarRuntime, CheckFactory checkFactory, FileLinesContextFactory fileLinesContextFactory) {
74+
this.sonarRuntime = sonarRuntime;
6975
this.checks = checkFactory
7076
.<FlexCheck>create(CheckList.REPOSITORY_KEY)
7177
.addAnnotatedChecks((Iterable) CheckList.getChecks());
@@ -78,6 +84,20 @@ public void describe(SensorDescriptor descriptor) {
7884
.name("Flex")
7985
.onlyOnFileType(InputFile.Type.MAIN)
8086
.onlyOnLanguage(Flex.KEY);
87+
processesFilesIndependently(descriptor);
88+
}
89+
90+
private void processesFilesIndependently(SensorDescriptor descriptor) {
91+
if ((sonarRuntime.getProduct() == SonarProduct.SONARLINT)
92+
|| !sonarRuntime.getApiVersion().isGreaterThanOrEqual(Version.create(9, 3))) {
93+
return;
94+
}
95+
try {
96+
Method method = descriptor.getClass().getMethod("processesFilesIndependently");
97+
method.invoke(descriptor);
98+
} catch (ReflectiveOperationException e) {
99+
LOG.warn("Could not call SensorDescriptor.processesFilesIndependently() method", e);
100+
}
81101
}
82102

83103
@Override

sonar-flex-plugin/src/test/java/org/sonar/plugins/flex/FlexSquidSensorTest.java

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
import org.junit.Rule;
2929
import org.junit.Test;
3030
import org.mockito.Mockito;
31+
import org.sonar.api.SonarEdition;
32+
import org.sonar.api.SonarQubeSide;
33+
import org.sonar.api.SonarRuntime;
3134
import org.sonar.api.batch.fs.InputFile;
3235
import org.sonar.api.batch.fs.internal.DefaultFileSystem;
3336
import org.sonar.api.batch.fs.internal.DefaultInputFile;
@@ -36,24 +39,29 @@
3639
import org.sonar.api.batch.rule.CheckFactory;
3740
import org.sonar.api.batch.rule.internal.ActiveRulesBuilder;
3841
import org.sonar.api.batch.rule.internal.NewActiveRule;
42+
import org.sonar.api.batch.sensor.SensorDescriptor;
3943
import org.sonar.api.batch.sensor.highlighting.TypeOfText;
4044
import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
4145
import org.sonar.api.batch.sensor.internal.SensorContextTester;
46+
import org.sonar.api.internal.SonarRuntimeImpl;
4247
import org.sonar.api.measures.CoreMetrics;
4348
import org.sonar.api.measures.FileLinesContext;
4449
import org.sonar.api.measures.FileLinesContextFactory;
4550
import org.sonar.api.rule.RuleKey;
51+
import org.sonar.api.utils.Version;
4652
import org.sonar.api.utils.log.LogTester;
4753
import org.sonar.api.utils.log.LoggerLevel;
4854
import org.sonar.plugins.flex.core.Flex;
4955

5056
import static org.assertj.core.api.Assertions.assertThat;
57+
import static org.junit.Assert.assertTrue;
5158
import static org.mockito.Mockito.mock;
5259
import static org.mockito.Mockito.when;
5360

5461
public class FlexSquidSensorTest {
5562

5663
private static final File TEST_DIR = new File("src/test/resources/org/sonar/plugins/flex/squid");
64+
private static final SonarRuntime SONARQUBE_89 = SonarRuntimeImpl.forSonarQube(Version.create(8, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER);
5765

5866
private FlexSquidSensor sensor;
5967
private SensorContextTester tester;
@@ -62,17 +70,22 @@ public class FlexSquidSensorTest {
6270
public LogTester logTester = new LogTester();
6371

6472
@Before
65-
public void setUp() throws Exception {
73+
public void setUp() {
74+
createSensor(SONARQUBE_89);
75+
tester = SensorContextTester.create(TEST_DIR);
76+
logTester.clear();
77+
}
78+
79+
private FlexSquidSensor createSensor(SonarRuntime sonarRuntime) {
6680
ActiveRulesBuilder activeRulesBuilder = new ActiveRulesBuilder();
6781
activeRulesBuilder.addRule(new NewActiveRule.Builder().setRuleKey(RuleKey.of("flex", "S1125")).setSeverity("BLOCKER").build());
6882
ActiveRules activeRules = activeRulesBuilder.build();
6983
CheckFactory checkFactory = new CheckFactory(activeRules);
7084
FileLinesContextFactory fileLinesContextFactory = mock(FileLinesContextFactory.class);
7185
FileLinesContext fileLinesContext = mock(FileLinesContext.class);
7286
when(fileLinesContextFactory.createFor(Mockito.any(InputFile.class))).thenReturn(fileLinesContext);
73-
sensor = new FlexSquidSensor(checkFactory, fileLinesContextFactory);
74-
tester = SensorContextTester.create(TEST_DIR);
75-
logTester.clear();
87+
sensor = new FlexSquidSensor(sonarRuntime, checkFactory, fileLinesContextFactory);
88+
return sensor;
7689
}
7790

7891
@Test
@@ -166,4 +179,37 @@ public void testDescriptor() {
166179
assertThat(descriptor.name()).isEqualTo("Flex");
167180
assertThat(descriptor.languages()).containsOnly("flex");
168181
}
182+
183+
@Test
184+
public void test_descriptor_sonarlint() {
185+
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor();
186+
createSensor(SonarRuntimeImpl.forSonarLint(Version.create(6, 5))).describe(descriptor);
187+
assertThat(descriptor.name()).isEqualTo("Flex");
188+
assertThat(descriptor.languages()).containsOnly("flex");
189+
}
190+
191+
@Test
192+
public void test_descriptor_sonarqube_9_3() {
193+
final boolean[] called = {false};
194+
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor() {
195+
public SensorDescriptor processesFilesIndependently() {
196+
called[0] = true;
197+
return this;
198+
}
199+
};
200+
createSensor(SonarRuntimeImpl.forSonarQube(Version.create(9, 3), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER)).describe(descriptor);
201+
assertThat(descriptor.name()).isEqualTo("Flex");
202+
assertThat(descriptor.languages()).containsOnly("flex");
203+
assertTrue(called[0]);
204+
}
205+
206+
@Test
207+
public void test_descriptor_sonarqube_9_3_reflection_failure() {
208+
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor();
209+
createSensor(SonarRuntimeImpl.forSonarQube(Version.create(9, 3), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER)).describe(descriptor);
210+
assertThat(descriptor.name()).isEqualTo("Flex");
211+
assertThat(descriptor.languages()).containsOnly("flex");
212+
assertTrue(logTester.logs().contains("Could not call SensorDescriptor.processesFilesIndependently() method"));
213+
}
214+
169215
}

0 commit comments

Comments
 (0)