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