3 changed files with 57 additions and 222 deletions
@ -1,201 +0,0 @@
@@ -1,201 +0,0 @@
|
||||
/* |
||||
* Copyright 2012-2024 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.build.constraints; |
||||
|
||||
import java.io.Serializable; |
||||
import java.util.ArrayList; |
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.TreeMap; |
||||
import java.util.TreeSet; |
||||
|
||||
import org.gradle.api.DefaultTask; |
||||
import org.gradle.api.Project; |
||||
import org.gradle.api.Task; |
||||
import org.gradle.api.artifacts.ComponentMetadataDetails; |
||||
import org.gradle.api.artifacts.Configuration; |
||||
import org.gradle.api.artifacts.DependencyConstraint; |
||||
import org.gradle.api.artifacts.DependencyConstraintMetadata; |
||||
import org.gradle.api.artifacts.DependencyConstraintSet; |
||||
import org.gradle.api.artifacts.dsl.DependencyHandler; |
||||
import org.gradle.api.tasks.Internal; |
||||
import org.gradle.api.tasks.TaskAction; |
||||
import org.gradle.platform.base.Platform; |
||||
|
||||
import org.springframework.boot.build.bom.BomExtension; |
||||
import org.springframework.boot.build.bom.BomPlugin; |
||||
import org.springframework.boot.build.bom.Library; |
||||
|
||||
/** |
||||
* {@link Task} to extract constraints from a {@link Platform}. The platform's own |
||||
* constraints and those in any boms upon which it depends are extracted. |
||||
* |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
public abstract class ExtractVersionConstraints extends DefaultTask { |
||||
|
||||
private final Configuration configuration; |
||||
|
||||
private final Map<String, String> versionConstraints = new TreeMap<>(); |
||||
|
||||
private final Set<ConstrainedVersion> constrainedVersions = new TreeSet<>(); |
||||
|
||||
private final Set<VersionProperty> versionProperties = new TreeSet<>(); |
||||
|
||||
private final List<DependencyConstraintSet> dependencyConstraintSets = new ArrayList<>(); |
||||
|
||||
private final List<BomExtension> boms = new ArrayList<>(); |
||||
|
||||
private final DependencyHandler dependencies; |
||||
|
||||
public ExtractVersionConstraints() { |
||||
this.dependencies = getProject().getDependencies(); |
||||
this.configuration = getProject().getConfigurations().create(getName()); |
||||
this.dependencies.getComponents().all(this::processMetadataDetails); |
||||
} |
||||
|
||||
public void enforcedPlatform(String projectPath) { |
||||
this.configuration.getDependencies() |
||||
.add(this.dependencies |
||||
.enforcedPlatform(this.dependencies.project(Collections.singletonMap("path", projectPath)))); |
||||
Project project = getProject().project(projectPath); |
||||
project.getPlugins().withType(BomPlugin.class).all((plugin) -> { |
||||
this.boms.add(project.getExtensions().getByType(BomExtension.class)); |
||||
this.dependencyConstraintSets |
||||
.add(project.getConfigurations().getByName("apiElements").getAllDependencyConstraints()); |
||||
}); |
||||
} |
||||
|
||||
@Internal |
||||
public Map<String, String> getVersionConstraints() { |
||||
return Collections.unmodifiableMap(this.versionConstraints); |
||||
} |
||||
|
||||
@Internal |
||||
public Set<ConstrainedVersion> getConstrainedVersions() { |
||||
return this.constrainedVersions; |
||||
} |
||||
|
||||
@Internal |
||||
public Set<VersionProperty> getVersionProperties() { |
||||
return this.versionProperties; |
||||
} |
||||
|
||||
@TaskAction |
||||
void extractVersionConstraints() { |
||||
this.configuration.resolve(); |
||||
this.boms.forEach(this::extractVersionProperties); |
||||
for (DependencyConstraintSet constraints : this.dependencyConstraintSets) { |
||||
for (DependencyConstraint constraint : constraints) { |
||||
this.versionConstraints.put(constraint.getGroup() + ":" + constraint.getName(), |
||||
constraint.getVersionConstraint().toString()); |
||||
this.constrainedVersions.add(new ConstrainedVersion(constraint.getGroup(), constraint.getName(), |
||||
constraint.getVersionConstraint().toString())); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void extractVersionProperties(BomExtension bomExtension) { |
||||
for (Library lib : bomExtension.getLibraries()) { |
||||
String versionProperty = lib.getVersionProperty(); |
||||
if (versionProperty != null) { |
||||
this.versionProperties.add(new VersionProperty(lib.getName(), versionProperty)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void processMetadataDetails(ComponentMetadataDetails details) { |
||||
details.allVariants((variantMetadata) -> variantMetadata.withDependencyConstraints((dependencyConstraints) -> { |
||||
for (DependencyConstraintMetadata constraint : dependencyConstraints) { |
||||
this.versionConstraints.put(constraint.getGroup() + ":" + constraint.getName(), |
||||
constraint.getVersionConstraint().toString()); |
||||
this.constrainedVersions.add(new ConstrainedVersion(constraint.getGroup(), constraint.getName(), |
||||
constraint.getVersionConstraint().toString())); |
||||
} |
||||
})); |
||||
} |
||||
|
||||
public static final class ConstrainedVersion implements Comparable<ConstrainedVersion>, Serializable { |
||||
|
||||
private final String group; |
||||
|
||||
private final String artifact; |
||||
|
||||
private final String version; |
||||
|
||||
private ConstrainedVersion(String group, String artifact, String version) { |
||||
this.group = group; |
||||
this.artifact = artifact; |
||||
this.version = version; |
||||
} |
||||
|
||||
public String getGroup() { |
||||
return this.group; |
||||
} |
||||
|
||||
public String getArtifact() { |
||||
return this.artifact; |
||||
} |
||||
|
||||
public String getVersion() { |
||||
return this.version; |
||||
} |
||||
|
||||
@Override |
||||
public int compareTo(ConstrainedVersion other) { |
||||
int groupComparison = this.group.compareTo(other.group); |
||||
if (groupComparison != 0) { |
||||
return groupComparison; |
||||
} |
||||
return this.artifact.compareTo(other.artifact); |
||||
} |
||||
|
||||
} |
||||
|
||||
public static final class VersionProperty implements Comparable<VersionProperty>, Serializable { |
||||
|
||||
private final String libraryName; |
||||
|
||||
private final String versionProperty; |
||||
|
||||
public VersionProperty(String libraryName, String versionProperty) { |
||||
this.libraryName = libraryName; |
||||
this.versionProperty = versionProperty; |
||||
} |
||||
|
||||
public String getLibraryName() { |
||||
return this.libraryName; |
||||
} |
||||
|
||||
public String getVersionProperty() { |
||||
return this.versionProperty; |
||||
} |
||||
|
||||
@Override |
||||
public int compareTo(VersionProperty other) { |
||||
int groupComparison = this.libraryName.compareToIgnoreCase(other.libraryName); |
||||
if (groupComparison != 0) { |
||||
return groupComparison; |
||||
} |
||||
return this.versionProperty.compareTo(other.versionProperty); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue