1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.aether.internal.impl;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.Map;
29
30 import org.eclipse.aether.RepositorySystemSession;
31 import org.eclipse.aether.repository.RemoteRepository;
32 import org.eclipse.aether.spi.connector.transport.Transporter;
33 import org.eclipse.aether.spi.connector.transport.TransporterFactory;
34 import org.eclipse.aether.spi.connector.transport.TransporterProvider;
35 import org.eclipse.aether.transfer.NoTransporterException;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 import static java.util.Objects.requireNonNull;
40
41
42
43 @Singleton
44 @Named
45 public final class DefaultTransporterProvider implements TransporterProvider {
46
47 private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTransporterProvider.class);
48
49 private final Map<String, TransporterFactory> transporterFactories;
50
51 @Inject
52 public DefaultTransporterProvider(Map<String, TransporterFactory> transporterFactories) {
53 this.transporterFactories = Collections.unmodifiableMap(transporterFactories);
54 }
55
56 @Override
57 public Transporter newTransporter(RepositorySystemSession session, RemoteRepository repository)
58 throws NoTransporterException {
59 requireNonNull(session, "session cannot be null");
60 requireNonNull(repository, "repository cannot be null");
61
62 PrioritizedComponents<TransporterFactory> factories =
63 PrioritizedComponents.reuseOrCreate(session, transporterFactories, TransporterFactory::getPriority);
64
65 List<NoTransporterException> errors = new ArrayList<>();
66 for (PrioritizedComponent<TransporterFactory> factory : factories.getEnabled()) {
67 try {
68 Transporter transporter = factory.getComponent().newInstance(session, repository);
69
70 if (LOGGER.isDebugEnabled()) {
71 StringBuilder buffer = new StringBuilder(256);
72 buffer.append("Using transporter ")
73 .append(transporter.getClass().getSimpleName());
74 Utils.appendClassLoader(buffer, transporter);
75 buffer.append(" with priority ").append(factory.getPriority());
76 buffer.append(" for ").append(repository.getUrl());
77 LOGGER.debug(buffer.toString());
78 }
79
80 return transporter;
81 } catch (NoTransporterException e) {
82
83 errors.add(e);
84 }
85 }
86 if (LOGGER.isDebugEnabled() && errors.size() > 1) {
87 for (Exception e : errors) {
88 LOGGER.debug("Could not obtain transporter factory for {}", repository, e);
89 }
90 }
91
92 StringBuilder buffer = new StringBuilder(256);
93 if (factories.isEmpty()) {
94 buffer.append("No transporter factories registered");
95 } else {
96 buffer.append("Cannot access ").append(repository.getUrl());
97 buffer.append(" using the registered transporter factories: ");
98 factories.list(buffer);
99 }
100
101 throw new NoTransporterException(repository, buffer.toString(), errors.size() == 1 ? errors.get(0) : null);
102 }
103 }