You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2024/04/16 08:28:58 UTC

(maven-resolver) branch master updated: [MRESOLVER-536] Cleanup redundancy and support FS without TS support (#468)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new c7e41893 [MRESOLVER-536] Cleanup redundancy and support FS without TS support (#468)
c7e41893 is described below

commit c7e41893d66fbb33e85c274293003ee25cc736eb
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Tue Apr 16 10:28:52 2024 +0200

    [MRESOLVER-536] Cleanup redundancy and support FS without TS support (#468)
    
    Centralize method and apply some common logic.
    
    ---
    
    https://issues.apache.org/jira/browse/MRESOLVER-536
---
 .../supplier/SupplierRepositorySystemFactory.java  |  4 ++-
 .../internal/impl/DefaultArtifactResolver.java     |  4 +--
 .../aether/internal/impl/DefaultInstaller.java     |  4 +--
 .../aether/internal/impl/DefaultPathProcessor.java |  5 ---
 .../org/eclipse/aether/spi/io/PathProcessor.java   | 41 +++++++++++++++++++++-
 .../aether/supplier/RepositorySystemSupplier.java  |  4 ++-
 .../aether/supplier/RepositorySystemSupplier.java  |  4 ++-
 .../internal/test/util/TestPathProcessor.java      |  4 ---
 .../aether/transport/apache/ApacheTransporter.java | 13 +++++--
 .../transport/apache/ApacheTransporterFactory.java |  8 +++--
 .../transport/apache/ApacheTransporterTest.java    |  3 +-
 .../aether/transport/jdk/JdkTransporter.java       |  7 ++--
 .../aether/transport/jetty/JettyTransporter.java   | 18 +++++-----
 .../transport/jetty/JettyTransporterFactory.java   |  8 +++--
 .../transport/jetty/JettyTransporterTest.java      |  3 +-
 15 files changed, 90 insertions(+), 40 deletions(-)

diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java
index 412f0a9a..0d618e7f 100644
--- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java
+++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java
@@ -93,7 +93,9 @@ public class SupplierRepositorySystemFactory {
                 result.put(
                         JdkTransporterFactory.NAME,
                         new JdkTransporterFactory(getChecksumExtractor(), getPathProcessor()));
-                result.put(JettyTransporterFactory.NAME, new JettyTransporterFactory(getChecksumExtractor()));
+                result.put(
+                        JettyTransporterFactory.NAME,
+                        new JettyTransporterFactory(getChecksumExtractor(), getPathProcessor()));
                 return result;
             }
         }.get();
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
index 15e10145..cee23036 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
@@ -26,7 +26,6 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.nio.file.attribute.FileTime;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -455,8 +454,7 @@ public class DefaultArtifactResolver implements ArtifactResolver {
                 boolean copy = pathProcessor.size(dst, 0L) != pathProcessor.size(path, 0L)
                         || pathProcessor.lastModified(dst, 0L) != pathLastModified;
                 if (copy) {
-                    pathProcessor.copy(path, dst);
-                    Files.setLastModifiedTime(dst, FileTime.fromMillis(pathLastModified));
+                    pathProcessor.copyWithTimestamp(path, dst);
                 }
             } catch (IOException e) {
                 throw new ArtifactTransferException(artifact, null, e);
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
index 5ac182c2..7f6cf4d8 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
@@ -22,7 +22,6 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.*;
 import java.util.ArrayList;
@@ -197,8 +196,7 @@ public class DefaultInstaller implements Installer {
                 throw new IllegalStateException("cannot install " + dstPath + " to same path");
             }
 
-            pathProcessor.copy(srcPath, dstPath);
-            Files.setLastModifiedTime(dstPath, Files.getLastModifiedTime(srcPath));
+            pathProcessor.copyWithTimestamp(srcPath, dstPath);
             lrm.add(session, new LocalArtifactRegistration(artifact));
         } catch (Exception e) {
             exception = e;
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultPathProcessor.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultPathProcessor.java
index b3af35bb..0b8c9298 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultPathProcessor.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultPathProcessor.java
@@ -47,11 +47,6 @@ public class DefaultPathProcessor implements PathProcessor {
         FileUtils.writeFile(target, p -> Files.copy(source, p, StandardCopyOption.REPLACE_EXISTING));
     }
 
-    @Override
-    public void copy(Path source, Path target) throws IOException {
-        copy(source, target, null);
-    }
-
     @Override
     public long copy(Path source, Path target, ProgressListener listener) throws IOException {
         try (InputStream in = new BufferedInputStream(Files.newInputStream(source));
diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/io/PathProcessor.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/io/PathProcessor.java
index 9b28ec2d..424386e0 100644
--- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/io/PathProcessor.java
+++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/io/PathProcessor.java
@@ -20,9 +20,11 @@ package org.eclipse.aether.spi.io;
 
 import java.io.*;
 import java.nio.ByteBuffer;
+import java.nio.file.FileSystemException;
 import java.nio.file.Files;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
 
 /**
  * A utility component to perform file-based operations.
@@ -46,6 +48,26 @@ public interface PathProcessor {
         }
     }
 
+    /**
+     * Sets last modified of path in milliseconds, if exists.
+     *
+     * @param path The path, may be {@code null}.
+     * @throws UncheckedIOException If an I/O error occurs.
+     * @return {@code true} if timestamp was successfully set, {@code false} otherwise. Reasons of {@code false} may
+     * be multiple, from file not found, to FS not supporting the setting the TS.
+     * @since TBD
+     */
+    default boolean setLastModified(Path path, long value) {
+        try {
+            Files.setLastModifiedTime(path, FileTime.fromMillis(value));
+            return true;
+        } catch (FileSystemException e) {
+            return false; // not found Ex belongs here as well
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+
     /**
      * Returns size of file, if exists.
      *
@@ -101,7 +123,24 @@ public interface PathProcessor {
      * @param target The file to copy to, must not be {@code null}.
      * @throws IOException If an I/O error occurs.
      */
-    void copy(Path source, Path target) throws IOException;
+    default void copy(Path source, Path target) throws IOException {
+        copy(source, target, null);
+    }
+
+    /**
+     * Same as {@link #copy(Path, Path)} but sets source file last modified timestamp on target as well.
+     *
+     * @param source The file to copy from, must not be {@code null}.
+     * @param target The file to copy to, must not be {@code null}.
+     * @throws IOException If an I/O error occurs.
+     * @return {@code true} if timestamp was successfully set, {@code false} otherwise.
+     * @see #setLastModified(Path, long)
+     * @since TBD
+     */
+    default boolean copyWithTimestamp(Path source, Path target) throws IOException {
+        copy(source, target, null);
+        return setLastModified(target, Files.getLastModifiedTime(source).toMillis());
+    }
 
     /**
      * Copies the specified source file to the given target file. Creates the necessary directories for the target file.
diff --git a/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java b/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
index 5016462a..e851f786 100644
--- a/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
+++ b/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
@@ -615,7 +615,9 @@ public class RepositorySystemSupplier implements Supplier<RepositorySystem> {
     protected Map<String, TransporterFactory> createTransporterFactories() {
         HashMap<String, TransporterFactory> result = new HashMap<>();
         result.put(FileTransporterFactory.NAME, new FileTransporterFactory());
-        result.put(ApacheTransporterFactory.NAME, new ApacheTransporterFactory(getChecksumExtractor()));
+        result.put(
+                ApacheTransporterFactory.NAME,
+                new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor()));
         return result;
     }
 
diff --git a/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java b/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
index cc2f994c..10ed0606 100644
--- a/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
+++ b/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
@@ -611,7 +611,9 @@ public class RepositorySystemSupplier implements Supplier<RepositorySystem> {
     protected Map<String, TransporterFactory> createTransporterFactories() {
         HashMap<String, TransporterFactory> result = new HashMap<>();
         result.put(FileTransporterFactory.NAME, new FileTransporterFactory());
-        result.put(ApacheTransporterFactory.NAME, new ApacheTransporterFactory(getChecksumExtractor()));
+        result.put(
+                ApacheTransporterFactory.NAME,
+                new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor()));
         return result;
     }
 
diff --git a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestPathProcessor.java b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestPathProcessor.java
index 0a263c88..b3e3e935 100644
--- a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestPathProcessor.java
+++ b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestPathProcessor.java
@@ -45,10 +45,6 @@ public class TestPathProcessor implements PathProcessor {
         testFileProcessor.write(target.toFile(), source);
     }
 
-    public void copy(Path source, Path target) throws IOException {
-        copy(source, target, null);
-    }
-
     public long copy(Path source, Path target, ProgressListener listener) throws IOException {
         return testFileProcessor.copy(source.toFile(), target.toFile(), null);
     }
diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java
index 4ca9707f..4a1cb463 100644
--- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java
+++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java
@@ -31,7 +31,6 @@ import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
-import java.nio.file.attribute.FileTime;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
@@ -95,6 +94,7 @@ import org.eclipse.aether.spi.connector.transport.TransportTask;
 import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractor;
 import org.eclipse.aether.spi.connector.transport.http.HttpTransporter;
 import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException;
+import org.eclipse.aether.spi.io.PathProcessor;
 import org.eclipse.aether.transfer.NoTransporterException;
 import org.eclipse.aether.transfer.TransferCancelledException;
 import org.eclipse.aether.util.ConfigUtils;
@@ -120,6 +120,8 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo
 
     private final ChecksumExtractor checksumExtractor;
 
+    private final PathProcessor pathProcessor;
+
     private final AuthenticationContext repoAuthContext;
 
     private final AuthenticationContext proxyAuthContext;
@@ -143,12 +145,17 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo
     private final boolean supportWebDav;
 
     @SuppressWarnings("checkstyle:methodlength")
-    ApacheTransporter(RemoteRepository repository, RepositorySystemSession session, ChecksumExtractor checksumExtractor)
+    ApacheTransporter(
+            RemoteRepository repository,
+            RepositorySystemSession session,
+            ChecksumExtractor checksumExtractor,
+            PathProcessor pathProcessor)
             throws NoTransporterException {
         if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) {
             throw new NoTransporterException(repository);
         }
         this.checksumExtractor = checksumExtractor;
+        this.pathProcessor = pathProcessor;
         try {
             this.baseUri = new URI(repository.getUrl()).parseServerAuthority();
             if (baseUri.isOpaque()) {
@@ -672,7 +679,7 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo
                 if (lastModifiedHeader != null) {
                     Date lastModified = DateUtils.parseDate(lastModifiedHeader.getValue());
                     if (lastModified != null) {
-                        Files.setLastModifiedTime(task.getDataPath(), FileTime.fromMillis(lastModified.getTime()));
+                        pathProcessor.setLastModified(task.getDataPath(), lastModified.getTime());
                     }
                 }
             }
diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java
index 73fd4b9e..14c076f4 100644
--- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java
+++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java
@@ -26,6 +26,7 @@ import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractor;
 import org.eclipse.aether.spi.connector.transport.http.HttpTransporter;
 import org.eclipse.aether.spi.connector.transport.http.HttpTransporterFactory;
+import org.eclipse.aether.spi.io.PathProcessor;
 import org.eclipse.aether.transfer.NoTransporterException;
 
 import static java.util.Objects.requireNonNull;
@@ -42,9 +43,12 @@ public final class ApacheTransporterFactory implements HttpTransporterFactory {
 
     private final ChecksumExtractor checksumExtractor;
 
+    private final PathProcessor pathProcessor;
+
     @Inject
-    public ApacheTransporterFactory(ChecksumExtractor checksumExtractor) {
+    public ApacheTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) {
         this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor");
+        this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor");
     }
 
     @Override
@@ -69,6 +73,6 @@ public final class ApacheTransporterFactory implements HttpTransporterFactory {
         requireNonNull(session, "session cannot be null");
         requireNonNull(repository, "repository cannot be null");
 
-        return new ApacheTransporter(repository, session, checksumExtractor);
+        return new ApacheTransporter(repository, session, checksumExtractor, pathProcessor);
     }
 }
diff --git a/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java b/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java
index a3a8d2ed..f468e42a 100644
--- a/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java
+++ b/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java
@@ -27,6 +27,7 @@ import org.apache.http.pool.PoolStats;
 import org.eclipse.aether.ConfigurationProperties;
 import org.eclipse.aether.DefaultRepositoryCache;
 import org.eclipse.aether.internal.test.util.TestFileUtils;
+import org.eclipse.aether.internal.test.util.TestPathProcessor;
 import org.eclipse.aether.internal.test.util.http.HttpTransporterTest;
 import org.eclipse.aether.internal.test.util.http.RecordingTransportListener;
 import org.eclipse.aether.spi.connector.transport.GetTask;
@@ -42,7 +43,7 @@ import static org.junit.jupiter.api.Assertions.*;
 class ApacheTransporterTest extends HttpTransporterTest {
 
     public ApacheTransporterTest() {
-        super(() -> new ApacheTransporterFactory(standardChecksumExtractor()));
+        super(() -> new ApacheTransporterFactory(standardChecksumExtractor(), new TestPathProcessor()));
     }
 
     @Test
diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
index 77a2312d..6287ff6c 100644
--- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
+++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
@@ -32,7 +32,6 @@ import java.net.http.HttpResponse;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
-import java.nio.file.attribute.FileTime;
 import java.security.cert.X509Certificate;
 import java.time.Duration;
 import java.time.Instant;
@@ -304,11 +303,11 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte
                         .orElse(null); // note: Wagon also does first not last
                 if (lastModifiedHeader != null) {
                     try {
-                        Files.setLastModifiedTime(
+                        pathProcessor.setLastModified(
                                 task.getDataPath(),
-                                FileTime.fromMillis(ZonedDateTime.parse(lastModifiedHeader, RFC7231)
+                                ZonedDateTime.parse(lastModifiedHeader, RFC7231)
                                         .toInstant()
-                                        .toEpochMilli()));
+                                        .toEpochMilli());
                     } catch (DateTimeParseException e) {
                         // fall through
                     }
diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java
index 107dda51..9dd46127 100644
--- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java
+++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java
@@ -27,9 +27,7 @@ import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
-import java.nio.file.attribute.FileTime;
 import java.security.cert.X509Certificate;
-import java.time.format.DateTimeParseException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -52,6 +50,7 @@ import org.eclipse.aether.spi.connector.transport.TransportTask;
 import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractor;
 import org.eclipse.aether.spi.connector.transport.http.HttpTransporter;
 import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException;
+import org.eclipse.aether.spi.io.PathProcessor;
 import org.eclipse.aether.transfer.NoTransporterException;
 import org.eclipse.aether.transfer.TransferCancelledException;
 import org.eclipse.aether.util.ConfigUtils;
@@ -85,6 +84,8 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor
 
     private final ChecksumExtractor checksumExtractor;
 
+    private final PathProcessor pathProcessor;
+
     private final URI baseUri;
 
     private final HttpClient client;
@@ -101,9 +102,14 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor
 
     private final BasicAuthentication.BasicResult basicProxyAuthenticationResult;
 
-    JettyTransporter(RepositorySystemSession session, RemoteRepository repository, ChecksumExtractor checksumExtractor)
+    JettyTransporter(
+            RepositorySystemSession session,
+            RemoteRepository repository,
+            ChecksumExtractor checksumExtractor,
+            PathProcessor pathProcessor)
             throws NoTransporterException {
         this.checksumExtractor = checksumExtractor;
+        this.pathProcessor = pathProcessor;
         try {
             URI uri = new URI(repository.getUrl()).parseServerAuthority();
             if (uri.isOpaque()) {
@@ -300,11 +306,7 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor
             long lastModified =
                     response.getHeaders().getDateField(LAST_MODIFIED); // note: Wagon also does first not last
             if (lastModified != -1) {
-                try {
-                    Files.setLastModifiedTime(task.getDataPath(), FileTime.fromMillis(lastModified));
-                } catch (DateTimeParseException e) {
-                    // fall through
-                }
+                pathProcessor.setLastModified(task.getDataPath(), lastModified);
             }
         }
         Map<String, String> checksums = checksumExtractor.extractChecksums(headerGetter(response));
diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java
index 901d82d7..83ecafce 100644
--- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java
+++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java
@@ -26,6 +26,7 @@ import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractor;
 import org.eclipse.aether.spi.connector.transport.http.HttpTransporter;
 import org.eclipse.aether.spi.connector.transport.http.HttpTransporterFactory;
+import org.eclipse.aether.spi.io.PathProcessor;
 import org.eclipse.aether.transfer.NoTransporterException;
 
 import static java.util.Objects.requireNonNull;
@@ -43,9 +44,12 @@ public final class JettyTransporterFactory implements HttpTransporterFactory {
 
     private final ChecksumExtractor checksumExtractor;
 
+    private final PathProcessor pathProcessor;
+
     @Inject
-    public JettyTransporterFactory(ChecksumExtractor checksumExtractor) {
+    public JettyTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) {
         this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor");
+        this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor");
     }
 
     @Override
@@ -68,6 +72,6 @@ public final class JettyTransporterFactory implements HttpTransporterFactory {
             throw new NoTransporterException(repository);
         }
 
-        return new JettyTransporter(session, repository, checksumExtractor);
+        return new JettyTransporter(session, repository, checksumExtractor, pathProcessor);
     }
 }
diff --git a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java
index 483f203f..67b3c976 100644
--- a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java
+++ b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java
@@ -18,6 +18,7 @@
  */
 package org.eclipse.aether.transport.jetty;
 
+import org.eclipse.aether.internal.test.util.TestPathProcessor;
 import org.eclipse.aether.internal.test.util.http.HttpTransporterTest;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -58,6 +59,6 @@ class JettyTransporterTest extends HttpTransporterTest {
     protected void testPut_Authenticated_ExpectContinueRejected_ExplicitlyConfiguredHeader() {}
 
     public JettyTransporterTest() {
-        super(() -> new JettyTransporterFactory(standardChecksumExtractor()));
+        super(() -> new JettyTransporterFactory(standardChecksumExtractor(), new TestPathProcessor()));
     }
 }