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.checksums.ProvidedChecksumsSource;
30  import org.eclipse.aether.spi.connector.RepositoryConnector;
31  import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
32  import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
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      @Deprecated
67      public BasicRepositoryConnectorFactory() {
68          // enables default constructor
69      }
70  
71      @Inject
72      public BasicRepositoryConnectorFactory(
73              TransporterProvider transporterProvider,
74              RepositoryLayoutProvider layoutProvider,
75              ChecksumPolicyProvider checksumPolicyProvider,
76              FileProcessor fileProcessor,
77              Map<String, ProvidedChecksumsSource> providedChecksumsSources) {
78          setTransporterProvider(transporterProvider);
79          setRepositoryLayoutProvider(layoutProvider);
80          setChecksumPolicyProvider(checksumPolicyProvider);
81          setFileProcessor(fileProcessor);
82          setProvidedChecksumSources(providedChecksumsSources);
83      }
84  
85      public void initService(ServiceLocator locator) {
86          setTransporterProvider(locator.getService(TransporterProvider.class));
87          setRepositoryLayoutProvider(locator.getService(RepositoryLayoutProvider.class));
88          setChecksumPolicyProvider(locator.getService(ChecksumPolicyProvider.class));
89          setFileProcessor(locator.getService(FileProcessor.class));
90          setProvidedChecksumSources(Collections.emptyMap());
91      }
92  
93      /**
94       * Sets the transporter provider to use for this component.
95       *
96       * @param transporterProvider The transporter provider to use, must not be {@code null}.
97       * @return This component for chaining, never {@code null}.
98       */
99      public BasicRepositoryConnectorFactory setTransporterProvider(TransporterProvider transporterProvider) {
100         this.transporterProvider = requireNonNull(transporterProvider, "transporter provider cannot be null");
101         return this;
102     }
103 
104     /**
105      * Sets the repository layout provider to use for this component.
106      *
107      * @param layoutProvider The repository layout provider to use, must not be {@code null}.
108      * @return This component for chaining, never {@code null}.
109      */
110     public BasicRepositoryConnectorFactory setRepositoryLayoutProvider(RepositoryLayoutProvider layoutProvider) {
111         this.layoutProvider = requireNonNull(layoutProvider, "repository layout provider cannot be null");
112         return this;
113     }
114 
115     /**
116      * Sets the checksum policy provider to use for this component.
117      *
118      * @param checksumPolicyProvider The checksum policy provider to use, must not be {@code null}.
119      * @return This component for chaining, never {@code null}.
120      */
121     public BasicRepositoryConnectorFactory setChecksumPolicyProvider(ChecksumPolicyProvider checksumPolicyProvider) {
122         this.checksumPolicyProvider = requireNonNull(checksumPolicyProvider, "checksum policy provider cannot be null");
123         return this;
124     }
125 
126     /**
127      * Sets the file processor to use for this component.
128      *
129      * @param fileProcessor The file processor to use, must not be {@code null}.
130      * @return This component for chaining, never {@code null}.
131      */
132     public BasicRepositoryConnectorFactory setFileProcessor(FileProcessor fileProcessor) {
133         this.fileProcessor = requireNonNull(fileProcessor, "file processor cannot be null");
134         return this;
135     }
136 
137     /**
138      * Sets the provided checksum sources to use for this component.
139      *
140      * @param providedChecksumsSources The provided checksum sources to use, must not be {@code null}.
141      * @return This component for chaining, never {@code null}.
142      * @since 1.8.0
143      */
144     public BasicRepositoryConnectorFactory setProvidedChecksumSources(
145             Map<String, ProvidedChecksumsSource> providedChecksumsSources) {
146         this.providedChecksumsSources =
147                 requireNonNull(providedChecksumsSources, "provided checksum sources cannot be null");
148         return this;
149     }
150 
151     public float getPriority() {
152         return priority;
153     }
154 
155     /**
156      * Sets the priority of this component.
157      *
158      * @param priority The priority.
159      * @return This component for chaining, never {@code null}.
160      */
161     public BasicRepositoryConnectorFactory setPriority(float priority) {
162         this.priority = priority;
163         return this;
164     }
165 
166     public RepositoryConnector newInstance(RepositorySystemSession session, RemoteRepository repository)
167             throws NoRepositoryConnectorException {
168         requireNonNull(session, "session cannot be null");
169         requireNonNull(repository, "repository cannot be null");
170 
171         return new BasicRepositoryConnector(
172                 session,
173                 repository,
174                 transporterProvider,
175                 layoutProvider,
176                 checksumPolicyProvider,
177                 fileProcessor,
178                 providedChecksumsSources);
179     }
180 }