Skip to content

Commit 8c7a201

Browse files
Avoid accessing SonarComponents at injection time to prevent NPE
1 parent 59c0140 commit 8c7a201

File tree

2 files changed

+35
-16
lines changed

2 files changed

+35
-16
lines changed

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

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,25 @@
1616
*/
1717
package org.sonar.java;
1818

19+
import javax.annotation.CheckForNull;
20+
import org.sonar.api.batch.bootstrap.ProjectDefinition;
1921
import org.sonar.api.config.Configuration;
2022
import org.sonar.java.model.JavaVersionImpl;
2123
import org.sonar.plugins.java.api.JavaVersion;
2224
import org.sonar.plugins.java.api.internal.ModuleMetadata;
2325

26+
import static org.sonar.java.SonarComponents.SONAR_IGNORE_UNNAMED_MODULE_FOR_SPLIT_PACKAGE;
27+
2428
public class DefaultModuleMetadata implements ModuleMetadata {
2529

2630
private final JavaVersion javaVersion;
27-
private final String moduleKey;
31+
private final ProjectDefinition projectDefinition;
2832
private final boolean ignoreUnnamedModuleForSplitPackage;
2933

30-
public DefaultModuleMetadata(SonarComponents sonarComponents, Configuration configuration) {
34+
public DefaultModuleMetadata(ProjectDefinition projectDefinition, Configuration configuration) {
3135
this.javaVersion = JavaVersionImpl.readFromConfiguration(configuration);
32-
this.moduleKey = sonarComponents.getModuleKey();
33-
this.ignoreUnnamedModuleForSplitPackage = sonarComponents.shouldIgnoreUnnamedModuleForSplitPackage();
36+
this.projectDefinition = projectDefinition;
37+
this.ignoreUnnamedModuleForSplitPackage = configuration.getBoolean(SONAR_IGNORE_UNNAMED_MODULE_FOR_SPLIT_PACKAGE).orElse(false);
3438
}
3539

3640
@Override
@@ -40,12 +44,30 @@ public JavaVersion javaVersion() {
4044

4145
@Override
4246
public String moduleKey() {
43-
return moduleKey;
47+
var root = getRootProject();
48+
if (root != null && projectDefinition != null) {
49+
var rootBase = root.getBaseDir().toPath();
50+
var moduleBase = projectDefinition.getBaseDir().toPath();
51+
return rootBase.relativize(moduleBase).toString().replace('\\', '/');
52+
}
53+
return "";
4454
}
4555

4656
@Override
4757
public boolean shouldIgnoreUnnamedModuleForSplitPackage() {
4858
return ignoreUnnamedModuleForSplitPackage;
4959
}
5060

61+
@CheckForNull
62+
private ProjectDefinition getRootProject() {
63+
ProjectDefinition current = projectDefinition;
64+
if (current == null) {
65+
return null;
66+
}
67+
while (current.getParent() != null) {
68+
current = current.getParent();
69+
}
70+
return current;
71+
}
72+
5173
}

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@ class DefaultModuleMetadataTest {
3131

3232
@Test
3333
void test() {
34-
var sonarComponents = mockSonarComponents();
34+
var projectDefinition = mockProjectDefinition();
3535
var config = mockConfiguration();
36-
sonarComponents.setSensorContext(mockSensorContext(config));
37-
var defaultModuleMetadata = new DefaultModuleMetadata(sonarComponents, config);
36+
var defaultModuleMetadata = new DefaultModuleMetadata(projectDefinition, config);
3837

3938
assertThat(defaultModuleMetadata.moduleKey()).isEqualTo("pmodule/cmodule");
4039
assertThat(defaultModuleMetadata.javaVersion().asInt()).isEqualTo(-1);
@@ -43,34 +42,32 @@ void test() {
4342

4443
@Test
4544
void testWithJavaVersion() {
46-
var sonarComponents = mockSonarComponents();
45+
var projectDefinition = mockProjectDefinition();
4746
var config = mockConfiguration("sonar.java.source", "11");
48-
sonarComponents.setSensorContext(mockSensorContext(config));
49-
var defaultModuleMetadata = new DefaultModuleMetadata(sonarComponents, config);
47+
var defaultModuleMetadata = new DefaultModuleMetadata(projectDefinition, config);
5048

5149
assertThat(defaultModuleMetadata.moduleKey()).isEqualTo("pmodule/cmodule");
5250
assertThat(defaultModuleMetadata.javaVersion().asInt()).isEqualTo(11);
5351
}
5452

5553
@Test
5654
void testWithShouldIgnoreUnnamed() {
57-
var sonarComponents = mockSonarComponents();
55+
var projectDefinition = mockProjectDefinition();
5856
var config = mockConfiguration("sonar.java.ignoreUnnamedModuleForSplitPackage", "true");
59-
sonarComponents.setSensorContext(mockSensorContext(config));
60-
var defaultModuleMetadata = new DefaultModuleMetadata(sonarComponents, config);
57+
var defaultModuleMetadata = new DefaultModuleMetadata(projectDefinition, config);
6158

6259
assertThat(defaultModuleMetadata.moduleKey()).isEqualTo("pmodule/cmodule");
6360
assertThat(defaultModuleMetadata.shouldIgnoreUnnamedModuleForSplitPackage()).isTrue();
6461
}
6562

66-
private SonarComponents mockSonarComponents() {
63+
private ProjectDefinition mockProjectDefinition() {
6764
var rootProj = mock(ProjectDefinition.class);
6865
doReturn(new File("/foo/bar/proj")).when(rootProj).getBaseDir();
6966
var childModule = mock(ProjectDefinition.class);
7067
doReturn(new File("/foo/bar/proj/pmodule/cmodule")).when(childModule).getBaseDir();
7168
doReturn(rootProj).when(childModule).getParent();
7269

73-
return new SonarComponents(null, null, null, null, null, null, childModule);
70+
return childModule;
7471
}
7572

7673
private Configuration mockConfiguration(String... keysAndValues) {

0 commit comments

Comments
 (0)