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