Skip to content

Commit 9079c94

Browse files
committed
Expose transporter details per protocol
Instead of purely relying on exception handling when a transporter cannot deal with a certain kind of repository an in advance check on the repository protocol is introduced This closes #1770
1 parent ec52693 commit 9079c94

9 files changed

Lines changed: 59 additions & 21 deletions

File tree

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ public Transporter newTransporter(RepositorySystemSession session, RemoteReposit
6666

6767
List<NoTransporterException> errors = new ArrayList<>();
6868
for (PrioritizedComponent<TransporterFactory> factory : factories.getEnabled()) {
69+
if (!factory.getComponent().canHandle(repository.getProtocol())) {
70+
LOGGER.debug(
71+
"Transporter factory {} cannot deal with protocol {}",
72+
factory.getComponent(),
73+
repository.getProtocol());
74+
continue;
75+
}
6976
try {
7077
Transporter transporter = factory.getComponent().newInstance(session, repository);
7178

maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/TransporterFactory.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
*/
1919
package org.eclipse.aether.spi.connector.transport;
2020

21+
import java.util.Map;
22+
2123
import org.eclipse.aether.RepositorySystemSession;
2224
import org.eclipse.aether.repository.RemoteRepository;
2325
import org.eclipse.aether.transfer.NoTransporterException;
@@ -31,9 +33,39 @@
3133
*/
3234
public interface TransporterFactory {
3335

36+
/**
37+
* A key for transporter properties.
38+
* @see #getProperties()
39+
*/
40+
public interface TransporterPropertyKey {}
41+
42+
/**
43+
* Indicates whether this factory can handle the specified repository protocol.
44+
* Even if {@code true} is returned the factory may still refuse to create a transporter for the given protocol.
45+
*
46+
* @param repositoryProtocol The repository protocol to check, may be {@code null}.
47+
* @return {@code true} if this factory can potentially handle the specified repository protocol, {@code false} otherwise.
48+
* @see #newInstance(RepositorySystemSession, RemoteRepository)
49+
*/
50+
default boolean canHandle(String repositoryProtocol) {
51+
return true;
52+
}
53+
54+
/**
55+
* Gets the properties exposing information about this transporter factory.
56+
* Some are mandatory and some are transporter-specific.
57+
*
58+
* @return A map of transporter property keys with values, never {@code null}.
59+
* @throws UnsupportedOperationException if the transporter factory does not implement this method.
60+
*/
61+
default Map<TransporterPropertyKey, Object> getProperties() {
62+
throw new UnsupportedOperationException("getProperties not implemented");
63+
}
64+
3465
/**
3566
* Tries to create a transporter for the specified remote repository. Typically, a factory will inspect
3667
* {@link RemoteRepository#getProtocol()} to determine whether it can handle a repository.
68+
* This should be preceded by a call to {@link #canHandle(String)}.
3769
*
3870
* @param session The repository system session from which to configure the transporter, must not be {@code null}.
3971
* In particular, a transporter should obey the timeouts configured for the session.

maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/HttpTransporterFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
*/
3131
public interface HttpTransporterFactory extends TransporterFactory {
3232

33+
@Override
34+
default boolean canHandle(String repositoryProtocol) {
35+
return "http".equalsIgnoreCase(repositoryProtocol) || "https".equalsIgnoreCase(repositoryProtocol);
36+
}
37+
3338
/**
3439
* Tries to create HTTP transporter for the specified remote repository.
3540
*

maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272

7373
import static java.util.Objects.requireNonNull;
7474
import static org.junit.jupiter.api.Assertions.assertEquals;
75+
import static org.junit.jupiter.api.Assertions.assertFalse;
7576
import static org.junit.jupiter.api.Assertions.assertNotNull;
7677
import static org.junit.jupiter.api.Assertions.assertNull;
7778
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -1399,7 +1400,7 @@ protected void testAuthSchemePreemptive() throws Exception {
13991400

14001401
@Test
14011402
void testInit_BadProtocol() {
1402-
assertThrows(NoTransporterException.class, () -> newTransporter("bad:/void"));
1403+
assertFalse(factory.canHandle("bad:/void"));
14031404
}
14041405

14051406
@Test

maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,7 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi
7373
requireNonNull(session, "session cannot be null");
7474
requireNonNull(repository, "repository cannot be null");
7575

76-
if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) {
77-
throw new NoTransporterException(repository);
78-
}
79-
76+
// repository protocol already checked in canHandle
8077
return new ApacheTransporter(repository, session, checksumExtractor, pathProcessor);
8178
}
8279
}

maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,17 @@ public ClasspathTransporterFactory setPriority(float priority) {
6969
return this;
7070
}
7171

72+
@Override
73+
public boolean canHandle(String repositoryProtocol) {
74+
return "classpath".equalsIgnoreCase(repositoryProtocol);
75+
}
76+
7277
@Override
7378
public Transporter newInstance(RepositorySystemSession session, RemoteRepository repository)
7479
throws NoTransporterException {
7580
requireNonNull(session, "session cannot be null");
7681
requireNonNull(repository, "repository cannot be null");
7782

78-
if (!"classpath".equalsIgnoreCase(repository.getProtocol())) {
79-
throw new NoTransporterException(repository);
80-
}
81-
8283
return new ClasspathTransporter(session, repository);
8384
}
8485
}

maven-resolver-transport-classpath/src/test/java/org/eclipse/aether/transport/classpath/ClasspathTransporterTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.eclipse.aether.spi.connector.transport.PutTask;
3333
import org.eclipse.aether.spi.connector.transport.Transporter;
3434
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
35-
import org.eclipse.aether.transfer.NoTransporterException;
3635
import org.eclipse.aether.transfer.TransferCancelledException;
3736
import org.junit.jupiter.api.AfterEach;
3837
import org.junit.jupiter.api.BeforeEach;
@@ -59,7 +58,9 @@ private void newTransporter(String url) throws Exception {
5958
transporter.close();
6059
transporter = null;
6160
}
62-
transporter = factory.newInstance(session, newRepo(url));
61+
RemoteRepository repo = newRepo(url);
62+
assertTrue(factory.canHandle(repo.getProtocol()));
63+
transporter = factory.newInstance(session, repo);
6364
}
6465

6566
@BeforeEach
@@ -259,8 +260,8 @@ void testPut_Closed() throws Exception {
259260
}
260261

261262
@Test
262-
void testInit_BadProtocol() {
263-
assertThrows(NoTransporterException.class, () -> newTransporter("bad:/void"));
263+
void testCanHandle_BadProtocol() {
264+
assertFalse(factory.canHandle("bad:/void"));
264265
}
265266

266267
@Test

maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,7 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi
6868
requireNonNull(session, "session cannot be null");
6969
requireNonNull(repository, "repository cannot be null");
7070

71-
if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) {
72-
throw new NoTransporterException(repository);
73-
}
74-
71+
// repository protocol already checked in canHandle
7572
return new JdkTransporter(session, repository, javaVersion(), checksumExtractor, pathProcessor);
7673
}
7774

maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,7 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi
6868
requireNonNull(session, "session cannot be null");
6969
requireNonNull(repository, "repository cannot be null");
7070

71-
if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) {
72-
throw new NoTransporterException(repository);
73-
}
74-
71+
// repository protocol already checked in canHandle
7572
return new JettyTransporter(session, repository, checksumExtractor, pathProcessor);
7673
}
7774
}

0 commit comments

Comments
 (0)