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