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.resolution;
20
21 import java.util.Collections;
22 import java.util.List;
23
24 import org.eclipse.aether.RepositorySystem;
25 import org.eclipse.aether.graph.DependencyCycle;
26 import org.eclipse.aether.graph.DependencyNode;
27
28 import static java.util.Objects.requireNonNull;
29
30 /**
31 * The result of a dependency resolution request.
32 *
33 * @see RepositorySystem#resolveDependencies(org.eclipse.aether.RepositorySystemSession, DependencyRequest)
34 */
35 public final class DependencyResult {
36
37 private final DependencyRequest request;
38
39 private DependencyNode root;
40
41 private List<DependencyCycle> cycles;
42
43 private List<Exception> collectExceptions;
44
45 private List<DependencyNode> dependencyNodeResults;
46
47 private List<ArtifactResult> artifactResults;
48
49 /**
50 * Creates a new result for the specified request.
51 *
52 * @param request The resolution request, must not be {@code null}.
53 */
54 public DependencyResult(DependencyRequest request) {
55 this.request = requireNonNull(request, "dependency request cannot be null");
56 root = request.getRoot();
57 cycles = Collections.emptyList();
58 collectExceptions = Collections.emptyList();
59 this.dependencyNodeResults = Collections.emptyList();
60 artifactResults = Collections.emptyList();
61 }
62
63 /**
64 * Gets the resolution request that was made.
65 *
66 * @return The resolution request, never {@code null}.
67 */
68 public DependencyRequest getRequest() {
69 return request;
70 }
71
72 /**
73 * Gets the root node of the resolved dependency graph. Note that this dependency graph might be
74 * incomplete/unfinished in case of {@link #getCollectExceptions()} indicating errors during its calculation.
75 *
76 * @return The root node of the resolved dependency graph or {@code null} if none.
77 */
78 public DependencyNode getRoot() {
79 return root;
80 }
81
82 /**
83 * Sets the root node of the resolved dependency graph.
84 *
85 * @param root The root node of the resolved dependency graph, may be {@code null}.
86 * @return This result for chaining, never {@code null}.
87 */
88 public DependencyResult setRoot(DependencyNode root) {
89 this.root = root;
90 return this;
91 }
92
93 /**
94 * Gets the dependency cycles that were encountered while building the dependency graph. Note that dependency cycles
95 * will only be reported here if the underlying request was created from a
96 * {@link org.eclipse.aether.collection.CollectRequest CollectRequest}. If the underlying {@link DependencyRequest}
97 * was created from an existing dependency graph, information about cycles will not be available in this result.
98 *
99 * @return The dependency cycles in the (raw) graph, never {@code null}.
100 */
101 public List<DependencyCycle> getCycles() {
102 return cycles;
103 }
104
105 /**
106 * Records the specified dependency cycles while building the dependency graph.
107 *
108 * @param cycles The dependency cycles to record, may be {@code null}.
109 * @return This result for chaining, never {@code null}.
110 */
111 public DependencyResult setCycles(List<DependencyCycle> cycles) {
112 if (cycles == null) {
113 this.cycles = Collections.emptyList();
114 } else {
115 this.cycles = cycles;
116 }
117 return this;
118 }
119
120 /**
121 * Gets the exceptions that occurred while building the dependency graph.
122 *
123 * @return The exceptions that occurred, never {@code null}.
124 */
125 public List<Exception> getCollectExceptions() {
126 return collectExceptions;
127 }
128
129 /**
130 * Records the specified exceptions while building the dependency graph.
131 *
132 * @param exceptions The exceptions to record, may be {@code null}.
133 * @return This result for chaining, never {@code null}.
134 */
135 public DependencyResult setCollectExceptions(List<Exception> exceptions) {
136 if (exceptions == null) {
137 this.collectExceptions = Collections.emptyList();
138 } else {
139 this.collectExceptions = exceptions;
140 }
141 return this;
142 }
143
144 /**
145 * Gets the resolution results for the dependency nodes that matched {@link DependencyRequest#getFilter()}.
146 *
147 * @return The resolution results for the dependency nodes, never {@code null}.
148 * @since 2.0.0
149 */
150 public List<DependencyNode> getDependencyNodeResults() {
151 return dependencyNodeResults;
152 }
153
154 /**
155 * Sets the resolution results for the dependency nodes that matched {@link DependencyRequest#getFilter()}.
156 *
157 * @param results The resolution results for the dependency nodes, may be {@code null}.
158 * @return This result for chaining, never {@code null}.
159 * @since 2.0.0
160 */
161 public DependencyResult setDependencyNodeResults(List<DependencyNode> results) {
162 if (results == null) {
163 this.dependencyNodeResults = Collections.emptyList();
164 } else {
165 this.dependencyNodeResults = results;
166 }
167 return this;
168 }
169
170 /**
171 * Gets the resolution results for the dependency artifacts that matched {@link DependencyRequest#getFilter()}.
172 *
173 * @return The resolution results for the dependency artifacts, never {@code null}.
174 */
175 public List<ArtifactResult> getArtifactResults() {
176 return artifactResults;
177 }
178
179 /**
180 * Sets the resolution results for the artifacts that matched {@link DependencyRequest#getFilter()}.
181 *
182 * @param results The resolution results for the artifacts, may be {@code null}.
183 * @return This result for chaining, never {@code null}.
184 */
185 public DependencyResult setArtifactResults(List<ArtifactResult> results) {
186 if (results == null) {
187 this.artifactResults = Collections.emptyList();
188 } else {
189 this.artifactResults = results;
190 }
191 return this;
192 }
193
194 @Override
195 public String toString() {
196 return String.valueOf(artifactResults);
197 }
198 }