1 package org.eclipse.aether.collection;
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.Collections;
24 import java.util.List;
25
26 import org.eclipse.aether.RepositorySystem;
27 import org.eclipse.aether.RequestTrace;
28 import org.eclipse.aether.artifact.Artifact;
29 import org.eclipse.aether.graph.Dependency;
30 import org.eclipse.aether.repository.RemoteRepository;
31
32 /**
33 * A request to collect the transitive dependencies and to build a dependency graph from them. There are three ways to
34 * create a dependency graph. First, only the root dependency can be given. Second, a root dependency and direct
35 * dependencies can be specified in which case the specified direct dependencies are merged with the direct dependencies
36 * retrieved from the artifact descriptor of the root dependency. And last, only direct dependencies can be specified in
37 * which case the root node of the resulting graph has no associated dependency.
38 *
39 * @see RepositorySystem#collectDependencies(org.eclipse.aether.RepositorySystemSession, CollectRequest)
40 */
41 public final class CollectRequest
42 {
43
44 private Artifact rootArtifact;
45
46 private Dependency root;
47
48 private List<Dependency> dependencies = Collections.emptyList();
49
50 private List<Dependency> managedDependencies = Collections.emptyList();
51
52 private List<RemoteRepository> repositories = Collections.emptyList();
53
54 private String context = "";
55
56 private RequestTrace trace;
57
58 /**
59 * Creates an uninitialized request.
60 */
61 public CollectRequest()
62 {
63 // enables default constructor
64 }
65
66 /**
67 * Creates a request with the specified properties.
68 *
69 * @param root The root dependency whose transitive dependencies should be collected, may be {@code null}.
70 * @param repositories The repositories to use for the collection, may be {@code null}.
71 */
72 public CollectRequest( Dependency root, List<RemoteRepository> repositories )
73 {
74 setRoot( root );
75 setRepositories( repositories );
76 }
77
78 /**
79 * Creates a new request with the specified properties.
80 *
81 * @param root The root dependency whose transitive dependencies should be collected, may be {@code null}.
82 * @param dependencies The direct dependencies to merge with the direct dependencies from the root dependency's
83 * artifact descriptor.
84 * @param repositories The repositories to use for the collection, may be {@code null}.
85 */
86 public CollectRequest( Dependency root, List<Dependency> dependencies, List<RemoteRepository> repositories )
87 {
88 setRoot( root );
89 setDependencies( dependencies );
90 setRepositories( repositories );
91 }
92
93 /**
94 * Creates a new request with the specified properties.
95 *
96 * @param dependencies The direct dependencies of some imaginary root, may be {@code null}.
97 * @param managedDependencies The dependency management information to apply to the transitive dependencies, may be
98 * {@code null}.
99 * @param repositories The repositories to use for the collection, may be {@code null}.
100 */
101 public CollectRequest( List<Dependency> dependencies, List<Dependency> managedDependencies,
102 List<RemoteRepository> repositories )
103 {
104 setDependencies( dependencies );
105 setManagedDependencies( managedDependencies );
106 setRepositories( repositories );
107 }
108
109 /**
110 * Gets the root artifact for the dependency graph.
111 *
112 * @return The root artifact for the dependency graph or {@code null} if none.
113 */
114 public Artifact getRootArtifact()
115 {
116 return rootArtifact;
117 }
118
119 /**
120 * Sets the root artifact for the dependency graph. This must not be confused with {@link #setRoot(Dependency)}: The
121 * root <em>dependency</em>, like any other specified dependency, will be subject to dependency
122 * collection/resolution, i.e. should have an artifact descriptor and a corresponding artifact file. The root
123 * <em>artifact</em> on the other hand is only used as a label for the root node of the graph in case no root
124 * dependency was specified. As such, the configured root artifact is ignored if {@link #getRoot()} does not return
125 * {@code null}.
126 *
127 * @param rootArtifact The root artifact for the dependency graph, may be {@code null}.
128 * @return This request for chaining, never {@code null}.
129 */
130 public CollectRequest setRootArtifact( Artifact rootArtifact )
131 {
132 this.rootArtifact = rootArtifact;
133 return this;
134 }
135
136 /**
137 * Gets the root dependency of the graph.
138 *
139 * @return The root dependency of the graph or {@code null} if none.
140 */
141 public Dependency getRoot()
142 {
143 return root;
144 }
145
146 /**
147 * Sets the root dependency of the graph.
148 *
149 * @param root The root dependency of the graph, may be {@code null}.
150 * @return This request for chaining, never {@code null}.
151 */
152 public CollectRequest setRoot( Dependency root )
153 {
154 this.root = root;
155 return this;
156 }
157
158 /**
159 * Gets the direct dependencies.
160 *
161 * @return The direct dependencies, never {@code null}.
162 */
163 public List<Dependency> getDependencies()
164 {
165 return dependencies;
166 }
167
168 /**
169 * Sets the direct dependencies. If both a root dependency and direct dependencies are given in the request, the
170 * direct dependencies from the request will be merged with the direct dependencies from the root dependency's
171 * artifact descriptor, giving higher priority to the dependencies from the request.
172 *
173 * @param dependencies The direct dependencies, may be {@code null}.
174 * @return This request for chaining, never {@code null}.
175 */
176 public CollectRequest setDependencies( List<Dependency> dependencies )
177 {
178 if ( dependencies == null )
179 {
180 this.dependencies = Collections.emptyList();
181 }
182 else
183 {
184 this.dependencies = dependencies;
185 }
186 return this;
187 }
188
189 /**
190 * Adds the specified direct dependency.
191 *
192 * @param dependency The dependency to add, may be {@code null}.
193 * @return This request for chaining, never {@code null}.
194 */
195 public CollectRequest addDependency( Dependency dependency )
196 {
197 if ( dependency != null )
198 {
199 if ( this.dependencies.isEmpty() )
200 {
201 this.dependencies = new ArrayList<>();
202 }
203 this.dependencies.add( dependency );
204 }
205 return this;
206 }
207
208 /**
209 * Gets the dependency management to apply to transitive dependencies.
210 *
211 * @return The dependency management to apply to transitive dependencies, never {@code null}.
212 */
213 public List<Dependency> getManagedDependencies()
214 {
215 return managedDependencies;
216 }
217
218 /**
219 * Sets the dependency management to apply to transitive dependencies. To clarify, this management does not apply to
220 * the direct dependencies of the root node.
221 *
222 * @param managedDependencies The dependency management, may be {@code null}.
223 * @return This request for chaining, never {@code null}.
224 */
225 public CollectRequest setManagedDependencies( List<Dependency> managedDependencies )
226 {
227 if ( managedDependencies == null )
228 {
229 this.managedDependencies = Collections.emptyList();
230 }
231 else
232 {
233 this.managedDependencies = managedDependencies;
234 }
235 return this;
236 }
237
238 /**
239 * Adds the specified managed dependency.
240 *
241 * @param managedDependency The managed dependency to add, may be {@code null}.
242 * @return This request for chaining, never {@code null}.
243 */
244 public CollectRequest addManagedDependency( Dependency managedDependency )
245 {
246 if ( managedDependency != null )
247 {
248 if ( this.managedDependencies.isEmpty() )
249 {
250 this.managedDependencies = new ArrayList<>();
251 }
252 this.managedDependencies.add( managedDependency );
253 }
254 return this;
255 }
256
257 /**
258 * Gets the repositories to use for the collection.
259 *
260 * @return The repositories to use for the collection, never {@code null}.
261 */
262 public List<RemoteRepository> getRepositories()
263 {
264 return repositories;
265 }
266
267 /**
268 * Sets the repositories to use for the collection.
269 *
270 * @param repositories The repositories to use for the collection, may be {@code null}.
271 * @return This request for chaining, never {@code null}.
272 */
273 public CollectRequest setRepositories( List<RemoteRepository> repositories )
274 {
275 if ( repositories == null )
276 {
277 this.repositories = Collections.emptyList();
278 }
279 else
280 {
281 this.repositories = repositories;
282 }
283 return this;
284 }
285
286 /**
287 * Adds the specified repository for collection.
288 *
289 * @param repository The repository to collect dependency information from, may be {@code null}.
290 * @return This request for chaining, never {@code null}.
291 */
292 public CollectRequest addRepository( RemoteRepository repository )
293 {
294 if ( repository != null )
295 {
296 if ( this.repositories.isEmpty() )
297 {
298 this.repositories = new ArrayList<>();
299 }
300 this.repositories.add( repository );
301 }
302 return this;
303 }
304
305 /**
306 * Gets the context in which this request is made.
307 *
308 * @return The context, never {@code null}.
309 */
310 public String getRequestContext()
311 {
312 return context;
313 }
314
315 /**
316 * Sets the context in which this request is made.
317 *
318 * @param context The context, may be {@code null}.
319 * @return This request for chaining, never {@code null}.
320 */
321 public CollectRequest setRequestContext( String context )
322 {
323 this.context = ( context != null ) ? context : "";
324 return this;
325 }
326
327 /**
328 * Gets the trace information that describes the higher level request/operation in which this request is issued.
329 *
330 * @return The trace information about the higher level operation or {@code null} if none.
331 */
332 public RequestTrace getTrace()
333 {
334 return trace;
335 }
336
337 /**
338 * Sets the trace information that describes the higher level request/operation in which this request is issued.
339 *
340 * @param trace The trace information about the higher level operation, may be {@code null}.
341 * @return This request for chaining, never {@code null}.
342 */
343 public CollectRequest setTrace( RequestTrace trace )
344 {
345 this.trace = trace;
346 return this;
347 }
348
349 @Override
350 public String toString()
351 {
352 return getRoot() + " -> " + getDependencies() + " < " + getRepositories();
353 }
354
355 }