Browse Source

Polish VerifyDependenciesVersionsPlugin

Issue gh-14047
pull/14143/head
Marcus Da Coregio 2 years ago
parent
commit
6654479649
  1. 104
      buildSrc/src/main/java/org/springframework/security/convention/versions/VerifyDependenciesVersionsPlugin.java

104
buildSrc/src/main/java/org/springframework/security/convention/versions/VerifyDependenciesVersionsPlugin.java

@ -21,30 +21,62 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.gradle.api.DefaultTask;
import org.gradle.api.Plugin; import org.gradle.api.Plugin;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.artifacts.ModuleVersionIdentifier;
import org.gradle.api.plugins.JavaBasePlugin;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.TaskProvider; import org.gradle.api.tasks.TaskProvider;
public class VerifyDependenciesVersionsPlugin implements Plugin<Project> { public class VerifyDependenciesVersionsPlugin implements Plugin<Project> {
@Override @Override
public void apply(Project project) { public void apply(Project project) {
TaskProvider<Task> provider = project.getTasks().register("verifyDependenciesVersions", (verifyDependenciesVersionsTask) -> { TaskProvider<VerifyDependenciesVersionsTask> verifyDependenciesVersionsTaskProvider = project.getTasks().register("verifyDependenciesVersions", VerifyDependenciesVersionsTask.class, (task) -> {
verifyDependenciesVersionsTask.setGroup("Verification"); task.setGroup("Verification");
verifyDependenciesVersionsTask.setDescription("Verify that specific dependencies are using the same version"); task.setDescription("Verify that specific dependencies are using the same version");
List<Configuration> allConfigurations = new ArrayList<>(); List<Configuration> allConfigurations = new ArrayList<>();
allConfigurations.addAll(getConfigurations(project)); allConfigurations.addAll(getConfigurations(project));
allConfigurations.addAll(getSubprojectsConfigurations(project.getSubprojects())); allConfigurations.addAll(getSubprojectsConfigurations(project.getSubprojects()));
verifyDependenciesVersionsTask.getInputs().property("dependenciesVersions", new DependencySupplier(allConfigurations)); task.setConfigurations(allConfigurations);
verifyDependenciesVersionsTask.doLast((task) -> { });
DependencySupplier dependencies = (DependencySupplier) task.getInputs().getProperties().get("dependenciesVersions"); project.getTasks().named(JavaBasePlugin.CHECK_TASK_NAME, checkTask -> checkTask.dependsOn(verifyDependenciesVersionsTaskProvider));
Map<String, List<Artifact>> artifacts = dependencies.get(); }
private List<Configuration> getConfigurations(Project project) {
return project.getConfigurations().stream()
.filter(Configuration::isCanBeResolved)
.filter((config) -> config.getName().equals("runtimeClasspath"))
.collect(Collectors.toList());
}
private List<Configuration> getSubprojectsConfigurations(Set<Project> subprojects) {
if (subprojects.isEmpty()) {
return Collections.emptyList();
}
List<Configuration> subprojectConfigurations = new ArrayList<>();
for (Project subproject : subprojects) {
subprojectConfigurations.addAll(getConfigurations(subproject));
subprojectConfigurations.addAll(getSubprojectsConfigurations(subproject.getSubprojects()));
}
return subprojectConfigurations;
}
public static class VerifyDependenciesVersionsTask extends DefaultTask {
private List<Configuration> configurations;
public void setConfigurations(List<Configuration> configurations) {
this.configurations = configurations;
}
@TaskAction
public void verify() {
Map<String, List<Artifact>> artifacts = getDependencies(this.configurations);
List<Artifact> oauth2OidcSdk = artifacts.get("oauth2-oidc-sdk"); List<Artifact> oauth2OidcSdk = artifacts.get("oauth2-oidc-sdk");
List<Artifact> nimbusJoseJwt = artifacts.get("nimbus-jose-jwt"); List<Artifact> nimbusJoseJwt = artifacts.get("nimbus-jose-jwt");
if (oauth2OidcSdk.size() > 1) { if (oauth2OidcSdk.size() > 1) {
@ -62,28 +94,20 @@ public class VerifyDependenciesVersionsPlugin implements Plugin<Project> {
+ ". Please align the versions of nimbus-jose-jwt."; + ". Please align the versions of nimbus-jose-jwt.";
throw new IllegalStateException(message); throw new IllegalStateException(message);
} }
});
});
project.getTasks().getByName("build").dependsOn(provider);
} }
private List<Configuration> getConfigurations(Project project) { private Map<String, List<Artifact>> getDependencies(List<Configuration> configurations) {
return project.getConfigurations().stream() return configurations.stream().flatMap((configuration) -> {
.filter(Configuration::isCanBeResolved) return configuration.getResolvedConfiguration().getResolvedArtifacts().stream()
.filter((config) -> config.getName().equals("runtimeClasspath")) .map((dep) -> {
.collect(Collectors.toList()); ModuleVersionIdentifier id = dep.getModuleVersion().getId();
return new Artifact(id.getName(), id.getVersion(), configuration.toString());
});
})
.distinct()
.collect(Collectors.groupingBy(Artifact::name));
} }
private List<Configuration> getSubprojectsConfigurations(Set<Project> subprojects) {
if (subprojects.isEmpty()) {
return Collections.emptyList();
}
List<Configuration> subprojectConfigurations = new ArrayList<>();
for (Project subproject : subprojects) {
subprojectConfigurations.addAll(getConfigurations(subproject));
subprojectConfigurations.addAll(getSubprojectsConfigurations(subproject.getSubprojects()));
}
return subprojectConfigurations;
} }
private static class Artifact { private static class Artifact {
@ -112,30 +136,4 @@ public class VerifyDependenciesVersionsPlugin implements Plugin<Project> {
} }
private static final class DependencySupplier implements Supplier<Map<String, List<Artifact>>> {
private final List<Configuration> configurations;
private DependencySupplier(List<Configuration> configurations) {
this.configurations = configurations;
}
@Override
public Map<String, List<Artifact>> get() {
return getDependencies(this.configurations);
}
private Map<String, List<Artifact>> getDependencies(List<Configuration> configurations) {
return configurations.stream().flatMap((configuration) -> {
return configuration.getResolvedConfiguration().getResolvedArtifacts().stream()
.map((dep) -> {
ModuleVersionIdentifier id = dep.getModuleVersion().getId();
return new Artifact(id.getName(), id.getVersion(), configuration.toString());
});
})
.distinct()
.collect(Collectors.groupingBy(Artifact::name));
}
}
} }

Loading…
Cancel
Save