Skip to content

Commit a0360b3

Browse files
authored
Augment version range resolution used repositories (#2574)
Ability to control which repositories to be queried to resolve ranges. Introduced new property: `maven.versionRangeResolutionNature` that is used in VersionRangeResolver, and means: * not set; behave as before (default) * "auto" string; will check lower and upper bounds, and if any is snapshot, will querty snapshot reposes otherwise not * any valid value of resolver Metadata.Nature enum; then will use that Fixes: #2558 Note: spotless insisted on reformatting the unrelated class, unsure why? and now CI fails due formatting???
1 parent ef54677 commit a0360b3

File tree

1 file changed

+43
-5
lines changed

1 file changed

+43
-5
lines changed

maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Collections;
2929
import java.util.HashMap;
3030
import java.util.List;
31+
import java.util.Locale;
3132
import java.util.Map;
3233
import java.util.Objects;
3334

@@ -55,6 +56,7 @@
5556
import org.eclipse.aether.spi.locator.Service;
5657
import org.eclipse.aether.spi.locator.ServiceLocator;
5758
import org.eclipse.aether.spi.synccontext.SyncContextFactory;
59+
import org.eclipse.aether.util.ConfigUtils;
5860
import org.eclipse.aether.util.version.GenericVersionScheme;
5961
import org.eclipse.aether.version.InvalidVersionSpecificationException;
6062
import org.eclipse.aether.version.Version;
@@ -68,6 +70,16 @@
6870
@Named
6971
@Singleton
7072
public class DefaultVersionRangeResolver implements VersionRangeResolver, Service {
73+
/**
74+
* Configuration property for version range resolution used metadata {@link Metadata.Nature}.
75+
* It may contain string names of {@link Metadata.Nature} enum values, or string value {@code "auto"}
76+
* to decide based on range: if any of the boundary versions is snapshot, {@link Metadata.Nature#RELEASE_OR_SNAPSHOT}
77+
* will be used, otherwise {@link Metadata.Nature#RELEASE}.
78+
* Default (when unset) is existing Maven 3 behaviour, using {@link Metadata.Nature#RELEASE_OR_SNAPSHOT}.
79+
*
80+
* @since 3.9.11
81+
*/
82+
public static final String MAVEN_VERSION_RANGE_RESOLUTION_NATURE = "maven.versionRangeResolutionNature";
7183

7284
private static final String MAVEN_METADATA_XML = "maven-metadata.xml";
7385

@@ -138,11 +150,34 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
138150
result.addVersion(versionConstraint.getVersion());
139151
} else {
140152
VersionRange.Bound lowerBound = versionConstraint.getRange().getLowerBound();
141-
if (lowerBound != null
142-
&& lowerBound.equals(versionConstraint.getRange().getUpperBound())) {
153+
VersionRange.Bound upperBound = versionConstraint.getRange().getUpperBound();
154+
if (lowerBound != null && lowerBound.equals(upperBound)) {
143155
result.addVersion(lowerBound.getVersion());
144156
} else {
145-
Map<String, ArtifactRepository> versionIndex = getVersions(session, result, request);
157+
Metadata.Nature wantedNature;
158+
String natureString = ConfigUtils.getString(
159+
session, Metadata.Nature.RELEASE_OR_SNAPSHOT.name(), MAVEN_VERSION_RANGE_RESOLUTION_NATURE);
160+
if ("auto".equals(natureString)) {
161+
org.eclipse.aether.artifact.Artifact lowerArtifact = lowerBound != null
162+
? request.getArtifact()
163+
.setVersion(lowerBound.getVersion().toString())
164+
: null;
165+
org.eclipse.aether.artifact.Artifact upperArtifact = upperBound != null
166+
? request.getArtifact()
167+
.setVersion(upperBound.getVersion().toString())
168+
: null;
169+
170+
if (lowerArtifact != null && lowerArtifact.isSnapshot()
171+
|| upperArtifact != null && upperArtifact.isSnapshot()) {
172+
wantedNature = Metadata.Nature.RELEASE_OR_SNAPSHOT;
173+
} else {
174+
wantedNature = Metadata.Nature.RELEASE;
175+
}
176+
} else {
177+
wantedNature = Metadata.Nature.valueOf(natureString.toUpperCase(Locale.ROOT));
178+
}
179+
180+
Map<String, ArtifactRepository> versionIndex = getVersions(session, result, request, wantedNature);
146181

147182
List<Version> versions = new ArrayList<>();
148183
for (Map.Entry<String, ArtifactRepository> v : versionIndex.entrySet()) {
@@ -166,7 +201,10 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
166201
}
167202

168203
private Map<String, ArtifactRepository> getVersions(
169-
RepositorySystemSession session, VersionRangeResult result, VersionRangeRequest request) {
204+
RepositorySystemSession session,
205+
VersionRangeResult result,
206+
VersionRangeRequest request,
207+
Metadata.Nature wantedNature) {
170208
RequestTrace trace = RequestTrace.newChild(request.getTrace(), request);
171209

172210
Map<String, ArtifactRepository> versionIndex = new HashMap<>();
@@ -175,7 +213,7 @@ private Map<String, ArtifactRepository> getVersions(
175213
request.getArtifact().getGroupId(),
176214
request.getArtifact().getArtifactId(),
177215
MAVEN_METADATA_XML,
178-
Metadata.Nature.RELEASE_OR_SNAPSHOT);
216+
wantedNature);
179217

180218
List<MetadataRequest> metadataRequests =
181219
new ArrayList<>(request.getRepositories().size());

0 commit comments

Comments
 (0)