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