[MNG-7959] User controlled relocations Addendum (#1349)

The "ban" was unfinished and wrong: what is actually needed is
to have exception with proper explanation instead.

---

https://issues.apache.org/jira/browse/MNG-7959
This commit is contained in:
Tamas Cservenak 2023-12-18 13:01:04 +01:00 committed by GitHub
parent 8001c30b69
commit 57effdd16e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 17 deletions

View File

@ -237,7 +237,7 @@ private Model loadPom(
throw new ArtifactDescriptorException(result);
}
Artifact relocatedArtifact = getRelocation(session, request, model);
Artifact relocatedArtifact = getRelocation(session, result, model);
if (relocatedArtifact != null) {
result.addRelocation(a);
a = relocatedArtifact;
@ -259,10 +259,12 @@ private Properties toProperties(Map<String, String> dominant, Map<String, String
return props;
}
private Artifact getRelocation(RepositorySystemSession session, ArtifactDescriptorRequest request, Model model) {
private Artifact getRelocation(
RepositorySystemSession session, ArtifactDescriptorResult artifactDescriptorResult, Model model)
throws ArtifactDescriptorException {
Artifact result = null;
for (MavenArtifactRelocationSource source : artifactRelocationSources.values()) {
result = source.relocatedTarget(session, request, model);
result = source.relocatedTarget(session, artifactDescriptorResult, model);
if (result != null) {
break;
}

View File

@ -21,7 +21,8 @@
import org.apache.maven.model.Model;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.eclipse.aether.resolution.ArtifactDescriptorException;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
/**
* Maven relocation source.
@ -33,9 +34,10 @@ public interface MavenArtifactRelocationSource {
* Returns {@link Artifact} instance where to relocate to, or {@code null}.
*
* @param session The session, never {@code null}.
* @param request The artifact descriptor request, never {@code null}.
* @param result The artifact descriptor result, never {@code null}.
* @param model The artifact model, never {@code null}.
* @return The {@link Artifact} to relocate to, or {@code null} if no relocation wanted.
*/
Artifact relocatedTarget(RepositorySystemSession session, ArtifactDescriptorRequest request, Model model);
Artifact relocatedTarget(RepositorySystemSession session, ArtifactDescriptorResult result, Model model)
throws ArtifactDescriptorException;
}

View File

@ -28,7 +28,7 @@
import org.apache.maven.repository.internal.RelocatedArtifact;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
import org.eclipse.sisu.Priority;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -49,13 +49,14 @@ public final class DistributionManagementArtifactRelocationSource implements Mav
private static final Logger LOGGER = LoggerFactory.getLogger(DistributionManagementArtifactRelocationSource.class);
@Override
public Artifact relocatedTarget(RepositorySystemSession session, ArtifactDescriptorRequest request, Model model) {
public Artifact relocatedTarget(
RepositorySystemSession session, ArtifactDescriptorResult artifactDescriptorResult, Model model) {
DistributionManagement distMgmt = model.getDistributionManagement();
if (distMgmt != null) {
Relocation relocation = distMgmt.getRelocation();
if (relocation != null) {
Artifact result = new RelocatedArtifact(
request.getArtifact(),
artifactDescriptorResult.getRequest().getArtifact(),
relocation.getGroupId(),
relocation.getArtifactId(),
null,
@ -64,7 +65,7 @@ public Artifact relocatedTarget(RepositorySystemSession session, ArtifactDescrip
relocation.getMessage());
LOGGER.debug(
"The artifact {} has been relocated to {}: {}",
request.getArtifact(),
artifactDescriptorResult.getRequest().getArtifact(),
result,
relocation.getMessage());
return result;

View File

@ -34,7 +34,8 @@
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.eclipse.aether.resolution.ArtifactDescriptorException;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
import org.eclipse.sisu.Priority;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -53,15 +54,28 @@ public final class UserPropertiesArtifactRelocationSource implements MavenArtifa
private static final String CONFIG_PROP_RELOCATIONS_ENTRIES = "maven.relocations.entries";
private static final Artifact SENTINEL = new DefaultArtifact("org.apache.maven.banned:user-relocation:1.0");
@Override
public Artifact relocatedTarget(RepositorySystemSession session, ArtifactDescriptorRequest request, Model model) {
public Artifact relocatedTarget(
RepositorySystemSession session, ArtifactDescriptorResult artifactDescriptorResult, Model model)
throws ArtifactDescriptorException {
Relocations relocations = (Relocations) session.getData()
.computeIfAbsent(getClass().getName() + ".relocations", () -> parseRelocations(session));
if (relocations != null) {
Relocation relocation = relocations.getRelocation(request.getArtifact());
if (relocation != null && (isProjectContext(request.getRequestContext()) || relocation.global)) {
Artifact original = artifactDescriptorResult.getRequest().getArtifact();
Relocation relocation = relocations.getRelocation(original);
if (relocation != null
&& (isProjectContext(artifactDescriptorResult.getRequest().getRequestContext())
|| relocation.global)) {
if (relocation.target == SENTINEL) {
String message = "The artifact " + original + " has been banned from resolution: "
+ (relocation.global ? "User global ban" : "User project ban");
LOGGER.debug(message);
throw new ArtifactDescriptorException(artifactDescriptorResult, message);
}
Artifact result = new RelocatedArtifact(
request.getArtifact(),
original,
isAny(relocation.target.getGroupId()) ? null : relocation.target.getGroupId(),
isAny(relocation.target.getArtifactId()) ? null : relocation.target.getArtifactId(),
isAny(relocation.target.getClassifier()) ? null : relocation.target.getClassifier(),
@ -70,7 +84,7 @@ public Artifact relocatedTarget(RepositorySystemSession session, ArtifactDescrip
relocation.global ? "User global relocation" : "User project relocation");
LOGGER.debug(
"The artifact {} has been relocated to {}: {}",
request.getArtifact(),
original,
result,
relocation.global ? "User global relocation" : "User project relocation");
return result;
@ -169,7 +183,7 @@ private Relocations parseRelocations(RepositorySystemSession session) {
if (parts.length > 1) {
t = parseArtifact(parts[1]);
} else {
t = new DefaultArtifact("org.apache.maven.banned:user-relocation:1.0");
t = SENTINEL;
}
return new Relocation(global, s, t);
})