View Javadoc
1   package org.eclipse.aether.internal.impl;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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.RemoteRepositoryFilterManager;
34  import org.eclipse.aether.impl.RepositoryConnectorProvider;
35  import org.eclipse.aether.internal.impl.filter.FilteringRepositoryConnector;
36  import org.eclipse.aether.repository.Authentication;
37  import org.eclipse.aether.repository.Proxy;
38  import org.eclipse.aether.repository.RemoteRepository;
39  import org.eclipse.aether.spi.connector.RepositoryConnector;
40  import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
41  import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilter;
42  import org.eclipse.aether.spi.locator.Service;
43  import org.eclipse.aether.spi.locator.ServiceLocator;
44  import org.eclipse.aether.transfer.NoRepositoryConnectorException;
45  import org.slf4j.Logger;
46  import org.slf4j.LoggerFactory;
47  
48  /**
49   */
50  @Singleton
51  @Named
52  public class DefaultRepositoryConnectorProvider
53      implements RepositoryConnectorProvider, Service
54  {
55  
56      private static final Logger LOGGER = LoggerFactory.getLogger( DefaultRepositoryConnectorProvider.class );
57  
58      private Collection<RepositoryConnectorFactory> connectorFactories = new ArrayList<>();
59  
60      private RemoteRepositoryFilterManager remoteRepositoryFilterManager;
61  
62      public DefaultRepositoryConnectorProvider()
63      {
64          // enables default constructor
65      }
66  
67      @Inject
68      DefaultRepositoryConnectorProvider( Set<RepositoryConnectorFactory> connectorFactories,
69                                          RemoteRepositoryFilterManager remoteRepositoryFilterManager )
70      {
71          setRepositoryConnectorFactories( connectorFactories );
72          setRemoteRepositoryFilterManager( remoteRepositoryFilterManager );
73      }
74  
75      public void initService( ServiceLocator locator )
76      {
77          setRepositoryConnectorFactories( locator.getServices( RepositoryConnectorFactory.class ) );
78          setRemoteRepositoryFilterManager( locator.getService( RemoteRepositoryFilterManager.class ) );
79      }
80  
81      public DefaultRepositoryConnectorProvider addRepositoryConnectorFactory( RepositoryConnectorFactory factory )
82      {
83          connectorFactories.add( requireNonNull( factory, "repository connector factory cannot be null" ) );
84          return this;
85      }
86  
87      public DefaultRepositoryConnectorProvider setRepositoryConnectorFactories(
88              Collection<RepositoryConnectorFactory> factories )
89      {
90          if ( factories == null )
91          {
92              this.connectorFactories = new ArrayList<>();
93          }
94          else
95          {
96              this.connectorFactories = factories;
97          }
98          return this;
99      }
100 
101     public DefaultRepositoryConnectorProvider setRemoteRepositoryFilterManager(
102             RemoteRepositoryFilterManager remoteRepositoryFilterManager )
103     {
104         this.remoteRepositoryFilterManager = requireNonNull( remoteRepositoryFilterManager );
105         return this;
106     }
107 
108     public RepositoryConnector newRepositoryConnector( RepositorySystemSession session, RemoteRepository repository )
109         throws NoRepositoryConnectorException
110     {
111         requireNonNull( repository, "remote repository cannot be null" );
112         RemoteRepositoryFilter filter = remoteRepositoryFilterManager.getRemoteRepositoryFilter( session );
113 
114         PrioritizedComponents<RepositoryConnectorFactory> factories = new PrioritizedComponents<>( session );
115         for ( RepositoryConnectorFactory factory : this.connectorFactories )
116         {
117             factories.add( factory, factory.getPriority() );
118         }
119 
120         List<NoRepositoryConnectorException> errors = new ArrayList<>();
121         for ( PrioritizedComponent<RepositoryConnectorFactory> factory : factories.getEnabled() )
122         {
123             try
124             {
125                 RepositoryConnector connector = factory.getComponent().newInstance( session, repository );
126 
127                 if ( LOGGER.isDebugEnabled() )
128                 {
129                     StringBuilder buffer = new StringBuilder( 256 );
130                     buffer.append( "Using connector " ).append( connector.getClass().getSimpleName() );
131                     Utils.appendClassLoader( buffer, connector );
132                     buffer.append( " with priority " ).append( factory.getPriority() );
133                     buffer.append( " for " ).append( repository.getUrl() );
134 
135                     Authentication auth = repository.getAuthentication();
136                     if ( auth != null )
137                     {
138                         buffer.append( " with " ).append( auth );
139                     }
140 
141                     Proxy proxy = repository.getProxy();
142                     if ( proxy != null )
143                     {
144                         buffer.append( " via " ).append( proxy.getHost() ).append( ':' ).append( proxy.getPort() );
145 
146                         auth = proxy.getAuthentication();
147                         if ( auth != null )
148                         {
149                             buffer.append( " with " ).append( auth );
150                         }
151                     }
152 
153                     LOGGER.debug( buffer.toString() );
154                 }
155 
156                 if ( filter != null )
157                 {
158                     return new FilteringRepositoryConnector(
159                             repository,
160                             connector,
161                             filter
162                     );
163                 }
164                 else
165                 {
166                     return connector;
167                 }
168             }
169             catch ( NoRepositoryConnectorException e )
170             {
171                 // continue and try next factory
172                 errors.add( e );
173             }
174         }
175         if ( LOGGER.isDebugEnabled() && errors.size() > 1 )
176         {
177             for ( Exception e : errors )
178             {
179                 LOGGER.debug( "Could not obtain connector factory for {}", repository, e );
180             }
181         }
182 
183         StringBuilder buffer = new StringBuilder( 256 );
184         if ( factories.isEmpty() )
185         {
186             buffer.append( "No connector factories available" );
187         }
188         else
189         {
190             buffer.append( "Cannot access " ).append( repository.getUrl() );
191             buffer.append( " with type " ).append( repository.getContentType() );
192             buffer.append( " using the available connector factories: " );
193             factories.list( buffer );
194         }
195 
196         throw new NoRepositoryConnectorException( repository, buffer.toString(), errors.size() == 1 ? errors.get( 0 )
197                         : null );
198     }
199 
200 }