diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java index 615cfad7e..99cf8f87b 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java @@ -66,6 +66,13 @@ public Transporter newTransporter(RepositorySystemSession session, RemoteReposit List errors = new ArrayList<>(); for (PrioritizedComponent factory : factories.getEnabled()) { + if (!factory.getComponent().canHandle(repository.getProtocol())) { + LOGGER.debug( + "Transporter factory {} cannot deal with protocol {}", + factory.getComponent(), + repository.getProtocol()); + continue; + } try { Transporter transporter = factory.getComponent().newInstance(session, repository); diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/TransporterFactory.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/TransporterFactory.java index 49886e4b8..3f46dcfae 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/TransporterFactory.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/TransporterFactory.java @@ -18,6 +18,8 @@ */ package org.eclipse.aether.spi.connector.transport; +import java.util.Map; + import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.transfer.NoTransporterException; @@ -31,9 +33,39 @@ */ public interface TransporterFactory { + /** + * A key for transporter properties. + * @see #getProperties() + */ + public interface TransporterPropertyKey {} + + /** + * Indicates whether this factory can handle the specified repository protocol. + * Even if {@code true} is returned the factory may still refuse to create a transporter for the given protocol. + * + * @param repositoryProtocol The repository protocol to check, may be {@code null}. + * @return {@code true} if this factory can potentially handle the specified repository protocol, {@code false} otherwise. + * @see #newInstance(RepositorySystemSession, RemoteRepository) + */ + default boolean canHandle(String repositoryProtocol) { + return true; + } + + /** + * Gets the properties exposing information about this transporter factory. + * Some are mandatory and some are transporter-specific. + * + * @return A map of transporter property keys with values, never {@code null}. + * @throws UnsupportedOperationException if the transporter factory does not implement this method. + */ + default Map getProperties() { + throw new UnsupportedOperationException("getProperties not implemented"); + } + /** * Tries to create a transporter for the specified remote repository. Typically, a factory will inspect * {@link RemoteRepository#getProtocol()} to determine whether it can handle a repository. + * This should be preceded by a call to {@link #canHandle(String)}. * * @param session The repository system session from which to configure the transporter, must not be {@code null}. * In particular, a transporter should obey the timeouts configured for the session. diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/HttpTransporterFactory.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/HttpTransporterFactory.java index a3c64bc5b..bf1547982 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/HttpTransporterFactory.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/HttpTransporterFactory.java @@ -30,6 +30,11 @@ */ public interface HttpTransporterFactory extends TransporterFactory { + @Override + default boolean canHandle(String repositoryProtocol) { + return "http".equalsIgnoreCase(repositoryProtocol) || "https".equalsIgnoreCase(repositoryProtocol); + } + /** * Tries to create HTTP transporter for the specified remote repository. * diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java index 316657d43..0bf9813b7 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java @@ -72,6 +72,7 @@ import static java.util.Objects.requireNonNull; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -1399,7 +1400,7 @@ protected void testAuthSchemePreemptive() throws Exception { @Test void testInit_BadProtocol() { - assertThrows(NoTransporterException.class, () -> newTransporter("bad:/void")); + assertFalse(factory.canHandle("bad:/void")); } @Test 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 3a3424a15..22449b623 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 @@ -73,10 +73,7 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi requireNonNull(session, "session cannot be null"); requireNonNull(repository, "repository cannot be null"); - if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) { - throw new NoTransporterException(repository); - } - + // repository protocol already checked in canHandle return new ApacheTransporter(repository, session, checksumExtractor, pathProcessor); } } diff --git a/maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java b/maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java index 646dadbe2..b94d96610 100644 --- a/maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java +++ b/maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java @@ -69,16 +69,17 @@ public ClasspathTransporterFactory setPriority(float priority) { return this; } + @Override + public boolean canHandle(String repositoryProtocol) { + return "classpath".equalsIgnoreCase(repositoryProtocol); + } + @Override public Transporter newInstance(RepositorySystemSession session, RemoteRepository repository) throws NoTransporterException { requireNonNull(session, "session cannot be null"); requireNonNull(repository, "repository cannot be null"); - if (!"classpath".equalsIgnoreCase(repository.getProtocol())) { - throw new NoTransporterException(repository); - } - return new ClasspathTransporter(session, repository); } } diff --git a/maven-resolver-transport-classpath/src/test/java/org/eclipse/aether/transport/classpath/ClasspathTransporterTest.java b/maven-resolver-transport-classpath/src/test/java/org/eclipse/aether/transport/classpath/ClasspathTransporterTest.java index dc0d499f4..37f1f2f14 100644 --- a/maven-resolver-transport-classpath/src/test/java/org/eclipse/aether/transport/classpath/ClasspathTransporterTest.java +++ b/maven-resolver-transport-classpath/src/test/java/org/eclipse/aether/transport/classpath/ClasspathTransporterTest.java @@ -32,7 +32,6 @@ import org.eclipse.aether.spi.connector.transport.PutTask; import org.eclipse.aether.spi.connector.transport.Transporter; import org.eclipse.aether.spi.connector.transport.TransporterFactory; -import org.eclipse.aether.transfer.NoTransporterException; import org.eclipse.aether.transfer.TransferCancelledException; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -59,7 +58,9 @@ private void newTransporter(String url) throws Exception { transporter.close(); transporter = null; } - transporter = factory.newInstance(session, newRepo(url)); + RemoteRepository repo = newRepo(url); + assertTrue(factory.canHandle(repo.getProtocol())); + transporter = factory.newInstance(session, repo); } @BeforeEach @@ -259,8 +260,8 @@ void testPut_Closed() throws Exception { } @Test - void testInit_BadProtocol() { - assertThrows(NoTransporterException.class, () -> newTransporter("bad:/void")); + void testCanHandle_BadProtocol() { + assertFalse(factory.canHandle("bad:/void")); } @Test diff --git a/maven-resolver-transport-file/src/main/java/org/eclipse/aether/transport/file/FileTransporterFactory.java b/maven-resolver-transport-file/src/main/java/org/eclipse/aether/transport/file/FileTransporterFactory.java index a4051b9e1..3f741f050 100644 --- a/maven-resolver-transport-file/src/main/java/org/eclipse/aether/transport/file/FileTransporterFactory.java +++ b/maven-resolver-transport-file/src/main/java/org/eclipse/aether/transport/file/FileTransporterFactory.java @@ -65,6 +65,12 @@ public FileTransporterFactory setPriority(float priority) { return this; } + + @Override + public boolean canHandle(String repositoryProtocol) { + return "bundle".equalsIgnoreCase(repositoryProtocol) || "file".equalsIgnoreCase(repositoryProtocol); + } + /** * Creates new instance of {@link FileTransporter}. * diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java index bfc3c2098..044652a7a 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java @@ -68,10 +68,7 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi requireNonNull(session, "session cannot be null"); requireNonNull(repository, "repository cannot be null"); - if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) { - throw new NoTransporterException(repository); - } - + // repository protocol already checked in canHandle return new JdkTransporter(session, repository, javaVersion(), checksumExtractor, pathProcessor); } 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 83ecafce8..9dd9a898b 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 @@ -68,10 +68,7 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi requireNonNull(session, "session cannot be null"); requireNonNull(repository, "repository cannot be null"); - if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) { - throw new NoTransporterException(repository); - } - + // repository protocol already checked in canHandle return new JettyTransporter(session, repository, checksumExtractor, pathProcessor); } }