This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch maven-3.9.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-3.9.x by this push:
     new 88681b8b76 [3.9.x] Apply resolver changes and improvements (#11536)
88681b8b76 is described below

commit 88681b8b764e523298a7f98d428a8ec5ffc16548
Author: Tamas Cservenak <[email protected]>
AuthorDate: Wed Dec 10 12:34:27 2025 +0100

    [3.9.x] Apply resolver changes and improvements (#11536)
    
    Changes:
    * allow per-request metadata nature
    * redirect maven-compat update check manager to resolver
---
 .../legacy/DefaultUpdateCheckManager.java          | 139 +++------------------
 .../transform/TransformationManagerTest.java       |   8 ++
 .../legacy/DefaultUpdateCheckManagerTest.java      |   4 +-
 .../repository/legacy/DefaultWagonManagerTest.java |   8 ++
 .../internal/DefaultVersionRangeResolver.java      |   2 +-
 5 files changed, 39 insertions(+), 122 deletions(-)

diff --git 
a/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java
 
b/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java
index fe32f9c138..320cd4ef97 100644
--- 
a/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java
+++ 
b/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java
@@ -19,13 +19,8 @@
 package org.apache.maven.repository.legacy;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.channels.Channels;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Properties;
 
 import org.apache.maven.artifact.Artifact;
@@ -35,21 +30,31 @@
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
 import org.apache.maven.repository.Proxy;
 import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.logging.Logger;
+import org.eclipse.aether.internal.impl.TrackingFileManager;
 
 /**
  * DefaultUpdateCheckManager
  */
 @Component(role = UpdateCheckManager.class)
 public class DefaultUpdateCheckManager extends AbstractLogEnabled implements 
UpdateCheckManager {
+    @Requirement
+    private TrackingFileManager trackingFileManager;
 
     private static final String ERROR_KEY_SUFFIX = ".error";
 
-    public DefaultUpdateCheckManager() {}
+    public DefaultUpdateCheckManager() {
+        // for plexus
+    }
 
-    public DefaultUpdateCheckManager(Logger logger) {
+    /**
+     * For testing purposes.
+     */
+    public DefaultUpdateCheckManager(Logger logger, TrackingFileManager 
trackingFileManager) {
         enableLogging(logger);
+        this.trackingFileManager = trackingFileManager;
     }
 
     public static final String LAST_UPDATE_TAG = ".lastUpdated";
@@ -148,7 +153,7 @@ public void touch(Artifact artifact, ArtifactRepository 
repository, String error
         File touchfile = getTouchfile(artifact);
 
         if (file.exists()) {
-            touchfile.delete();
+            trackingFileManager.delete(touchfile);
         } else {
             writeLastUpdated(touchfile, getRepositoryKey(repository), error);
         }
@@ -192,70 +197,10 @@ String getRepositoryKey(ArtifactRepository repository) {
     }
 
     private void writeLastUpdated(File touchfile, String key, String error) {
-        synchronized (touchfile.getAbsolutePath().intern()) {
-            if (!touchfile.getParentFile().exists()
-                    && !touchfile.getParentFile().mkdirs()) {
-                getLogger()
-                        .debug("Failed to create directory: " + 
touchfile.getParent()
-                                + " for tracking artifact metadata 
resolution.");
-                return;
-            }
-
-            FileChannel channel = null;
-            FileLock lock = null;
-            try {
-                Properties props = new Properties();
-
-                channel = new RandomAccessFile(touchfile, "rw").getChannel();
-                lock = channel.lock();
-
-                if (touchfile.canRead()) {
-                    getLogger().debug("Reading resolution-state from: " + 
touchfile);
-                    props.load(Channels.newInputStream(channel));
-                }
-
-                props.setProperty(key, 
Long.toString(System.currentTimeMillis()));
-
-                if (error != null) {
-                    props.setProperty(key + ERROR_KEY_SUFFIX, error);
-                } else {
-                    props.remove(key + ERROR_KEY_SUFFIX);
-                }
-
-                getLogger().debug("Writing resolution-state to: " + touchfile);
-                channel.truncate(0);
-                props.store(Channels.newOutputStream(channel), "Last modified 
on: " + new Date());
-
-                lock.release();
-                lock = null;
-
-                channel.close();
-                channel = null;
-            } catch (IOException e) {
-                getLogger()
-                        .debug(
-                                "Failed to record lastUpdated information for 
resolution.\nFile: "
-                                        + touchfile.toString() + "; key: " + 
key,
-                                e);
-            } finally {
-                if (lock != null) {
-                    try {
-                        lock.release();
-                    } catch (IOException e) {
-                        getLogger()
-                                .debug("Error releasing exclusive lock for 
resolution tracking file: " + touchfile, e);
-                    }
-                }
-
-                if (channel != null) {
-                    try {
-                        channel.close();
-                    } catch (IOException e) {
-                        getLogger().debug("Error closing FileChannel for 
resolution tracking file: " + touchfile, e);
-                    }
-                }
-            }
-        }
+        HashMap<String, String> update = new HashMap<>();
+        update.put(key, Long.toString(System.currentTimeMillis()));
+        update.put(key + ERROR_KEY_SUFFIX, error); // error==null => remove 
mapping
+        trackingFileManager.update(touchfile, update);
     }
 
     Date readLastUpdated(File touchfile, String key) {
@@ -284,53 +229,7 @@ private String getError(File touchFile, String key) {
     }
 
     private Properties read(File touchfile) {
-        if (!touchfile.canRead()) {
-            getLogger().debug("Skipped unreadable resolution tracking file " + 
touchfile);
-            return null;
-        }
-
-        synchronized (touchfile.getAbsolutePath().intern()) {
-            FileInputStream in = null;
-            FileLock lock = null;
-
-            try {
-                Properties props = new Properties();
-
-                in = new FileInputStream(touchfile);
-                lock = in.getChannel().lock(0, Long.MAX_VALUE, true);
-
-                getLogger().debug("Reading resolution-state from: " + 
touchfile);
-                props.load(in);
-
-                lock.release();
-                lock = null;
-
-                in.close();
-                in = null;
-
-                return props;
-            } catch (IOException e) {
-                getLogger().debug("Failed to read resolution tracking file " + 
touchfile, e);
-
-                return null;
-            } finally {
-                if (lock != null) {
-                    try {
-                        lock.release();
-                    } catch (IOException e) {
-                        getLogger().debug("Error releasing shared lock for 
resolution tracking file: " + touchfile, e);
-                    }
-                }
-
-                if (in != null) {
-                    try {
-                        in.close();
-                    } catch (IOException e) {
-                        getLogger().debug("Error closing FileChannel for 
resolution tracking file: " + touchfile, e);
-                    }
-                }
-            }
-        }
+        return trackingFileManager.read(touchfile);
     }
 
     File getTouchfile(Artifact artifact) {
diff --git 
a/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java
 
b/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java
index f6ee97bf32..5ea7a9c888 100644
--- 
a/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java
+++ 
b/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java
@@ -24,10 +24,18 @@
 import 
org.apache.maven.repository.legacy.resolver.transform.LatestArtifactTransformation;
 import 
org.apache.maven.repository.legacy.resolver.transform.ReleaseArtifactTransformation;
 import 
org.apache.maven.repository.legacy.resolver.transform.SnapshotTransformation;
+import org.codehaus.plexus.ContainerConfiguration;
+import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusTestCase;
 
 /** @author Jason van Zyl */
 public class TransformationManagerTest extends PlexusTestCase {
+    @Override
+    protected void customizeContainerConfiguration(ContainerConfiguration 
configuration) {
+        configuration.setAutoWiring(true);
+        configuration.setClassPathScanning(PlexusConstants.SCANNING_INDEX);
+    }
+
     public void testTransformationManager() throws Exception {
         ArtifactTransformationManager tm = 
lookup(ArtifactTransformationManager.class);
 
diff --git 
a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java
 
b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java
index 8d5d156e26..8492ec30ff 100644
--- 
a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java
+++ 
b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java
@@ -28,6 +28,7 @@
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.logging.console.ConsoleLogger;
+import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
 
 public class DefaultUpdateCheckManagerTest extends 
AbstractArtifactComponentTestCase {
 
@@ -42,7 +43,8 @@ protected String component() {
     protected void setUp() throws Exception {
         super.setUp();
 
-        updateCheckManager = new DefaultUpdateCheckManager(new 
ConsoleLogger(Logger.LEVEL_DEBUG, "test"));
+        updateCheckManager = new DefaultUpdateCheckManager(
+                new ConsoleLogger(Logger.LEVEL_DEBUG, "test"), new 
DefaultTrackingFileManager());
     }
 
     public void testArtifact() throws Exception {
diff --git 
a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java
 
b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java
index 54271769b4..f5467ab146 100644
--- 
a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java
+++ 
b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java
@@ -42,6 +42,8 @@
 import org.apache.maven.wagon.events.TransferListener;
 import org.apache.maven.wagon.observers.AbstractTransferListener;
 import org.apache.maven.wagon.observers.Debug;
+import org.codehaus.plexus.ContainerConfiguration;
+import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.util.FileUtils;
 
@@ -57,6 +59,12 @@ public class DefaultWagonManagerTest extends PlexusTestCase {
 
     private ArtifactRepositoryFactory artifactRepositoryFactory;
 
+    @Override
+    protected void customizeContainerConfiguration(ContainerConfiguration 
configuration) {
+        configuration.setAutoWiring(true);
+        configuration.setClassPathScanning(PlexusConstants.SCANNING_INDEX);
+    }
+
     protected void setUp() throws Exception {
         super.setUp();
         wagonManager = (DefaultWagonManager) lookup(WagonManager.class);
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
index 6bbb4ec9f0..23b7bc84b5 100644
--- 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
@@ -156,7 +156,7 @@ public VersionRangeResult 
resolveVersionRange(RepositorySystemSession session, V
             } else {
                 Metadata.Nature wantedNature;
                 String natureString = ConfigUtils.getString(
-                        session, Metadata.Nature.RELEASE_OR_SNAPSHOT.name(), 
MAVEN_VERSION_RANGE_RESOLUTION_NATURE);
+                        session, request.getNature().name(), 
MAVEN_VERSION_RANGE_RESOLUTION_NATURE);
                 if ("auto".equals(natureString)) {
                     org.eclipse.aether.artifact.Artifact lowerArtifact = 
lowerBound != null
                             ? request.getArtifact()

Reply via email to