View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.connector.basic;
20  
21  import javax.inject.Inject;
22  import javax.inject.Named;
23  
24  import java.util.Collections;
25  import java.util.Map;
26  
27  import org.eclipse.aether.RepositorySystemSession;
28  import org.eclipse.aether.repository.RemoteRepository;
29  import org.eclipse.aether.spi.connector.RepositoryConnector;
30  import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
31  import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
32  import org.eclipse.aether.spi.connector.checksum.ProvidedChecksumsSource;
33  import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
34  import org.eclipse.aether.spi.connector.transport.TransporterProvider;
35  import org.eclipse.aether.spi.io.FileProcessor;
36  import org.eclipse.aether.spi.locator.Service;
37  import org.eclipse.aether.spi.locator.ServiceLocator;
38  import org.eclipse.aether.transfer.NoRepositoryConnectorException;
39  
40  import static java.util.Objects.requireNonNull;
41  
42  /**
43   * A repository connector factory that employs pluggable
44   * {@link org.eclipse.aether.spi.connector.transport.TransporterFactory transporters} and
45   * {@link org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory repository layouts} for the transfers.
46   */
47  @Named("basic")
48  public final class BasicRepositoryConnectorFactory implements RepositoryConnectorFactory, Service {
49      private TransporterProvider transporterProvider;
50  
51      private RepositoryLayoutProvider layoutProvider;
52  
53      private ChecksumPolicyProvider checksumPolicyProvider;
54  
55      private FileProcessor fileProcessor;
56  
57      private Map<String, ProvidedChecksumsSource> providedChecksumsSources;
58  
59      private float priority;
60  
61      /**
62       * Creates an (uninitialized) instance of this connector factory. <em>Note:</em> In case of manual instantiation by
63       * clients, the new factory needs to be configured via its various mutators before first use or runtime errors will
64       * occur.
65       */
66      public BasicRepositoryConnectorFactory() {
67          // enables default constructor
68      }
69  
70      @Inject
71      BasicRepositoryConnectorFactory(
72              TransporterProvider transporterProvider,
73              RepositoryLayoutProvider layoutProvider,
74              ChecksumPolicyProvider checksumPolicyProvider,
75              FileProcessor fileProcessor,
76              Map<String, ProvidedChecksumsSource> providedChecksumsSources) {
77          setTransporterProvider(transporterProvider);
78          setRepositoryLayoutProvider(layoutProvider);
79          setChecksumPolicyProvider(checksumPolicyProvider);
80          setFileProcessor(fileProcessor);
81          setProvidedChecksumSources(providedChecksumsSources);
82      }
83  
84      public void initService(ServiceLocator locator) {
85          setTransporterProvider(locator.getService(TransporterProvider.class));
86          setRepositoryLayoutProvider(locator.getService(RepositoryLayoutProvider.class));
87          setChecksumPolicyProvider(locator.getService(ChecksumPolicyProvider.class));
88          setFileProcessor(locator.getService(FileProcessor.class));
89          setProvidedChecksumSources(Collections.emptyMap());
90      }
91  
92      /**
93       * Sets the transporter provider to use for this component.
94       *
95       * @param transporterProvider The transporter provider to use, must not be {@code null}.
96       * @return This component for chaining, never {@code null}.
97       */
98      public BasicRepositoryConnectorFactory setTransporterProvider(TransporterProvider transporterProvider) {
99          this.transporterProvider = requireNonNull(transporterProvider, "transporter provider cannot be null");
100         return this;
101     }
102 
103     /**
104      * Sets the repository layout provider to use for this component.
105      *
106      * @param layoutProvider The repository layout provider to use, must not be {@code null}.
107      * @return This component for chaining, never {@code null}.
108      */
109     public BasicRepositoryConnectorFactory setRepositoryLayoutProvider(RepositoryLayoutProvider layoutProvider) {
110         this.layoutProvider = requireNonNull(layoutProvider, "repository layout provider cannot be null");
111         return this;
112     }
113 
114     /**
115      * Sets the checksum policy provider to use for this component.
116      *
117      * @param checksumPolicyProvider The checksum policy provider to use, must not be {@code null}.
118      * @return This component for chaining, never {@code null}.
119      */
120     public BasicRepositoryConnectorFactory setChecksumPolicyProvider(ChecksumPolicyProvider checksumPolicyProvider) {
121         this.checksumPolicyProvider = requireNonNull(checksumPolicyProvider, "checksum policy provider cannot be null");
122         return this;
123     }
124 
125     /**
126      * Sets the file processor to use for this component.
127      *
128      * @param fileProcessor The file processor to use, must not be {@code null}.
129      * @return This component for chaining, never {@code null}.
130      */
131     public BasicRepositoryConnectorFactory setFileProcessor(FileProcessor fileProcessor) {
132         this.fileProcessor = requireNonNull(fileProcessor, "file processor cannot be null");
133         return this;
134     }
135 
136     /**
137      * Sets the provided checksum sources to use for this component.
138      *
139      * @param providedChecksumsSources The provided checksum sources to use, must not be {@code null}.
140      * @return This component for chaining, never {@code null}.
141      * @since 1.8.0
142      */
143     public BasicRepositoryConnectorFactory setProvidedChecksumSources(
144             Map<String, ProvidedChecksumsSource> providedChecksumsSources) {
145         this.providedChecksumsSources =
146                 requireNonNull(providedChecksumsSources, "provided checksum sources cannot be null");
147         return this;
148     }
149 
150     public float getPriority() {
151         return priority;
152     }
153 
154     /**
155      * Sets the priority of this component.
156      *
157      * @param priority The priority.
158      * @return This component for chaining, never {@code null}.
159      */
160     public BasicRepositoryConnectorFactory setPriority(float priority) {
161         this.priority = priority;
162         return this;
163     }
164 
165     public RepositoryConnector newInstance(RepositorySystemSession session, RemoteRepository repository)
166             throws NoRepositoryConnectorException {
167         requireNonNull(session, "session cannot be null");
168         requireNonNull(repository, "repository cannot be null");
169 
170         return new BasicRepositoryConnector(
171                 session,
172                 repository,
173                 transporterProvider,
174                 layoutProvider,
175                 checksumPolicyProvider,
176                 fileProcessor,
177                 providedChecksumsSources);
178     }
179 }