1 package org.eclipse.aether.internal.impl;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.List;
25 import static java.util.Objects.requireNonNull;
26 import java.util.Set;
27
28 import javax.inject.Inject;
29 import javax.inject.Named;
30 import javax.inject.Singleton;
31
32 import org.eclipse.aether.RepositorySystemSession;
33 import org.eclipse.aether.impl.RepositoryConnectorProvider;
34 import org.eclipse.aether.repository.Authentication;
35 import org.eclipse.aether.repository.Proxy;
36 import org.eclipse.aether.repository.RemoteRepository;
37 import org.eclipse.aether.spi.connector.RepositoryConnector;
38 import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
39 import org.eclipse.aether.spi.locator.Service;
40 import org.eclipse.aether.spi.locator.ServiceLocator;
41 import org.eclipse.aether.transfer.NoRepositoryConnectorException;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45
46
47 @Singleton
48 @Named
49 public class DefaultRepositoryConnectorProvider
50 implements RepositoryConnectorProvider, Service
51 {
52
53 private static final Logger LOGGER = LoggerFactory.getLogger( DefaultRepositoryConnectorProvider.class );
54
55 private Collection<RepositoryConnectorFactory> connectorFactories = new ArrayList<>();
56
57 public DefaultRepositoryConnectorProvider()
58 {
59
60 }
61
62 @Inject
63 DefaultRepositoryConnectorProvider( Set<RepositoryConnectorFactory> connectorFactories )
64 {
65 setRepositoryConnectorFactories( connectorFactories );
66 }
67
68 public void initService( ServiceLocator locator )
69 {
70 connectorFactories = locator.getServices( RepositoryConnectorFactory.class );
71 }
72
73 public DefaultRepositoryConnectorProvider addRepositoryConnectorFactory( RepositoryConnectorFactory factory )
74 {
75 connectorFactories.add( requireNonNull( factory, "repository connector factory cannot be null" ) );
76 return this;
77 }
78
79 public DefaultRepositoryConnectorProvider setRepositoryConnectorFactories(
80 Collection<RepositoryConnectorFactory> factories )
81 {
82 if ( factories == null )
83 {
84 this.connectorFactories = new ArrayList<>();
85 }
86 else
87 {
88 this.connectorFactories = factories;
89 }
90 return this;
91 }
92
93 public RepositoryConnector newRepositoryConnector( RepositorySystemSession session, RemoteRepository repository )
94 throws NoRepositoryConnectorException
95 {
96 requireNonNull( repository, "remote repository cannot be null" );
97
98 PrioritizedComponents<RepositoryConnectorFactory> factories = new PrioritizedComponents<>( session );
99 for ( RepositoryConnectorFactory factory : this.connectorFactories )
100 {
101 factories.add( factory, factory.getPriority() );
102 }
103
104 List<NoRepositoryConnectorException> errors = new ArrayList<>();
105 for ( PrioritizedComponent<RepositoryConnectorFactory> factory : factories.getEnabled() )
106 {
107 try
108 {
109 RepositoryConnector connector = factory.getComponent().newInstance( session, repository );
110
111 if ( LOGGER.isDebugEnabled() )
112 {
113 StringBuilder buffer = new StringBuilder( 256 );
114 buffer.append( "Using connector " ).append( connector.getClass().getSimpleName() );
115 Utils.appendClassLoader( buffer, connector );
116 buffer.append( " with priority " ).append( factory.getPriority() );
117 buffer.append( " for " ).append( repository.getUrl() );
118
119 Authentication auth = repository.getAuthentication();
120 if ( auth != null )
121 {
122 buffer.append( " with " ).append( auth );
123 }
124
125 Proxy proxy = repository.getProxy();
126 if ( proxy != null )
127 {
128 buffer.append( " via " ).append( proxy.getHost() ).append( ':' ).append( proxy.getPort() );
129
130 auth = proxy.getAuthentication();
131 if ( auth != null )
132 {
133 buffer.append( " with " ).append( auth );
134 }
135 }
136
137 LOGGER.debug( buffer.toString() );
138 }
139
140 return connector;
141 }
142 catch ( NoRepositoryConnectorException e )
143 {
144
145 errors.add( e );
146 }
147 }
148 if ( LOGGER.isDebugEnabled() && errors.size() > 1 )
149 {
150 for ( Exception e : errors )
151 {
152 LOGGER.debug( "Could not obtain connector factory for {}", repository, e );
153 }
154 }
155
156 StringBuilder buffer = new StringBuilder( 256 );
157 if ( factories.isEmpty() )
158 {
159 buffer.append( "No connector factories available" );
160 }
161 else
162 {
163 buffer.append( "Cannot access " ).append( repository.getUrl() );
164 buffer.append( " with type " ).append( repository.getContentType() );
165 buffer.append( " using the available connector factories: " );
166 factories.list( buffer );
167 }
168
169 throw new NoRepositoryConnectorException( repository, buffer.toString(), errors.size() == 1 ? errors.get( 0 )
170 : null );
171 }
172
173 }