Skip to content

Commit 0815a83

Browse files
SCANGRADLE-314 refactor: compile and test classpath to use provider api (#398)
1 parent 5c5e666 commit 0815a83

File tree

7 files changed

+30
-152
lines changed

7 files changed

+30
-152
lines changed

integrationTests/src/test/java/org/sonarqube/gradle/AbstractGradleIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ static void assertThatPluginDoesNotCreateGradleDeprecationWarnings(String text)
345345
}
346346

347347
static boolean isUnexpectedWarning(String line){
348-
if(line.contains("SonarResolverTask.java:143") || line.contains("SonarResolverTask.java:146")){
348+
if(line.contains("SonarResolverTask.java:108") || line.contains("SonarResolverTask.java:111")){
349349
// These warnings are expected until we properly support Gradle 9
350350
return false;
351351
}

src/main/java/org/sonarqube/gradle/BuildFeaturesEnabledResolverTask.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/main/java/org/sonarqube/gradle/SonarQubePlugin.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,13 @@
4242
import org.gradle.api.plugins.JavaPlugin;
4343
import org.gradle.api.provider.MapProperty;
4444
import org.gradle.api.provider.Provider;
45+
import org.gradle.api.tasks.SourceSet;
4546
import org.gradle.api.tasks.TaskContainer;
4647
import org.gradle.testing.jacoco.plugins.JacocoPlugin;
4748
import org.gradle.testing.jacoco.tasks.JacocoReport;
4849
import org.gradle.util.GradleVersion;
4950

5051
import static org.sonarqube.gradle.SonarUtils.capitalize;
51-
import static org.sonarqube.gradle.SonarUtils.getMainClassPath;
52-
import static org.sonarqube.gradle.SonarUtils.getTestClassPath;
5352
import static org.sonarqube.gradle.SonarUtils.isAndroidProject;
5453

5554
/**
@@ -108,7 +107,7 @@ public void apply(Project project) {
108107
private static List<File> registerAndConfigureResolverTasks(Project topLevelProject) {
109108
List<File> resolverFiles = new ArrayList<>();
110109
topLevelProject.getAllprojects().forEach(target ->
111-
target.getTasks().register(SonarResolverTask.TASK_NAME, getCompatibleTaskType(GradleVersion.current()), task -> {
110+
target.getTasks().register(SonarResolverTask.TASK_NAME, SonarResolverTask.class, task -> {
112111
Provider<Boolean> skipProject = target.provider(() -> isSkipped(target));
113112

114113
task.setDescription(SonarResolverTask.TASK_DESCRIPTION);
@@ -119,10 +118,10 @@ private static List<File> registerAndConfigureResolverTasks(Project topLevelProj
119118
}
120119
task.setProjectName(SonarUtils.constructPrefixedProjectName(target.getPath()));
121120

122-
FileCollection mainClassPath = getMainClassPath(target);
123-
task.setCompileClasspath(mainClassPath);
124-
FileCollection testClassPath = getTestClassPath(target);
125-
task.setTestCompileClasspath(testClassPath);
121+
Provider<FileCollection> compile = target.provider(() -> querySourceSet(target, SourceSet.MAIN_SOURCE_SET_NAME));
122+
Provider<FileCollection> test = target.provider(() -> querySourceSet(target, SourceSet.TEST_SOURCE_SET_NAME));
123+
task.setCompileClasspath(compile);
124+
task.setTestCompileClasspath(test);
126125

127126
if (isAndroidProject(target)) {
128127
setAndroidLibrariesProperties(target, task);
@@ -140,6 +139,16 @@ private static List<File> registerAndConfigureResolverTasks(Project topLevelProj
140139
return resolverFiles;
141140
}
142141

142+
@Nullable
143+
private static FileCollection querySourceSet(Project project, String sourceSetName) {
144+
var sourceSets = SonarUtils.getSourceSets(project);
145+
if (sourceSets == null) {
146+
return null;
147+
}
148+
var set = sourceSets.findByName(sourceSetName);
149+
return set == null ? null : set.getCompileClasspath();
150+
}
151+
143152
private static void setAndroidLibrariesProperties(Project target, SonarResolverTask task) {
144153
AndroidUtils.LibrariesAndTestLibraries libraries = AndroidUtils.LibrariesAndTestLibraries.ofProject(target);
145154
task.setMainLibraries(libraries.getMainLibraries());
@@ -153,15 +162,6 @@ private static void setJavaLibrariesProperties(Project target, SonarResolverTask
153162
task.setTestLibraries(libraries);
154163
}
155164

156-
private static Class<? extends SonarResolverTask> getCompatibleTaskType(GradleVersion version) {
157-
if (version.compareTo(GradleVersion.version("8.5.0")) >= 0) {
158-
return BuildFeaturesEnabledResolverTask.class;
159-
} else if (version.compareTo(GradleVersion.version("7.6.1")) >= 0) {
160-
return StartParameterBasedTask.class;
161-
}
162-
return SonarResolverTask.class;
163-
}
164-
165165
private static void addExtensions(Project project, String name, Map<String, ActionBroadcast<SonarProperties>> actionBroadcastMap) {
166166
project.getAllprojects().forEach(p -> {
167167
LOGGER.debug("Adding " + name + " extension to " + p);

src/main/java/org/sonarqube/gradle/SonarResolverTask.java

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ public abstract class SonarResolverTask extends DefaultTask {
4444

4545
private String projectName;
4646
private boolean isTopLevelProject;
47-
private FileCollection compileClasspath;
48-
private FileCollection testCompileClasspath;
4947
private FileCollection mainLibraries;
5048
private FileCollection testLibraries;
49+
private Provider<FileCollection> compileClasspath;
50+
private Provider<FileCollection> testCompileClasspath;
5151
private File outputDirectory;
5252
private Provider<Boolean> skipProject;
5353

@@ -71,19 +71,19 @@ public void setTopLevelProject(boolean topLevelProject) {
7171

7272
@Internal
7373
FileCollection getCompileClasspath() {
74-
return this.compileClasspath;
74+
return this.compileClasspath.get();
7575
}
7676

77-
public void setCompileClasspath(FileCollection compileClasspath) {
77+
public void setCompileClasspath(Provider<FileCollection> compileClasspath) {
7878
this.compileClasspath = compileClasspath;
7979
}
8080

8181
@Internal
82-
FileCollection getTestCompileClasspath() {
82+
Provider<FileCollection> getTestCompileClasspath() {
8383
return this.testCompileClasspath;
8484
}
8585

86-
public void setTestCompileClasspath(FileCollection testCompileClasspath) {
86+
public void setTestCompileClasspath(Provider<FileCollection> testCompileClasspath) {
8787
this.testCompileClasspath = testCompileClasspath;
8888
}
8989

@@ -137,23 +137,18 @@ void run() throws IOException {
137137
LOGGER.info("Resolving properties for " + displayName + ".");
138138
}
139139

140-
// If we failed to initialize class paths at configuration time AND the configuration cache is not active/requested,
141-
// we attempt to rebuild them using the source sets.
142-
if (compileClasspath == null && configurationCacheIsDisabled()) {
143-
compileClasspath = SonarUtils.getMainClassPath(getProject());
144-
}
145-
if (testCompileClasspath == null && configurationCacheIsDisabled()) {
146-
testCompileClasspath = SonarUtils.getTestClassPath(getProject());
147-
}
140+
var mainClasspath = this.compileClasspath.getOrNull();
141+
var testClasspath = testCompileClasspath.getOrNull();
148142

149-
List<String> compileClasspathFilenames = SonarUtils.exists(compileClasspath == null ? Collections.emptyList() : compileClasspath)
143+
List<String> compileClasspathFilenames = SonarUtils.exists(mainClasspath == null ? Collections.emptyList() : mainClasspath)
150144
.stream()
151145
.map(File::getAbsolutePath)
152146
.collect(Collectors.toList());
153-
List<String> testCompileClasspathFilenames = SonarUtils.exists(testCompileClasspath == null ? Collections.emptyList() : testCompileClasspath)
147+
List<String> testCompileClasspathFilenames = SonarUtils.exists(testClasspath == null ? Collections.emptyList() : testClasspath)
154148
.stream()
155149
.map(File::getAbsolutePath)
156150
.collect(Collectors.toList());
151+
157152
List<String> mainLibrariesFilenames = SonarUtils.exists(getMainLibraries() == null ? Collections.emptyList() : getMainLibraries())
158153
.stream()
159154
.map(File::getAbsolutePath)
@@ -162,6 +157,7 @@ void run() throws IOException {
162157
.stream()
163158
.map(File::getAbsolutePath)
164159
.collect(Collectors.toList());
160+
165161
ProjectProperties projectProperties = new ProjectProperties(
166162
getProjectName(),
167163
isTopLevelProject(),
@@ -179,9 +175,4 @@ void run() throws IOException {
179175
LOGGER.info("Resolved properties for " + displayName + " and wrote them to " + getOutputFile() + ".");
180176
}
181177
}
182-
183-
public boolean configurationCacheIsDisabled() {
184-
return true;
185-
}
186-
187178
}

src/main/java/org/sonarqube/gradle/SonarUtils.java

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,9 @@
3939
import java.util.stream.StreamSupport;
4040
import javax.annotation.Nullable;
4141
import org.gradle.api.Project;
42-
import org.gradle.api.file.FileCollection;
4342
import org.gradle.api.internal.plugins.DslObject;
4443
import org.gradle.api.plugins.JavaPluginConvention;
4544
import org.gradle.api.plugins.JavaPluginExtension;
46-
import org.gradle.api.tasks.SourceSet;
4745
import org.gradle.api.tasks.SourceSetContainer;
4846
import org.gradle.util.GradleVersion;
4947

@@ -96,6 +94,7 @@ static boolean isAndroidProject(Project project) {
9694
* @param project The (sub-)project under analysis
9795
* @return A container with the "main" and "test" source sets
9896
*/
97+
@Nullable
9998
static SourceSetContainer getSourceSets(Project project) {
10099
GradleVersion gradleVersion = GradleVersion.version(project.getGradle().getGradleVersion());
101100
if (isCompatibleWithJavaPluginExtension(gradleVersion)) {
@@ -123,37 +122,6 @@ private static SourceSetContainer getSourceSetsGradleLegacy(Project project) {
123122
return javaPluginConvention.getSourceSets();
124123
}
125124

126-
@Nullable
127-
public static FileCollection getMainClassPath(Project project) {
128-
return getClassPath(project, "main");
129-
}
130-
131-
@Nullable
132-
public static FileCollection getTestClassPath(Project project) {
133-
return getClassPath(project, "test");
134-
}
135-
136-
@Nullable
137-
public static FileCollection getClassPath(Project project, String sourceSetName) {
138-
SourceSetContainer sourceSets = SonarUtils.getSourceSets(project);
139-
return getClassPathFromSourceSets(sourceSetName, sourceSets);
140-
}
141-
142-
public static @Nullable FileCollection getClassPathFromSourceSets(String sourceSetName, @Nullable SourceSetContainer sourceSets) {
143-
if (sourceSets == null) {
144-
return null;
145-
}
146-
SourceSet sourceSet = sourceSets.findByName(sourceSetName);
147-
if (sourceSet == null) {
148-
return null;
149-
}
150-
FileCollection compileClasspath = sourceSet.getCompileClasspath();
151-
if (compileClasspath == null) {
152-
return null;
153-
}
154-
return compileClasspath;
155-
}
156-
157125
static boolean isCompatibleWithJavaPluginExtension(GradleVersion version) {
158126
return version.getBaseVersion().compareTo(GradleVersion.version("7.0")) >= 0;
159127
}

src/main/java/org/sonarqube/gradle/StartParameterBasedTask.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/test/java/org/sonarqube/gradle/SonarUtilsTest.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,14 @@
2424
import java.util.HashMap;
2525
import java.util.List;
2626
import java.util.Map;
27-
import org.gradle.api.tasks.SourceSet;
28-
import org.gradle.api.tasks.SourceSetContainer;
2927
import org.junit.jupiter.api.Test;
30-
import org.mockito.Mockito;
3128

3229
import static org.assertj.core.api.Assertions.assertThat;
3330
import static org.assertj.core.api.Assertions.assertThatThrownBy;
3431
import static org.mockito.Mockito.when;
3532

3633
class SonarUtilsTest {
3734

38-
@Test
39-
void test_get_class_path_from_sourcesets(){
40-
SourceSetContainer sourceSetsMissingMain = Mockito.mock(SourceSetContainer.class);
41-
when(sourceSetsMissingMain.findByName("main")).thenReturn(null);
42-
assertThat(SonarUtils.getClassPathFromSourceSets("main", sourceSetsMissingMain)).isNull();
43-
44-
SourceSetContainer sourceSets = Mockito.mock(SourceSetContainer.class);
45-
SourceSet sourceSet = Mockito.mock(SourceSet.class);
46-
when(sourceSets.findByName("main")).thenReturn(sourceSet);
47-
when(sourceSet.getCompileClasspath()).thenReturn(null);
48-
assertThat(SonarUtils.getClassPathFromSourceSets("main", sourceSets)).isNull();
49-
}
50-
5135
@Test
5236
void test_construct_prefixed_project_name() {
5337
assertThat(SonarUtils.constructPrefixedProjectName(":module:submodule")).isEqualTo(":module.:module:submodule");

0 commit comments

Comments
 (0)